diff options
Diffstat (limited to 'drivers/media/v4l2-core/v4l2-ioctl.c')
-rw-r--r-- | drivers/media/v4l2-core/v4l2-ioctl.c | 214 |
1 files changed, 202 insertions, 12 deletions
diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c index aa407cb5f830..85de4557f696 100644 --- a/drivers/media/v4l2-core/v4l2-ioctl.c +++ b/drivers/media/v4l2-core/v4l2-ioctl.c | |||
@@ -142,6 +142,7 @@ const char *v4l2_field_names[] = { | |||
142 | EXPORT_SYMBOL(v4l2_field_names); | 142 | EXPORT_SYMBOL(v4l2_field_names); |
143 | 143 | ||
144 | const char *v4l2_type_names[] = { | 144 | const char *v4l2_type_names[] = { |
145 | [0] = "0", | ||
145 | [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "vid-cap", | 146 | [V4L2_BUF_TYPE_VIDEO_CAPTURE] = "vid-cap", |
146 | [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "vid-overlay", | 147 | [V4L2_BUF_TYPE_VIDEO_OVERLAY] = "vid-overlay", |
147 | [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "vid-out", | 148 | [V4L2_BUF_TYPE_VIDEO_OUTPUT] = "vid-out", |
@@ -257,7 +258,8 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
257 | pr_cont(", width=%u, height=%u, " | 258 | pr_cont(", width=%u, height=%u, " |
258 | "pixelformat=%c%c%c%c, field=%s, " | 259 | "pixelformat=%c%c%c%c, field=%s, " |
259 | "bytesperline=%u, sizeimage=%u, colorspace=%d, " | 260 | "bytesperline=%u, sizeimage=%u, colorspace=%d, " |
260 | "flags=0x%x, ycbcr_enc=%u, quantization=%u\n", | 261 | "flags=0x%x, ycbcr_enc=%u, quantization=%u, " |
262 | "xfer_func=%u\n", | ||
261 | pix->width, pix->height, | 263 | pix->width, pix->height, |
262 | (pix->pixelformat & 0xff), | 264 | (pix->pixelformat & 0xff), |
263 | (pix->pixelformat >> 8) & 0xff, | 265 | (pix->pixelformat >> 8) & 0xff, |
@@ -266,7 +268,7 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
266 | prt_names(pix->field, v4l2_field_names), | 268 | prt_names(pix->field, v4l2_field_names), |
267 | pix->bytesperline, pix->sizeimage, | 269 | pix->bytesperline, pix->sizeimage, |
268 | pix->colorspace, pix->flags, pix->ycbcr_enc, | 270 | pix->colorspace, pix->flags, pix->ycbcr_enc, |
269 | pix->quantization); | 271 | pix->quantization, pix->xfer_func); |
270 | break; | 272 | break; |
271 | case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: | 273 | case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: |
272 | case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: | 274 | case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: |
@@ -274,7 +276,7 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
274 | pr_cont(", width=%u, height=%u, " | 276 | pr_cont(", width=%u, height=%u, " |
275 | "format=%c%c%c%c, field=%s, " | 277 | "format=%c%c%c%c, field=%s, " |
276 | "colorspace=%d, num_planes=%u, flags=0x%x, " | 278 | "colorspace=%d, num_planes=%u, flags=0x%x, " |
277 | "ycbcr_enc=%u, quantization=%u\n", | 279 | "ycbcr_enc=%u, quantization=%u, xfer_func=%u\n", |
278 | mp->width, mp->height, | 280 | mp->width, mp->height, |
279 | (mp->pixelformat & 0xff), | 281 | (mp->pixelformat & 0xff), |
280 | (mp->pixelformat >> 8) & 0xff, | 282 | (mp->pixelformat >> 8) & 0xff, |
@@ -282,7 +284,7 @@ static void v4l_print_format(const void *arg, bool write_only) | |||
282 | (mp->pixelformat >> 24) & 0xff, | 284 | (mp->pixelformat >> 24) & 0xff, |
283 | prt_names(mp->field, v4l2_field_names), | 285 | prt_names(mp->field, v4l2_field_names), |
284 | mp->colorspace, mp->num_planes, mp->flags, | 286 | mp->colorspace, mp->num_planes, mp->flags, |
285 | mp->ycbcr_enc, mp->quantization); | 287 | mp->ycbcr_enc, mp->quantization, mp->xfer_func); |
286 | for (i = 0; i < mp->num_planes; i++) | 288 | for (i = 0; i < mp->num_planes; i++) |
287 | printk(KERN_DEBUG "plane %u: bytesperline=%u sizeimage=%u\n", i, | 289 | printk(KERN_DEBUG "plane %u: bytesperline=%u sizeimage=%u\n", i, |
288 | mp->plane_fmt[i].bytesperline, | 290 | mp->plane_fmt[i].bytesperline, |
@@ -1103,6 +1105,183 @@ static int v4l_enumoutput(const struct v4l2_ioctl_ops *ops, | |||
1103 | return ops->vidioc_enum_output(file, fh, p); | 1105 | return ops->vidioc_enum_output(file, fh, p); |
1104 | } | 1106 | } |
1105 | 1107 | ||
1108 | static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) | ||
1109 | { | ||
1110 | const unsigned sz = sizeof(fmt->description); | ||
1111 | const char *descr = NULL; | ||
1112 | u32 flags = 0; | ||
1113 | |||
1114 | /* | ||
1115 | * We depart from the normal coding style here since the descriptions | ||
1116 | * should be aligned so it is easy to see which descriptions will be | ||
1117 | * longer than 31 characters (the max length for a description). | ||
1118 | * And frankly, this is easier to read anyway. | ||
1119 | * | ||
1120 | * Note that gcc will use O(log N) comparisons to find the right case. | ||
1121 | */ | ||
1122 | switch (fmt->pixelformat) { | ||
1123 | /* Max description length mask: descr = "0123456789012345678901234567890" */ | ||
1124 | case V4L2_PIX_FMT_RGB332: descr = "8-bit RGB 3-3-2"; break; | ||
1125 | case V4L2_PIX_FMT_RGB444: descr = "16-bit A/XRGB 4-4-4-4"; break; | ||
1126 | case V4L2_PIX_FMT_ARGB444: descr = "16-bit ARGB 4-4-4-4"; break; | ||
1127 | case V4L2_PIX_FMT_XRGB444: descr = "16-bit XRGB 4-4-4-4"; break; | ||
1128 | case V4L2_PIX_FMT_RGB555: descr = "16-bit A/XRGB 1-5-5-5"; break; | ||
1129 | case V4L2_PIX_FMT_ARGB555: descr = "16-bit ARGB 1-5-5-5"; break; | ||
1130 | case V4L2_PIX_FMT_XRGB555: descr = "16-bit XRGB 1-5-5-5"; break; | ||
1131 | case V4L2_PIX_FMT_RGB565: descr = "16-bit RGB 5-6-5"; break; | ||
1132 | case V4L2_PIX_FMT_RGB555X: descr = "16-bit A/XRGB 1-5-5-5 BE"; break; | ||
1133 | case V4L2_PIX_FMT_ARGB555X: descr = "16-bit ARGB 1-5-5-5 BE"; break; | ||
1134 | case V4L2_PIX_FMT_XRGB555X: descr = "16-bit XRGB 1-5-5-5 BE"; break; | ||
1135 | case V4L2_PIX_FMT_RGB565X: descr = "16-bit RGB 5-6-5 BE"; break; | ||
1136 | case V4L2_PIX_FMT_BGR666: descr = "18-bit BGRX 6-6-6-14"; break; | ||
1137 | case V4L2_PIX_FMT_BGR24: descr = "24-bit BGR 8-8-8"; break; | ||
1138 | case V4L2_PIX_FMT_RGB24: descr = "24-bit RGB 8-8-8"; break; | ||
1139 | case V4L2_PIX_FMT_BGR32: descr = "32-bit BGRA/X 8-8-8-8"; break; | ||
1140 | case V4L2_PIX_FMT_ABGR32: descr = "32-bit BGRA 8-8-8-8"; break; | ||
1141 | case V4L2_PIX_FMT_XBGR32: descr = "32-bit BGRX 8-8-8-8"; break; | ||
1142 | case V4L2_PIX_FMT_RGB32: descr = "32-bit A/XRGB 8-8-8-8"; break; | ||
1143 | case V4L2_PIX_FMT_ARGB32: descr = "32-bit ARGB 8-8-8-8"; break; | ||
1144 | case V4L2_PIX_FMT_XRGB32: descr = "32-bit XRGB 8-8-8-8"; break; | ||
1145 | case V4L2_PIX_FMT_GREY: descr = "8-bit Greyscale"; break; | ||
1146 | case V4L2_PIX_FMT_Y4: descr = "4-bit Greyscale"; break; | ||
1147 | case V4L2_PIX_FMT_Y6: descr = "6-bit Greyscale"; break; | ||
1148 | case V4L2_PIX_FMT_Y10: descr = "10-bit Greyscale"; break; | ||
1149 | case V4L2_PIX_FMT_Y12: descr = "12-bit Greyscale"; break; | ||
1150 | case V4L2_PIX_FMT_Y16: descr = "16-bit Greyscale"; break; | ||
1151 | case V4L2_PIX_FMT_Y16_BE: descr = "16-bit Greyscale BE"; break; | ||
1152 | case V4L2_PIX_FMT_Y10BPACK: descr = "10-bit Greyscale (Packed)"; break; | ||
1153 | case V4L2_PIX_FMT_PAL8: descr = "8-bit Palette"; break; | ||
1154 | case V4L2_PIX_FMT_UV8: descr = "8-bit Chrominance UV 4-4"; break; | ||
1155 | case V4L2_PIX_FMT_YVU410: descr = "Planar YVU 4:1:0"; break; | ||
1156 | case V4L2_PIX_FMT_YVU420: descr = "Planar YVU 4:2:0"; break; | ||
1157 | case V4L2_PIX_FMT_YUYV: descr = "YUYV 4:2:2"; break; | ||
1158 | case V4L2_PIX_FMT_YYUV: descr = "YYUV 4:2:2"; break; | ||
1159 | case V4L2_PIX_FMT_YVYU: descr = "YVYU 4:2:2"; break; | ||
1160 | case V4L2_PIX_FMT_UYVY: descr = "UYVY 4:2:2"; break; | ||
1161 | case V4L2_PIX_FMT_VYUY: descr = "VYUY 4:2:2"; break; | ||
1162 | case V4L2_PIX_FMT_YUV422P: descr = "Planar YVU 4:2:2"; break; | ||
1163 | case V4L2_PIX_FMT_YUV411P: descr = "Planar YUV 4:1:1"; break; | ||
1164 | case V4L2_PIX_FMT_Y41P: descr = "YUV 4:1:1 (Packed)"; break; | ||
1165 | case V4L2_PIX_FMT_YUV444: descr = "16-bit A/XYUV 4-4-4-4"; break; | ||
1166 | case V4L2_PIX_FMT_YUV555: descr = "16-bit A/XYUV 1-5-5-5"; break; | ||
1167 | case V4L2_PIX_FMT_YUV565: descr = "16-bit YUV 5-6-5"; break; | ||
1168 | case V4L2_PIX_FMT_YUV32: descr = "32-bit A/XYUV 8-8-8-8"; break; | ||
1169 | case V4L2_PIX_FMT_YUV410: descr = "Planar YUV 4:1:0"; break; | ||
1170 | case V4L2_PIX_FMT_YUV420: descr = "Planar YUV 4:2:0"; break; | ||
1171 | case V4L2_PIX_FMT_HI240: descr = "8-bit Dithered RGB (BTTV)"; break; | ||
1172 | case V4L2_PIX_FMT_HM12: descr = "YUV 4:2:0 (16x16 Macroblocks)"; break; | ||
1173 | case V4L2_PIX_FMT_M420: descr = "YUV 4:2:0 (M420)"; break; | ||
1174 | case V4L2_PIX_FMT_NV12: descr = "Y/CbCr 4:2:0"; break; | ||
1175 | case V4L2_PIX_FMT_NV21: descr = "Y/CrCb 4:2:0"; break; | ||
1176 | case V4L2_PIX_FMT_NV16: descr = "Y/CbCr 4:2:2"; break; | ||
1177 | case V4L2_PIX_FMT_NV61: descr = "Y/CrCb 4:2:2"; break; | ||
1178 | case V4L2_PIX_FMT_NV24: descr = "Y/CbCr 4:4:4"; break; | ||
1179 | case V4L2_PIX_FMT_NV42: descr = "Y/CrCb 4:4:4"; break; | ||
1180 | case V4L2_PIX_FMT_NV12M: descr = "Y/CbCr 4:2:0 (N-C)"; break; | ||
1181 | case V4L2_PIX_FMT_NV21M: descr = "Y/CrCb 4:2:0 (N-C)"; break; | ||
1182 | case V4L2_PIX_FMT_NV16M: descr = "Y/CbCr 4:2:2 (N-C)"; break; | ||
1183 | case V4L2_PIX_FMT_NV61M: descr = "Y/CrCb 4:2:2 (N-C)"; break; | ||
1184 | case V4L2_PIX_FMT_NV12MT: descr = "Y/CbCr 4:2:0 (64x32 MB, N-C)"; break; | ||
1185 | case V4L2_PIX_FMT_NV12MT_16X16: descr = "Y/CbCr 4:2:0 (16x16 MB, N-C)"; break; | ||
1186 | case V4L2_PIX_FMT_YUV420M: descr = "Planar YUV 4:2:0 (N-C)"; break; | ||
1187 | case V4L2_PIX_FMT_YVU420M: descr = "Planar YVU 4:2:0 (N-C)"; break; | ||
1188 | case V4L2_PIX_FMT_SBGGR8: descr = "8-bit Bayer BGBG/GRGR"; break; | ||
1189 | case V4L2_PIX_FMT_SGBRG8: descr = "8-bit Bayer GBGB/RGRG"; break; | ||
1190 | case V4L2_PIX_FMT_SGRBG8: descr = "8-bit Bayer GRGR/BGBG"; break; | ||
1191 | case V4L2_PIX_FMT_SRGGB8: descr = "8-bit Bayer RGRG/GBGB"; break; | ||
1192 | case V4L2_PIX_FMT_SBGGR10: descr = "10-bit Bayer BGBG/GRGR"; break; | ||
1193 | case V4L2_PIX_FMT_SGBRG10: descr = "10-bit Bayer GBGB/RGRG"; break; | ||
1194 | case V4L2_PIX_FMT_SGRBG10: descr = "10-bit Bayer GRGR/BGBG"; break; | ||
1195 | case V4L2_PIX_FMT_SRGGB10: descr = "10-bit Bayer RGRG/GBGB"; break; | ||
1196 | case V4L2_PIX_FMT_SBGGR12: descr = "12-bit Bayer BGBG/GRGR"; break; | ||
1197 | case V4L2_PIX_FMT_SGBRG12: descr = "12-bit Bayer GBGB/RGRG"; break; | ||
1198 | case V4L2_PIX_FMT_SGRBG12: descr = "12-bit Bayer GRGR/BGBG"; break; | ||
1199 | case V4L2_PIX_FMT_SRGGB12: descr = "12-bit Bayer RGRG/GBGB"; break; | ||
1200 | case V4L2_PIX_FMT_SBGGR10P: descr = "10-bit Bayer BGBG/GRGR Packed"; break; | ||
1201 | case V4L2_PIX_FMT_SGBRG10P: descr = "10-bit Bayer GBGB/RGRG Packed"; break; | ||
1202 | case V4L2_PIX_FMT_SGRBG10P: descr = "10-bit Bayer GRGR/BGBG Packed"; break; | ||
1203 | case V4L2_PIX_FMT_SRGGB10P: descr = "10-bit Bayer RGRG/GBGB Packed"; break; | ||
1204 | case V4L2_PIX_FMT_SBGGR10ALAW8: descr = "8-bit Bayer BGBG/GRGR (A-law)"; break; | ||
1205 | case V4L2_PIX_FMT_SGBRG10ALAW8: descr = "8-bit Bayer GBGB/RGRG (A-law)"; break; | ||
1206 | case V4L2_PIX_FMT_SGRBG10ALAW8: descr = "8-bit Bayer GRGR/BGBG (A-law)"; break; | ||
1207 | case V4L2_PIX_FMT_SRGGB10ALAW8: descr = "8-bit Bayer RGRG/GBGB (A-law)"; break; | ||
1208 | case V4L2_PIX_FMT_SBGGR10DPCM8: descr = "8-bit Bayer BGBG/GRGR (DPCM)"; break; | ||
1209 | case V4L2_PIX_FMT_SGBRG10DPCM8: descr = "8-bit Bayer GBGB/RGRG (DPCM)"; break; | ||
1210 | case V4L2_PIX_FMT_SGRBG10DPCM8: descr = "8-bit Bayer GRGR/BGBG (DPCM)"; break; | ||
1211 | case V4L2_PIX_FMT_SRGGB10DPCM8: descr = "8-bit Bayer RGRG/GBGB (DPCM)"; break; | ||
1212 | case V4L2_PIX_FMT_SBGGR16: descr = "16-bit Bayer BGBG/GRGR (Exp.)"; break; | ||
1213 | case V4L2_PIX_FMT_SN9C20X_I420: descr = "GSPCA SN9C20X I420"; break; | ||
1214 | case V4L2_PIX_FMT_SPCA501: descr = "GSPCA SPCA501"; break; | ||
1215 | case V4L2_PIX_FMT_SPCA505: descr = "GSPCA SPCA505"; break; | ||
1216 | case V4L2_PIX_FMT_SPCA508: descr = "GSPCA SPCA508"; break; | ||
1217 | case V4L2_PIX_FMT_STV0680: descr = "GSPCA STV0680"; break; | ||
1218 | case V4L2_PIX_FMT_TM6000: descr = "A/V + VBI Mux Packet"; break; | ||
1219 | case V4L2_PIX_FMT_CIT_YYVYUY: descr = "GSPCA CIT YYVYUY"; break; | ||
1220 | case V4L2_PIX_FMT_KONICA420: descr = "GSPCA KONICA420"; break; | ||
1221 | case V4L2_SDR_FMT_CU8: descr = "Complex U8"; break; | ||
1222 | case V4L2_SDR_FMT_CU16LE: descr = "Complex U16LE"; break; | ||
1223 | case V4L2_SDR_FMT_CS8: descr = "Complex S8"; break; | ||
1224 | case V4L2_SDR_FMT_CS14LE: descr = "Complex S14LE"; break; | ||
1225 | case V4L2_SDR_FMT_RU12LE: descr = "Real U12LE"; break; | ||
1226 | |||
1227 | default: | ||
1228 | /* Compressed formats */ | ||
1229 | flags = V4L2_FMT_FLAG_COMPRESSED; | ||
1230 | switch (fmt->pixelformat) { | ||
1231 | /* Max description length mask: descr = "0123456789012345678901234567890" */ | ||
1232 | case V4L2_PIX_FMT_MJPEG: descr = "Motion-JPEG"; break; | ||
1233 | case V4L2_PIX_FMT_JPEG: descr = "JFIF JPEG"; break; | ||
1234 | case V4L2_PIX_FMT_DV: descr = "1394"; break; | ||
1235 | case V4L2_PIX_FMT_MPEG: descr = "MPEG-1/2/4"; break; | ||
1236 | case V4L2_PIX_FMT_H264: descr = "H.264"; break; | ||
1237 | case V4L2_PIX_FMT_H264_NO_SC: descr = "H.264 (No Start Codes)"; break; | ||
1238 | case V4L2_PIX_FMT_H264_MVC: descr = "H.264 MVC"; break; | ||
1239 | case V4L2_PIX_FMT_H263: descr = "H.263"; break; | ||
1240 | case V4L2_PIX_FMT_MPEG1: descr = "MPEG-1 ES"; break; | ||
1241 | case V4L2_PIX_FMT_MPEG2: descr = "MPEG-2 ES"; break; | ||
1242 | case V4L2_PIX_FMT_MPEG4: descr = "MPEG-4 part 2 ES"; break; | ||
1243 | case V4L2_PIX_FMT_XVID: descr = "Xvid"; break; | ||
1244 | case V4L2_PIX_FMT_VC1_ANNEX_G: descr = "VC-1 (SMPTE 412M Annex G)"; break; | ||
1245 | case V4L2_PIX_FMT_VC1_ANNEX_L: descr = "VC-1 (SMPTE 412M Annex L)"; break; | ||
1246 | case V4L2_PIX_FMT_VP8: descr = "VP8"; break; | ||
1247 | case V4L2_PIX_FMT_CPIA1: descr = "GSPCA CPiA YUV"; break; | ||
1248 | case V4L2_PIX_FMT_WNVA: descr = "WNVA"; break; | ||
1249 | case V4L2_PIX_FMT_SN9C10X: descr = "GSPCA SN9C10X"; break; | ||
1250 | case V4L2_PIX_FMT_PWC1: descr = "Raw Philips Webcam Type (Old)"; break; | ||
1251 | case V4L2_PIX_FMT_PWC2: descr = "Raw Philips Webcam Type (New)"; break; | ||
1252 | case V4L2_PIX_FMT_ET61X251: descr = "GSPCA ET61X251"; break; | ||
1253 | case V4L2_PIX_FMT_SPCA561: descr = "GSPCA SPCA561"; break; | ||
1254 | case V4L2_PIX_FMT_PAC207: descr = "GSPCA PAC207"; break; | ||
1255 | case V4L2_PIX_FMT_MR97310A: descr = "GSPCA MR97310A"; break; | ||
1256 | case V4L2_PIX_FMT_JL2005BCD: descr = "GSPCA JL2005BCD"; break; | ||
1257 | case V4L2_PIX_FMT_SN9C2028: descr = "GSPCA SN9C2028"; break; | ||
1258 | case V4L2_PIX_FMT_SQ905C: descr = "GSPCA SQ905C"; break; | ||
1259 | case V4L2_PIX_FMT_PJPG: descr = "GSPCA PJPG"; break; | ||
1260 | case V4L2_PIX_FMT_OV511: descr = "GSPCA OV511"; break; | ||
1261 | case V4L2_PIX_FMT_OV518: descr = "GSPCA OV518"; break; | ||
1262 | case V4L2_PIX_FMT_JPGL: descr = "JPEG Lite"; break; | ||
1263 | case V4L2_PIX_FMT_SE401: descr = "GSPCA SE401"; break; | ||
1264 | case V4L2_PIX_FMT_S5C_UYVY_JPG: descr = "S5C73MX interleaved UYVY/JPEG"; break; | ||
1265 | default: | ||
1266 | WARN(1, "Unknown pixelformat 0x%08x\n", fmt->pixelformat); | ||
1267 | if (fmt->description[0]) | ||
1268 | return; | ||
1269 | flags = 0; | ||
1270 | snprintf(fmt->description, sz, "%c%c%c%c%s", | ||
1271 | (char)(fmt->pixelformat & 0x7f), | ||
1272 | (char)((fmt->pixelformat >> 8) & 0x7f), | ||
1273 | (char)((fmt->pixelformat >> 16) & 0x7f), | ||
1274 | (char)((fmt->pixelformat >> 24) & 0x7f), | ||
1275 | (fmt->pixelformat & (1 << 31)) ? "-BE" : ""); | ||
1276 | break; | ||
1277 | } | ||
1278 | } | ||
1279 | |||
1280 | if (descr) | ||
1281 | WARN_ON(strlcpy(fmt->description, descr, sz) >= sz); | ||
1282 | fmt->flags = flags; | ||
1283 | } | ||
1284 | |||
1106 | static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops, | 1285 | static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops, |
1107 | struct file *file, void *fh, void *arg) | 1286 | struct file *file, void *fh, void *arg) |
1108 | { | 1287 | { |
@@ -1112,34 +1291,43 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops, | |||
1112 | bool is_sdr = vfd->vfl_type == VFL_TYPE_SDR; | 1291 | bool is_sdr = vfd->vfl_type == VFL_TYPE_SDR; |
1113 | bool is_rx = vfd->vfl_dir != VFL_DIR_TX; | 1292 | bool is_rx = vfd->vfl_dir != VFL_DIR_TX; |
1114 | bool is_tx = vfd->vfl_dir != VFL_DIR_RX; | 1293 | bool is_tx = vfd->vfl_dir != VFL_DIR_RX; |
1294 | int ret = -EINVAL; | ||
1115 | 1295 | ||
1116 | switch (p->type) { | 1296 | switch (p->type) { |
1117 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: | 1297 | case V4L2_BUF_TYPE_VIDEO_CAPTURE: |
1118 | if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap)) | 1298 | if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap)) |
1119 | break; | 1299 | break; |
1120 | return ops->vidioc_enum_fmt_vid_cap(file, fh, arg); | 1300 | ret = ops->vidioc_enum_fmt_vid_cap(file, fh, arg); |
1301 | break; | ||
1121 | case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: | 1302 | case V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE: |
1122 | if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap_mplane)) | 1303 | if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_cap_mplane)) |
1123 | break; | 1304 | break; |
1124 | return ops->vidioc_enum_fmt_vid_cap_mplane(file, fh, arg); | 1305 | ret = ops->vidioc_enum_fmt_vid_cap_mplane(file, fh, arg); |
1306 | break; | ||
1125 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: | 1307 | case V4L2_BUF_TYPE_VIDEO_OVERLAY: |
1126 | if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_overlay)) | 1308 | if (unlikely(!is_rx || !is_vid || !ops->vidioc_enum_fmt_vid_overlay)) |
1127 | break; | 1309 | break; |
1128 | return ops->vidioc_enum_fmt_vid_overlay(file, fh, arg); | 1310 | ret = ops->vidioc_enum_fmt_vid_overlay(file, fh, arg); |
1311 | break; | ||
1129 | case V4L2_BUF_TYPE_VIDEO_OUTPUT: | 1312 | case V4L2_BUF_TYPE_VIDEO_OUTPUT: |
1130 | if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out)) | 1313 | if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out)) |
1131 | break; | 1314 | break; |
1132 | return ops->vidioc_enum_fmt_vid_out(file, fh, arg); | 1315 | ret = ops->vidioc_enum_fmt_vid_out(file, fh, arg); |
1316 | break; | ||
1133 | case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: | 1317 | case V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE: |
1134 | if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out_mplane)) | 1318 | if (unlikely(!is_tx || !is_vid || !ops->vidioc_enum_fmt_vid_out_mplane)) |
1135 | break; | 1319 | break; |
1136 | return ops->vidioc_enum_fmt_vid_out_mplane(file, fh, arg); | 1320 | ret = ops->vidioc_enum_fmt_vid_out_mplane(file, fh, arg); |
1321 | break; | ||
1137 | case V4L2_BUF_TYPE_SDR_CAPTURE: | 1322 | case V4L2_BUF_TYPE_SDR_CAPTURE: |
1138 | if (unlikely(!is_rx || !is_sdr || !ops->vidioc_enum_fmt_sdr_cap)) | 1323 | if (unlikely(!is_rx || !is_sdr || !ops->vidioc_enum_fmt_sdr_cap)) |
1139 | break; | 1324 | break; |
1140 | return ops->vidioc_enum_fmt_sdr_cap(file, fh, arg); | 1325 | ret = ops->vidioc_enum_fmt_sdr_cap(file, fh, arg); |
1326 | break; | ||
1141 | } | 1327 | } |
1142 | return -EINVAL; | 1328 | if (ret == 0) |
1329 | v4l_fill_fmtdesc(p); | ||
1330 | return ret; | ||
1143 | } | 1331 | } |
1144 | 1332 | ||
1145 | static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, | 1333 | static int v4l_g_fmt(const struct v4l2_ioctl_ops *ops, |
@@ -1618,6 +1806,8 @@ static int v4l_create_bufs(const struct v4l2_ioctl_ops *ops, | |||
1618 | if (ret) | 1806 | if (ret) |
1619 | return ret; | 1807 | return ret; |
1620 | 1808 | ||
1809 | CLEAR_AFTER_FIELD(create, format); | ||
1810 | |||
1621 | v4l_sanitize_format(&create->format); | 1811 | v4l_sanitize_format(&create->format); |
1622 | 1812 | ||
1623 | ret = ops->vidioc_create_bufs(file, fh, create); | 1813 | ret = ops->vidioc_create_bufs(file, fh, create); |
@@ -2354,7 +2544,7 @@ static long __video_do_ioctl(struct file *file, | |||
2354 | if (v4l2_is_known_ioctl(cmd)) { | 2544 | if (v4l2_is_known_ioctl(cmd)) { |
2355 | info = &v4l2_ioctls[_IOC_NR(cmd)]; | 2545 | info = &v4l2_ioctls[_IOC_NR(cmd)]; |
2356 | 2546 | ||
2357 | if (!test_bit(_IOC_NR(cmd), vfd->valid_ioctls) && | 2547 | if (!test_bit(_IOC_NR(cmd), vfd->valid_ioctls) && |
2358 | !((info->flags & INFO_FL_CTRL) && vfh && vfh->ctrl_handler)) | 2548 | !((info->flags & INFO_FL_CTRL) && vfh && vfh->ctrl_handler)) |
2359 | goto done; | 2549 | goto done; |
2360 | 2550 | ||