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.
This commit is contained in:
		
							parent
							
								
									cc20fbcd39
								
							
						
					
					
						commit
						a553c6a347
					
				@ -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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user