Commit 589a6042 authored by Ronald S. Bultje's avatar Ronald S. Bultje Committed by Michael Niedermayer

avutil: make AVFrameSideData buffers ref-counted.

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent b8e36690
...@@ -115,7 +115,7 @@ static void free_side_data(AVFrameSideData **ptr_sd) ...@@ -115,7 +115,7 @@ static void free_side_data(AVFrameSideData **ptr_sd)
{ {
AVFrameSideData *sd = *ptr_sd; AVFrameSideData *sd = *ptr_sd;
av_freep(&sd->data); av_buffer_unref(&sd->buf);
av_dict_free(&sd->metadata); av_dict_free(&sd->metadata);
av_freep(ptr_sd); av_freep(ptr_sd);
} }
...@@ -275,7 +275,7 @@ int av_frame_get_buffer(AVFrame *frame, int align) ...@@ -275,7 +275,7 @@ int av_frame_get_buffer(AVFrame *frame, int align)
return AVERROR(EINVAL); return AVERROR(EINVAL);
} }
int av_frame_copy_props(AVFrame *dst, const AVFrame *src) static int frame_copy_props(AVFrame *dst, const AVFrame *src, int force_copy)
{ {
int i; int i;
...@@ -320,13 +320,28 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src) ...@@ -320,13 +320,28 @@ int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
if ( sd_src->type == AV_FRAME_DATA_PANSCAN if ( sd_src->type == AV_FRAME_DATA_PANSCAN
&& (src->width != dst->width || src->height != dst->height)) && (src->width != dst->width || src->height != dst->height))
continue; continue;
sd_dst = av_frame_new_side_data(dst, sd_src->type, if (force_copy) {
sd_src->size); sd_dst = av_frame_new_side_data(dst, sd_src->type,
if (!sd_dst) { sd_src->size);
wipe_side_data(dst); if (!sd_dst) {
return AVERROR(ENOMEM); wipe_side_data(dst);
return AVERROR(ENOMEM);
}
memcpy(sd_dst->data, sd_src->data, sd_src->size);
} else {
sd_dst = av_frame_new_side_data(dst, sd_src->type, 0);
if (!sd_dst) {
wipe_side_data(dst);
return AVERROR(ENOMEM);
}
sd_dst->buf = av_buffer_ref(sd_src->buf);
if (!sd_dst->buf) {
wipe_side_data(dst);
return AVERROR(ENOMEM);
}
sd_dst->data = sd_dst->buf->data;
sd_dst->size = sd_dst->buf->size;
} }
memcpy(sd_dst->data, sd_src->data, sd_src->size);
av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0); av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
} }
...@@ -356,7 +371,7 @@ int av_frame_ref(AVFrame *dst, const AVFrame *src) ...@@ -356,7 +371,7 @@ int av_frame_ref(AVFrame *dst, const AVFrame *src)
dst->channel_layout = src->channel_layout; dst->channel_layout = src->channel_layout;
dst->nb_samples = src->nb_samples; dst->nb_samples = src->nb_samples;
ret = av_frame_copy_props(dst, src); ret = frame_copy_props(dst, src, 0);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -530,6 +545,11 @@ int av_frame_make_writable(AVFrame *frame) ...@@ -530,6 +545,11 @@ int av_frame_make_writable(AVFrame *frame)
return 0; return 0;
} }
int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
{
return frame_copy_props(dst, src, 1);
}
AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane) AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane)
{ {
uint8_t *data; uint8_t *data;
...@@ -580,13 +600,16 @@ AVFrameSideData *av_frame_new_side_data(AVFrame *frame, ...@@ -580,13 +600,16 @@ AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
if (!ret) if (!ret)
return NULL; return NULL;
ret->data = av_malloc(size); if (size > 0) {
if (!ret->data) { ret->buf = av_buffer_alloc(size);
av_freep(&ret); if (!ret->buf) {
return NULL; av_freep(&ret);
} return NULL;
}
ret->size = size; ret->data = ret->buf->data;
ret->size = size;
}
ret->type = type; ret->type = type;
frame->side_data[frame->nb_side_data++] = ret; frame->side_data[frame->nb_side_data++] = ret;
......
...@@ -136,6 +136,7 @@ typedef struct AVFrameSideData { ...@@ -136,6 +136,7 @@ typedef struct AVFrameSideData {
uint8_t *data; uint8_t *data;
int size; int size;
AVDictionary *metadata; AVDictionary *metadata;
AVBufferRef *buf;
} AVFrameSideData; } AVFrameSideData;
/** /**
......
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