int ff_h264_fill_default_ref_list(H264Context *h, H264SliceContext *sl)

{

    int i, len;

    int j;



    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {

        H264Picture *sorted[32];

        int cur_poc, list;

        int lens[2];



        if (FIELD_PICTURE(h))

            cur_poc = h->cur_pic_ptr->field_poc[h->picture_structure == PICT_BOTTOM_FIELD];

        else

            cur_poc = h->cur_pic_ptr->poc;



        for (list = 0; list < 2; list++) {

            len  = add_sorted(sorted,       h->short_ref, h->short_ref_count, cur_poc, 1 ^ list);

            len += add_sorted(sorted + len, h->short_ref, h->short_ref_count, cur_poc, 0 ^ list);

            av_assert0(len <= 32);



            len  = build_def_list(h->default_ref_list[list], FF_ARRAY_ELEMS(h->default_ref_list[0]),

                                  sorted, len, 0, h->picture_structure);

            len += build_def_list(h->default_ref_list[list] + len,

                                  FF_ARRAY_ELEMS(h->default_ref_list[0]) - len,

                                  h->long_ref, 16, 1, h->picture_structure);

            av_assert0(len <= 32);



            if (len < sl->ref_count[list])

                memset(&h->default_ref_list[list][len], 0, sizeof(H264Ref) * (sl->ref_count[list] - len));

            lens[list] = len;

        }



        if (lens[0] == lens[1] && lens[1] > 1) {

            for (i = 0; i < lens[0] &&

                        h->default_ref_list[0][i].parent->f->buf[0]->buffer ==

                        h->default_ref_list[1][i].parent->f->buf[0]->buffer; i++);

            if (i == lens[0]) {

                FFSWAP(H264Ref, h->default_ref_list[1][0], h->default_ref_list[1][1]);

            }

        }

    } else {

        len  = build_def_list(h->default_ref_list[0], FF_ARRAY_ELEMS(h->default_ref_list[0]),

                              h->short_ref, h->short_ref_count, 0, h->picture_structure);

        len += build_def_list(h->default_ref_list[0] + len,

                              FF_ARRAY_ELEMS(h->default_ref_list[0]) - len,

                              h-> long_ref, 16, 1, h->picture_structure);

        av_assert0(len <= 32);



        if (len < sl->ref_count[0])

            memset(&h->default_ref_list[0][len], 0, sizeof(H264Ref) * (sl->ref_count[0] - len));

    }

#ifdef TRACE

    for (i = 0; i < sl->ref_count[0]; i++) {

        ff_tlog(h->avctx, "List0: %s fn:%d 0x%p\n",

                h->default_ref_list[0][i].parent ? (h->default_ref_list[0][i].parent->long_ref ? "LT" : "ST") : "NULL",

                h->default_ref_list[0][i].pic_id,

                h->default_ref_list[0][i].parent ? h->default_ref_list[0][i].parent->f->data[0] : 0);

    }

    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {

        for (i = 0; i < sl->ref_count[1]; i++) {

            ff_tlog(h->avctx, "List1: %s fn:%d 0x%p\n",

                    h->default_ref_list[1][i].parent ? (h->default_ref_list[1][i].parent->long_ref ? "LT" : "ST") : "NULL",

                    h->default_ref_list[1][i].pic_id,

                    h->default_ref_list[1][i].parent ? h->default_ref_list[1][i].parent->f->data[0] : 0);

        }

    }

#endif



    for (j = 0; j<1+(sl->slice_type_nos == AV_PICTURE_TYPE_B); j++) {

        for (i = 0; i < sl->ref_count[j]; i++) {

            if (h->default_ref_list[j][i].parent) {

                AVFrame *f = h->default_ref_list[j][i].parent->f;

                if (h->cur_pic_ptr->f->width  != f->width ||

                    h->cur_pic_ptr->f->height != f->height ||

                    h->cur_pic_ptr->f->format != f->format) {

                    av_log(h->avctx, AV_LOG_ERROR, "Discarding mismatching reference\n");

                    memset(&h->default_ref_list[j][i], 0, sizeof(h->default_ref_list[j][i]));

                }

            }

        }

    }



    return 0;

}

