|
|
@@ -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; \ |
|
|
|
} \ |
|
|
|
} |
|
|
|
|
|
|
|