st/omx/dec/h265: get the reference list for uvd
authorLeo Liu <leo.liu@amd.com>
Mon, 29 Aug 2016 17:42:24 +0000 (13:42 -0400)
committerLeo Liu <leo.liu@amd.com>
Tue, 6 Sep 2016 14:08:01 +0000 (10:08 -0400)
Signed-off-by: Leo Liu <leo.liu@amd.com>
Acked-by: Christian König <christian.koenig@amd.com>
src/gallium/state_trackers/omx/vid_dec_h265.c

index df2dc057c8b7f34d63bf538ba260ad4f48f3bbf6..7c0f75d8ceaf312b2f063116a85fac3c13729757 100644 (file)
@@ -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;