[FFmpeg-devel] [PATCH 2/3] examples/decoding_encoding: upgrade to encode_video2.

Nicolas George nicolas.george at normalesup.org
Thu Apr 12 11:32:58 CEST 2012


Signed-off-by: Nicolas George <nicolas.george at normalesup.org>
---
 doc/examples/decoding_encoding.c |   52 +++++++++++++++++++++++---------------
 1 file changed, 31 insertions(+), 21 deletions(-)

diff --git a/doc/examples/decoding_encoding.c b/doc/examples/decoding_encoding.c
index 1262611..5a4a1ec 100644
--- a/doc/examples/decoding_encoding.c
+++ b/doc/examples/decoding_encoding.c
@@ -228,10 +228,11 @@ static void video_encode_example(const char *filename, int codec_id)
 {
     AVCodec *codec;
     AVCodecContext *c= NULL;
-    int i, out_size, size, x, y, outbuf_size;
+    int i, ret, got_packet, x, y;
     FILE *f;
     AVFrame *picture;
-    uint8_t *outbuf;
+    AVPacket packet;
+    uint8_t sequence_end_code[] = { 0x00, 0x00, 0x01, 0xb7 };
 
     printf("Video encoding\n");
 
@@ -271,10 +272,6 @@ static void video_encode_example(const char *filename, int codec_id)
         exit(1);
     }
 
-    /* alloc image and output buffer */
-    outbuf_size = 100000 + 12*c->width*c->height;
-    outbuf = malloc(outbuf_size);
-
     /* the image can be allocated by any means and av_image_alloc() is
      * just the most convenient way if av_malloc() is to be used */
     av_image_alloc(picture->data, picture->linesize,
@@ -299,29 +296,42 @@ static void video_encode_example(const char *filename, int codec_id)
             }
         }
 
+        picture->pts = i;
+
         /* encode the image */
-        out_size = avcodec_encode_video(c, outbuf, outbuf_size, picture);
-        printf("encoding frame %3d (size=%5d)\n", i, out_size);
-        fwrite(outbuf, 1, out_size, f);
+        av_init_packet(&packet);
+        packet.data = NULL;
+        packet.size = 0;
+        got_packet = 0;
+        ret = avcodec_encode_video2(c, &packet, picture, &got_packet);
+        if (ret < 0) {
+            fprintf(stderr, "Video encoding failed.\n");
+            exit(1);
+        }
+        if (got_packet) {
+            printf("got packet after frame %3d (size=%5d)\n", i, packet.size);
+            fwrite(packet.data, 1, packet.size, f);
+            av_destruct_packet(&packet);
+        }
     }
 
     /* get the delayed frames */
-    for(; out_size; i++) {
-        fflush(stdout);
-
-        out_size = avcodec_encode_video(c, outbuf, outbuf_size, NULL);
-        printf("write frame %3d (size=%5d)\n", i, out_size);
-        fwrite(outbuf, 1, out_size, f);
+    while (1) {
+        av_init_packet(&packet);
+        packet.data = NULL;
+        packet.size = 0;
+        got_packet = 0;
+        ret = avcodec_encode_video2(c, &packet, NULL, &got_packet);
+        if (ret < 0 || !got_packet)
+            break;
+        printf("got extra packet (size=%5d)\n", packet.size);
+        fwrite(packet.data, 1, packet.size, f);
+        av_destruct_packet(&packet);
     }
 
     /* add sequence end code to have a real mpeg file */
-    outbuf[0] = 0x00;
-    outbuf[1] = 0x00;
-    outbuf[2] = 0x01;
-    outbuf[3] = 0xb7;
-    fwrite(outbuf, 1, 4, f);
+    fwrite(sequence_end_code, 1, sizeof(sequence_end_code), f);
     fclose(f);
-    free(outbuf);
 
     avcodec_close(c);
     av_free(c);
-- 
1.7.9.5



More information about the ffmpeg-devel mailing list