Skip to content

Commit fd62e4a

Browse files
6by9popcornmix
authored andcommitted
vc04_services: bcm2835_codec: Ignore READ_ONLY ctrls in s_ctrl
In adding the MPEG2/MPEG4/H264 level and profile controls to the decoder, they weren't declared as read-only, nor handlers added to bcm2835_codec_s_ctrl. That resulted in an error message "Invalid control" being logged every time v4l2_ctrl_handler_setup was called from bcm2835_codec_create_component. Define those controls as read only, and exit early from s_ctrl on read only controls. Fixes: "media: bcm2835-v4l2-codec: Add profile & level ctrls to decode" Signed-off-by: Dave Stevenson <[email protected]>
1 parent 7e01281 commit fd62e4a

File tree

1 file changed

+68
-59
lines changed

1 file changed

+68
-59
lines changed

drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c

Lines changed: 68 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2224,6 +2224,9 @@ static int bcm2835_codec_s_ctrl(struct v4l2_ctrl *ctrl)
22242224
container_of(ctrl->handler, struct bcm2835_codec_ctx, hdl);
22252225
int ret = 0;
22262226

2227+
if (ctrl->flags & V4L2_CTRL_FLAG_READ_ONLY)
2228+
return 0;
2229+
22272230
switch (ctrl->id) {
22282231
case V4L2_CID_MPEG_VIDEO_BITRATE:
22292232
ctx->bitrate = ctrl->val;
@@ -2376,7 +2379,7 @@ static int bcm2835_codec_s_ctrl(struct v4l2_ctrl *ctrl)
23762379
break;
23772380

23782381
default:
2379-
v4l2_err(&ctx->dev->v4l2_dev, "Invalid control\n");
2382+
v4l2_err(&ctx->dev->v4l2_dev, "Invalid control %08x\n", ctrl->id);
23802383
return -EINVAL;
23812384
}
23822385

@@ -3198,74 +3201,80 @@ static int queue_init(void *priv, struct vb2_queue *src_vq,
31983201
static void dec_add_profile_ctrls(struct bcm2835_codec_dev *const dev,
31993202
struct v4l2_ctrl_handler *const hdl)
32003203
{
3204+
struct v4l2_ctrl *ctrl;
32013205
unsigned int i;
32023206
const struct bcm2835_codec_fmt_list *const list = &dev->supported_fmts[0];
32033207

32043208
for (i = 0; i < list->num_entries; ++i) {
32053209
switch (list->list[i].fourcc) {
32063210
case V4L2_PIX_FMT_H264:
3207-
v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3208-
V4L2_CID_MPEG_VIDEO_H264_LEVEL,
3209-
V4L2_MPEG_VIDEO_H264_LEVEL_4_2,
3210-
~(BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
3211-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
3212-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
3213-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
3214-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
3215-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
3216-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
3217-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
3218-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
3219-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
3220-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
3221-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0) |
3222-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
3223-
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2)),
3224-
V4L2_MPEG_VIDEO_H264_LEVEL_4_0);
3225-
v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3226-
V4L2_CID_MPEG_VIDEO_H264_PROFILE,
3227-
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
3228-
~(BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
3229-
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
3230-
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
3231-
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
3232-
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);
3211+
ctrl = v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3212+
V4L2_CID_MPEG_VIDEO_H264_LEVEL,
3213+
V4L2_MPEG_VIDEO_H264_LEVEL_4_2,
3214+
~(BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
3215+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
3216+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
3217+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
3218+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
3219+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
3220+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
3221+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
3222+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
3223+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
3224+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
3225+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0) |
3226+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
3227+
BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2)),
3228+
V4L2_MPEG_VIDEO_H264_LEVEL_4_0);
3229+
ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
3230+
ctrl = v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3231+
V4L2_CID_MPEG_VIDEO_H264_PROFILE,
3232+
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
3233+
~(BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
3234+
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
3235+
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
3236+
BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
3237+
V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);
3238+
ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
32333239
break;
32343240
case V4L2_PIX_FMT_MPEG2:
3235-
v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3236-
V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL,
3237-
V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH,
3238-
~(BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW) |
3239-
BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN) |
3240-
BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH_1440) |
3241-
BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH)),
3242-
V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN);
3243-
v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3244-
V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE,
3245-
V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN,
3246-
~(BIT(V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE) |
3247-
BIT(V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN)),
3248-
V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN);
3241+
ctrl = v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3242+
V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL,
3243+
V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH,
3244+
~(BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW) |
3245+
BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN) |
3246+
BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH_1440) |
3247+
BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH)),
3248+
V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN);
3249+
ctrl = v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3250+
V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE,
3251+
V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN,
3252+
~(BIT(V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE) |
3253+
BIT(V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN)),
3254+
V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN);
3255+
ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
32493256
break;
32503257
case V4L2_PIX_FMT_MPEG4:
3251-
v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3252-
V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL,
3253-
V4L2_MPEG_VIDEO_MPEG4_LEVEL_5,
3254-
~(BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_0) |
3255-
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B) |
3256-
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_1) |
3257-
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_2) |
3258-
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_3) |
3259-
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_3B) |
3260-
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_4) |
3261-
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_5)),
3262-
V4L2_MPEG_VIDEO_MPEG4_LEVEL_4);
3263-
v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3264-
V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE,
3265-
V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE,
3266-
~(BIT(V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) |
3267-
BIT(V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)),
3268-
V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE);
3258+
ctrl = v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3259+
V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL,
3260+
V4L2_MPEG_VIDEO_MPEG4_LEVEL_5,
3261+
~(BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_0) |
3262+
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B) |
3263+
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_1) |
3264+
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_2) |
3265+
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_3) |
3266+
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_3B) |
3267+
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_4) |
3268+
BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_5)),
3269+
V4L2_MPEG_VIDEO_MPEG4_LEVEL_4);
3270+
ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
3271+
ctrl = v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
3272+
V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE,
3273+
V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE,
3274+
~(BIT(V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) |
3275+
BIT(V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)),
3276+
V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE);
3277+
ctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
32693278
break;
32703279
/* No profiles defined by V4L2 */
32713280
case V4L2_PIX_FMT_H263:

0 commit comments

Comments
 (0)