Skip to content

Commit 0b8b8af

Browse files
committed
minor update to video capture example
1 parent de12666 commit 0b8b8af

File tree

5 files changed

+92
-154
lines changed

5 files changed

+92
-154
lines changed

examples/device/video_capture/src/main.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,7 @@ static struct {
131131
static uint8_t frame_buffer[FRAME_WIDTH * FRAME_HEIGHT * 16 / 8];
132132

133133
static void fill_color_bar(uint8_t* buffer, unsigned start_position) {
134-
/* EBU color bars
135-
* See also https://stackoverflow.com/questions/6939422 */
134+
/* EBU color bars: https://stackoverflow.com/questions/6939422 */
136135
static uint8_t const bar_color[8][4] = {
137136
/* Y, U, Y, V */
138137
{ 235, 128, 235, 128}, /* 100% White */
@@ -184,12 +183,12 @@ void video_task(void) {
184183
already_sent = 1;
185184
start_ms = board_millis();
186185
#ifdef CFG_EXAMPLE_VIDEO_READONLY
187-
# if defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)
186+
#if defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)
188187
tud_video_n_frame_xfer(0, 0, (void*)(uintptr_t)&frame_buffer[(frame_num % (FRAME_WIDTH / 2)) * 4],
189188
FRAME_WIDTH * FRAME_HEIGHT * 16/8);
190-
# else
189+
#else
191190
tud_video_n_frame_xfer(0, 0, (void*)(uintptr_t)frames[frame_num % 8].buffer, frames[frame_num % 8].size);
192-
# endif
191+
#endif
193192
#else
194193
fill_color_bar(frame_buffer, frame_num);
195194
tud_video_n_frame_xfer(0, 0, (void*) frame_buffer, FRAME_WIDTH * FRAME_HEIGHT * 16 / 8);
@@ -202,12 +201,12 @@ void video_task(void) {
202201
start_ms += interval_ms;
203202

204203
#ifdef CFG_EXAMPLE_VIDEO_READONLY
205-
# if defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)
204+
#if defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG)
206205
tud_video_n_frame_xfer(0, 0, (void*)(uintptr_t)&frame_buffer[(frame_num % (FRAME_WIDTH / 2)) * 4],
207206
FRAME_WIDTH * FRAME_HEIGHT * 16/8);
208-
# else
207+
#else
209208
tud_video_n_frame_xfer(0, 0, (void*)(uintptr_t)frames[frame_num % 8].buffer, frames[frame_num % 8].size);
210-
# endif
209+
#endif
211210
#else
212211
fill_color_bar(frame_buffer, frame_num);
213212
tud_video_n_frame_xfer(0, 0, (void*) frame_buffer, FRAME_WIDTH * FRAME_HEIGHT * 16 / 8);

examples/device/video_capture/src/tusb_config.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@
9797
// The number of video streaming interfaces
9898
#define CFG_TUD_VIDEO_STREAMING 1
9999

100-
// video streaming endpoint size
100+
// video streaming endpoint buffer size
101101
#define CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE 256
102102

103103
// use bulk endpoint for streaming interface

examples/device/video_capture/src/usb_descriptors.h

Lines changed: 23 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -126,23 +126,17 @@ enum {
126126
#define TUD_VIDEO_CAPTURE_DESCRIPTOR_UNCOMPR(_stridx, _epin, _width, _height, _fps, _epsize) \
127127
TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \
128128
/* Video control 0 */ \
129-
TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx), \
130-
TUD_VIDEO_DESC_CS_VC( /* UVC 1.5*/ 0x0150, \
131-
/* wTotalLength - bLength */ \
132-
TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, \
133-
UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \
134-
TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0,\
135-
/*wObjectiveFocalLengthMin*/0, /*wObjectiveFocalLengthMax*/0,\
136-
/*wObjectiveFocalLength*/0, /*bmControls*/0), \
129+
TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx), \
130+
/* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \
131+
TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \
132+
/* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \
133+
TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \
137134
TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \
138135
/* Video stream alt. 0 */ \
139136
TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 0, _stridx), \
140137
/* Video stream header for without still image capture */ \
141138
TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \
142-
/*wTotalLength - bLength */\
143-
TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN\
144-
+ TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN\
145-
+ TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\
139+
/*wTotalLength - bLength */ TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\
146140
_epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \
147141
/*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \
148142
/*bmaControls(1)*/0), \
@@ -163,23 +157,17 @@ enum {
163157
#define TUD_VIDEO_CAPTURE_DESCRIPTOR_MJPEG(_stridx, _epin, _width, _height, _fps, _epsize) \
164158
TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \
165159
/* Video control 0 */ \
166-
TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx), \
167-
TUD_VIDEO_DESC_CS_VC( /* UVC 1.5*/ 0x0150, \
168-
/* wTotalLength - bLength */ \
169-
TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, \
170-
UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \
171-
TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0,\
172-
/*wObjectiveFocalLengthMin*/0, /*wObjectiveFocalLengthMax*/0,\
173-
/*wObjectiveFocalLength*/0, /*bmControls*/0), \
160+
TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx), \
161+
/* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \
162+
TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \
163+
/* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \
164+
TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \
174165
TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \
175166
/* Video stream alt. 0 */ \
176167
TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 0, _stridx), \
177168
/* Video stream header for without still image capture */ \
178169
TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \
179-
/*wTotalLength - bLength */\
180-
TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN\
181-
+ TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN\
182-
+ TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\
170+
/*wTotalLength - bLength */ TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\
183171
_epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \
184172
/*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \
185173
/*bmaControls(1)*/0), \
@@ -202,22 +190,17 @@ enum {
202190
TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \
203191
/* Video control 0 */ \
204192
TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx), \
205-
TUD_VIDEO_DESC_CS_VC( /* UVC 1.5*/ 0x0150, \
206-
/* wTotalLength - bLength */ \
207-
TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, \
208-
UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \
209-
TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0,\
210-
/*wObjectiveFocalLengthMin*/0, /*wObjectiveFocalLengthMax*/0,\
211-
/*wObjectiveFocalLength*/0, /*bmControls*/0), \
193+
/* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \
194+
TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \
195+
/* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \
196+
TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \
212197
TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \
213198
/* Video stream alt. 0 */ \
214199
TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 1, _stridx), \
215200
/* Video stream header for without still image capture */ \
216201
TUD_VIDEO_DESC_CS_VS_INPUT( /*bNumFormats*/1, \
217202
/*wTotalLength - bLength */\
218-
TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN\
219-
+ TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN\
220-
+ TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\
203+
TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN + TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\
221204
_epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \
222205
/*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \
223206
/*bmaControls(1)*/0), \
@@ -235,23 +218,17 @@ enum {
235218
#define TUD_VIDEO_CAPTURE_DESCRIPTOR_MJPEG_BULK(_stridx, _epin, _width, _height, _fps, _epsize) \
236219
TUD_VIDEO_DESC_IAD(ITF_NUM_VIDEO_CONTROL, /* 2 Interfaces */ 0x02, _stridx), \
237220
/* 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), \
221+
TUD_VIDEO_DESC_STD_VC(ITF_NUM_VIDEO_CONTROL, 0, _stridx), \
222+
/* Header: UVC 1.5, length of followed descs, clock (deprecated), streaming interfaces */ \
223+
TUD_VIDEO_DESC_CS_VC(0x0150, TUD_VIDEO_DESC_CAMERA_TERM_LEN + TUD_VIDEO_DESC_OUTPUT_TERM_LEN, UVC_CLOCK_FREQUENCY, ITF_NUM_VIDEO_STREAMING), \
224+
/* Camera Terminal: ID, bAssocTerminal, iTerminal, focal min, max, length, bmControl */ \
225+
TUD_VIDEO_DESC_CAMERA_TERM(UVC_ENTITY_CAP_INPUT_TERMINAL, 0, 0, 0, 0, 0, 0), \
246226
TUD_VIDEO_DESC_OUTPUT_TERM(UVC_ENTITY_CAP_OUTPUT_TERMINAL, VIDEO_TT_STREAMING, 0, 1, 0), \
247227
/* Video stream alt. 0 */ \
248228
TUD_VIDEO_DESC_STD_VS(ITF_NUM_VIDEO_STREAMING, 0, 1, _stridx), \
249229
/* Video stream header for without still image capture */ \
250230
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,\
231+
/*wTotalLength - bLength */ TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN + TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN + TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN,\
255232
_epin, /*bmInfo*/0, /*bTerminalLink*/UVC_ENTITY_CAP_OUTPUT_TERMINAL, \
256233
/*bStillCaptureMethod*/0, /*bTriggerSupport*/0, /*bTriggerUsage*/0, \
257234
/*bmaControls(1)*/0), \

src/class/video/video_device.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -434,8 +434,9 @@ static bool _update_streaming_parameters(videod_streaming_interface_t const *stm
434434
uint_fast32_t interval_ms = interval / 10000;
435435
TU_ASSERT(interval_ms);
436436
uint_fast32_t payload_size = (frame_size + interval_ms - 1) / interval_ms + 2;
437-
if (CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE < payload_size)
437+
if (CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE < payload_size) {
438438
payload_size = CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE;
439+
}
439440
param->dwMaxPayloadTransferSize = payload_size;
440441
return true;
441442
}
@@ -577,8 +578,9 @@ static bool _negotiate_streaming_parameters(videod_streaming_interface_t const *
577578
} else {
578579
payload_size = (frame_size + interval_ms - 1) / interval_ms + 2;
579580
}
580-
if (CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE < payload_size)
581+
if (CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE < payload_size) {
581582
payload_size = CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE;
583+
}
582584
param->dwMaxPayloadTransferSize = payload_size;
583585
}
584586
return true;

0 commit comments

Comments
 (0)