@@ -116,31 +116,27 @@ static unsigned frame_num[CFG_TUD_VIDEO_STREAMING] = {1};
116
116
static unsigned tx_busy = 0 ;
117
117
static unsigned interval_ms [CFG_TUD_VIDEO_STREAMING ] = {1000 / FRAME_RATE };
118
118
119
- #ifdef CFG_EXAMPLE_VIDEO_READONLY
120
119
// For mcus that does not have enough SRAM for frame buffer, we use fixed frame data.
121
120
// To further reduce the size, we use MJPEG format instead of YUY2.
122
121
#include "images.h"
123
122
124
- #if !defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG )
125
123
static struct {
126
124
uint32_t size ;
127
125
uint8_t const * buffer ;
128
- } const frames [] = {
129
- { color_bar_0_jpg_len , color_bar_0_jpg },
130
- { color_bar_1_jpg_len , color_bar_1_jpg },
131
- { color_bar_2_jpg_len , color_bar_2_jpg },
132
- { color_bar_3_jpg_len , color_bar_3_jpg },
133
- { color_bar_4_jpg_len , color_bar_4_jpg },
134
- { color_bar_5_jpg_len , color_bar_5_jpg },
135
- { color_bar_6_jpg_len , color_bar_6_jpg },
136
- { color_bar_7_jpg_len , color_bar_7_jpg },
126
+ } const framebuf_mjpeg [] = {
127
+ { sizeof ( color_bar_0_jpg ) , color_bar_0_jpg },
128
+ { sizeof ( color_bar_1_jpg ) , color_bar_1_jpg },
129
+ { sizeof ( color_bar_2_jpg ) , color_bar_2_jpg },
130
+ { sizeof ( color_bar_3_jpg ) , color_bar_3_jpg },
131
+ { sizeof ( color_bar_4_jpg ) , color_bar_4_jpg },
132
+ { sizeof ( color_bar_5_jpg ) , color_bar_5_jpg },
133
+ { sizeof ( color_bar_6_jpg ) , color_bar_6_jpg },
134
+ { sizeof ( color_bar_7_jpg ) , color_bar_7_jpg },
137
135
};
138
- #endif
139
-
140
- #else
141
136
142
137
// YUY2 frame buffer
143
- static uint8_t frame_buffer [2 ][FRAME_WIDTH * FRAME_HEIGHT * 16 / 8 ];
138
+ #define FRAMEBUF_SIZE (FRAME_WIDTH * FRAME_HEIGHT * 16 / 8)
139
+ static uint8_t framebuf_yuy2 [FRAMEBUF_SIZE ];
144
140
145
141
static void fill_color_bar (uint8_t * buffer , unsigned start_position ) {
146
142
/* EBU color bars: https://stackoverflow.com/questions/6939422 */
@@ -179,7 +175,26 @@ static void fill_color_bar(uint8_t* buffer, unsigned start_position) {
179
175
}
180
176
}
181
177
182
- #endif
178
+ size_t get_framebuf (uint_fast8_t ctl_idx , uint_fast8_t stm_idx , size_t fnum , void * * fb ) {
179
+ uint32_t idx = ctl_idx + stm_idx ;
180
+
181
+ if (idx == 0 ) {
182
+ // stream 0 use uncompressed YUY2 frame
183
+ fill_color_bar (framebuf_yuy2 , frame_num [idx ]);
184
+ * fb = framebuf_yuy2 ;
185
+ return FRAMEBUF_SIZE ;
186
+ }else {
187
+ // stream 1 use MJPEG frame
188
+ size_t const bar_id = fnum & 0x7 ;
189
+
190
+ * fb = (void * )(uintptr_t ) framebuf_mjpeg [bar_id ].buffer ;
191
+ return framebuf_mjpeg [bar_id ].size ;
192
+ }
193
+ }
194
+
195
+ //--------------------------------------------------------------------+
196
+ //
197
+ //--------------------------------------------------------------------+
183
198
184
199
void video_send_frame (uint_fast8_t ctl_idx , uint_fast8_t stm_idx ) {
185
200
static unsigned start_ms [CFG_TUD_VIDEO_STREAMING ] = {0 , };
@@ -191,22 +206,16 @@ void video_send_frame(uint_fast8_t ctl_idx, uint_fast8_t stm_idx) {
191
206
frame_num [idx ] = 0 ;
192
207
return ;
193
208
}
209
+ void * fp ;
210
+ size_t fb_size ;
194
211
195
212
if (!(already_sent & (1u << idx ))) {
196
213
already_sent |= 1u << idx ;
197
214
tx_busy |= 1u << idx ;
198
215
start_ms [idx ] = board_millis ();
199
- #ifdef CFG_EXAMPLE_VIDEO_READONLY
200
- #if defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG )
201
- tud_video_n_frame_xfer (ctl_idx , stm_idx , (void * )(uintptr_t )& frame_buffer [(frame_num [idx ] % (FRAME_WIDTH / 2 )) * 4 ],
202
- FRAME_WIDTH * FRAME_HEIGHT * 16 /8 );
203
- #else
204
- tud_video_n_frame_xfer (ctl_idx , stm_idx , (void * )(uintptr_t )frames [frame_num [idx ] % 8 ].buffer , frames [frame_num [idx ] % 8 ].size );
205
- #endif
206
- #else
207
- fill_color_bar (frame_buffer [idx ], frame_num [idx ]);
208
- tud_video_n_frame_xfer (ctl_idx , stm_idx , (void * ) frame_buffer [idx ], FRAME_WIDTH * FRAME_HEIGHT * 16 / 8 );
209
- #endif
216
+
217
+ fb_size = get_framebuf (ctl_idx , stm_idx , frame_num [idx ], & fp );
218
+ tud_video_n_frame_xfer (ctl_idx , stm_idx , fp , fb_size );
210
219
}
211
220
212
221
unsigned cur = board_millis ();
@@ -215,17 +224,8 @@ void video_send_frame(uint_fast8_t ctl_idx, uint_fast8_t stm_idx) {
215
224
start_ms [idx ] += interval_ms [idx ];
216
225
tx_busy |= 1u << idx ;
217
226
218
- #ifdef CFG_EXAMPLE_VIDEO_READONLY
219
- #if defined(CFG_EXAMPLE_VIDEO_DISABLE_MJPEG )
220
- tud_video_n_frame_xfer (ctl_idx , stm_idx , (void * )(uintptr_t )& frame_buffer [(frame_num [idx ] % (FRAME_WIDTH / 2 )) * 4 ],
221
- FRAME_WIDTH * FRAME_HEIGHT * 16 /8 );
222
- #else
223
- tud_video_n_frame_xfer (ctl_idx , stm_idx , (void * )(uintptr_t )frames [frame_num [idx ] % 8 ].buffer , frames [frame_num [idx ] % 8 ].size );
224
- #endif
225
- #else
226
- fill_color_bar (frame_buffer [idx ], frame_num [idx ]);
227
- tud_video_n_frame_xfer (ctl_idx , stm_idx , (void * ) frame_buffer [idx ], FRAME_WIDTH * FRAME_HEIGHT * 16 / 8 );
228
- #endif
227
+ fb_size = get_framebuf (ctl_idx , stm_idx , frame_num [idx ], & fp );
228
+ tud_video_n_frame_xfer (ctl_idx , stm_idx , fp , fb_size );
229
229
}
230
230
231
231
0 commit comments