blob: 0acfacfa94369ac43fc87b7d3fdac224b6257706 [file] [log] [blame]
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001/*
Andy Walls0d82fe82009-01-01 19:02:31 -03002 * cx2341x - generic code for cx23415/6/8 based devices
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03003 *
4 * Copyright (C) 2006 Hans Verkuil <hverkuil@xs4all.nl>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21
22#include <linux/module.h>
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -030023#include <linux/errno.h>
24#include <linux/kernel.h>
25#include <linux/init.h>
26#include <linux/types.h>
27#include <linux/videodev2.h>
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -030028
29#include <media/tuner.h>
30#include <media/cx2341x.h>
31#include <media/v4l2-common.h>
32
Andy Walls0d82fe82009-01-01 19:02:31 -030033MODULE_DESCRIPTION("cx23415/6/8 driver");
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -030034MODULE_AUTHOR("Hans Verkuil");
35MODULE_LICENSE("GPL");
36
Hans Verkuil737bd412007-11-01 13:38:12 -030037static int debug;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -030038module_param(debug, int, 0644);
39MODULE_PARM_DESC(debug, "Debug level (0-1)");
40
Hans Verkuilcc7bc642006-06-19 17:53:08 -030041const u32 cx2341x_mpeg_ctrls[] = {
42 V4L2_CID_MPEG_CLASS,
43 V4L2_CID_MPEG_STREAM_TYPE,
Hans Verkuil8cbde942006-06-24 14:36:02 -030044 V4L2_CID_MPEG_STREAM_VBI_FMT,
Hans Verkuilcc7bc642006-06-19 17:53:08 -030045 V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ,
46 V4L2_CID_MPEG_AUDIO_ENCODING,
47 V4L2_CID_MPEG_AUDIO_L2_BITRATE,
Andy Walls0d82fe82009-01-01 19:02:31 -030048 V4L2_CID_MPEG_AUDIO_AC3_BITRATE,
Hans Verkuilcc7bc642006-06-19 17:53:08 -030049 V4L2_CID_MPEG_AUDIO_MODE,
50 V4L2_CID_MPEG_AUDIO_MODE_EXTENSION,
51 V4L2_CID_MPEG_AUDIO_EMPHASIS,
52 V4L2_CID_MPEG_AUDIO_CRC,
Hans Verkuil5eee72e2007-04-27 12:31:00 -030053 V4L2_CID_MPEG_AUDIO_MUTE,
Hans Verkuilcc7bc642006-06-19 17:53:08 -030054 V4L2_CID_MPEG_VIDEO_ENCODING,
55 V4L2_CID_MPEG_VIDEO_ASPECT,
56 V4L2_CID_MPEG_VIDEO_B_FRAMES,
57 V4L2_CID_MPEG_VIDEO_GOP_SIZE,
58 V4L2_CID_MPEG_VIDEO_GOP_CLOSURE,
Hans Verkuilcc7bc642006-06-19 17:53:08 -030059 V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
60 V4L2_CID_MPEG_VIDEO_BITRATE,
61 V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
62 V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION,
Hans Verkuil5eee72e2007-04-27 12:31:00 -030063 V4L2_CID_MPEG_VIDEO_MUTE,
64 V4L2_CID_MPEG_VIDEO_MUTE_YUV,
Hans Verkuilcc7bc642006-06-19 17:53:08 -030065 V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE,
66 V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER,
67 V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE,
68 V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE,
69 V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE,
70 V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER,
71 V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE,
72 V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM,
73 V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP,
74 V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM,
75 V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP,
Hans Verkuil5eee72e2007-04-27 12:31:00 -030076 V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS,
Hans Verkuilcc7bc642006-06-19 17:53:08 -030077 0
78};
Hans Verkuil737bd412007-11-01 13:38:12 -030079EXPORT_SYMBOL(cx2341x_mpeg_ctrls);
Hans Verkuilcc7bc642006-06-19 17:53:08 -030080
Hans Verkuilca130ee2008-07-17 12:26:45 -030081static const struct cx2341x_mpeg_params default_params = {
82 /* misc */
83 .capabilities = 0,
84 .port = CX2341X_PORT_MEMORY,
85 .width = 720,
86 .height = 480,
87 .is_50hz = 0,
88
89 /* stream */
90 .stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS,
91 .stream_vbi_fmt = V4L2_MPEG_STREAM_VBI_FMT_NONE,
92 .stream_insert_nav_packets = 0,
93
94 /* audio */
95 .audio_sampling_freq = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
96 .audio_encoding = V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
97 .audio_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_224K,
Andy Walls0d82fe82009-01-01 19:02:31 -030098 .audio_ac3_bitrate = V4L2_MPEG_AUDIO_AC3_BITRATE_224K,
Hans Verkuilca130ee2008-07-17 12:26:45 -030099 .audio_mode = V4L2_MPEG_AUDIO_MODE_STEREO,
100 .audio_mode_extension = V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4,
101 .audio_emphasis = V4L2_MPEG_AUDIO_EMPHASIS_NONE,
102 .audio_crc = V4L2_MPEG_AUDIO_CRC_NONE,
103 .audio_mute = 0,
104
105 /* video */
106 .video_encoding = V4L2_MPEG_VIDEO_ENCODING_MPEG_2,
107 .video_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3,
108 .video_b_frames = 2,
109 .video_gop_size = 12,
110 .video_gop_closure = 1,
111 .video_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
112 .video_bitrate = 6000000,
113 .video_bitrate_peak = 8000000,
114 .video_temporal_decimation = 0,
115 .video_mute = 0,
116 .video_mute_yuv = 0x008080, /* YCbCr value for black */
117
118 /* encoding filters */
119 .video_spatial_filter_mode =
120 V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL,
121 .video_spatial_filter = 0,
122 .video_luma_spatial_filter_type =
123 V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR,
124 .video_chroma_spatial_filter_type =
125 V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR,
126 .video_temporal_filter_mode =
127 V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL,
128 .video_temporal_filter = 8,
129 .video_median_filter_type =
130 V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF,
131 .video_luma_median_filter_top = 255,
132 .video_luma_median_filter_bottom = 0,
133 .video_chroma_median_filter_top = 255,
134 .video_chroma_median_filter_bottom = 0,
135};
136
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300137
138/* Map the control ID to the correct field in the cx2341x_mpeg_params
139 struct. Return -EINVAL if the ID is unknown, else return 0. */
Hans Verkuile0e31cd2008-06-22 12:03:28 -0300140static int cx2341x_get_ctrl(const struct cx2341x_mpeg_params *params,
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300141 struct v4l2_ext_control *ctrl)
142{
143 switch (ctrl->id) {
144 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
145 ctrl->value = params->audio_sampling_freq;
146 break;
147 case V4L2_CID_MPEG_AUDIO_ENCODING:
148 ctrl->value = params->audio_encoding;
149 break;
150 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
151 ctrl->value = params->audio_l2_bitrate;
152 break;
Andy Walls0d82fe82009-01-01 19:02:31 -0300153 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
154 ctrl->value = params->audio_ac3_bitrate;
155 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300156 case V4L2_CID_MPEG_AUDIO_MODE:
157 ctrl->value = params->audio_mode;
158 break;
159 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
160 ctrl->value = params->audio_mode_extension;
161 break;
162 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
163 ctrl->value = params->audio_emphasis;
164 break;
165 case V4L2_CID_MPEG_AUDIO_CRC:
166 ctrl->value = params->audio_crc;
167 break;
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300168 case V4L2_CID_MPEG_AUDIO_MUTE:
169 ctrl->value = params->audio_mute;
170 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300171 case V4L2_CID_MPEG_VIDEO_ENCODING:
172 ctrl->value = params->video_encoding;
173 break;
174 case V4L2_CID_MPEG_VIDEO_ASPECT:
175 ctrl->value = params->video_aspect;
176 break;
177 case V4L2_CID_MPEG_VIDEO_B_FRAMES:
178 ctrl->value = params->video_b_frames;
179 break;
180 case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
181 ctrl->value = params->video_gop_size;
182 break;
183 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
184 ctrl->value = params->video_gop_closure;
185 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300186 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
187 ctrl->value = params->video_bitrate_mode;
188 break;
189 case V4L2_CID_MPEG_VIDEO_BITRATE:
190 ctrl->value = params->video_bitrate;
191 break;
192 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
193 ctrl->value = params->video_bitrate_peak;
194 break;
195 case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION:
196 ctrl->value = params->video_temporal_decimation;
197 break;
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300198 case V4L2_CID_MPEG_VIDEO_MUTE:
199 ctrl->value = params->video_mute;
200 break;
201 case V4L2_CID_MPEG_VIDEO_MUTE_YUV:
202 ctrl->value = params->video_mute_yuv;
203 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300204 case V4L2_CID_MPEG_STREAM_TYPE:
205 ctrl->value = params->stream_type;
206 break;
Hans Verkuil8cbde942006-06-24 14:36:02 -0300207 case V4L2_CID_MPEG_STREAM_VBI_FMT:
208 ctrl->value = params->stream_vbi_fmt;
209 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300210 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
211 ctrl->value = params->video_spatial_filter_mode;
212 break;
213 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER:
214 ctrl->value = params->video_spatial_filter;
215 break;
216 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:
217 ctrl->value = params->video_luma_spatial_filter_type;
218 break;
219 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:
220 ctrl->value = params->video_chroma_spatial_filter_type;
221 break;
222 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:
223 ctrl->value = params->video_temporal_filter_mode;
224 break;
225 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER:
226 ctrl->value = params->video_temporal_filter;
227 break;
228 case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:
229 ctrl->value = params->video_median_filter_type;
230 break;
231 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP:
232 ctrl->value = params->video_luma_median_filter_top;
233 break;
234 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM:
235 ctrl->value = params->video_luma_median_filter_bottom;
236 break;
237 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP:
238 ctrl->value = params->video_chroma_median_filter_top;
239 break;
240 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:
241 ctrl->value = params->video_chroma_median_filter_bottom;
242 break;
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300243 case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
244 ctrl->value = params->stream_insert_nav_packets;
245 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300246 default:
247 return -EINVAL;
248 }
249 return 0;
250}
251
252/* Map the control ID to the correct field in the cx2341x_mpeg_params
253 struct. Return -EINVAL if the ID is unknown, else return 0. */
Hans Verkuil01f1e442007-08-21 18:32:42 -0300254static int cx2341x_set_ctrl(struct cx2341x_mpeg_params *params, int busy,
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300255 struct v4l2_ext_control *ctrl)
256{
257 switch (ctrl->id) {
258 case V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ:
Hans Verkuil01f1e442007-08-21 18:32:42 -0300259 if (busy)
260 return -EBUSY;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300261 params->audio_sampling_freq = ctrl->value;
262 break;
263 case V4L2_CID_MPEG_AUDIO_ENCODING:
Andy Walls0d82fe82009-01-01 19:02:31 -0300264 if (busy)
265 return -EBUSY;
266 if (params->capabilities & CX2341X_CAP_HAS_AC3 &&
267 ctrl->value != V4L2_MPEG_AUDIO_ENCODING_LAYER_2 &&
268 ctrl->value != V4L2_MPEG_AUDIO_ENCODING_AC3)
269 return -EINVAL;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300270 params->audio_encoding = ctrl->value;
271 break;
272 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
Hans Verkuil01f1e442007-08-21 18:32:42 -0300273 if (busy)
274 return -EBUSY;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300275 params->audio_l2_bitrate = ctrl->value;
276 break;
Andy Walls0d82fe82009-01-01 19:02:31 -0300277 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
278 if (busy)
279 return -EBUSY;
280 params->audio_ac3_bitrate = ctrl->value;
281 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300282 case V4L2_CID_MPEG_AUDIO_MODE:
283 params->audio_mode = ctrl->value;
284 break;
285 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
286 params->audio_mode_extension = ctrl->value;
287 break;
288 case V4L2_CID_MPEG_AUDIO_EMPHASIS:
289 params->audio_emphasis = ctrl->value;
290 break;
291 case V4L2_CID_MPEG_AUDIO_CRC:
292 params->audio_crc = ctrl->value;
293 break;
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300294 case V4L2_CID_MPEG_AUDIO_MUTE:
295 params->audio_mute = ctrl->value;
296 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300297 case V4L2_CID_MPEG_VIDEO_ASPECT:
298 params->video_aspect = ctrl->value;
299 break;
300 case V4L2_CID_MPEG_VIDEO_B_FRAMES: {
301 int b = ctrl->value + 1;
302 int gop = params->video_gop_size;
303 params->video_b_frames = ctrl->value;
304 params->video_gop_size = b * ((gop + b - 1) / b);
305 /* Max GOP size = 34 */
306 while (params->video_gop_size > 34)
307 params->video_gop_size -= b;
308 break;
309 }
310 case V4L2_CID_MPEG_VIDEO_GOP_SIZE: {
311 int b = params->video_b_frames + 1;
312 int gop = ctrl->value;
313 params->video_gop_size = b * ((gop + b - 1) / b);
314 /* Max GOP size = 34 */
315 while (params->video_gop_size > 34)
316 params->video_gop_size -= b;
317 ctrl->value = params->video_gop_size;
318 break;
319 }
320 case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
321 params->video_gop_closure = ctrl->value;
322 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300323 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
Hans Verkuil01f1e442007-08-21 18:32:42 -0300324 if (busy)
325 return -EBUSY;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300326 /* MPEG-1 only allows CBR */
327 if (params->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1 &&
328 ctrl->value != V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
329 return -EINVAL;
330 params->video_bitrate_mode = ctrl->value;
331 break;
332 case V4L2_CID_MPEG_VIDEO_BITRATE:
Hans Verkuil01f1e442007-08-21 18:32:42 -0300333 if (busy)
334 return -EBUSY;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300335 params->video_bitrate = ctrl->value;
336 break;
337 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
Hans Verkuil01f1e442007-08-21 18:32:42 -0300338 if (busy)
339 return -EBUSY;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300340 params->video_bitrate_peak = ctrl->value;
341 break;
342 case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION:
343 params->video_temporal_decimation = ctrl->value;
344 break;
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300345 case V4L2_CID_MPEG_VIDEO_MUTE:
346 params->video_mute = (ctrl->value != 0);
347 break;
348 case V4L2_CID_MPEG_VIDEO_MUTE_YUV:
349 params->video_mute_yuv = ctrl->value;
350 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300351 case V4L2_CID_MPEG_STREAM_TYPE:
Hans Verkuil01f1e442007-08-21 18:32:42 -0300352 if (busy)
353 return -EBUSY;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300354 params->stream_type = ctrl->value;
355 params->video_encoding =
Hans Verkuil737bd412007-11-01 13:38:12 -0300356 (params->stream_type == V4L2_MPEG_STREAM_TYPE_MPEG1_SS ||
357 params->stream_type == V4L2_MPEG_STREAM_TYPE_MPEG1_VCD) ?
358 V4L2_MPEG_VIDEO_ENCODING_MPEG_1 :
359 V4L2_MPEG_VIDEO_ENCODING_MPEG_2;
360 if (params->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300361 /* MPEG-1 implies CBR */
Hans Verkuil737bd412007-11-01 13:38:12 -0300362 params->video_bitrate_mode =
363 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300364 break;
Hans Verkuil8cbde942006-06-24 14:36:02 -0300365 case V4L2_CID_MPEG_STREAM_VBI_FMT:
366 params->stream_vbi_fmt = ctrl->value;
367 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300368 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
369 params->video_spatial_filter_mode = ctrl->value;
370 break;
371 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER:
372 params->video_spatial_filter = ctrl->value;
373 break;
374 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:
375 params->video_luma_spatial_filter_type = ctrl->value;
376 break;
377 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:
378 params->video_chroma_spatial_filter_type = ctrl->value;
379 break;
380 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:
381 params->video_temporal_filter_mode = ctrl->value;
382 break;
383 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER:
384 params->video_temporal_filter = ctrl->value;
385 break;
386 case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:
387 params->video_median_filter_type = ctrl->value;
388 break;
389 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP:
390 params->video_luma_median_filter_top = ctrl->value;
391 break;
392 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM:
393 params->video_luma_median_filter_bottom = ctrl->value;
394 break;
395 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP:
396 params->video_chroma_median_filter_top = ctrl->value;
397 break;
398 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:
399 params->video_chroma_median_filter_bottom = ctrl->value;
400 break;
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300401 case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
402 params->stream_insert_nav_packets = ctrl->value;
403 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300404 default:
405 return -EINVAL;
406 }
407 return 0;
408}
409
Hans Verkuil737bd412007-11-01 13:38:12 -0300410static int cx2341x_ctrl_query_fill(struct v4l2_queryctrl *qctrl,
411 s32 min, s32 max, s32 step, s32 def)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300412{
413 const char *name;
414
415 qctrl->flags = 0;
416 switch (qctrl->id) {
417 /* MPEG controls */
418 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
419 name = "Spatial Filter Mode";
420 break;
421 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER:
422 name = "Spatial Filter";
423 break;
424 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:
425 name = "Spatial Luma Filter Type";
426 break;
427 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:
428 name = "Spatial Chroma Filter Type";
429 break;
430 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:
431 name = "Temporal Filter Mode";
432 break;
433 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER:
434 name = "Temporal Filter";
435 break;
436 case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:
437 name = "Median Filter Type";
438 break;
439 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP:
440 name = "Median Luma Filter Maximum";
441 break;
442 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM:
443 name = "Median Luma Filter Minimum";
444 break;
445 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP:
446 name = "Median Chroma Filter Maximum";
447 break;
448 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:
449 name = "Median Chroma Filter Minimum";
450 break;
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300451 case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
452 name = "Insert Navigation Packets";
453 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300454
455 default:
456 return v4l2_ctrl_query_fill(qctrl, min, max, step, def);
457 }
458 switch (qctrl->id) {
459 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
460 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:
461 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:
462 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:
463 case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:
464 qctrl->type = V4L2_CTRL_TYPE_MENU;
465 min = 0;
466 step = 1;
467 break;
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300468 case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
469 qctrl->type = V4L2_CTRL_TYPE_BOOLEAN;
470 min = 0;
471 max = 1;
472 step = 1;
473 break;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300474 default:
475 qctrl->type = V4L2_CTRL_TYPE_INTEGER;
476 break;
477 }
478 switch (qctrl->id) {
479 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
480 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:
481 case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:
482 qctrl->flags |= V4L2_CTRL_FLAG_UPDATE;
483 break;
484 }
485 qctrl->minimum = min;
486 qctrl->maximum = max;
487 qctrl->step = step;
488 qctrl->default_value = def;
489 qctrl->reserved[0] = qctrl->reserved[1] = 0;
490 snprintf(qctrl->name, sizeof(qctrl->name), name);
491 return 0;
492}
493
Hans Verkuile0e31cd2008-06-22 12:03:28 -0300494int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
Hans Verkuil737bd412007-11-01 13:38:12 -0300495 struct v4l2_queryctrl *qctrl)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300496{
497 int err;
498
499 switch (qctrl->id) {
500 case V4L2_CID_MPEG_AUDIO_ENCODING:
Andy Walls0d82fe82009-01-01 19:02:31 -0300501 if (params->capabilities & CX2341X_CAP_HAS_AC3)
502 return v4l2_ctrl_query_fill(qctrl,
503 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
504 V4L2_MPEG_AUDIO_ENCODING_AC3, 1,
505 default_params.audio_encoding);
506
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300507 return v4l2_ctrl_query_fill(qctrl,
508 V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
509 V4L2_MPEG_AUDIO_ENCODING_LAYER_2, 1,
Hans Verkuilca130ee2008-07-17 12:26:45 -0300510 default_params.audio_encoding);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300511
512 case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
513 return v4l2_ctrl_query_fill(qctrl,
514 V4L2_MPEG_AUDIO_L2_BITRATE_192K,
515 V4L2_MPEG_AUDIO_L2_BITRATE_384K, 1,
Hans Verkuilca130ee2008-07-17 12:26:45 -0300516 default_params.audio_l2_bitrate);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300517
518 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
519 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
520 return -EINVAL;
521
Andy Walls0d82fe82009-01-01 19:02:31 -0300522 case V4L2_CID_MPEG_AUDIO_AC3_BITRATE:
523 return v4l2_ctrl_query_fill(qctrl,
524 V4L2_MPEG_AUDIO_AC3_BITRATE_48K,
525 V4L2_MPEG_AUDIO_AC3_BITRATE_448K, 1,
526 default_params.audio_ac3_bitrate);
527
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300528 case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
529 err = v4l2_ctrl_query_fill_std(qctrl);
Hans Verkuil737bd412007-11-01 13:38:12 -0300530 if (err == 0 &&
531 params->audio_mode != V4L2_MPEG_AUDIO_MODE_JOINT_STEREO)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300532 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
533 return err;
534
535 case V4L2_CID_MPEG_VIDEO_ENCODING:
536 /* this setting is read-only for the cx2341x since the
537 V4L2_CID_MPEG_STREAM_TYPE really determines the
538 MPEG-1/2 setting */
Janne Grunau188919a2008-08-08 07:21:00 -0300539 err = v4l2_ctrl_query_fill(qctrl,
540 V4L2_MPEG_VIDEO_ENCODING_MPEG_1,
541 V4L2_MPEG_VIDEO_ENCODING_MPEG_2, 1,
542 V4L2_MPEG_VIDEO_ENCODING_MPEG_2);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300543 if (err == 0)
544 qctrl->flags |= V4L2_CTRL_FLAG_READ_ONLY;
545 return err;
546
Hans Verkuil54aa9a22006-06-19 18:00:06 -0300547 case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
548 err = v4l2_ctrl_query_fill_std(qctrl);
Hans Verkuil737bd412007-11-01 13:38:12 -0300549 if (err == 0 &&
550 params->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
Hans Verkuil54aa9a22006-06-19 18:00:06 -0300551 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
552 return err;
553
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300554 case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
555 err = v4l2_ctrl_query_fill_std(qctrl);
Hans Verkuil737bd412007-11-01 13:38:12 -0300556 if (err == 0 &&
557 params->video_bitrate_mode ==
558 V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300559 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
560 return err;
561
Hans Verkuil8cbde942006-06-24 14:36:02 -0300562 case V4L2_CID_MPEG_STREAM_VBI_FMT:
563 if (params->capabilities & CX2341X_CAP_HAS_SLICED_VBI)
564 return v4l2_ctrl_query_fill_std(qctrl);
565 return cx2341x_ctrl_query_fill(qctrl,
566 V4L2_MPEG_STREAM_VBI_FMT_NONE,
567 V4L2_MPEG_STREAM_VBI_FMT_NONE, 1,
Hans Verkuilca130ee2008-07-17 12:26:45 -0300568 default_params.stream_vbi_fmt);
569
570 case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
571 return v4l2_ctrl_query_fill(qctrl, 1, 34, 1,
572 params->is_50hz ? 12 : 15);
Hans Verkuil8cbde942006-06-24 14:36:02 -0300573
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300574 /* CX23415/6 specific */
575 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
576 return cx2341x_ctrl_query_fill(qctrl,
Hans Verkuil737bd412007-11-01 13:38:12 -0300577 V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL,
578 V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO, 1,
Hans Verkuilca130ee2008-07-17 12:26:45 -0300579 default_params.video_spatial_filter_mode);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300580
581 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER:
Hans Verkuilca130ee2008-07-17 12:26:45 -0300582 cx2341x_ctrl_query_fill(qctrl, 0, 15, 1,
583 default_params.video_spatial_filter);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300584 qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
Hans Verkuil737bd412007-11-01 13:38:12 -0300585 if (params->video_spatial_filter_mode ==
586 V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)
587 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300588 return 0;
589
590 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:
591 cx2341x_ctrl_query_fill(qctrl,
Hans Verkuil737bd412007-11-01 13:38:12 -0300592 V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF,
593 V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE,
594 1,
Hans Verkuilca130ee2008-07-17 12:26:45 -0300595 default_params.video_luma_spatial_filter_type);
Hans Verkuil737bd412007-11-01 13:38:12 -0300596 if (params->video_spatial_filter_mode ==
597 V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)
598 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300599 return 0;
600
601 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:
602 cx2341x_ctrl_query_fill(qctrl,
Hans Verkuil737bd412007-11-01 13:38:12 -0300603 V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF,
604 V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR,
605 1,
Hans Verkuilca130ee2008-07-17 12:26:45 -0300606 default_params.video_chroma_spatial_filter_type);
Hans Verkuil737bd412007-11-01 13:38:12 -0300607 if (params->video_spatial_filter_mode ==
608 V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)
609 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300610 return 0;
611
612 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:
613 return cx2341x_ctrl_query_fill(qctrl,
Hans Verkuil737bd412007-11-01 13:38:12 -0300614 V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL,
615 V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO, 1,
Hans Verkuilca130ee2008-07-17 12:26:45 -0300616 default_params.video_temporal_filter_mode);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300617
618 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER:
Hans Verkuilca130ee2008-07-17 12:26:45 -0300619 cx2341x_ctrl_query_fill(qctrl, 0, 31, 1,
620 default_params.video_temporal_filter);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300621 qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
Hans Verkuil737bd412007-11-01 13:38:12 -0300622 if (params->video_temporal_filter_mode ==
623 V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO)
624 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300625 return 0;
626
627 case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:
628 return cx2341x_ctrl_query_fill(qctrl,
Hans Verkuil737bd412007-11-01 13:38:12 -0300629 V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF,
630 V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG, 1,
Hans Verkuilca130ee2008-07-17 12:26:45 -0300631 default_params.video_median_filter_type);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300632
633 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP:
Hans Verkuilca130ee2008-07-17 12:26:45 -0300634 cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,
635 default_params.video_luma_median_filter_top);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300636 qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
Hans Verkuil737bd412007-11-01 13:38:12 -0300637 if (params->video_median_filter_type ==
638 V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
639 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300640 return 0;
641
642 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM:
Hans Verkuilca130ee2008-07-17 12:26:45 -0300643 cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,
644 default_params.video_luma_median_filter_bottom);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300645 qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
Hans Verkuil737bd412007-11-01 13:38:12 -0300646 if (params->video_median_filter_type ==
647 V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
648 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300649 return 0;
650
651 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP:
Hans Verkuilca130ee2008-07-17 12:26:45 -0300652 cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,
653 default_params.video_chroma_median_filter_top);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300654 qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
Hans Verkuil737bd412007-11-01 13:38:12 -0300655 if (params->video_median_filter_type ==
656 V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
657 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300658 return 0;
659
660 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:
Hans Verkuilca130ee2008-07-17 12:26:45 -0300661 cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,
662 default_params.video_chroma_median_filter_bottom);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300663 qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
Hans Verkuil737bd412007-11-01 13:38:12 -0300664 if (params->video_median_filter_type ==
665 V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
666 qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300667 return 0;
668
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300669 case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
Hans Verkuilca130ee2008-07-17 12:26:45 -0300670 return cx2341x_ctrl_query_fill(qctrl, 0, 1, 1,
671 default_params.stream_insert_nav_packets);
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300672
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300673 default:
674 return v4l2_ctrl_query_fill_std(qctrl);
675
676 }
677}
Hans Verkuil737bd412007-11-01 13:38:12 -0300678EXPORT_SYMBOL(cx2341x_ctrl_query);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300679
Hans Verkuile0e31cd2008-06-22 12:03:28 -0300680const char **cx2341x_ctrl_get_menu(const struct cx2341x_mpeg_params *p, u32 id)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300681{
Hans Verkuile0e31cd2008-06-22 12:03:28 -0300682 static const char *mpeg_stream_type_without_ts[] = {
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300683 "MPEG-2 Program Stream",
684 "",
685 "MPEG-1 System Stream",
686 "MPEG-2 DVD-compatible Stream",
687 "MPEG-1 VCD-compatible Stream",
688 "MPEG-2 SVCD-compatible Stream",
689 NULL
690 };
691
Hans Verkuile0e31cd2008-06-22 12:03:28 -0300692 static const char *mpeg_stream_type_with_ts[] = {
693 "MPEG-2 Program Stream",
694 "MPEG-2 Transport Stream",
695 "MPEG-1 System Stream",
696 "MPEG-2 DVD-compatible Stream",
697 "MPEG-1 VCD-compatible Stream",
698 "MPEG-2 SVCD-compatible Stream",
699 NULL
700 };
701
Andy Walls0d82fe82009-01-01 19:02:31 -0300702 static const char *mpeg_audio_encoding_l2_ac3[] = {
703 "",
704 "MPEG-1/2 Layer II",
705 "",
706 "",
707 "AC-3",
708 NULL
709 };
710
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300711 static const char *cx2341x_video_spatial_filter_mode_menu[] = {
712 "Manual",
713 "Auto",
714 NULL
715 };
716
717 static const char *cx2341x_video_luma_spatial_filter_type_menu[] = {
718 "Off",
719 "1D Horizontal",
720 "1D Vertical",
721 "2D H/V Separable",
722 "2D Symmetric non-separable",
723 NULL
724 };
725
726 static const char *cx2341x_video_chroma_spatial_filter_type_menu[] = {
727 "Off",
728 "1D Horizontal",
729 NULL
730 };
731
732 static const char *cx2341x_video_temporal_filter_mode_menu[] = {
733 "Manual",
734 "Auto",
735 NULL
736 };
737
738 static const char *cx2341x_video_median_filter_type_menu[] = {
739 "Off",
740 "Horizontal",
741 "Vertical",
742 "Horizontal/Vertical",
743 "Diagonal",
744 NULL
745 };
746
747 switch (id) {
748 case V4L2_CID_MPEG_STREAM_TYPE:
Hans Verkuile0e31cd2008-06-22 12:03:28 -0300749 return (p->capabilities & CX2341X_CAP_HAS_TS) ?
750 mpeg_stream_type_with_ts : mpeg_stream_type_without_ts;
Andy Walls0d82fe82009-01-01 19:02:31 -0300751 case V4L2_CID_MPEG_AUDIO_ENCODING:
752 return (p->capabilities & CX2341X_CAP_HAS_AC3) ?
753 mpeg_audio_encoding_l2_ac3 : v4l2_ctrl_get_menu(id);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300754 case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
755 case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
756 return NULL;
757 case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
758 return cx2341x_video_spatial_filter_mode_menu;
759 case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:
760 return cx2341x_video_luma_spatial_filter_type_menu;
761 case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:
762 return cx2341x_video_chroma_spatial_filter_type_menu;
763 case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:
764 return cx2341x_video_temporal_filter_mode_menu;
765 case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:
766 return cx2341x_video_median_filter_type_menu;
767 default:
768 return v4l2_ctrl_get_menu(id);
769 }
770}
Hans Verkuil737bd412007-11-01 13:38:12 -0300771EXPORT_SYMBOL(cx2341x_ctrl_get_menu);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300772
Andy Walls0d82fe82009-01-01 19:02:31 -0300773/* definitions for audio properties bits 29-28 */
774#define CX2341X_AUDIO_ENCDING_METHOD_MPEG 0
775#define CX2341X_AUDIO_ENCDING_METHOD_AC3 1
776#define CX2341X_AUDIO_ENCDING_METHOD_LPCM 2
777
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300778static void cx2341x_calc_audio_properties(struct cx2341x_mpeg_params *params)
779{
Andy Walls0d82fe82009-01-01 19:02:31 -0300780 params->audio_properties =
781 (params->audio_sampling_freq << 0) |
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300782 (params->audio_mode << 8) |
783 (params->audio_mode_extension << 10) |
Hans Verkuil737bd412007-11-01 13:38:12 -0300784 (((params->audio_emphasis == V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17)
785 ? 3 : params->audio_emphasis) << 12) |
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300786 (params->audio_crc << 14);
Andy Walls0d82fe82009-01-01 19:02:31 -0300787
788 if ((params->capabilities & CX2341X_CAP_HAS_AC3) &&
789 params->audio_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3) {
790 params->audio_properties |=
791 /* Not sure if this MPEG Layer II setting is required */
792 ((3 - V4L2_MPEG_AUDIO_ENCODING_LAYER_2) << 2) |
793 (params->audio_ac3_bitrate << 4) |
794 (CX2341X_AUDIO_ENCDING_METHOD_AC3 << 28);
795 } else {
796 /* Assuming MPEG Layer II */
797 params->audio_properties |=
798 ((3 - params->audio_encoding) << 2) |
799 ((1 + params->audio_l2_bitrate) << 4);
800 }
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300801}
802
Hans Verkuil01f1e442007-08-21 18:32:42 -0300803int cx2341x_ext_ctrls(struct cx2341x_mpeg_params *params, int busy,
Hans Verkuil4d6b5ae2006-06-26 09:31:18 -0300804 struct v4l2_ext_controls *ctrls, unsigned int cmd)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300805{
806 int err = 0;
807 int i;
808
809 if (cmd == VIDIOC_G_EXT_CTRLS) {
810 for (i = 0; i < ctrls->count; i++) {
811 struct v4l2_ext_control *ctrl = ctrls->controls + i;
812
813 err = cx2341x_get_ctrl(params, ctrl);
814 if (err) {
815 ctrls->error_idx = i;
816 break;
817 }
818 }
819 return err;
820 }
821 for (i = 0; i < ctrls->count; i++) {
822 struct v4l2_ext_control *ctrl = ctrls->controls + i;
823 struct v4l2_queryctrl qctrl;
824 const char **menu_items = NULL;
825
826 qctrl.id = ctrl->id;
827 err = cx2341x_ctrl_query(params, &qctrl);
828 if (err)
829 break;
830 if (qctrl.type == V4L2_CTRL_TYPE_MENU)
Hans Verkuile0e31cd2008-06-22 12:03:28 -0300831 menu_items = cx2341x_ctrl_get_menu(params, qctrl.id);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300832 err = v4l2_ctrl_check(ctrl, &qctrl, menu_items);
833 if (err)
834 break;
Hans Verkuil01f1e442007-08-21 18:32:42 -0300835 err = cx2341x_set_ctrl(params, busy, ctrl);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300836 if (err)
837 break;
838 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300839 if (err == 0 &&
840 params->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR &&
841 params->video_bitrate_peak < params->video_bitrate) {
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300842 err = -ERANGE;
843 ctrls->error_idx = ctrls->count;
844 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300845 if (err)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300846 ctrls->error_idx = i;
Hans Verkuil737bd412007-11-01 13:38:12 -0300847 else
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300848 cx2341x_calc_audio_properties(params);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300849 return err;
850}
Hans Verkuil737bd412007-11-01 13:38:12 -0300851EXPORT_SYMBOL(cx2341x_ext_ctrls);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300852
853void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
854{
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300855 *p = default_params;
856 cx2341x_calc_audio_properties(p);
857}
Hans Verkuil737bd412007-11-01 13:38:12 -0300858EXPORT_SYMBOL(cx2341x_fill_defaults);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300859
Hans Verkuil737bd412007-11-01 13:38:12 -0300860static int cx2341x_api(void *priv, cx2341x_mbox_func func,
Hans Verkuilea48c132007-12-12 07:04:58 -0300861 u32 cmd, int args, ...)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300862{
863 u32 data[CX2341X_MBOX_MAX_DATA];
864 va_list vargs;
865 int i;
866
867 va_start(vargs, args);
868
Hans Verkuil737bd412007-11-01 13:38:12 -0300869 for (i = 0; i < args; i++)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300870 data[i] = va_arg(vargs, int);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300871 va_end(vargs);
872 return func(priv, cmd, args, 0, data);
873}
874
Hans Verkuil737bd412007-11-01 13:38:12 -0300875#define NEQ(field) (old->field != new->field)
876
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300877int cx2341x_update(void *priv, cx2341x_mbox_func func,
Hans Verkuil737bd412007-11-01 13:38:12 -0300878 const struct cx2341x_mpeg_params *old,
879 const struct cx2341x_mpeg_params *new)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300880{
881 static int mpeg_stream_type[] = {
882 0, /* MPEG-2 PS */
883 1, /* MPEG-2 TS */
884 2, /* MPEG-1 SS */
885 14, /* DVD */
886 11, /* VCD */
887 12, /* SVCD */
888 };
889
890 int err = 0;
Hans Verkuil737bd412007-11-01 13:38:12 -0300891 int force = (old == NULL);
Hans Verkuil44b579d2006-08-27 19:22:15 -0300892 u16 temporal = new->video_temporal_filter;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300893
Hans Verkuil45ad9f82006-06-21 17:04:13 -0300894 cx2341x_api(priv, func, CX2341X_ENC_SET_OUTPUT_PORT, 2, new->port, 0);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300895
Hans Verkuil737bd412007-11-01 13:38:12 -0300896 if (force || NEQ(is_50hz)) {
897 err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_RATE, 1,
898 new->is_50hz);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300899 if (err) return err;
900 }
901
Hans Verkuil737bd412007-11-01 13:38:12 -0300902 if (force || NEQ(width) || NEQ(height) || NEQ(video_encoding)) {
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300903 u16 w = new->width;
904 u16 h = new->height;
905
906 if (new->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1) {
907 w /= 2;
908 h /= 2;
909 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300910 err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_SIZE, 2,
911 h, w);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300912 if (err) return err;
Hans Verkuil12b896e2006-12-18 13:37:50 -0300913 }
Hans Verkuil44b579d2006-08-27 19:22:15 -0300914
Hans Verkuil12b896e2006-12-18 13:37:50 -0300915 if (new->width != 720 || new->height != (new->is_50hz ? 576 : 480)) {
Hans Verkuil737bd412007-11-01 13:38:12 -0300916 /* Adjust temporal filter if necessary. The problem with the
917 temporal filter is that it works well with full resolution
918 capturing, but not when the capture window is scaled (the
919 filter introduces a ghosting effect). So if the capture
920 window is scaled, then force the filter to 0.
Hans Verkuil44b579d2006-08-27 19:22:15 -0300921
Hans Verkuil12b896e2006-12-18 13:37:50 -0300922 For full resolution the filter really improves the video
Hans Verkuil737bd412007-11-01 13:38:12 -0300923 quality, especially if the original video quality is
924 suboptimal. */
Hans Verkuil12b896e2006-12-18 13:37:50 -0300925 temporal = 0;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300926 }
927
Hans Verkuil737bd412007-11-01 13:38:12 -0300928 if (force || NEQ(stream_type)) {
929 err = cx2341x_api(priv, func, CX2341X_ENC_SET_STREAM_TYPE, 1,
930 mpeg_stream_type[new->stream_type]);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300931 if (err) return err;
932 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300933 if (force || NEQ(video_aspect)) {
934 err = cx2341x_api(priv, func, CX2341X_ENC_SET_ASPECT_RATIO, 1,
935 1 + new->video_aspect);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300936 if (err) return err;
937 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300938 if (force || NEQ(video_b_frames) || NEQ(video_gop_size)) {
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300939 err = cx2341x_api(priv, func, CX2341X_ENC_SET_GOP_PROPERTIES, 2,
940 new->video_gop_size, new->video_b_frames + 1);
941 if (err) return err;
942 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300943 if (force || NEQ(video_gop_closure)) {
944 err = cx2341x_api(priv, func, CX2341X_ENC_SET_GOP_CLOSURE, 1,
945 new->video_gop_closure);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300946 if (err) return err;
947 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300948 if (force || NEQ(audio_properties)) {
949 err = cx2341x_api(priv, func, CX2341X_ENC_SET_AUDIO_PROPERTIES,
950 1, new->audio_properties);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300951 if (err) return err;
952 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300953 if (force || NEQ(audio_mute)) {
954 err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_AUDIO, 1,
955 new->audio_mute);
Hans Verkuil5eee72e2007-04-27 12:31:00 -0300956 if (err) return err;
957 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300958 if (force || NEQ(video_bitrate_mode) || NEQ(video_bitrate) ||
959 NEQ(video_bitrate_peak)) {
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300960 err = cx2341x_api(priv, func, CX2341X_ENC_SET_BIT_RATE, 5,
961 new->video_bitrate_mode, new->video_bitrate,
962 new->video_bitrate_peak / 400, 0, 0);
963 if (err) return err;
964 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300965 if (force || NEQ(video_spatial_filter_mode) ||
966 NEQ(video_temporal_filter_mode) ||
967 NEQ(video_median_filter_type)) {
968 err = cx2341x_api(priv, func, CX2341X_ENC_SET_DNR_FILTER_MODE,
969 2, new->video_spatial_filter_mode |
970 (new->video_temporal_filter_mode << 1),
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300971 new->video_median_filter_type);
972 if (err) return err;
973 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300974 if (force || NEQ(video_luma_median_filter_bottom) ||
975 NEQ(video_luma_median_filter_top) ||
976 NEQ(video_chroma_median_filter_bottom) ||
977 NEQ(video_chroma_median_filter_top)) {
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300978 err = cx2341x_api(priv, func, CX2341X_ENC_SET_CORING_LEVELS, 4,
979 new->video_luma_median_filter_bottom,
980 new->video_luma_median_filter_top,
981 new->video_chroma_median_filter_bottom,
982 new->video_chroma_median_filter_top);
983 if (err) return err;
984 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300985 if (force || NEQ(video_luma_spatial_filter_type) ||
986 NEQ(video_chroma_spatial_filter_type)) {
987 err = cx2341x_api(priv, func,
988 CX2341X_ENC_SET_SPATIAL_FILTER_TYPE,
989 2, new->video_luma_spatial_filter_type,
990 new->video_chroma_spatial_filter_type);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300991 if (err) return err;
992 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300993 if (force || NEQ(video_spatial_filter) ||
994 old->video_temporal_filter != temporal) {
995 err = cx2341x_api(priv, func, CX2341X_ENC_SET_DNR_FILTER_PROPS,
996 2, new->video_spatial_filter, temporal);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -0300997 if (err) return err;
998 }
Hans Verkuil737bd412007-11-01 13:38:12 -0300999 if (force || NEQ(video_temporal_decimation)) {
1000 err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_DROP_RATE,
1001 1, new->video_temporal_decimation);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001002 if (err) return err;
1003 }
Hans Verkuil737bd412007-11-01 13:38:12 -03001004 if (force || NEQ(video_mute) ||
1005 (new->video_mute && NEQ(video_mute_yuv))) {
1006 err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_VIDEO, 1,
1007 new->video_mute | (new->video_mute_yuv << 8));
Hans Verkuil5eee72e2007-04-27 12:31:00 -03001008 if (err) return err;
1009 }
Hans Verkuil737bd412007-11-01 13:38:12 -03001010 if (force || NEQ(stream_insert_nav_packets)) {
1011 err = cx2341x_api(priv, func, CX2341X_ENC_MISC, 2,
1012 7, new->stream_insert_nav_packets);
Hans Verkuil5eee72e2007-04-27 12:31:00 -03001013 if (err) return err;
1014 }
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001015 return 0;
1016}
Hans Verkuil737bd412007-11-01 13:38:12 -03001017EXPORT_SYMBOL(cx2341x_update);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001018
Hans Verkuile0e31cd2008-06-22 12:03:28 -03001019static const char *cx2341x_menu_item(const struct cx2341x_mpeg_params *p, u32 id)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001020{
Hans Verkuile0e31cd2008-06-22 12:03:28 -03001021 const char **menu = cx2341x_ctrl_get_menu(p, id);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001022 struct v4l2_ext_control ctrl;
1023
1024 if (menu == NULL)
1025 goto invalid;
1026 ctrl.id = id;
1027 if (cx2341x_get_ctrl(p, &ctrl))
1028 goto invalid;
1029 while (ctrl.value-- && *menu) menu++;
1030 if (*menu == NULL)
1031 goto invalid;
1032 return *menu;
1033
1034invalid:
1035 return "<invalid>";
1036}
1037
Hans Verkuile0e31cd2008-06-22 12:03:28 -03001038void cx2341x_log_status(const struct cx2341x_mpeg_params *p, const char *prefix)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001039{
1040 int is_mpeg1 = p->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1;
Hans Verkuil83aaf132006-12-18 13:40:23 -03001041 int temporal = p->video_temporal_filter;
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001042
1043 /* Stream */
Hans Verkuil5eee72e2007-04-27 12:31:00 -03001044 printk(KERN_INFO "%s: Stream: %s",
Hans Verkuil99eb44f2006-06-26 18:24:05 -03001045 prefix,
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001046 cx2341x_menu_item(p, V4L2_CID_MPEG_STREAM_TYPE));
Hans Verkuil5eee72e2007-04-27 12:31:00 -03001047 if (p->stream_insert_nav_packets)
1048 printk(" (with navigation packets)");
1049 printk("\n");
Hans Verkuil44b579d2006-08-27 19:22:15 -03001050 printk(KERN_INFO "%s: VBI Format: %s\n",
1051 prefix,
1052 cx2341x_menu_item(p, V4L2_CID_MPEG_STREAM_VBI_FMT));
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001053
1054 /* Video */
Hans Verkuil5eee72e2007-04-27 12:31:00 -03001055 printk(KERN_INFO "%s: Video: %dx%d, %d fps%s\n",
Hans Verkuil99eb44f2006-06-26 18:24:05 -03001056 prefix,
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001057 p->width / (is_mpeg1 ? 2 : 1), p->height / (is_mpeg1 ? 2 : 1),
Hans Verkuil5eee72e2007-04-27 12:31:00 -03001058 p->is_50hz ? 25 : 30,
1059 (p->video_mute) ? " (muted)" : "");
Hans Verkuil99eb44f2006-06-26 18:24:05 -03001060 printk(KERN_INFO "%s: Video: %s, %s, %s, %d",
1061 prefix,
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001062 cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_ENCODING),
1063 cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_ASPECT),
1064 cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_BITRATE_MODE),
1065 p->video_bitrate);
Hans Verkuil737bd412007-11-01 13:38:12 -03001066 if (p->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR)
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001067 printk(", Peak %d", p->video_bitrate_peak);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001068 printk("\n");
Hans Verkuil737bd412007-11-01 13:38:12 -03001069 printk(KERN_INFO
1070 "%s: Video: GOP Size %d, %d B-Frames, %sGOP Closure\n",
Hans Verkuil99eb44f2006-06-26 18:24:05 -03001071 prefix,
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001072 p->video_gop_size, p->video_b_frames,
Hans Verkuil75558ab2006-12-18 22:52:21 -03001073 p->video_gop_closure ? "" : "No ");
Hans Verkuil737bd412007-11-01 13:38:12 -03001074 if (p->video_temporal_decimation)
Hans Verkuil99eb44f2006-06-26 18:24:05 -03001075 printk(KERN_INFO "%s: Video: Temporal Decimation %d\n",
1076 prefix, p->video_temporal_decimation);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001077
1078 /* Audio */
Hans Verkuil5eee72e2007-04-27 12:31:00 -03001079 printk(KERN_INFO "%s: Audio: %s, %s, %s, %s%s",
Hans Verkuil99eb44f2006-06-26 18:24:05 -03001080 prefix,
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001081 cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ),
1082 cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_ENCODING),
Andy Walls0d82fe82009-01-01 19:02:31 -03001083 cx2341x_menu_item(p,
1084 p->audio_encoding == V4L2_MPEG_AUDIO_ENCODING_AC3
1085 ? V4L2_CID_MPEG_AUDIO_AC3_BITRATE
1086 : V4L2_CID_MPEG_AUDIO_L2_BITRATE),
Hans Verkuil5eee72e2007-04-27 12:31:00 -03001087 cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_MODE),
1088 p->audio_mute ? " (muted)" : "");
Hans Verkuil737bd412007-11-01 13:38:12 -03001089 if (p->audio_mode == V4L2_MPEG_AUDIO_MODE_JOINT_STEREO)
1090 printk(", %s", cx2341x_menu_item(p,
1091 V4L2_CID_MPEG_AUDIO_MODE_EXTENSION));
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001092 printk(", %s, %s\n",
1093 cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_EMPHASIS),
1094 cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_CRC));
1095
1096 /* Encoding filters */
Hans Verkuil99eb44f2006-06-26 18:24:05 -03001097 printk(KERN_INFO "%s: Spatial Filter: %s, Luma %s, Chroma %s, %d\n",
1098 prefix,
Hans Verkuil737bd412007-11-01 13:38:12 -03001099 cx2341x_menu_item(p,
1100 V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE),
1101 cx2341x_menu_item(p,
1102 V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE),
1103 cx2341x_menu_item(p,
1104 V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE),
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001105 p->video_spatial_filter);
Hans Verkuil737bd412007-11-01 13:38:12 -03001106
1107 if (p->width != 720 || p->height != (p->is_50hz ? 576 : 480))
Hans Verkuil83aaf132006-12-18 13:40:23 -03001108 temporal = 0;
Hans Verkuil737bd412007-11-01 13:38:12 -03001109
Hans Verkuil99eb44f2006-06-26 18:24:05 -03001110 printk(KERN_INFO "%s: Temporal Filter: %s, %d\n",
1111 prefix,
Hans Verkuil737bd412007-11-01 13:38:12 -03001112 cx2341x_menu_item(p,
1113 V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE),
Hans Verkuil83aaf132006-12-18 13:40:23 -03001114 temporal);
Hans Verkuil737bd412007-11-01 13:38:12 -03001115 printk(KERN_INFO
1116 "%s: Median Filter: %s, Luma [%d, %d], Chroma [%d, %d]\n",
Hans Verkuil99eb44f2006-06-26 18:24:05 -03001117 prefix,
Hans Verkuil737bd412007-11-01 13:38:12 -03001118 cx2341x_menu_item(p,
1119 V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE),
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001120 p->video_luma_median_filter_bottom,
1121 p->video_luma_median_filter_top,
1122 p->video_chroma_median_filter_bottom,
1123 p->video_chroma_median_filter_top);
1124}
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001125EXPORT_SYMBOL(cx2341x_log_status);
Hans Verkuil5d1a9ae2006-06-18 14:40:30 -03001126
1127/*
1128 * Local variables:
1129 * c-basic-offset: 8
1130 * End:
1131 */
1132