output example: use the new AVFrame API for allocating the video frame
This commit is contained in:
@@ -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)
|
|||||||
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)
|
|||||||
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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************/
|
/**************************************************************/
|
||||||
|
Reference in New Issue
Block a user