diff options
Diffstat (limited to 'libavcodec/diracdec.c')
-rw-r--r-- | libavcodec/diracdec.c | 19 |
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; } |