summaryrefslogtreecommitdiff
path: root/libavcodec/diracdec.c
diff options
context:
space:
mode:
Diffstat (limited to 'libavcodec/diracdec.c')
-rw-r--r--libavcodec/diracdec.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/libavcodec/diracdec.c b/libavcodec/diracdec.c
index a791e8835a..aa158bfae1 100644
--- a/libavcodec/diracdec.c
+++ b/libavcodec/diracdec.c
@@ -365,7 +365,7 @@ static void free_sequence_buffers(DiracContext *s)
for (i = 0; i < MAX_FRAMES; i++) {
if (s->all_frames[i].avframe.data[0]) {
- s->avctx->release_buffer(s->avctx, &s->all_frames[i].avframe);
+ av_frame_unref(&s->all_frames[i].avframe);
memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
}
@@ -1671,7 +1671,7 @@ static int dirac_decode_picture_header(DiracContext *s)
for (j = 0; j < MAX_FRAMES; j++)
if (!s->all_frames[j].avframe.data[0]) {
s->ref_pics[i] = &s->all_frames[j];
- ff_get_buffer(s->avctx, &s->ref_pics[i]->avframe);
+ ff_get_buffer(s->avctx, &s->ref_pics[i]->avframe, AV_GET_BUFFER_FLAG_REF);
break;
}
}
@@ -1712,6 +1712,7 @@ static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame)
{
DiracFrame *out = s->delay_frames[0];
int i, out_idx = 0;
+ int ret;
/* find frame with lowest picture number */
for (i = 1; s->delay_frames[i]; i++)
@@ -1726,7 +1727,8 @@ static int get_delayed_pic(DiracContext *s, AVFrame *picture, int *got_frame)
if (out) {
out->avframe.reference ^= DELAYED_PIC_REF;
*got_frame = 1;
- *(AVFrame *)picture = out->avframe;
+ if((ret = av_frame_ref(picture, &out->avframe)) < 0)
+ return ret;
}
return 0;
@@ -1809,7 +1811,7 @@ static int dirac_decode_data_unit(AVCodecContext *avctx, const uint8_t *buf, int
pic->avframe.key_frame = s->num_refs == 0; /* [DIRAC_STD] is_intra() */
pic->avframe.pict_type = s->num_refs + 1; /* Definition of AVPictureType in avutil.h */
- if (ff_get_buffer(avctx, &pic->avframe) < 0) {
+ if (ff_get_buffer(avctx, &pic->avframe, (parse_code & 0x0C) == 0x0C ? AV_GET_BUFFER_FLAG_REF : 0) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return -1;
}
@@ -1836,11 +1838,12 @@ static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
uint8_t *buf = pkt->data;
int buf_size = pkt->size;
int i, data_unit_size, buf_idx = 0;
+ int ret;
/* release unused frames */
for (i = 0; i < MAX_FRAMES; i++)
if (s->all_frames[i].avframe.data[0] && !s->all_frames[i].avframe.reference) {
- avctx->release_buffer(avctx, &s->all_frames[i].avframe);
+ av_frame_unref(&s->all_frames[i].avframe);
memset(s->all_frames[i].interpolated, 0, sizeof(s->all_frames[i].interpolated));
}
@@ -1906,12 +1909,14 @@ static int dirac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
if (delayed_frame) {
delayed_frame->avframe.reference ^= DELAYED_PIC_REF;
- *(AVFrame*)data = delayed_frame->avframe;
+ if((ret=av_frame_ref(data, &delayed_frame->avframe)) < 0)
+ return ret;
*got_frame = 1;
}
} else if (s->current_picture->avframe.display_picture_number == s->frame_number) {
/* The right frame at the right time :-) */
- *(AVFrame*)data = s->current_picture->avframe;
+ if((ret=av_frame_ref(data, &s->current_picture->avframe)) < 0)
+ return ret;
*got_frame = 1;
}