st/omx/dec: result buffers size should match codec decoder size
authorLeo Liu <leo.liu@amd.com>
Mon, 24 Oct 2016 18:03:10 +0000 (14:03 -0400)
committerLeo Liu <leo.liu@amd.com>
Mon, 31 Oct 2016 15:45:14 +0000 (11:45 -0400)
Otherwise fails the check of matching between decoder size and buffers
size in kernel.

Signed-off-by: Leo Liu <leo.liu@amd.com>
Cc: 13.0 <mesa-stable@lists.freedesktop.org>
src/gallium/state_trackers/omx/vid_dec.c
src/gallium/state_trackers/omx/vid_dec_h264.c
src/gallium/state_trackers/omx/vid_dec_h265.c

index 90f435bc1dcd42ed8d081b87112ba7b346c92fa0..e51a747699f80d99eea5b804bb33e5e8e4f38ce0 100644 (file)
@@ -425,24 +425,19 @@ void vid_dec_NeedTarget(vid_dec_PrivateType *priv)
    struct pipe_video_buffer templat = {};
    struct vl_screen *omx_screen;
    struct pipe_screen *pscreen;
-   omx_base_video_PortType *port;
 
    omx_screen = priv->screen;
-   port = (omx_base_video_PortType *)priv->ports[OMX_BASE_FILTER_INPUTPORT_INDEX];
-
    assert(omx_screen);
-   assert(port);
 
    pscreen = omx_screen->pscreen;
-
    assert(pscreen);
 
    if (!priv->target) {
       memset(&templat, 0, sizeof(templat));
 
       templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
-      templat.width = port->sPortParam.format.video.nFrameWidth;
-      templat.height = port->sPortParam.format.video.nFrameHeight;
+      templat.width = priv->codec->width;
+      templat.height = priv->codec->height;
       templat.buffer_format = pscreen->get_video_param(
             pscreen,
             PIPE_VIDEO_PROFILE_UNKNOWN,
index 10f2959d0d2ea2973cfe84dd628f16cb9c29566d..a680844a1962ccb21d0a2d7483bf2606f7be2803 100644 (file)
@@ -105,13 +105,6 @@ static void vid_dec_h264_BeginFrame(vid_dec_PrivateType *priv)
    if (priv->frame_started)
       return;
 
-   vid_dec_NeedTarget(priv);
-   if (priv->first_buf_in_frame)
-      priv->timestamp = priv->timestamps[0];
-   priv->first_buf_in_frame = false;
-
-   priv->picture.h264.num_ref_frames = priv->picture.h264.pps->sps->max_num_ref_frames;
-
    if (!priv->codec) {
       struct pipe_video_codec templat = {};
       omx_base_video_PortType *port;
@@ -128,6 +121,15 @@ static void vid_dec_h264_BeginFrame(vid_dec_PrivateType *priv)
 
       priv->codec = priv->pipe->create_video_codec(priv->pipe, &templat);
    }
+
+   vid_dec_NeedTarget(priv);
+
+   if (priv->first_buf_in_frame)
+      priv->timestamp = priv->timestamps[0];
+   priv->first_buf_in_frame = false;
+
+   priv->picture.h264.num_ref_frames = priv->picture.h264.pps->sps->max_num_ref_frames;
+
    priv->picture.h264.slice_count = 0;
    priv->codec->begin_frame(priv->codec, priv->target, &priv->picture.base);
    priv->frame_started = true;
index 6deae82d2c2e1558b74ec9d4661367a60a7560d5..b9ac654e876a9f82e67f586dcd04268a01e78956 100644 (file)
@@ -612,11 +612,6 @@ static void vid_dec_h265_BeginFrame(vid_dec_PrivateType *priv)
    if (priv->frame_started)
       return;
 
-   vid_dec_NeedTarget(priv);
-   if (priv->first_buf_in_frame)
-      priv->timestamp = priv->timestamps[0];
-   priv->first_buf_in_frame = false;
-
    if (!priv->codec) {
       struct pipe_video_codec templat = {};
 
@@ -629,6 +624,13 @@ static void vid_dec_h265_BeginFrame(vid_dec_PrivateType *priv)
       templat.level =  priv->codec_data.h265.level_idc;
       priv->codec = priv->pipe->create_video_codec(priv->pipe, &templat);
    }
+
+   vid_dec_NeedTarget(priv);
+
+   if (priv->first_buf_in_frame)
+      priv->timestamp = priv->timestamps[0];
+   priv->first_buf_in_frame = false;
+
    priv->codec->begin_frame(priv->codec, priv->target, &priv->picture.base);
    priv->frame_started = true;
 }