From a553c6a347d3d28d7ee44c3df3d5c4ee780dba23 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Fri, 1 Nov 2013 18:07:22 +0100 Subject: [PATCH] lavc: use buf[0] instead of data[0] in checks whether a frame is allocated data[0] may be NULL for valid frames with hwaccel pixel formats. --- libavcodec/h264.c | 14 +++++++------- libavcodec/h264_refs.c | 8 +++++--- libavcodec/mpegvideo.c | 26 +++++++++++++------------- libavcodec/pthread_frame.c | 2 +- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/libavcodec/h264.c b/libavcodec/h264.c index 6f6727b5cf..62e4940dc1 100644 --- a/libavcodec/h264.c +++ b/libavcodec/h264.c @@ -256,7 +256,7 @@ static void unref_picture(H264Context *h, Picture *pic) int off = offsetof(Picture, tf) + sizeof(pic->tf); int i; - if (!pic->f.data[0]) + if (!pic->f.buf[0]) return; ff_thread_release_buffer(h->avctx, &pic->tf); @@ -278,7 +278,7 @@ static void release_unused_pictures(H264Context *h, int remove_current) /* release non reference frames */ for (i = 0; i < MAX_PICTURE_COUNT; i++) { - if (h->DPB[i].f.data[0] && !h->DPB[i].reference && + if (h->DPB[i].f.buf[0] && !h->DPB[i].reference && (remove_current || &h->DPB[i] != h->cur_pic_ptr)) { unref_picture(h, &h->DPB[i]); } @@ -454,7 +454,7 @@ fail: static inline int pic_is_unused(H264Context *h, Picture *pic) { - if (pic->f.data[0] == NULL) + if (!pic->f.buf[0]) return 1; if (pic->needs_realloc && !(pic->reference & DELAYED_PIC_REF)) return 1; @@ -1767,7 +1767,7 @@ static int decode_update_thread_context(AVCodecContext *dst, for (i = 0; i < MAX_PICTURE_COUNT; i++) { unref_picture(h, &h->DPB[i]); - if (h1->DPB[i].f.data[0] && + if (h1->DPB[i].f.buf[0] && (ret = ref_picture(h, &h->DPB[i], &h1->DPB[i])) < 0) return ret; } @@ -3524,7 +3524,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0) * since that can modify s->current_picture_ptr. */ if (h0->first_field) { assert(h0->cur_pic_ptr); - assert(h0->cur_pic_ptr->f.data[0]); + assert(h0->cur_pic_ptr->f.buf[0]); assert(h0->cur_pic_ptr->reference != DELAYED_PIC_REF); /* figure out if we have a complementary field pair */ @@ -3614,7 +3614,7 @@ static int decode_slice_header(H264Context *h, H264Context *h0) * frame, or to allocate a new one. */ if (h0->first_field) { assert(h0->cur_pic_ptr); - assert(h0->cur_pic_ptr->f.data[0]); + assert(h0->cur_pic_ptr->f.buf[0]); assert(h0->cur_pic_ptr->reference != DELAYED_PIC_REF); /* figure out if we have a complementary field pair */ @@ -4894,7 +4894,7 @@ out: } } - assert(pict->data[0] || !*got_frame); + assert(pict->buf[0] || !*got_frame); return get_consumed_bytes(buf_index, buf_size); } diff --git a/libavcodec/h264_refs.c b/libavcodec/h264_refs.c index 3721c2e337..5a09c2ccc5 100644 --- a/libavcodec/h264_refs.c +++ b/libavcodec/h264_refs.c @@ -140,7 +140,9 @@ int ff_h264_fill_default_ref_list(H264Context *h) } if (lens[0] == lens[1] && lens[1] > 1) { - for (i = 0; h->default_ref_list[0][i].f.data[0] == h->default_ref_list[1][i].f.data[0] && i < lens[0]; i++); + for (i = 0; i < lens[0] && + h->default_ref_list[0][i].f.buf[0]->buffer == + h->default_ref_list[1][i].f.buf[0]->buffer; i++); if (i == lens[0]) { Picture tmp; COPY_PICTURE(&tmp, &h->default_ref_list[1][0]); @@ -303,9 +305,9 @@ int ff_h264_decode_ref_pic_list_reordering(H264Context *h) } for (list = 0; list < h->list_count; list++) { for (index = 0; index < h->ref_count[list]; index++) { - if (!h->ref_list[list][index].f.data[0]) { + if (!h->ref_list[list][index].f.buf[0]) { av_log(h->avctx, AV_LOG_ERROR, "Missing reference picture\n"); - if (h->default_ref_list[list][0].f.data[0]) + if (h->default_ref_list[list][0].f.buf[0]) COPY_PICTURE(&h->ref_list[list][index], &h->default_ref_list[list][0]); else return -1; diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c index 48a7320a24..7ffb2615df 100644 --- a/libavcodec/mpegvideo.c +++ b/libavcodec/mpegvideo.c @@ -236,7 +236,7 @@ static int alloc_frame_buffer(MpegEncContext *s, Picture *pic) r = avcodec_default_get_buffer2(s->avctx, &pic->f, 0); } - if (r < 0 || !pic->f.data[0]) { + if (r < 0 || !pic->f.buf[0]) { av_log(s->avctx, AV_LOG_ERROR, "get_buffer() failed (%d %p)\n", r, pic->f.data[0]); return -1; @@ -372,7 +372,7 @@ int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared) assert(pic->f.data[0]); pic->shared = 1; } else { - assert(!pic->f.data[0]); + assert(!pic->f.buf[0]); if (alloc_frame_buffer(s, pic) < 0) return -1; @@ -674,7 +674,7 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, for (i = 0; i < MAX_PICTURE_COUNT; i++) { ff_mpeg_unref_picture(s, &s->picture[i]); - if (s1->picture[i].f.data[0] && + if (s1->picture[i].f.buf[0] && (ret = ff_mpeg_ref_picture(s, &s->picture[i], &s1->picture[i])) < 0) return ret; } @@ -682,7 +682,7 @@ int ff_mpeg_update_thread_context(AVCodecContext *dst, #define UPDATE_PICTURE(pic)\ do {\ ff_mpeg_unref_picture(s, &s->pic);\ - if (s1->pic.f.data[0])\ + if (s1->pic.f.buf[0])\ ret = ff_mpeg_ref_picture(s, &s->pic, &s1->pic);\ else\ ret = update_picture_tables(&s->pic, &s1->pic);\ @@ -1401,7 +1401,7 @@ void ff_release_unused_pictures(MpegEncContext*s, int remove_current) static inline int pic_is_unused(MpegEncContext *s, Picture *pic) { - if (pic->f.data[0] == NULL) + if (pic->f.buf[0] == NULL) return 1; if (pic->needs_realloc && !(pic->reference & DELAYED_PIC_REF)) return 1; @@ -1414,7 +1414,7 @@ static int find_unused_picture(MpegEncContext *s, int shared) if (shared) { for (i = 0; i < MAX_PICTURE_COUNT; i++) { - if (s->picture[i].f.data[0] == NULL) + if (s->picture[i].f.buf[0] == NULL) return i; } } else { @@ -1476,7 +1476,7 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) /* mark & release old frames */ if (s->pict_type != AV_PICTURE_TYPE_B && s->last_picture_ptr && s->last_picture_ptr != s->next_picture_ptr && - s->last_picture_ptr->f.data[0]) { + s->last_picture_ptr->f.buf[0]) { ff_mpeg_unref_picture(s, s->last_picture_ptr); } @@ -1501,7 +1501,7 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) ff_release_unused_pictures(s, 1); if (s->current_picture_ptr && - s->current_picture_ptr->f.data[0] == NULL) { + s->current_picture_ptr->f.buf[0] == NULL) { // we already have a unused image // (maybe it was set before reading the header) pic = s->current_picture_ptr; @@ -1561,7 +1561,7 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) s->pict_type, s->droppable); if ((s->last_picture_ptr == NULL || - s->last_picture_ptr->f.data[0] == NULL) && + s->last_picture_ptr->f.buf[0] == NULL) && (s->pict_type != AV_PICTURE_TYPE_I || s->picture_structure != PICT_FRAME)) { int h_chroma_shift, v_chroma_shift; @@ -1599,7 +1599,7 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) ff_thread_report_progress(&s->last_picture_ptr->tf, INT_MAX, 1); } if ((s->next_picture_ptr == NULL || - s->next_picture_ptr->f.data[0] == NULL) && + s->next_picture_ptr->f.buf[0] == NULL) && s->pict_type == AV_PICTURE_TYPE_B) { /* Allocate a dummy frame */ i = ff_find_unused_picture(s, 0); @@ -1618,21 +1618,21 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx) if (s->last_picture_ptr) { ff_mpeg_unref_picture(s, &s->last_picture); - if (s->last_picture_ptr->f.data[0] && + if (s->last_picture_ptr->f.buf[0] && (ret = ff_mpeg_ref_picture(s, &s->last_picture, s->last_picture_ptr)) < 0) return ret; } if (s->next_picture_ptr) { ff_mpeg_unref_picture(s, &s->next_picture); - if (s->next_picture_ptr->f.data[0] && + if (s->next_picture_ptr->f.buf[0] && (ret = ff_mpeg_ref_picture(s, &s->next_picture, s->next_picture_ptr)) < 0) return ret; } if (s->pict_type != AV_PICTURE_TYPE_I && - !(s->last_picture_ptr && s->last_picture_ptr->f.data[0])) { + !(s->last_picture_ptr && s->last_picture_ptr->f.buf[0])) { av_log(s, AV_LOG_ERROR, "Non-reference picture received and no reference available\n"); return AVERROR_INVALIDDATA; diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index 3dff9608f9..626d4f724b 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -757,7 +757,7 @@ FF_DISABLE_DEPRECATION_WARNINGS avctx->get_buffer2 == avcodec_default_get_buffer2); FF_ENABLE_DEPRECATION_WARNINGS - if (!f->f->data[0]) + if (!f->f->buf[0]) return; if (avctx->debug & FF_DEBUG_BUFFERS)