summaryrefslogtreecommitdiffstats
path: root/src/gallium/state_trackers
diff options
context:
space:
mode:
authorLeo Liu <[email protected]>2015-03-13 12:39:26 -0400
committerMarek Olšák <[email protected]>2015-04-28 17:42:45 +0200
commitb2596efeb767417f21ce45a411c56bb3ecc51620 (patch)
treec23825172badc37af894c61d0d2d2eec40ebe59b /src/gallium/state_trackers
parent1a5e2bb5ce254eb272960e5b50b803110f25c9b1 (diff)
st/omx/dec: add h264 decoder level support
v2: use sps level idc as level to driver Signed-off-by: Leo Liu <[email protected]> Reviewed-by: Christian König <[email protected]>
Diffstat (limited to 'src/gallium/state_trackers')
-rw-r--r--src/gallium/state_trackers/omx/vid_dec_h264.c10
1 files changed, 7 insertions, 3 deletions
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) {