int ff_h264_fill_default_ref_list(H264Context *h, H264SliceContext *sl)

{

    int i, len;

    int j;



    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {

        H264Picture *sorted[32];

        int cur_poc, list;

        int lens[2];



        if (FIELD_PICTURE(h))

            cur_poc = h->cur_pic_ptr->field_poc[h->picture_structure == PICT_BOTTOM_FIELD];

        else

            cur_poc = h->cur_pic_ptr->poc;



        for (list = 0; list < 2; list++) {

            len  = add_sorted(sorted,       h->short_ref, h->short_ref_count, cur_poc, 1 ^ list);

            len += add_sorted(sorted + len, h->short_ref, h->short_ref_count, cur_poc, 0 ^ list);

            av_assert0(len <= 32);



            len  = build_def_list(h->default_ref_list[list], FF_ARRAY_ELEMS(h->default_ref_list[0]),

                                  sorted, len, 0, h->picture_structure);

            len += build_def_list(h->default_ref_list[list] + len,

                                  FF_ARRAY_ELEMS(h->default_ref_list[0]) - len,

                                  h->long_ref, 16, 1, h->picture_structure);

            av_assert0(len <= 32);



            if (len < sl->ref_count[list])

                memset(&h->default_ref_list[list][len], 0, sizeof(H264Ref) * (sl->ref_count[list] - len));

            lens[list] = len;

        }



        if (lens[0] == lens[1] && lens[1] > 1) {

            for (i = 0; i < lens[0] &&

                        h->default_ref_list[0][i].parent->f->buf[0]->buffer ==

                        h->default_ref_list[1][i].parent->f->buf[0]->buffer; i++);

            if (i == lens[0]) {

                FFSWAP(H264Ref, h->default_ref_list[1][0], h->default_ref_list[1][1]);

            }

        }

    } else {

        len  = build_def_list(h->default_ref_list[0], FF_ARRAY_ELEMS(h->default_ref_list[0]),

                              h->short_ref, h->short_ref_count, 0, h->picture_structure);

        len += build_def_list(h->default_ref_list[0] + len,

                              FF_ARRAY_ELEMS(h->default_ref_list[0]) - len,

                              h-> long_ref, 16, 1, h->picture_structure);

        av_assert0(len <= 32);



        if (len < sl->ref_count[0])

            memset(&h->default_ref_list[0][len], 0, sizeof(H264Ref) * (sl->ref_count[0] - len));

    }

#ifdef TRACE

    for (i = 0; i < sl->ref_count[0]; i++) {

        ff_tlog(h->avctx, "List0: %s fn:%d 0x%p\n",

                h->default_ref_list[0][i].parent ? (h->default_ref_list[0][i].parent->long_ref ? "LT" : "ST") : "NULL",

                h->default_ref_list[0][i].pic_id,

                h->default_ref_list[0][i].parent ? h->default_ref_list[0][i].parent->f->data[0] : 0);

    }

    if (sl->slice_type_nos == AV_PICTURE_TYPE_B) {

        for (i = 0; i < sl->ref_count[1]; i++) {

            ff_tlog(h->avctx, "List1: %s fn:%d 0x%p\n",

                    h->default_ref_list[1][i].parent ? (h->default_ref_list[1][i].parent->long_ref ? "LT" : "ST") : "NULL",

                    h->default_ref_list[1][i].pic_id,

                    h->default_ref_list[1][i].parent ? h->default_ref_list[1][i].parent->f->data[0] : 0);

        }

    }

#endif



    for (j = 0; j<1+(sl->slice_type_nos == AV_PICTURE_TYPE_B); j++) {

        for (i = 0; i < sl->ref_count[j]; i++) {

            if (h->default_ref_list[j][i].parent) {

                AVFrame *f = h->default_ref_list[j][i].parent->f;

                if (h->cur_pic_ptr->f->width  != f->width ||

                    h->cur_pic_ptr->f->height != f->height ||

                    h->cur_pic_ptr->f->format != f->format) {

                    av_log(h->avctx, AV_LOG_ERROR, "Discarding mismatching reference\n");

                    memset(&h->default_ref_list[j][i], 0, sizeof(h->default_ref_list[j][i]));

                }

            }

        }

    }



    return 0;

}

