@@ -33,12 +33,149 @@ static ssize_t sendall(int sock, const void *buf, size_t len)
33
33
return 0 ;
34
34
}
35
35
36
+ #if DT_HAS_CHOSEN (zephyr_videoenc )
37
+ const struct device * encoder_dev = NULL ;
38
+
39
+ int configure_encoder ()
40
+ {
41
+ struct video_buffer * buffer ;
42
+ struct video_format fmt ;
43
+ struct video_caps caps ;
44
+ uint32_t size ;
45
+ int i = 0 ;
46
+
47
+ encoder_dev = DEVICE_DT_GET (DT_CHOSEN (zephyr_videoenc ));
48
+ if (!device_is_ready (encoder_dev )) {
49
+ LOG_ERR ("%s: encoder video device not ready." ,
50
+ encoder_dev -> name );
51
+ return -1 ;
52
+ }
53
+
54
+ /* Get capabilities */
55
+ caps .type = VIDEO_BUF_TYPE_OUTPUT ;
56
+ if (video_get_caps (encoder_dev , & caps )) {
57
+ LOG_ERR ("Unable to retrieve video capabilities" );
58
+ return -1 ;
59
+ }
60
+
61
+ LOG_INF ("- Capabilities:" );
62
+ while (caps .format_caps [i ].pixelformat ) {
63
+ const struct video_format_cap * fcap = & caps .format_caps [i ];
64
+ /* fourcc to string */
65
+ LOG_INF (" %s width [%u; %u; %u] height [%u; %u; %u]" ,
66
+ VIDEO_FOURCC_TO_STR (fcap -> pixelformat ),
67
+ fcap -> width_min , fcap -> width_max , fcap -> width_step ,
68
+ fcap -> height_min , fcap -> height_max , fcap -> height_step );
69
+ i ++ ;
70
+ }
71
+
72
+ /* Get default/native format */
73
+ fmt .type = VIDEO_BUF_TYPE_OUTPUT ;
74
+ if (video_get_format (encoder_dev , & fmt )) {
75
+ LOG_ERR ("Unable to retrieve video format" );
76
+ return -1 ;
77
+ }
78
+
79
+ printk ("Video encoder device detected, format: %s %ux%u\n" ,
80
+ VIDEO_FOURCC_TO_STR (fmt .pixelformat ), fmt .width , fmt .height );
81
+
82
+ #if CONFIG_VIDEO_FRAME_HEIGHT
83
+ fmt .height = CONFIG_VIDEO_FRAME_HEIGHT ;
84
+ #endif
85
+
86
+ #if CONFIG_VIDEO_FRAME_WIDTH
87
+ fmt .width = CONFIG_VIDEO_FRAME_WIDTH ;
88
+ #endif
89
+
90
+ /* Set output format */
91
+ if (strcmp (CONFIG_VIDEO_ENCODED_PIXEL_FORMAT , "" )) {
92
+ fmt .pixelformat = VIDEO_FOURCC_FROM_STR (CONFIG_VIDEO_ENCODED_PIXEL_FORMAT );
93
+ }
94
+
95
+ LOG_INF ("- Video encoded format: %s %ux%u" ,
96
+ VIDEO_FOURCC_TO_STR (fmt .pixelformat ), fmt .width , fmt .height );
97
+
98
+ fmt .type = VIDEO_BUF_TYPE_OUTPUT ;
99
+ if (video_set_format (encoder_dev , & fmt )) {
100
+ LOG_ERR ("Unable to set format" );
101
+ return -1 ;
102
+ }
103
+
104
+ /* Alloc output buffer */
105
+ size = fmt .sizeimage ;
106
+ if (size == 0 ) {
107
+ LOG_ERR ("Encoder driver must set sizeimage" );
108
+ return -1 ;
109
+ }
110
+ buffer = video_buffer_aligned_alloc (size , CONFIG_VIDEO_BUFFER_POOL_ALIGN ,
111
+ K_FOREVER );
112
+ if (buffer == NULL ) {
113
+ LOG_ERR ("Unable to alloc compressed video buffer size=%d" , size );
114
+ return -1 ;
115
+ }
116
+ buffer -> type = VIDEO_BUF_TYPE_OUTPUT ;
117
+ video_enqueue (encoder_dev , buffer );
118
+
119
+ /* Set input format */
120
+ if (strcmp (CONFIG_VIDEO_PIXEL_FORMAT , "" )) {
121
+ fmt .pixelformat = VIDEO_FOURCC_FROM_STR (CONFIG_VIDEO_PIXEL_FORMAT );
122
+ }
123
+
124
+ LOG_INF ("- Video input format: %s %ux%u" ,
125
+ VIDEO_FOURCC_TO_STR (fmt .pixelformat ), fmt .width , fmt .height );
126
+
127
+ fmt .type = VIDEO_BUF_TYPE_INPUT ;
128
+ if (video_set_format (encoder_dev , & fmt )) {
129
+ LOG_ERR ("Unable to set input format" );
130
+ return 0 ;
131
+ }
132
+
133
+ /* Start video encoder */
134
+ if (video_stream_start (encoder_dev , VIDEO_BUF_TYPE_INPUT )) {
135
+ LOG_ERR ("Unable to start video encoder (input)" );
136
+ return -1 ;
137
+ }
138
+ if (video_stream_start (encoder_dev , VIDEO_BUF_TYPE_OUTPUT )) {
139
+ LOG_ERR ("Unable to start video encoder (output)" );
140
+ return -1 ;
141
+ }
142
+
143
+ return 0 ;
144
+ }
145
+
146
+ int encode_frame (struct video_buffer * in , struct video_buffer * * out )
147
+ {
148
+ int ret ;
149
+
150
+ in -> type = VIDEO_BUF_TYPE_INPUT ;
151
+ video_enqueue (encoder_dev , in );
152
+
153
+ (* out )-> type = VIDEO_BUF_TYPE_OUTPUT ;
154
+ ret = video_dequeue (encoder_dev , out , K_FOREVER );
155
+ if (ret ) {
156
+ LOG_ERR ("Unable to dequeue encoder buf" );
157
+ return ret ;
158
+ }
159
+
160
+ return 0 ;
161
+ }
162
+
163
+ void stop_encoder (void )
164
+ {
165
+ if (video_stream_stop (encoder_dev , VIDEO_BUF_TYPE_OUTPUT ))
166
+ LOG_ERR ("Unable to stop encoder" );
167
+ }
168
+ #endif
169
+
36
170
int main (void )
37
171
{
38
172
struct sockaddr_in addr , client_addr ;
39
173
socklen_t client_addr_len = sizeof (client_addr );
40
174
struct video_buffer * buffers [CONFIG_VIDEO_CAPTURE_N_BUFFERING ];
41
175
struct video_buffer * vbuf = & (struct video_buffer ){};
176
+ #if DT_HAS_CHOSEN (zephyr_videoenc )
177
+ struct video_buffer * vbuf_out = & (struct video_buffer ){};
178
+ #endif
42
179
int ret , sock , client ;
43
180
struct video_format fmt ;
44
181
struct video_caps caps ;
@@ -269,6 +406,13 @@ int main(void)
269
406
270
407
printk ("TCP: Accepted connection\n" );
271
408
409
+ #if DT_HAS_CHOSEN (zephyr_videoenc )
410
+ if (configure_encoder ()) {
411
+ LOG_ERR ("Unable to configure video encoder" );
412
+ return 0 ;
413
+ }
414
+ #endif
415
+
272
416
/* Enqueue Buffers */
273
417
for (i = 0 ; i < ARRAY_SIZE (buffers ); i ++ ) {
274
418
video_enqueue (video_dev , buffers [i ]);
@@ -292,16 +436,27 @@ int main(void)
292
436
return 0 ;
293
437
}
294
438
295
- printk ("\rSending frame %d\n" , i ++ );
439
+ #if DT_HAS_CHOSEN (zephyr_videoenc )
440
+ encode_frame (vbuf , & vbuf_out );
296
441
442
+ printk ("\rSending compressed frame %d (size=%d bytes)\n" , i ++ , vbuf_out -> bytesused );
443
+ /* Send compressed video buffer to TCP client */
444
+ ret = sendall (client , vbuf_out -> buffer , vbuf_out -> bytesused );
445
+
446
+ vbuf_out -> type = VIDEO_BUF_TYPE_OUTPUT ;
447
+ video_enqueue (encoder_dev , vbuf_out );
448
+ #else
449
+ printk ("\rSending frame %d\n" , i ++ );
297
450
/* Send video buffer to TCP client */
298
451
ret = sendall (client , vbuf -> buffer , vbuf -> bytesused );
452
+ #endif
299
453
if (ret && ret != - EAGAIN ) {
300
454
/* client disconnected */
301
455
printk ("\nTCP: Client disconnected %d\n" , ret );
302
456
close (client );
303
457
}
304
458
459
+ vbuf -> type = VIDEO_BUF_TYPE_INPUT ;
305
460
(void )video_enqueue (video_dev , vbuf );
306
461
} while (!ret );
307
462
@@ -311,8 +466,13 @@ int main(void)
311
466
return 0 ;
312
467
}
313
468
469
+ #if DT_HAS_CHOSEN (zephyr_videoenc )
470
+ stop_encoder ();
471
+ #endif
472
+
314
473
/* Flush remaining buffers */
315
474
do {
475
+ vbuf -> type = VIDEO_BUF_TYPE_INPUT ;
316
476
ret = video_dequeue (video_dev , & vbuf , K_NO_WAIT );
317
477
} while (!ret );
318
478
0 commit comments