On Sun, May 31, 2015 at 12:35 PM, Hendrik Leppkes <[email protected]> wrote: > On Thu, May 28, 2015 at 6:25 PM, Hendrik Leppkes <[email protected]> wrote: >> The old logic required an explicit clearing of the lists first and was >> prone to overflow the DXVA2 struct in some circumstances. >> --- >> libavcodec/dxva2_hevc.c | 40 ++++++++++++++++++++++------------------ >> 1 file changed, 22 insertions(+), 18 deletions(-) >> >> diff --git a/libavcodec/dxva2_hevc.c b/libavcodec/dxva2_hevc.c >> index a2abb97..5112bd2 100644 >> --- a/libavcodec/dxva2_hevc.c >> +++ b/libavcodec/dxva2_hevc.c >> @@ -57,7 +57,7 @@ static void fill_picture_parameters(const AVCodecContext >> *avctx, AVDXVAContext * >> DXVA_PicParams_HEVC *pp) >> { >> const HEVCFrame *current_picture = h->ref; >> - int i, j, k; >> + int i, j; >> >> memset(pp, 0, sizeof(*pp)); >> >> @@ -155,30 +155,34 @@ static void fill_picture_parameters(const >> AVCodecContext *avctx, AVDXVAContext * >> pp->log2_parallel_merge_level_minus2 = >> h->pps->log2_parallel_merge_level - 2; >> pp->CurrPicOrderCntVal = h->poc; >> >> - // empty the lists >> - memset(&pp->RefPicList, 0xff, sizeof(pp->RefPicList)); >> - memset(&pp->RefPicSetStCurrBefore, 0xff, >> sizeof(pp->RefPicSetStCurrBefore)); >> - memset(&pp->RefPicSetStCurrAfter, 0xff, >> sizeof(pp->RefPicSetStCurrAfter)); >> - memset(&pp->RefPicSetLtCurr, 0xff, sizeof(pp->RefPicSetLtCurr)); >> - >> // fill RefPicList from the DPB >> - for (i = 0, j = 0; i < FF_ARRAY_ELEMS(h->DPB); i++) { >> - const HEVCFrame *frame = &h->DPB[i]; >> - if (frame != current_picture && (frame->flags & >> (HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF))) { >> - fill_picture_entry(&pp->RefPicList[j], >> ff_dxva2_get_surface_index(avctx, ctx, frame->frame), !!(frame->flags & >> HEVC_FRAME_FLAG_LONG_REF)); >> - pp->PicOrderCntValList[j] = frame->poc; >> + for (i = 0, j = 0; i < FF_ARRAY_ELEMS(pp->RefPicList); i++) { >> + const HEVCFrame *frame = NULL; >> + while (!frame && j < FF_ARRAY_ELEMS(h->DPB)) { >> + if (&h->DPB[j] != current_picture && (h->DPB[j].flags & >> (HEVC_FRAME_FLAG_LONG_REF | HEVC_FRAME_FLAG_SHORT_REF))) >> + frame = &h->DPB[j]; >> j++; >> } >> + >> + if (frame) { >> + fill_picture_entry(&pp->RefPicList[i], >> ff_dxva2_get_surface_index(avctx, ctx, frame->frame), !!(frame->flags & >> HEVC_FRAME_FLAG_LONG_REF)); >> + pp->PicOrderCntValList[i] = frame->poc; >> + } else { >> + pp->RefPicList[i].bPicEntry = 0xff; >> + pp->PicOrderCntValList[i] = 0; >> + } >> } >> >> #define DO_REF_LIST(ref_idx, ref_list) { \ >> const RefPicList *rpl = &h->rps[ref_idx]; \ >> - av_assert0(rpl->nb_refs <= FF_ARRAY_ELEMS(pp->ref_list)); \ >> - for (j = 0, k = 0; j < rpl->nb_refs; j++) { \ >> - if (rpl->ref[j]) { \ >> - pp->ref_list[k] = get_refpic_index(pp, >> ff_dxva2_get_surface_index(avctx, ctx, rpl->ref[j]->frame)); \ >> - k++; \ >> - } \ >> + for (i = 0, j = 0; i < FF_ARRAY_ELEMS(pp->ref_list); i++) { \ >> + const HEVCFrame *frame = NULL; \ >> + while (!frame && j < rpl->nb_refs) \ >> + frame = rpl->ref[j++]; \ >> + if (frame) \ >> + pp->ref_list[i] = get_refpic_index(pp, >> ff_dxva2_get_surface_index(avctx, ctx, frame->frame)); \ >> + else \ >> + pp->ref_list[i] = 0xff; \ >> } \ >> } >> >> -- >> 1.9.5.msysgit.1 >> > > Ping.
Set pushed thanks. -- Vittorio _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
