From: Leo Liu Date: Fri, 13 Mar 2015 16:39:26 +0000 (-0400) Subject: st/omx/dec: add h264 decoder level support X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b2596efeb767417f21ce45a411c56bb3ecc51620;p=mesa.git st/omx/dec: add h264 decoder level support v2: use sps level idc as level to driver Signed-off-by: Leo Liu Reviewed-by: Christian König --- diff --git a/src/gallium/state_trackers/omx/vid_dec_h264.c b/src/gallium/state_trackers/omx/vid_dec_h264.c index 7c90dee60fa..18d88039579 100644 --- a/src/gallium/state_trackers/omx/vid_dec_h264.c +++ b/src/gallium/state_trackers/omx/vid_dec_h264.c @@ -33,6 +33,7 @@ #include "pipe/p_video_codec.h" #include "util/u_memory.h" +#include "util/u_video.h" #include "vl/vl_rbsp.h" #include "entrypoint.h" @@ -113,10 +114,11 @@ static void vid_dec_h264_BeginFrame(vid_dec_PrivateType *priv) templat.profile = priv->profile; templat.entrypoint = PIPE_VIDEO_ENTRYPOINT_BITSTREAM; templat.chroma_format = PIPE_VIDEO_CHROMA_FORMAT_420; - templat.max_references = 2; + templat.max_references = priv->picture.h264.num_ref_frames; templat.expect_chunked_decode = true; templat.width = port->sPortParam.format.video.nFrameWidth; templat.height = port->sPortParam.format.video.nFrameHeight; + templat.level = priv->picture.h264.pps->sps->level_idc; priv->codec = priv->pipe->create_video_codec(priv->pipe, &templat); } @@ -239,7 +241,7 @@ static struct pipe_h264_sps *seq_parameter_set_id(vid_dec_PrivateType *priv, str static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp) { struct pipe_h264_sps *sps; - unsigned profile_idc; + unsigned profile_idc, level_idc; unsigned i; /* Sequence parameter set */ @@ -267,7 +269,7 @@ static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp) vl_rbsp_u(rbsp, 2); /* level_idc */ - vl_rbsp_u(rbsp, 8); + level_idc = vl_rbsp_u(rbsp, 8); sps = seq_parameter_set_id(priv, rbsp); if (!sps) @@ -277,6 +279,8 @@ static void seq_parameter_set(vid_dec_PrivateType *priv, struct vl_rbsp *rbsp) memset(sps->ScalingList4x4, 16, sizeof(sps->ScalingList4x4)); memset(sps->ScalingList8x8, 16, sizeof(sps->ScalingList8x8)); + sps->level_idc = level_idc; + if (profile_idc == 100 || profile_idc == 110 || profile_idc == 122 || profile_idc == 244 || profile_idc == 44 || profile_idc == 83 || profile_idc == 86 || profile_idc == 118 || profile_idc == 128 || profile_idc == 138) {