bcm27xx: 6.1: add kernel patches
[openwrt/staging/nbd.git] / target / linux / bcm27xx / patches-6.1 / 950-0557-media-bcm2835-v4l2-codec-Add-profile-level-ctrls-to-.patch
1 From a99a43c595e40de8e584c47b0d05a61d931b416e Mon Sep 17 00:00:00 2001
2 From: John Cox <jc@kynesim.co.uk>
3 Date: Mon, 30 Jan 2023 16:34:55 +0000
4 Subject: [PATCH] media: bcm2835-v4l2-codec: Add profile & level ctrls
5 to decode
6
7 In order to support discovery of what profile & levels are supported by
8 stateful decoders implement the profile and level controls where they
9 are defined by V4L2.
10
11 Signed-off-by: John Cox <jc@kynesim.co.uk>
12 ---
13 .../bcm2835-codec/bcm2835-v4l2-codec.c | 86 ++++++++++++++++++-
14 1 file changed, 85 insertions(+), 1 deletion(-)
15
16 --- a/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c
17 +++ b/drivers/staging/vc04_services/bcm2835-codec/bcm2835-v4l2-codec.c
18 @@ -3195,6 +3195,89 @@ static int queue_init(void *priv, struct
19 return vb2_queue_init(dst_vq);
20 }
21
22 +static void dec_add_profile_ctrls(struct bcm2835_codec_dev *const dev,
23 + struct v4l2_ctrl_handler *const hdl)
24 +{
25 + unsigned int i;
26 + const struct bcm2835_codec_fmt_list *const list = &dev->supported_fmts[0];
27 +
28 + for (i = 0; i < list->num_entries; ++i) {
29 + switch (list->list[i].fourcc) {
30 + case V4L2_PIX_FMT_H264:
31 + v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
32 + V4L2_CID_MPEG_VIDEO_H264_LEVEL,
33 + V4L2_MPEG_VIDEO_H264_LEVEL_4_2,
34 + ~(BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_0) |
35 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1B) |
36 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_1) |
37 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_2) |
38 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_1_3) |
39 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_0) |
40 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_1) |
41 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_2_2) |
42 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_0) |
43 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_1) |
44 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_3_2) |
45 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_0) |
46 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_1) |
47 + BIT(V4L2_MPEG_VIDEO_H264_LEVEL_4_2)),
48 + V4L2_MPEG_VIDEO_H264_LEVEL_4_0);
49 + v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
50 + V4L2_CID_MPEG_VIDEO_H264_PROFILE,
51 + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH,
52 + ~(BIT(V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
53 + BIT(V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
54 + BIT(V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
55 + BIT(V4L2_MPEG_VIDEO_H264_PROFILE_HIGH)),
56 + V4L2_MPEG_VIDEO_H264_PROFILE_HIGH);
57 + break;
58 + case V4L2_PIX_FMT_MPEG2:
59 + v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
60 + V4L2_CID_MPEG_VIDEO_MPEG2_LEVEL,
61 + V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH,
62 + ~(BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_LOW) |
63 + BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN) |
64 + BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH_1440) |
65 + BIT(V4L2_MPEG_VIDEO_MPEG2_LEVEL_HIGH)),
66 + V4L2_MPEG_VIDEO_MPEG2_LEVEL_MAIN);
67 + v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
68 + V4L2_CID_MPEG_VIDEO_MPEG2_PROFILE,
69 + V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN,
70 + ~(BIT(V4L2_MPEG_VIDEO_MPEG2_PROFILE_SIMPLE) |
71 + BIT(V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN)),
72 + V4L2_MPEG_VIDEO_MPEG2_PROFILE_MAIN);
73 + break;
74 + case V4L2_PIX_FMT_MPEG4:
75 + v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
76 + V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL,
77 + V4L2_MPEG_VIDEO_MPEG4_LEVEL_5,
78 + ~(BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_0) |
79 + BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_0B) |
80 + BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_1) |
81 + BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_2) |
82 + BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_3) |
83 + BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_3B) |
84 + BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_4) |
85 + BIT(V4L2_MPEG_VIDEO_MPEG4_LEVEL_5)),
86 + V4L2_MPEG_VIDEO_MPEG4_LEVEL_4);
87 + v4l2_ctrl_new_std_menu(hdl, &bcm2835_codec_ctrl_ops,
88 + V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE,
89 + V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE,
90 + ~(BIT(V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) |
91 + BIT(V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)),
92 + V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE);
93 + break;
94 + /* No profiles defined by V4L2 */
95 + case V4L2_PIX_FMT_H263:
96 + case V4L2_PIX_FMT_JPEG:
97 + case V4L2_PIX_FMT_MJPEG:
98 + case V4L2_PIX_FMT_VC1_ANNEX_G:
99 + default:
100 + break;
101 + }
102 + }
103 +}
104 +
105 /*
106 * File operations
107 */
108 @@ -3334,11 +3417,12 @@ static int bcm2835_codec_open(struct fil
109 break;
110 case DECODE:
111 {
112 - v4l2_ctrl_handler_init(hdl, 1);
113 + v4l2_ctrl_handler_init(hdl, 1 + dev->supported_fmts[0].num_entries * 2);
114
115 v4l2_ctrl_new_std(hdl, &bcm2835_codec_ctrl_ops,
116 V4L2_CID_MIN_BUFFERS_FOR_CAPTURE,
117 1, 1, 1, 1);
118 + dec_add_profile_ctrls(dev, hdl);
119 if (hdl->error) {
120 rc = hdl->error;
121 goto free_ctrl_handler;