int FUNC_0(H264Context *VAR_0, H264SliceContext *VAR_1)

{

    int VAR_2, VAR_3;

    int VAR_4;



    if (VAR_1->slice_type_nos == AV_PICTURE_TYPE_B) {

        H264Picture *sorted[32];

        int VAR_5, VAR_6;

        int VAR_7[2];



        if (FIELD_PICTURE(VAR_0))

            VAR_5 = VAR_0->cur_pic_ptr->field_poc[VAR_0->picture_structure == PICT_BOTTOM_FIELD];

        else

            VAR_5 = VAR_0->cur_pic_ptr->poc;



        for (VAR_6 = 0; VAR_6 < 2; VAR_6++) {

            VAR_3  = add_sorted(sorted,       VAR_0->short_ref, VAR_0->short_ref_count, VAR_5, 1 ^ VAR_6);

            VAR_3 += add_sorted(sorted + VAR_3, VAR_0->short_ref, VAR_0->short_ref_count, VAR_5, 0 ^ VAR_6);

            av_assert0(VAR_3 <= 32);



            VAR_3  = build_def_list(VAR_0->default_ref_list[VAR_6], FF_ARRAY_ELEMS(VAR_0->default_ref_list[0]),

                                  sorted, VAR_3, 0, VAR_0->picture_structure);

            VAR_3 += build_def_list(VAR_0->default_ref_list[VAR_6] + VAR_3,

                                  FF_ARRAY_ELEMS(VAR_0->default_ref_list[0]) - VAR_3,

                                  VAR_0->long_ref, 16, 1, VAR_0->picture_structure);

            av_assert0(VAR_3 <= 32);



            if (VAR_3 < VAR_1->ref_count[VAR_6])

                memset(&VAR_0->default_ref_list[VAR_6][VAR_3], 0, sizeof(H264Ref) * (VAR_1->ref_count[VAR_6] - VAR_3));

            VAR_7[VAR_6] = VAR_3;

        }



        if (VAR_7[0] == VAR_7[1] && VAR_7[1] > 1) {

            for (VAR_2 = 0; VAR_2 < VAR_7[0] &&

                        VAR_0->default_ref_list[0][VAR_2].parent->f->buf[0]->buffer ==

                        VAR_0->default_ref_list[1][VAR_2].parent->f->buf[0]->buffer; VAR_2++);

            if (VAR_2 == VAR_7[0]) {

                FFSWAP(H264Ref, VAR_0->default_ref_list[1][0], VAR_0->default_ref_list[1][1]);

            }

        }

    } else {

        VAR_3  = build_def_list(VAR_0->default_ref_list[0], FF_ARRAY_ELEMS(VAR_0->default_ref_list[0]),

                              VAR_0->short_ref, VAR_0->short_ref_count, 0, VAR_0->picture_structure);

        VAR_3 += build_def_list(VAR_0->default_ref_list[0] + VAR_3,

                              FF_ARRAY_ELEMS(VAR_0->default_ref_list[0]) - VAR_3,

                              VAR_0-> long_ref, 16, 1, VAR_0->picture_structure);

        av_assert0(VAR_3 <= 32);



        if (VAR_3 < VAR_1->ref_count[0])

            memset(&VAR_0->default_ref_list[0][VAR_3], 0, sizeof(H264Ref) * (VAR_1->ref_count[0] - VAR_3));

    }

#ifdef TRACE

    for (VAR_2 = 0; VAR_2 < VAR_1->ref_count[0]; VAR_2++) {

        ff_tlog(VAR_0->avctx, "List0: %s fn:%d 0x%p\n",

                VAR_0->default_ref_list[0][VAR_2].parent ? (VAR_0->default_ref_list[0][VAR_2].parent->long_ref ? "LT" : "ST") : "NULL",

                VAR_0->default_ref_list[0][VAR_2].pic_id,

                VAR_0->default_ref_list[0][VAR_2].parent ? VAR_0->default_ref_list[0][VAR_2].parent->f->data[0] : 0);

    }

    if (VAR_1->slice_type_nos == AV_PICTURE_TYPE_B) {

        for (VAR_2 = 0; VAR_2 < VAR_1->ref_count[1]; VAR_2++) {

            ff_tlog(VAR_0->avctx, "List1: %s fn:%d 0x%p\n",

                    VAR_0->default_ref_list[1][VAR_2].parent ? (VAR_0->default_ref_list[1][VAR_2].parent->long_ref ? "LT" : "ST") : "NULL",

                    VAR_0->default_ref_list[1][VAR_2].pic_id,

                    VAR_0->default_ref_list[1][VAR_2].parent ? VAR_0->default_ref_list[1][VAR_2].parent->f->data[0] : 0);

        }

    }

#endif



    for (VAR_4 = 0; VAR_4<1+(VAR_1->slice_type_nos == AV_PICTURE_TYPE_B); VAR_4++) {

        for (VAR_2 = 0; VAR_2 < VAR_1->ref_count[VAR_4]; VAR_2++) {

            if (VAR_0->default_ref_list[VAR_4][VAR_2].parent) {

                AVFrame *f = VAR_0->default_ref_list[VAR_4][VAR_2].parent->f;

                if (VAR_0->cur_pic_ptr->f->width  != f->width ||

                    VAR_0->cur_pic_ptr->f->height != f->height ||

                    VAR_0->cur_pic_ptr->f->format != f->format) {

                    av_log(VAR_0->avctx, AV_LOG_ERROR, "Discarding mismatching reference\n");

                    memset(&VAR_0->default_ref_list[VAR_4][VAR_2], 0, sizeof(VAR_0->default_ref_list[VAR_4][VAR_2]));

                }

            }

        }

    }



    return 0;

}

