mirror of
https://github.com/hathach/tinyusb.git
synced 2025-04-16 05:42:56 +00:00
Fix regarding standard video stream request
This commit is contained in:
parent
c52cf9c8a5
commit
20572a6ed2
@ -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, \
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user