@@ -33,12 +33,154 @@ 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
+
111
+ buffer = video_buffer_aligned_alloc (size , CONFIG_VIDEO_BUFFER_POOL_ALIGN ,
112
+ K_FOREVER );
113
+ if (buffer == NULL ) {
114
+ LOG_ERR ("Unable to alloc compressed video buffer size=%d" , size );
115
+ return -1 ;
116
+ }
117
+
118
+ buffer -> type = VIDEO_BUF_TYPE_OUTPUT ;
119
+ video_enqueue (encoder_dev , buffer );
120
+
121
+ /* Set input format */
122
+ if (strcmp (CONFIG_VIDEO_PIXEL_FORMAT , "" )) {
123
+ fmt .pixelformat = VIDEO_FOURCC_FROM_STR (CONFIG_VIDEO_PIXEL_FORMAT );
124
+ }
125
+
126
+ LOG_INF ("- Video input format: %s %ux%u" ,
127
+ VIDEO_FOURCC_TO_STR (fmt .pixelformat ), fmt .width , fmt .height );
128
+
129
+ fmt .type = VIDEO_BUF_TYPE_INPUT ;
130
+ if (video_set_format (encoder_dev , & fmt )) {
131
+ LOG_ERR ("Unable to set input format" );
132
+ return -1 ;
133
+ }
134
+
135
+ /* Start video encoder */
136
+ if (video_stream_start (encoder_dev , VIDEO_BUF_TYPE_INPUT )) {
137
+ LOG_ERR ("Unable to start video encoder (input)" );
138
+ return -1 ;
139
+ }
140
+ if (video_stream_start (encoder_dev , VIDEO_BUF_TYPE_OUTPUT )) {
141
+ LOG_ERR ("Unable to start video encoder (output)" );
142
+ return -1 ;
143
+ }
144
+
145
+ return 0 ;
146
+ }
147
+
148
+ int encode_frame (struct video_buffer * in , struct video_buffer * * out )
149
+ {
150
+ int ret ;
151
+
152
+ in -> type = VIDEO_BUF_TYPE_INPUT ;
153
+ video_enqueue (encoder_dev , in );
154
+
155
+ (* out )-> type = VIDEO_BUF_TYPE_OUTPUT ;
156
+ ret = video_dequeue (encoder_dev , out , K_FOREVER );
157
+ if (ret ) {
158
+ LOG_ERR ("Unable to dequeue encoder buf" );
159
+ return ret ;
160
+ }
161
+
162
+ return 0 ;
163
+ }
164
+
165
+ void stop_encoder (void )
166
+ {
167
+ if (video_stream_stop (encoder_dev , VIDEO_BUF_TYPE_OUTPUT ))
168
+ LOG_ERR ("Unable to stop encoder (output)" );
169
+
170
+ if (video_stream_stop (encoder_dev , VIDEO_BUF_TYPE_INPUT ))
171
+ LOG_ERR ("Unable to stop encoder (input)" );
172
+ }
173
+ #endif
174
+
36
175
int main (void )
37
176
{
38
177
struct sockaddr_in addr , client_addr ;
39
178
socklen_t client_addr_len = sizeof (client_addr );
40
179
struct video_buffer * buffers [CONFIG_VIDEO_CAPTURE_N_BUFFERING ];
41
180
struct video_buffer * vbuf = & (struct video_buffer ){};
181
+ #if DT_HAS_CHOSEN (zephyr_videoenc )
182
+ struct video_buffer * vbuf_out = & (struct video_buffer ){};
183
+ #endif
42
184
int ret , sock , client ;
43
185
struct video_format fmt ;
44
186
struct video_caps caps ;
@@ -269,6 +411,13 @@ int main(void)
269
411
270
412
printk ("TCP: Accepted connection\n" );
271
413
414
+ #if DT_HAS_CHOSEN (zephyr_videoenc )
415
+ if (configure_encoder ()) {
416
+ LOG_ERR ("Unable to configure video encoder" );
417
+ return 0 ;
418
+ }
419
+ #endif
420
+
272
421
/* Enqueue Buffers */
273
422
for (i = 0 ; i < ARRAY_SIZE (buffers ); i ++ ) {
274
423
video_enqueue (video_dev , buffers [i ]);
@@ -292,16 +441,27 @@ int main(void)
292
441
return 0 ;
293
442
}
294
443
295
- printk ("\rSending frame %d\n" , i ++ );
444
+ #if DT_HAS_CHOSEN (zephyr_videoenc )
445
+ encode_frame (vbuf , & vbuf_out );
296
446
447
+ printk ("\rSending compressed frame %d (size=%d bytes)\n" , i ++ , vbuf_out -> bytesused );
448
+ /* Send compressed video buffer to TCP client */
449
+ ret = sendall (client , vbuf_out -> buffer , vbuf_out -> bytesused );
450
+
451
+ vbuf_out -> type = VIDEO_BUF_TYPE_OUTPUT ;
452
+ video_enqueue (encoder_dev , vbuf_out );
453
+ #else
454
+ printk ("\rSending frame %d\n" , i ++ );
297
455
/* Send video buffer to TCP client */
298
456
ret = sendall (client , vbuf -> buffer , vbuf -> bytesused );
457
+ #endif
299
458
if (ret && ret != - EAGAIN ) {
300
459
/* client disconnected */
301
460
printk ("\nTCP: Client disconnected %d\n" , ret );
302
461
close (client );
303
462
}
304
463
464
+ vbuf -> type = VIDEO_BUF_TYPE_INPUT ;
305
465
(void )video_enqueue (video_dev , vbuf );
306
466
} while (!ret );
307
467
@@ -311,8 +471,13 @@ int main(void)
311
471
return 0 ;
312
472
}
313
473
474
+ #if DT_HAS_CHOSEN (zephyr_videoenc )
475
+ stop_encoder ();
476
+ #endif
477
+
314
478
/* Flush remaining buffers */
315
479
do {
480
+ vbuf -> type = VIDEO_BUF_TYPE_INPUT ;
316
481
ret = video_dequeue (video_dev , & vbuf , K_NO_WAIT );
317
482
} while (!ret );
318
483
0 commit comments