Fix regarding standard video stream request

This commit is contained in:
kkitayam 2021-08-04 00:32:16 +09:00
parent c52cf9c8a5
commit 20572a6ed2
2 changed files with 17 additions and 11 deletions

View File

@ -56,6 +56,9 @@ enum {
+ 7/* Endpoint */\ + 7/* Endpoint */\
) )
/* Windows support YUV2 and NV12
* https://docs.microsoft.com/en-us/windows-hardware/drivers/stream/usb-video-class-driver-overview */
#define TUD_VIDEO_DESC_CS_VS_FMT_YUY2(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \ #define TUD_VIDEO_DESC_CS_VS_FMT_YUY2(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \
TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_YUY2, 16, _frmidx, _asrx, _asry, _interlace, _cp) TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR(_fmtidx, _numfmtdesc, TUD_VIDEO_GUID_YUY2, 16, _frmidx, _asrx, _asry, _interlace, _cp)
#define TUD_VIDEO_DESC_CS_VS_FMT_NV12(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \ #define TUD_VIDEO_DESC_CS_VS_FMT_NV12(_fmtidx, _numfmtdesc, _frmidx, _asrx, _asry, _interlace, _cp) \
@ -88,7 +91,7 @@ enum {
/*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \ /*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \
/*bControlSize*/1, /*bmaControls(1)*/0), \ /*bControlSize*/1, /*bmaControls(1)*/0), \
/* Video stream format */ \ /* Video stream format */ \
TUD_VIDEO_DESC_CS_VS_FMT_I420(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1,\ TUD_VIDEO_DESC_CS_VS_FMT_NV12(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1,\
/*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \ /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \
/* Video stream frame format */ \ /* Video stream frame format */ \
TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT(/*bFrameIndex */1, 0, _width, _height, \ TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT(/*bFrameIndex */1, 0, _width, _height, \

View File

@ -321,6 +321,7 @@ static bool _open_vs_itf(uint8_t rhport, videod_interface_t *self, unsigned itfn
cur += tu_desc_len(cur); cur += tu_desc_len(cur);
} }
*ofs = (void const*)vs - self->beg; *ofs = (void const*)vs - self->beg;
TU_LOG2(" done\r\n");
return true; return true;
} }
@ -626,6 +627,7 @@ uint16_t videod_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uin
bool videod_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request) bool videod_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request)
{ {
int err; int err;
int (*handle_video_req)(uint8_t rhport, uint8_t stage, tusb_control_request_t const *request, unsigned itf) = NULL;
if (request->bmRequestType_bit.recipient != TUSB_REQ_RCPT_INTERFACE) { if (request->bmRequestType_bit.recipient != TUSB_REQ_RCPT_INTERFACE) {
return false; return false;
} }
@ -635,20 +637,21 @@ bool videod_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_
tusb_desc_vc_itf_t const *vc = NULL; tusb_desc_vc_itf_t const *vc = NULL;
for (itf = 0; itf < CFG_TUD_VIDEO; ++itf) { for (itf = 0; itf < CFG_TUD_VIDEO; ++itf) {
vc = _get_desc_vc(&_videod_itf[itf]); vc = _get_desc_vc(&_videod_itf[itf]);
unsigned beg_itfnum = vc->std.bInterfaceNumber; if (itfnum == vc->std.bInterfaceNumber) {
unsigned end_itfnum = vc->ctl.bInCollection; handle_video_req = handle_video_ctl_req;
if (beg_itfnum <= itfnum && itfnum < end_itfnum)
break; break;
}
int i;
int bInCollection = vc->ctl.bInCollection;
for (i = 0; i < bInCollection && itfnum != vc->ctl.baInterfaceNr[i]; ++i) ;
if (i < bInCollection) {
handle_video_req = handle_video_stm_req;
break;
}
} }
if (itf == CFG_TUD_VIDEO) return false; if (itf == CFG_TUD_VIDEO) return false;
if (itfnum == vc->std.bInterfaceNumber) { err = handle_video_req(rhport, stage, request, itf);
/* To video control interface */
err = handle_video_ctl_req(rhport, stage, request, itf);
} else {
/* To video streaming interface */
err = handle_video_stm_req(rhport, stage, request, itf);
}
_videod_itf[itf].error_code = (uint8_t)err; _videod_itf[itf].error_code = (uint8_t)err;
if (err) return false; if (err) return false;
return true; return true;