examples/encode_video: allocate the packet dynamically
authorAnton Khirnov <anton@khirnov.net>
Thu, 20 Oct 2016 09:03:20 +0000 (11:03 +0200)
committerAnton Khirnov <anton@khirnov.net>
Wed, 23 Nov 2016 12:10:22 +0000 (13:10 +0100)
AVPackets on stack are discouraged.

doc/examples/encode_video.c

index 2ff6354..cb12836 100644 (file)
@@ -69,7 +69,7 @@ int main(int argc, char **argv)
     int i, ret, x, y;
     FILE *f;
     AVFrame *picture;
-    AVPacket pkt;
+    AVPacket *pkt;
     uint8_t endcode[] = { 0, 0, 1, 0xb7 };
 
     if (argc <= 1) {
@@ -90,6 +90,10 @@ int main(int argc, char **argv)
     c = avcodec_alloc_context3(codec);
     picture = av_frame_alloc();
 
+    pkt = av_packet_alloc();
+    if (!pkt)
+        exit(1);
+
     /* put sample parameters */
     c->bit_rate = 400000;
     /* resolution must be a multiple of two */
@@ -127,10 +131,6 @@ int main(int argc, char **argv)
 
     /* encode 1 second of video */
     for(i=0;i<25;i++) {
-        av_init_packet(&pkt);
-        pkt.data = NULL;    // packet data will be allocated by the encoder
-        pkt.size = 0;
-
         fflush(stdout);
 
         /* make sure the frame data is writable */
@@ -157,11 +157,11 @@ int main(int argc, char **argv)
         picture->pts = i;
 
         /* encode the image */
-        encode(c, picture, &pkt, f);
+        encode(c, picture, pkt, f);
     }
 
     /* flush the encoder */
-    encode(c, NULL, &pkt, f);
+    encode(c, NULL, pkt, f);
 
     /* add sequence end code to have a real MPEG file */
     fwrite(endcode, 1, sizeof(endcode), f);
@@ -169,6 +169,7 @@ int main(int argc, char **argv)
 
     avcodec_free_context(&c);
     av_frame_free(&picture);
+    av_packet_free(&pkt);
 
     return 0;
 }