Skip to content

Commit 61eee53

Browse files
committed
feat(uvc): support format frame based
1 parent 1f259b3 commit 61eee53

File tree

2 files changed

+55
-17
lines changed

2 files changed

+55
-17
lines changed

src/class/video/video.h

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -540,28 +540,32 @@ typedef struct TU_ATTR_PACKED {
540540

541541
TU_VERIFY_STATIC( sizeof(video_probe_and_commit_control_t) == 48, "size is not correct");
542542

543-
#define TUD_VIDEO_DESC_IAD_LEN 8
544-
#define TUD_VIDEO_DESC_STD_VC_LEN 9
545-
#define TUD_VIDEO_DESC_CS_VC_LEN 12
546-
#define TUD_VIDEO_DESC_INPUT_TERM_LEN 8
547-
#define TUD_VIDEO_DESC_OUTPUT_TERM_LEN 9
548-
#define TUD_VIDEO_DESC_CAMERA_TERM_LEN 18
549-
#define TUD_VIDEO_DESC_STD_VS_LEN 9
550-
#define TUD_VIDEO_DESC_CS_VS_IN_LEN 13
551-
#define TUD_VIDEO_DESC_CS_VS_OUT_LEN 9
552-
#define TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN 27
553-
#define TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN 11
554-
#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN 38
555-
#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_DISC_LEN 26
556-
#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN 38
557-
#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_DISC_LEN 26
558-
#define TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN 6
543+
#define TUD_VIDEO_DESC_IAD_LEN 8
544+
#define TUD_VIDEO_DESC_STD_VC_LEN 9
545+
#define TUD_VIDEO_DESC_CS_VC_LEN 12
546+
#define TUD_VIDEO_DESC_INPUT_TERM_LEN 8
547+
#define TUD_VIDEO_DESC_OUTPUT_TERM_LEN 9
548+
#define TUD_VIDEO_DESC_CAMERA_TERM_LEN 18
549+
#define TUD_VIDEO_DESC_STD_VS_LEN 9
550+
#define TUD_VIDEO_DESC_CS_VS_IN_LEN 13
551+
#define TUD_VIDEO_DESC_CS_VS_OUT_LEN 9
552+
#define TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN 27
553+
#define TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN 11
554+
#define TUD_VIDEO_DESC_CS_VS_FMT_FRAME_BASED_LEN 28
555+
#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN 38
556+
#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_DISC_LEN 26
557+
#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN 38
558+
#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_DISC_LEN 26
559+
#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_CONT_LEN 38
560+
#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_DISC_LEN 26
561+
#define TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN 6
559562

560563
/* 2.2 compression formats */
561564
#define TUD_VIDEO_GUID_YUY2 0x59,0x55,0x59,0x32,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
562565
#define TUD_VIDEO_GUID_NV12 0x4E,0x56,0x31,0x32,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
563566
#define TUD_VIDEO_GUID_M420 0x4D,0x34,0x32,0x30,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
564567
#define TUD_VIDEO_GUID_I420 0x49,0x34,0x32,0x30,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
568+
#define TUD_VIDEO_GUID_H264 0x48,0x32,0x36,0x34,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
565569

566570
#define TUD_VIDEO_DESC_IAD(_firstitf, _nitfs, _stridx) \
567571
TUD_VIDEO_DESC_IAD_LEN, TUSB_DESC_INTERFACE_ASSOCIATION, \
@@ -656,6 +660,25 @@ TU_VERIFY_STATIC( sizeof(video_probe_and_commit_control_t) == 48, "size is not c
656660
_frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \
657661
U32_TO_U8S_LE(_maxfrmbufsz), U32_TO_U8S_LE(_frminterval), (TU_ARGS_NUM(__VA_ARGS__)), __VA_ARGS__
658662

663+
/* Motion-Frame-Based 3.1.1 Table 3-1 */
664+
#define TUD_VIDEO_DESC_CS_VS_FMT_FRAME_BASED(_fmtidx, _numfrmdesc, _guid, _bitsperpix, _frmidx, _asrx, _asry, _interlace, _cp, _variablesize) \
665+
TUD_VIDEO_DESC_CS_VS_FMT_FRAME_BASED_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED, \
666+
_fmtidx, _numfrmdesc, TUD_VIDEO_GUID(_guid), _bitsperpix, _frmidx, _asrx, _asry, _interlace, _cp, _variablesize
667+
668+
/* Motion-Frame-Based 3.1.1 Table 3-2 and 3-3 */
669+
#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_CONT(_frmidx, _cap, _width, _height, _minbr, _maxbr, _frminterval, _bytesperline, _minfrminterval, _maxfrminterval, _frmintervalstep) \
670+
TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_CONT_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_FRAME_BASED, \
671+
_frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \
672+
U32_TO_U8S_LE(_frminterval), 0, U32_TO_U8S_LE(_bytesperline), \
673+
U32_TO_U8S_LE(_minfrminterval), U32_TO_U8S_LE(_maxfrminterval), U32_TO_U8S_LE(_frmintervalstep)
674+
675+
/* Motion-Frame-Based 3.1.1 Table 3-2 and 3-4 */
676+
#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_DISC(_frmidx, _cap, _width, _height, _minbr, _maxbr, _frminterval, _bytesperline, ...) \
677+
TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_DISC_LEN + (TU_ARGS_NUM(__VA_ARGS__)) * 4, \
678+
TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_FRAME_BASED, \
679+
_frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \
680+
U32_TO_U8S_LE(_frminterval), U32_TO_U8S_LE(_bytesperline), (TU_ARGS_NUM(__VA_ARGS__)), __VA_ARGS__
681+
659682
/* 3.9.2.6 */
660683
#define TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(_color, _trns, _mat) \
661684
TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN, \

src/class/video/video_device.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -398,7 +398,7 @@ static inline void const *_find_desc_format(void const *beg, void const *end, ui
398398
if ((fmt == VIDEO_CS_ITF_VS_FORMAT_UNCOMPRESSED ||
399399
fmt == VIDEO_CS_ITF_VS_FORMAT_MJPEG ||
400400
fmt == VIDEO_CS_ITF_VS_FORMAT_DV ||
401-
fmt == VIDEO_CS_ITF_VS_FRAME_FRAME_BASED) &&
401+
fmt == VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED) &&
402402
fmtnum == p[3]) {
403403
return cur;
404404
}
@@ -464,6 +464,9 @@ static bool _update_streaming_parameters(videod_streaming_interface_t const *stm
464464
case VIDEO_CS_ITF_VS_FORMAT_MJPEG:
465465
break;
466466

467+
case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
468+
break;
469+
467470
default: return false;
468471
}
469472

@@ -489,6 +492,10 @@ static bool _update_streaming_parameters(videod_streaming_interface_t const *stm
489492
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
490493
break;
491494

495+
case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
496+
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
497+
break;
498+
492499
default: break;
493500
}
494501
param->dwMaxVideoFrameSize = frame_size;
@@ -578,6 +585,10 @@ static bool _negotiate_streaming_parameters(videod_streaming_interface_t const *
578585
frmnum = fmt->mjpeg.bDefaultFrameIndex;
579586
break;
580587

588+
case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
589+
frmnum = fmt->frame_based.bDefaultFrameIndex;
590+
break;
591+
581592
default: return false;
582593
}
583594
break;
@@ -596,6 +607,10 @@ static bool _negotiate_streaming_parameters(videod_streaming_interface_t const *
596607
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
597608
break;
598609

610+
case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
611+
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
612+
break;
613+
599614
default: return false;
600615
}
601616
param->dwMaxVideoFrameSize = frame_size;

0 commit comments

Comments
 (0)