Skip to content

Commit 5ce60c5

Browse files
committed
Add MJPEG descriptor for bulk transfer
1 parent 993b8d6 commit 5ce60c5

File tree

2 files changed

+74
-8
lines changed

2 files changed

+74
-8
lines changed

examples/device/video_capture/src/usb_descriptors.c

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,17 @@ uint8_t const * tud_descriptor_device_cb(void)
7676
//--------------------------------------------------------------------+
7777

7878
#if defined(CFG_EXAMPLE_VIDEO_READONLY) && !defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)
79-
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_VIDEO_CAPTURE_DESC_MJPEG_LEN)
80-
#elif 1 == CFG_TUD_VIDEO_STREAMING_BULK
81-
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_VIDEO_CAPTURE_DESC_UNCOMPR_BULK_LEN)
79+
# if 1 == CFG_TUD_VIDEO_STREAMING_BULK
80+
# define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_VIDEO_CAPTURE_DESC_MJPEG_BULK_LEN)
81+
# else
82+
# define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_VIDEO_CAPTURE_DESC_MJPEG_LEN)
83+
# endif
8284
#else
83-
#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_VIDEO_CAPTURE_DESC_UNCOMPR_LEN)
85+
# if 1 == CFG_TUD_VIDEO_STREAMING_BULK
86+
# define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_VIDEO_CAPTURE_DESC_UNCOMPR_BULK_LEN)
87+
# else
88+
# define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_VIDEO_CAPTURE_DESC_UNCOMPR_LEN)
89+
# endif
8490
#endif
8591

8692
#if TU_CHECK_MCU(OPT_MCU_LPC175X_6X, OPT_MCU_LPC177X_8X, OPT_MCU_LPC40XX)
@@ -108,17 +114,25 @@ uint8_t const desc_fs_configuration[] =
108114

109115
// IAD for Video Control
110116
#if defined(CFG_EXAMPLE_VIDEO_READONLY) && !defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)
117+
# if 1 == CFG_TUD_VIDEO_STREAMING_BULK
118+
TUD_VIDEO_CAPTURE_DESCRIPTOR_MJPEG_BULK(4, EPNUM_VIDEO_IN,
119+
FRAME_WIDTH, FRAME_HEIGHT, FRAME_RATE,
120+
64)
121+
# else
111122
TUD_VIDEO_CAPTURE_DESCRIPTOR_MJPEG(4, EPNUM_VIDEO_IN,
112123
FRAME_WIDTH, FRAME_HEIGHT, FRAME_RATE,
113124
CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE)
114-
#elif 1 == CFG_TUD_VIDEO_STREAMING_BULK
115-
TUD_VIDEO_CAPTURE_DESCRIPTOR_UNCOMPR_BULK(4, EPNUM_VIDEO_IN,
116-
FRAME_WIDTH, FRAME_HEIGHT, FRAME_RATE,
117-
64)
125+
# endif
118126
#else
127+
# if 1 == CFG_TUD_VIDEO_STREAMING_BULK
128+
TUD_VIDEO_CAPTURE_DESCRIPTOR_UNCOMPR_BULK(4, EPNUM_VIDEO_IN,
129+
FRAME_WIDTH, FRAME_HEIGHT, FRAME_RATE,
130+
64)
131+
# else
119132
TUD_VIDEO_CAPTURE_DESCRIPTOR_UNCOMPR(4, EPNUM_VIDEO_IN,
120133
FRAME_WIDTH, FRAME_HEIGHT, FRAME_RATE,
121134
CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE)
135+
# endif
122136
#endif
123137
};
124138

examples/device/video_capture/src/usb_descriptors.h

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,22 @@ enum {
9595
+ 7/* Endpoint */\
9696
)
9797

98+
#define TUD_VIDEO_CAPTURE_DESC_MJPEG_BULK_LEN (\
99+
TUD_VIDEO_DESC_IAD_LEN\
100+
/* control */\
101+
+ TUD_VIDEO_DESC_STD_VC_LEN\
102+
+ (TUD_VIDEO_DESC_CS_VC_LEN + 1/*bInCollection*/)\
103+
+ TUD_VIDEO_DESC_CAMERA_TERM_LEN\
104+
+ TUD_VIDEO_DESC_OUTPUT_TERM_LEN\
105+
/* Interface 1, Alternate 0 */\
106+
+ TUD_VIDEO_DESC_STD_VS_LEN\
107+
+ (TUD_VIDEO_DESC_CS_VS_IN_LEN + 1/*bNumFormats x bControlSize*/)\
108+
+ TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN\
109+
+ TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN\
110+
+ TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN\
111+
+ 7/* Endpoint */\
112+
)
113+
98114
/* Windows support YUY2 and NV12
99115
* https://docs.microsoft.com/en-us/windows-hardware/drivers/stream/usb-video-class-driver-overview */
100116

@@ -216,4 +232,40 @@ enum {
216232
TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \
217233
TUD_VIDEO_DESC_EP_BULK(_epin, _epsize, 1)
218234

235+
#define TUD_VIDEO_CAPTURE_DESCRIPTOR_MJPEG_BULK(_stridx, _epin, _width, _height, _fps, _epsize) \
236+
TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \
237+
/* Video control 0 */ \
238+
TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx), \
239+
TUD_VIDEO_DESC_CS_VC( /* UVC 1.5*/ 0x0150, \
240+
/* wTotalLength - bLength */ \
241+
TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, \
242+
UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \
243+
TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0,\
244+
/*wObjectiveFocalLengthMin*/0, /*wObjectiveFocalLengthMax*/0,\
245+
/*wObjectiveFocalLength*/0, /*bmControls*/0), \
246+
TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \
247+
/* Video stream alt. 0 */ \
248+
TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 1, _stridx), \
249+
/* Video stream header for without still image capture */ \
250+
TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \
251+
/*wTotalLength - bLength */\
252+
TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN\
253+
+ TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN\
254+
+ TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\
255+
_epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \
256+
/*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \
257+
/*bmaControls(1)*/0), \
258+
/* Video stream format */ \
259+
TUD_VIDEO_DESC_CS_VS_FMT_MJPEG(/*bFormatIndex*/1, /*bNumFrameDescriptors*/1, \
260+
/*bmFlags*/0, /*bDefaultFrameIndex*/1, 0, 0, 0, /*bCopyProtect*/0), \
261+
/* Video stream frame format */ \
262+
TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT(/*bFrameIndex */1, 0, _width, _height, \
263+
_width * _height * 16, _width * _height * 16 * _fps, \
264+
_width * _height * 16 / 8, \
265+
(10000000/_fps), (10000000/_fps), (10000000/_fps)*_fps, (10000000/_fps)), \
266+
TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(VIDEO_COLOR_PRIMARIES_BT709, VIDEO_COLOR_XFER_CH_BT709, VIDEO_COLOR_COEF_SMPTE170M), \
267+
/* EP */ \
268+
TUD_VIDEO_DESC_EP_BULK(_epin, _epsize, 1)
269+
270+
219271
#endif

0 commit comments

Comments
 (0)