int FUNC_0(H264Context *VAR_0, H264SliceContext *VAR_1)
{ int VAR_2, VAR_3; int VAR_4; if (VAR_1->slice_type_nos == AV_PICTURE_TYPE_B) { H264Picture *sorted[32]; int VAR_5, VAR_6; int VAR_7[2]; if (FIELD_PICTURE(VAR_0))
VAR_5 = VAR_0->cur_pic_ptr->field_poc[VAR_0->picture_structure == PICT_BOTTOM_FIELD]; else
VAR_5 = VAR_0->cur_pic_ptr->poc; for (VAR_6 = 0; VAR_6 < 2; VAR_6++) { VAR_3  = add_sorted(sorted,       VAR_0->short_ref, VAR_0->short_ref_count, VAR_5, 1 ^ VAR_6); VAR_3 += add_sorted(sorted + VAR_3, VAR_0->short_ref, VAR_0->short_ref_count, VAR_5, 0 ^ VAR_6); av_assert0(VAR_3 <= 32); VAR_3  = build_def_list(VAR_0->default_ref_list[VAR_6], FF_ARRAY_ELEMS(VAR_0->default_ref_list[0]),
sorted, VAR_3, 0, VAR_0->picture_structure); VAR_3 += build_def_list(VAR_0->default_ref_list[VAR_6] + VAR_3,
FF_ARRAY_ELEMS(VAR_0->default_ref_list[0]) - VAR_3,
VAR_0->long_ref, 16, 1, VAR_0->picture_structure); av_assert0(VAR_3 <= 32); if (VAR_3 < VAR_1->ref_count[VAR_6])
memset(&VAR_0->default_ref_list[VAR_6][VAR_3], 0, sizeof(H264Ref) * (VAR_1->ref_count[VAR_6] - VAR_3)); VAR_7[VAR_6] = VAR_3; } if (VAR_7[0] == VAR_7[1] && VAR_7[1] > 1) { for (VAR_2 = 0; VAR_2 < VAR_7[0] && VAR_0->default_ref_list[0][VAR_2].parent->f->buf[0]->buffer ==
VAR_0->default_ref_list[1][VAR_2].parent->f->buf[0]->buffer; VAR_2++); if (VAR_2 == VAR_7[0]) { FFSWAP(H264Ref, VAR_0->default_ref_list[1][0], VAR_0->default_ref_list[1][1]); } } } else { VAR_3  = build_def_list(VAR_0->default_ref_list[0], FF_ARRAY_ELEMS(VAR_0->default_ref_list[0]),
VAR_0->short_ref, VAR_0->short_ref_count, 0, VAR_0->picture_structure); VAR_3 += build_def_list(VAR_0->default_ref_list[0] + VAR_3,
FF_ARRAY_ELEMS(VAR_0->default_ref_list[0]) - VAR_3,
VAR_0-> long_ref, 16, 1, VAR_0->picture_structure); av_assert0(VAR_3 <= 32); if (VAR_3 < VAR_1->ref_count[0])
memset(&VAR_0->default_ref_list[0][VAR_3], 0, sizeof(H264Ref) * (VAR_1->ref_count[0] - VAR_3)); } #ifdef TRACE
for (VAR_2 = 0; VAR_2 < VAR_1->ref_count[0]; VAR_2++) { ff_tlog(VAR_0->avctx, "List0: %s fn:%d 0x%p\n",
VAR_0->default_ref_list[0][VAR_2].parent ? (VAR_0->default_ref_list[0][VAR_2].parent->long_ref ? "LT" : "ST") : "NULL",
VAR_0->default_ref_list[0][VAR_2].pic_id,
VAR_0->default_ref_list[0][VAR_2].parent ? VAR_0->default_ref_list[0][VAR_2].parent->f->data[0] : 0); } if (VAR_1->slice_type_nos == AV_PICTURE_TYPE_B) { for (VAR_2 = 0; VAR_2 < VAR_1->ref_count[1]; VAR_2++) { ff_tlog(VAR_0->avctx, "List1: %s fn:%d 0x%p\n",
VAR_0->default_ref_list[1][VAR_2].parent ? (VAR_0->default_ref_list[1][VAR_2].parent->long_ref ? "LT" : "ST") : "NULL",
VAR_0->default_ref_list[1][VAR_2].pic_id,
VAR_0->default_ref_list[1][VAR_2].parent ? VAR_0->default_ref_list[1][VAR_2].parent->f->data[0] : 0); } } #endif
for (VAR_4 = 0; VAR_4<1+(VAR_1->slice_type_nos == AV_PICTURE_TYPE_B); VAR_4++) { for (VAR_2 = 0; VAR_2 < VAR_1->ref_count[VAR_4]; VAR_2++) { if (VAR_0->default_ref_list[VAR_4][VAR_2].parent) { AVFrame *f = VAR_0->default_ref_list[VAR_4][VAR_2].parent->f; if (VAR_0->cur_pic_ptr->f->width  != f->width ||
VAR_0->cur_pic_ptr->f->height != f->height ||
VAR_0->cur_pic_ptr->f->format != f->format) { av_log(VAR_0->avctx, AV_LOG_ERROR, "Discarding mismatching reference\n"); memset(&VAR_0->default_ref_list[VAR_4][VAR_2], 0, sizeof(VAR_0->default_ref_list[VAR_4][VAR_2])); } } } } return 0; }