media: coda: update profile and level controls after sequence initialization
The header report return value from decoder sequence initialization is available on CodaHx4 and CODA7541 already. Use the profile and level identification values reported by the firmware to update codec specific profile and level controls after sequence initialization has succeeded. Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
This commit is contained in:

committed by
Mauro Carvalho Chehab

parent
8a61895725
commit
e45cf927f3
@@ -1567,42 +1567,53 @@ static void coda_update_menu_ctrl(struct v4l2_ctrl *ctrl, int value)
|
||||
v4l2_ctrl_unlock(ctrl);
|
||||
}
|
||||
|
||||
static void coda_update_h264_profile_ctrl(struct coda_ctx *ctx)
|
||||
void coda_update_profile_level_ctrls(struct coda_ctx *ctx, u8 profile_idc,
|
||||
u8 level_idc)
|
||||
{
|
||||
const char * const *profile_names;
|
||||
int profile;
|
||||
|
||||
profile = coda_h264_profile(ctx->params.h264_profile_idc);
|
||||
if (profile < 0) {
|
||||
v4l2_warn(&ctx->dev->v4l2_dev, "Invalid H264 Profile: %u\n",
|
||||
ctx->params.h264_profile_idc);
|
||||
return;
|
||||
}
|
||||
|
||||
coda_update_menu_ctrl(ctx->h264_profile_ctrl, profile);
|
||||
|
||||
profile_names = v4l2_ctrl_get_menu(V4L2_CID_MPEG_VIDEO_H264_PROFILE);
|
||||
|
||||
coda_dbg(1, ctx, "Parsed H264 Profile: %s\n", profile_names[profile]);
|
||||
}
|
||||
|
||||
static void coda_update_h264_level_ctrl(struct coda_ctx *ctx)
|
||||
{
|
||||
const char * const *level_names;
|
||||
struct v4l2_ctrl *profile_ctrl;
|
||||
struct v4l2_ctrl *level_ctrl;
|
||||
const char *codec_name;
|
||||
u32 profile_cid;
|
||||
u32 level_cid;
|
||||
int profile;
|
||||
int level;
|
||||
|
||||
level = coda_h264_level(ctx->params.h264_level_idc);
|
||||
if (level < 0) {
|
||||
v4l2_warn(&ctx->dev->v4l2_dev, "Invalid H264 Level: %u\n",
|
||||
ctx->params.h264_level_idc);
|
||||
switch (ctx->codec->src_fourcc) {
|
||||
case V4L2_PIX_FMT_H264:
|
||||
codec_name = "H264";
|
||||
profile_cid = V4L2_CID_MPEG_VIDEO_H264_PROFILE;
|
||||
level_cid = V4L2_CID_MPEG_VIDEO_H264_LEVEL;
|
||||
profile_ctrl = ctx->h264_profile_ctrl;
|
||||
level_ctrl = ctx->h264_level_ctrl;
|
||||
profile = coda_h264_profile(profile_idc);
|
||||
level = coda_h264_level(level_idc);
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
coda_update_menu_ctrl(ctx->h264_level_ctrl, level);
|
||||
profile_names = v4l2_ctrl_get_menu(profile_cid);
|
||||
level_names = v4l2_ctrl_get_menu(level_cid);
|
||||
|
||||
level_names = v4l2_ctrl_get_menu(V4L2_CID_MPEG_VIDEO_H264_LEVEL);
|
||||
if (profile < 0) {
|
||||
v4l2_warn(&ctx->dev->v4l2_dev, "Invalid %s profile: %u\n",
|
||||
codec_name, profile_idc);
|
||||
} else {
|
||||
coda_dbg(1, ctx, "Parsed %s profile: %s\n", codec_name,
|
||||
profile_names[profile]);
|
||||
coda_update_menu_ctrl(profile_ctrl, profile);
|
||||
}
|
||||
|
||||
coda_dbg(1, ctx, "Parsed H264 Level: %s\n", level_names[level]);
|
||||
if (level < 0) {
|
||||
v4l2_warn(&ctx->dev->v4l2_dev, "Invalid %s level: %u\n",
|
||||
codec_name, level_idc);
|
||||
} else {
|
||||
coda_dbg(1, ctx, "Parsed %s level: %s\n", codec_name,
|
||||
level_names[level]);
|
||||
coda_update_menu_ctrl(level_ctrl, level);
|
||||
}
|
||||
}
|
||||
|
||||
static void coda_buf_queue(struct vb2_buffer *vb)
|
||||
@@ -1635,8 +1646,9 @@ static void coda_buf_queue(struct vb2_buffer *vb)
|
||||
*/
|
||||
if (!ctx->params.h264_profile_idc) {
|
||||
coda_sps_parse_profile(ctx, vb);
|
||||
coda_update_h264_profile_ctrl(ctx);
|
||||
coda_update_h264_level_ctrl(ctx);
|
||||
coda_update_profile_level_ctrls(ctx,
|
||||
ctx->params.h264_profile_idc,
|
||||
ctx->params.h264_level_idc);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user