[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