Skip to content

Commit 6243534

Browse files
lijunru-hubroma-jam
authored andcommitted
feat(uvc): support format frame based
1 parent eab1d0a commit 6243534

File tree

2 files changed

+54
-16
lines changed

2 files changed

+54
-16
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: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,9 @@ static bool _update_streaming_parameters(videod_streaming_interface_t const *stm
462462
case VIDEO_CS_ITF_VS_FORMAT_MJPEG:
463463
break;
464464

465+
case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
466+
break;
467+
465468
default: return false;
466469
}
467470

@@ -487,6 +490,10 @@ static bool _update_streaming_parameters(videod_streaming_interface_t const *stm
487490
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
488491
break;
489492

493+
case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
494+
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
495+
break;
496+
490497
default: break;
491498
}
492499
param->dwMaxVideoFrameSize = frame_size;
@@ -576,6 +583,10 @@ static bool _negotiate_streaming_parameters(videod_streaming_interface_t const *
576583
frmnum = fmt->mjpeg.bDefaultFrameIndex;
577584
break;
578585

586+
case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
587+
frmnum = fmt->frame_based.bDefaultFrameIndex;
588+
break;
589+
579590
default: return false;
580591
}
581592
break;
@@ -594,6 +605,10 @@ static bool _negotiate_streaming_parameters(videod_streaming_interface_t const *
594605
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
595606
break;
596607

608+
case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
609+
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
610+
break;
611+
597612
default: return false;
598613
}
599614
param->dwMaxVideoFrameSize = frame_size;

0 commit comments

Comments
 (0)