Commit 38d04442 authored by Anton Khirnov's avatar Anton Khirnov
Browse files

output example: use the new AVFrame API for allocating the video frame

parent 3f4edf01
...@@ -234,20 +234,23 @@ static AVStream *add_video_stream(AVFormatContext *oc, enum AVCodecID codec_id) ...@@ -234,20 +234,23 @@ static AVStream *add_video_stream(AVFormatContext *oc, enum AVCodecID codec_id)
static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height) static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
{ {
AVFrame *picture; AVFrame *picture;
uint8_t *picture_buf; int ret;
int size;
picture = av_frame_alloc(); picture = av_frame_alloc();
if (!picture) if (!picture)
return NULL; return NULL;
size = avpicture_get_size(pix_fmt, width, height);
picture_buf = av_malloc(size); picture->format = pix_fmt;
if (!picture_buf) { picture->width = width;
av_free(picture); picture->height = height;
return NULL;
/* allocate the buffers for the frame data */
ret = av_frame_get_buffer(picture, 32);
if (ret < 0) {
fprintf(stderr, "Could not allocate frame data.\n");
exit(1);
} }
avpicture_fill((AVPicture *)picture, picture_buf,
pix_fmt, width, height);
return picture; return picture;
} }
...@@ -287,7 +290,15 @@ static void open_video(AVFormatContext *oc, AVStream *st) ...@@ -287,7 +290,15 @@ static void open_video(AVFormatContext *oc, AVStream *st)
static void fill_yuv_image(AVFrame *pict, int frame_index, static void fill_yuv_image(AVFrame *pict, int frame_index,
int width, int height) int width, int height)
{ {
int x, y, i; int x, y, i, ret;
/* when we pass a frame to the encoder, it may keep a reference to it
* internally;
* make sure we do not overwrite it here
*/
ret = av_frame_make_writable(pict);
if (ret < 0)
exit(1);
i = frame_index; i = frame_index;
...@@ -381,12 +392,8 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st) ...@@ -381,12 +392,8 @@ static void write_video_frame(AVFormatContext *oc, AVStream *st)
static void close_video(AVFormatContext *oc, AVStream *st) static void close_video(AVFormatContext *oc, AVStream *st)
{ {
avcodec_close(st->codec); avcodec_close(st->codec);
av_free(picture->data[0]); av_frame_free(&picture);
av_free(picture); av_frame_free(&tmp_picture);
if (tmp_picture) {
av_free(tmp_picture->data[0]);
av_free(tmp_picture);
}
} }
/**************************************************************/ /**************************************************************/
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment