st/omx/dec/h265: decoder size should follow from sps
authorLeo Liu <leo.liu@amd.com>
Fri, 23 Sep 2016 15:33:31 +0000 (11:33 -0400)
committerLeo Liu <leo.liu@amd.com>
Tue, 4 Oct 2016 15:09:59 +0000 (11:09 -0400)
The video size from format container is not always compatible with
the size from codec bitstream, the HW decoder should take the size
information from bitstream, otherwise the corruption appears with clip
that has different size info between bitstream and format container

So we are passing width(height)_in_samples from sequence parameter
set to video decoder.

Signed-off-by: Leo Liu <leo.liu@amd.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
src/gallium/state_trackers/omx/vid_dec.h
src/gallium/state_trackers/omx/vid_dec_h265.c

index ebb35a353aff21e9e6514e977cd03e6122e1d5d7..35a575899c615f10ce3b1efbcf36c9a59bd51e72 100644 (file)
@@ -100,6 +100,8 @@ DERIVEDCLASS(vid_dec_PrivateType, omx_base_filter_PrivateType)
       struct { \
          unsigned temporal_id; \
          unsigned level_idc; \
+         unsigned pic_width_in_luma_samples; \
+         unsigned pic_height_in_luma_samples; \
          bool IdrPicFlag; \
          int slice_prev_poc; \
          void *ref_pic_set_list; \
index eae476a96eefaaad1dd9d970f4efdfaa6961b806..f3bf66f783cadcd43760186f52f03603e58519ba 100644 (file)
@@ -342,9 +342,11 @@ static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp)
    if (sps->chroma_format_idc == 3)
       sps->separate_colour_plane_flag = vl_rbsp_u(rbsp, 1);
 
-   sps->pic_width_in_luma_samples = vl_rbsp_ue(rbsp);
+   priv->codec_data.h265.pic_width_in_luma_samples =
+      sps->pic_width_in_luma_samples = vl_rbsp_ue(rbsp);
 
-   sps->pic_height_in_luma_samples = vl_rbsp_ue(rbsp);
+   priv->codec_data.h265.pic_height_in_luma_samples =
+      sps->pic_height_in_luma_samples = vl_rbsp_ue(rbsp);
 
    /* conformance_window_flag */
    if (vl_rbsp_u(rbsp, 1)) {
@@ -525,16 +527,13 @@ static void vid_dec_h265_BeginFrame(vid_dec_PrivateType *priv)
 
    if (!priv->codec) {
       struct pipe_video_codec templat = {};
-      omx_base_video_PortType *port;
 
-      port = (omx_base_video_PortType *)
-         priv->ports[OMX_BASE_FILTER_INPUTPORT_INDEX];
       templat.profile = priv->profile;
       templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM;
       templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420;
       templat.expect_chunked_decode = true;
-      templat.width = align(port->sPortParam.format.video.nFrameWidth, 4);
-      templat.height = align(port->sPortParam.format.video.nFrameHeight, 4);
+      templat.width = priv->codec_data.h265.pic_width_in_luma_samples;
+      templat.height = priv->codec_data.h265.pic_height_in_luma_samples;
       templat.level =  priv->codec_data.h265.level_idc;
       priv->codec = priv->pipe->create_video_codec(priv->pipe, &templat);
    }