diff options
author | Leo Liu <[email protected]> | 2016-08-29 13:42:24 -0400 |
---|---|---|
committer | Leo Liu <[email protected]> | 2016-09-06 10:08:01 -0400 |
commit | 1a534d31febb3abd7554cf44b9be5ed18b4609f4 (patch) | |
tree | 337dd7c6b31730be1ec093cba320396b7943eb36 /src/gallium | |
parent | 7d63b807281b0b4d09cfdb4ef5c12c1ff9d66818 (diff) |
st/omx/dec/h265: get the reference list for uvd
Signed-off-by: Leo Liu <[email protected]>
Acked-by: Christian König <[email protected]>
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/state_trackers/omx/vid_dec_h265.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/gallium/state_trackers/omx/vid_dec_h265.c b/src/gallium/state_trackers/omx/vid_dec_h265.c index df2dc057c8b..7c0f75d8cea 100644 --- a/src/gallium/state_trackers/omx/vid_dec_h265.c +++ b/src/gallium/state_trackers/omx/vid_dec_h265.c @@ -570,10 +570,49 @@ static void vid_dec_h265_EndFrame(vid_dec_PrivateType *priv) { struct dpb_list *entry = NULL; struct pipe_video_buffer *tmp; + struct ref_pic_set *rps; + int i; if (!priv->frame_started) return; + priv->picture.h265.NumPocStCurrBefore = 0; + priv->picture.h265.NumPocStCurrAfter = 0; + memset(priv->picture.h265.RefPicSetStCurrBefore, 0, 8); + memset(priv->picture.h265.RefPicSetStCurrAfter, 0, 8); + for (i = 0; i < MAX_NUM_REF_PICS; ++i) { + priv->picture.h265.ref[i] = NULL; + priv->picture.h265.PicOrderCntVal[i] = 0; + } + + rps = priv->codec_data.h265.rps; + + if (rps) { + priv->picture.h265.NumDeltaPocsOfRefRpsIdx = rps->num_delta_poc; + for (i = 0; i < rps->num_pics; ++i) { + priv->picture.h265.PicOrderCntVal[i] = + rps->delta_poc[i] + get_poc(priv); + + LIST_FOR_EACH_ENTRY(entry, &priv->codec_data.h265.dpb_list, list) { + if (entry->poc == priv->picture.h265.PicOrderCntVal[i]) { + priv->picture.h265.ref[i] = entry->buffer; + break; + } + } + + if (rps->used[i]) { + if (i < rps->num_neg_pics) { + priv->picture.h265.NumPocStCurrBefore++; + priv->picture.h265.RefPicSetStCurrBefore[i] = i; + } else { + int j = i - rps->num_neg_pics; + priv->picture.h265.NumPocStCurrAfter++; + priv->picture.h265.RefPicSetStCurrAfter[j] = i; + } + } + } + } + priv->codec->end_frame(priv->codec, priv->target, &priv->picture.base); priv->frame_started = false; |