V4L/DVB (6741): cx2341x: codingstyle cleanups

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
This commit is contained in:
Hans Verkuil 2007-11-01 13:38:12 -03:00 committed by Mauro Carvalho Chehab
parent 574dec611f
commit 737bd410e7

View File

@ -34,7 +34,7 @@ MODULE_DESCRIPTION("cx23415/6 driver");
MODULE_AUTHOR("Hans Verkuil"); MODULE_AUTHOR("Hans Verkuil");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
static int debug = 0; static int debug;
module_param(debug, int, 0644); module_param(debug, int, 0644);
MODULE_PARM_DESC(debug, "Debug level (0-1)"); MODULE_PARM_DESC(debug, "Debug level (0-1)");
@ -75,6 +75,7 @@ const u32 cx2341x_mpeg_ctrls[] = {
V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS, V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS,
0 0
}; };
EXPORT_SYMBOL(cx2341x_mpeg_ctrls);
/* Map the control ID to the correct field in the cx2341x_mpeg_params /* Map the control ID to the correct field in the cx2341x_mpeg_params
@ -281,13 +282,14 @@ static int cx2341x_set_ctrl(struct cx2341x_mpeg_params *params, int busy,
return -EBUSY; return -EBUSY;
params->stream_type = ctrl->value; params->stream_type = ctrl->value;
params->video_encoding = params->video_encoding =
(params->stream_type == V4L2_MPEG_STREAM_TYPE_MPEG1_SS || (params->stream_type == V4L2_MPEG_STREAM_TYPE_MPEG1_SS ||
params->stream_type == V4L2_MPEG_STREAM_TYPE_MPEG1_VCD) ? params->stream_type == V4L2_MPEG_STREAM_TYPE_MPEG1_VCD) ?
V4L2_MPEG_VIDEO_ENCODING_MPEG_1 : V4L2_MPEG_VIDEO_ENCODING_MPEG_2; V4L2_MPEG_VIDEO_ENCODING_MPEG_1 :
if (params->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1) { V4L2_MPEG_VIDEO_ENCODING_MPEG_2;
if (params->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
/* MPEG-1 implies CBR */ /* MPEG-1 implies CBR */
params->video_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_CBR; params->video_bitrate_mode =
} V4L2_MPEG_VIDEO_BITRATE_MODE_CBR;
break; break;
case V4L2_CID_MPEG_STREAM_VBI_FMT: case V4L2_CID_MPEG_STREAM_VBI_FMT:
params->stream_vbi_fmt = ctrl->value; params->stream_vbi_fmt = ctrl->value;
@ -334,7 +336,8 @@ static int cx2341x_set_ctrl(struct cx2341x_mpeg_params *params, int busy,
return 0; return 0;
} }
static int cx2341x_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 max, s32 step, s32 def) static int cx2341x_ctrl_query_fill(struct v4l2_queryctrl *qctrl,
s32 min, s32 max, s32 step, s32 def)
{ {
const char *name; const char *name;
@ -417,7 +420,8 @@ static int cx2341x_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 ma
return 0; return 0;
} }
int cx2341x_ctrl_query(struct cx2341x_mpeg_params *params, struct v4l2_queryctrl *qctrl) int cx2341x_ctrl_query(struct cx2341x_mpeg_params *params,
struct v4l2_queryctrl *qctrl)
{ {
int err; int err;
@ -440,7 +444,8 @@ int cx2341x_ctrl_query(struct cx2341x_mpeg_params *params, struct v4l2_queryctrl
case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION: case V4L2_CID_MPEG_AUDIO_MODE_EXTENSION:
err = v4l2_ctrl_query_fill_std(qctrl); err = v4l2_ctrl_query_fill_std(qctrl);
if (err == 0 && params->audio_mode != V4L2_MPEG_AUDIO_MODE_JOINT_STEREO) if (err == 0 &&
params->audio_mode != V4L2_MPEG_AUDIO_MODE_JOINT_STEREO)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return err; return err;
@ -455,13 +460,16 @@ int cx2341x_ctrl_query(struct cx2341x_mpeg_params *params, struct v4l2_queryctrl
case V4L2_CID_MPEG_VIDEO_BITRATE_MODE: case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
err = v4l2_ctrl_query_fill_std(qctrl); err = v4l2_ctrl_query_fill_std(qctrl);
if (err == 0 && params->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1) if (err == 0 &&
params->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return err; return err;
case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK: case V4L2_CID_MPEG_VIDEO_BITRATE_PEAK:
err = v4l2_ctrl_query_fill_std(qctrl); err = v4l2_ctrl_query_fill_std(qctrl);
if (err == 0 && params->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) if (err == 0 &&
params->video_bitrate_mode ==
V4L2_MPEG_VIDEO_BITRATE_MODE_CBR)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return err; return err;
@ -476,80 +484,90 @@ int cx2341x_ctrl_query(struct cx2341x_mpeg_params *params, struct v4l2_queryctrl
/* CX23415/6 specific */ /* CX23415/6 specific */
case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE: case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
return cx2341x_ctrl_query_fill(qctrl, return cx2341x_ctrl_query_fill(qctrl,
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL, V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL,
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO, 1, V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO, 1,
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL); V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL);
case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER: case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER:
cx2341x_ctrl_query_fill(qctrl, 0, 15, 1, 0); cx2341x_ctrl_query_fill(qctrl, 0, 15, 1, 0);
qctrl->flags |= V4L2_CTRL_FLAG_SLIDER; qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
if (params->video_spatial_filter_mode == V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO) if (params->video_spatial_filter_mode ==
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return 0; return 0;
case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE: case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE:
cx2341x_ctrl_query_fill(qctrl, cx2341x_ctrl_query_fill(qctrl,
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF, V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF,
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE, 1, V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE,
V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF); 1,
if (params->video_spatial_filter_mode == V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO) V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF);
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; if (params->video_spatial_filter_mode ==
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return 0; return 0;
case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE: case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE:
cx2341x_ctrl_query_fill(qctrl, cx2341x_ctrl_query_fill(qctrl,
V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF, V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF,
V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR, 1, V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR,
V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF); 1,
if (params->video_spatial_filter_mode == V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO) V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF);
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; if (params->video_spatial_filter_mode ==
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return 0; return 0;
case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE: case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE:
return cx2341x_ctrl_query_fill(qctrl, return cx2341x_ctrl_query_fill(qctrl,
V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL, V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL,
V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO, 1, V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO, 1,
V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL); V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL);
case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER: case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER:
cx2341x_ctrl_query_fill(qctrl, 0, 31, 1, 0); cx2341x_ctrl_query_fill(qctrl, 0, 31, 1, 0);
qctrl->flags |= V4L2_CTRL_FLAG_SLIDER; qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
if (params->video_temporal_filter_mode == V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO) if (params->video_temporal_filter_mode ==
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return 0; return 0;
case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE: case V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE:
return cx2341x_ctrl_query_fill(qctrl, return cx2341x_ctrl_query_fill(qctrl,
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF, V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF,
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG, 1, V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG, 1,
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF); V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF);
case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP: case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP:
cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 255); cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 255);
qctrl->flags |= V4L2_CTRL_FLAG_SLIDER; qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
if (params->video_median_filter_type == V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF) if (params->video_median_filter_type ==
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return 0; return 0;
case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM: case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM:
cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 0); cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 0);
qctrl->flags |= V4L2_CTRL_FLAG_SLIDER; qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
if (params->video_median_filter_type == V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF) if (params->video_median_filter_type ==
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return 0; return 0;
case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP: case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP:
cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 255); cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 255);
qctrl->flags |= V4L2_CTRL_FLAG_SLIDER; qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
if (params->video_median_filter_type == V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF) if (params->video_median_filter_type ==
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return 0; return 0;
case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM: case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:
cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 0); cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 0);
qctrl->flags |= V4L2_CTRL_FLAG_SLIDER; qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
if (params->video_median_filter_type == V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF) if (params->video_median_filter_type ==
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE; V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
return 0; return 0;
case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS: case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
@ -560,6 +578,7 @@ int cx2341x_ctrl_query(struct cx2341x_mpeg_params *params, struct v4l2_queryctrl
} }
} }
EXPORT_SYMBOL(cx2341x_ctrl_query);
const char **cx2341x_ctrl_get_menu(u32 id) const char **cx2341x_ctrl_get_menu(u32 id)
{ {
@ -629,6 +648,7 @@ const char **cx2341x_ctrl_get_menu(u32 id)
return v4l2_ctrl_get_menu(id); return v4l2_ctrl_get_menu(id);
} }
} }
EXPORT_SYMBOL(cx2341x_ctrl_get_menu);
static void cx2341x_calc_audio_properties(struct cx2341x_mpeg_params *params) static void cx2341x_calc_audio_properties(struct cx2341x_mpeg_params *params)
{ {
@ -637,9 +657,8 @@ static void cx2341x_calc_audio_properties(struct cx2341x_mpeg_params *params)
((1 + params->audio_l2_bitrate) << 4) | ((1 + params->audio_l2_bitrate) << 4) |
(params->audio_mode << 8) | (params->audio_mode << 8) |
(params->audio_mode_extension << 10) | (params->audio_mode_extension << 10) |
(((params->audio_emphasis == V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17) ? (((params->audio_emphasis == V4L2_MPEG_AUDIO_EMPHASIS_CCITT_J17)
3 : ? 3 : params->audio_emphasis) << 12) |
params->audio_emphasis) << 12) |
(params->audio_crc << 14); (params->audio_crc << 14);
} }
@ -679,19 +698,19 @@ int cx2341x_ext_ctrls(struct cx2341x_mpeg_params *params, int busy,
if (err) if (err)
break; break;
} }
if (err == 0 && params->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR && if (err == 0 &&
params->video_bitrate_peak < params->video_bitrate) { params->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR &&
params->video_bitrate_peak < params->video_bitrate) {
err = -ERANGE; err = -ERANGE;
ctrls->error_idx = ctrls->count; ctrls->error_idx = ctrls->count;
} }
if (err) { if (err)
ctrls->error_idx = i; ctrls->error_idx = i;
} else
else {
cx2341x_calc_audio_properties(params); cx2341x_calc_audio_properties(params);
}
return err; return err;
} }
EXPORT_SYMBOL(cx2341x_ext_ctrls);
void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p) void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
{ {
@ -732,13 +751,18 @@ void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
.video_mute_yuv = 0x008080, /* YCbCr value for black */ .video_mute_yuv = 0x008080, /* YCbCr value for black */
/* encoding filters */ /* encoding filters */
.video_spatial_filter_mode = V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL, .video_spatial_filter_mode =
V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL,
.video_spatial_filter = 0, .video_spatial_filter = 0,
.video_luma_spatial_filter_type = V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR, .video_luma_spatial_filter_type =
.video_chroma_spatial_filter_type = V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR, V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR,
.video_temporal_filter_mode = V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL, .video_chroma_spatial_filter_type =
V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR,
.video_temporal_filter_mode =
V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL,
.video_temporal_filter = 8, .video_temporal_filter = 8,
.video_median_filter_type = V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF, .video_median_filter_type =
V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF,
.video_luma_median_filter_top = 255, .video_luma_median_filter_top = 255,
.video_luma_median_filter_bottom = 0, .video_luma_median_filter_bottom = 0,
.video_chroma_median_filter_top = 255, .video_chroma_median_filter_top = 255,
@ -748,8 +772,10 @@ void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
*p = default_params; *p = default_params;
cx2341x_calc_audio_properties(p); cx2341x_calc_audio_properties(p);
} }
EXPORT_SYMBOL(cx2341x_fill_defaults);
static int cx2341x_api(void *priv, cx2341x_mbox_func func, int cmd, int args, ...) static int cx2341x_api(void *priv, cx2341x_mbox_func func,
int cmd, int args, ...)
{ {
u32 data[CX2341X_MBOX_MAX_DATA]; u32 data[CX2341X_MBOX_MAX_DATA];
va_list vargs; va_list vargs;
@ -757,15 +783,17 @@ static int cx2341x_api(void *priv, cx2341x_mbox_func func, int cmd, int args, ..
va_start(vargs, args); va_start(vargs, args);
for (i = 0; i < args; i++) { for (i = 0; i < args; i++)
data[i] = va_arg(vargs, int); data[i] = va_arg(vargs, int);
}
va_end(vargs); va_end(vargs);
return func(priv, cmd, args, 0, data); return func(priv, cmd, args, 0, data);
} }
#define NEQ(field) (old->field != new->field)
int cx2341x_update(void *priv, cx2341x_mbox_func func, int cx2341x_update(void *priv, cx2341x_mbox_func func,
const struct cx2341x_mpeg_params *old, const struct cx2341x_mpeg_params *new) const struct cx2341x_mpeg_params *old,
const struct cx2341x_mpeg_params *new)
{ {
static int mpeg_stream_type[] = { static int mpeg_stream_type[] = {
0, /* MPEG-2 PS */ 0, /* MPEG-2 PS */
@ -777,17 +805,18 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
}; };
int err = 0; int err = 0;
int force = (old == NULL);
u16 temporal = new->video_temporal_filter; u16 temporal = new->video_temporal_filter;
cx2341x_api(priv, func, CX2341X_ENC_SET_OUTPUT_PORT, 2, new->port, 0); cx2341x_api(priv, func, CX2341X_ENC_SET_OUTPUT_PORT, 2, new->port, 0);
if (old == NULL || old->is_50hz != new->is_50hz) { if (force || NEQ(is_50hz)) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_RATE, 1, new->is_50hz); err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_RATE, 1,
new->is_50hz);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->width != new->width || old->height != new->height || if (force || NEQ(width) || NEQ(height) || NEQ(video_encoding)) {
old->video_encoding != new->video_encoding) {
u16 w = new->width; u16 w = new->width;
u16 h = new->height; u16 h = new->height;
@ -795,69 +824,74 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
w /= 2; w /= 2;
h /= 2; h /= 2;
} }
err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_SIZE, 2, h, w); err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_SIZE, 2,
h, w);
if (err) return err; if (err) return err;
} }
if (new->width != 720 || new->height != (new->is_50hz ? 576 : 480)) { if (new->width != 720 || new->height != (new->is_50hz ? 576 : 480)) {
/* Adjust temporal filter if necessary. The problem with the temporal /* Adjust temporal filter if necessary. The problem with the
filter is that it works well with full resolution capturing, but temporal filter is that it works well with full resolution
not when the capture window is scaled (the filter introduces capturing, but not when the capture window is scaled (the
a ghosting effect). So if the capture window is scaled, then filter introduces a ghosting effect). So if the capture
force the filter to 0. window is scaled, then force the filter to 0.
For full resolution the filter really improves the video For full resolution the filter really improves the video
quality, especially if the original video quality is suboptimal. */ quality, especially if the original video quality is
suboptimal. */
temporal = 0; temporal = 0;
} }
if (old == NULL || old->stream_type != new->stream_type) { if (force || NEQ(stream_type)) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_STREAM_TYPE, 1, mpeg_stream_type[new->stream_type]); err = cx2341x_api(priv, func, CX2341X_ENC_SET_STREAM_TYPE, 1,
mpeg_stream_type[new->stream_type]);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->video_aspect != new->video_aspect) { if (force || NEQ(video_aspect)) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_ASPECT_RATIO, 1, 1 + new->video_aspect); err = cx2341x_api(priv, func, CX2341X_ENC_SET_ASPECT_RATIO, 1,
1 + new->video_aspect);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->video_b_frames != new->video_b_frames || if (force || NEQ(video_b_frames) || NEQ(video_gop_size)) {
old->video_gop_size != new->video_gop_size) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_GOP_PROPERTIES, 2, err = cx2341x_api(priv, func, CX2341X_ENC_SET_GOP_PROPERTIES, 2,
new->video_gop_size, new->video_b_frames + 1); new->video_gop_size, new->video_b_frames + 1);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->video_gop_closure != new->video_gop_closure) { if (force || NEQ(video_gop_closure)) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_GOP_CLOSURE, 1, new->video_gop_closure); err = cx2341x_api(priv, func, CX2341X_ENC_SET_GOP_CLOSURE, 1,
new->video_gop_closure);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->audio_properties != new->audio_properties) { if (force || NEQ(audio_properties)) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_AUDIO_PROPERTIES, 1, new->audio_properties); err = cx2341x_api(priv, func, CX2341X_ENC_SET_AUDIO_PROPERTIES,
1, new->audio_properties);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->audio_mute != new->audio_mute) { if (force || NEQ(audio_mute)) {
err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_AUDIO, 1, new->audio_mute); err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_AUDIO, 1,
new->audio_mute);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->video_bitrate_mode != new->video_bitrate_mode || if (force || NEQ(video_bitrate_mode) || NEQ(video_bitrate) ||
old->video_bitrate != new->video_bitrate || NEQ(video_bitrate_peak)) {
old->video_bitrate_peak != new->video_bitrate_peak) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_BIT_RATE, 5, err = cx2341x_api(priv, func, CX2341X_ENC_SET_BIT_RATE, 5,
new->video_bitrate_mode, new->video_bitrate, new->video_bitrate_mode, new->video_bitrate,
new->video_bitrate_peak / 400, 0, 0); new->video_bitrate_peak / 400, 0, 0);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->video_spatial_filter_mode != new->video_spatial_filter_mode || if (force || NEQ(video_spatial_filter_mode) ||
old->video_temporal_filter_mode != new->video_temporal_filter_mode || NEQ(video_temporal_filter_mode) ||
old->video_median_filter_type != new->video_median_filter_type) { NEQ(video_median_filter_type)) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_DNR_FILTER_MODE, 2, err = cx2341x_api(priv, func, CX2341X_ENC_SET_DNR_FILTER_MODE,
new->video_spatial_filter_mode | (new->video_temporal_filter_mode << 1), 2, new->video_spatial_filter_mode |
(new->video_temporal_filter_mode << 1),
new->video_median_filter_type); new->video_median_filter_type);
if (err) return err; if (err) return err;
} }
if (old == NULL || if (force || NEQ(video_luma_median_filter_bottom) ||
old->video_luma_median_filter_bottom != new->video_luma_median_filter_bottom || NEQ(video_luma_median_filter_top) ||
old->video_luma_median_filter_top != new->video_luma_median_filter_top || NEQ(video_chroma_median_filter_bottom) ||
old->video_chroma_median_filter_bottom != new->video_chroma_median_filter_bottom || NEQ(video_chroma_median_filter_top)) {
old->video_chroma_median_filter_top != new->video_chroma_median_filter_top) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_CORING_LEVELS, 4, err = cx2341x_api(priv, func, CX2341X_ENC_SET_CORING_LEVELS, 4,
new->video_luma_median_filter_bottom, new->video_luma_median_filter_bottom,
new->video_luma_median_filter_top, new->video_luma_median_filter_top,
@ -865,36 +899,39 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
new->video_chroma_median_filter_top); new->video_chroma_median_filter_top);
if (err) return err; if (err) return err;
} }
if (old == NULL || if (force || NEQ(video_luma_spatial_filter_type) ||
old->video_luma_spatial_filter_type != new->video_luma_spatial_filter_type || NEQ(video_chroma_spatial_filter_type)) {
old->video_chroma_spatial_filter_type != new->video_chroma_spatial_filter_type) { err = cx2341x_api(priv, func,
err = cx2341x_api(priv, func, CX2341X_ENC_SET_SPATIAL_FILTER_TYPE, 2, CX2341X_ENC_SET_SPATIAL_FILTER_TYPE,
new->video_luma_spatial_filter_type, new->video_chroma_spatial_filter_type); 2, new->video_luma_spatial_filter_type,
new->video_chroma_spatial_filter_type);
if (err) return err; if (err) return err;
} }
if (old == NULL || if (force || NEQ(video_spatial_filter) ||
old->video_spatial_filter != new->video_spatial_filter || old->video_temporal_filter != temporal) {
old->video_temporal_filter != temporal) { err = cx2341x_api(priv, func, CX2341X_ENC_SET_DNR_FILTER_PROPS,
err = cx2341x_api(priv, func, CX2341X_ENC_SET_DNR_FILTER_PROPS, 2, 2, new->video_spatial_filter, temporal);
new->video_spatial_filter, temporal);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->video_temporal_decimation != new->video_temporal_decimation) { if (force || NEQ(video_temporal_decimation)) {
err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_DROP_RATE, 1, err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_DROP_RATE,
new->video_temporal_decimation); 1, new->video_temporal_decimation);
if (err) return err; if (err) return err;
} }
if (old == NULL || old->video_mute != new->video_mute || if (force || NEQ(video_mute) ||
(new->video_mute && old->video_mute_yuv != new->video_mute_yuv)) { (new->video_mute && NEQ(video_mute_yuv))) {
err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_VIDEO, 1, new->video_mute | (new->video_mute_yuv << 8)); err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_VIDEO, 1,
new->video_mute | (new->video_mute_yuv << 8));
if (err) return err; if (err) return err;
} }
if (old == NULL || old->stream_insert_nav_packets != new->stream_insert_nav_packets) { if (force || NEQ(stream_insert_nav_packets)) {
err = cx2341x_api(priv, func, CX2341X_ENC_MISC, 2, 7, new->stream_insert_nav_packets); err = cx2341x_api(priv, func, CX2341X_ENC_MISC, 2,
7, new->stream_insert_nav_packets);
if (err) return err; if (err) return err;
} }
return 0; return 0;
} }
EXPORT_SYMBOL(cx2341x_update);
static const char *cx2341x_menu_item(struct cx2341x_mpeg_params *p, u32 id) static const char *cx2341x_menu_item(struct cx2341x_mpeg_params *p, u32 id)
{ {
@ -943,18 +980,17 @@ void cx2341x_log_status(struct cx2341x_mpeg_params *p, const char *prefix)
cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_ASPECT), cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_ASPECT),
cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_BITRATE_MODE), cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_BITRATE_MODE),
p->video_bitrate); p->video_bitrate);
if (p->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) { if (p->video_bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR)
printk(", Peak %d", p->video_bitrate_peak); printk(", Peak %d", p->video_bitrate_peak);
}
printk("\n"); printk("\n");
printk(KERN_INFO "%s: Video: GOP Size %d, %d B-Frames, %sGOP Closure\n", printk(KERN_INFO
"%s: Video: GOP Size %d, %d B-Frames, %sGOP Closure\n",
prefix, prefix,
p->video_gop_size, p->video_b_frames, p->video_gop_size, p->video_b_frames,
p->video_gop_closure ? "" : "No "); p->video_gop_closure ? "" : "No ");
if (p->video_temporal_decimation) { if (p->video_temporal_decimation)
printk(KERN_INFO "%s: Video: Temporal Decimation %d\n", printk(KERN_INFO "%s: Video: Temporal Decimation %d\n",
prefix, p->video_temporal_decimation); prefix, p->video_temporal_decimation);
}
/* Audio */ /* Audio */
printk(KERN_INFO "%s: Audio: %s, %s, %s, %s%s", printk(KERN_INFO "%s: Audio: %s, %s, %s, %s%s",
@ -964,10 +1000,9 @@ void cx2341x_log_status(struct cx2341x_mpeg_params *p, const char *prefix)
cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_L2_BITRATE), cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_L2_BITRATE),
cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_MODE), cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_MODE),
p->audio_mute ? " (muted)" : ""); p->audio_mute ? " (muted)" : "");
if (p->audio_mode == V4L2_MPEG_AUDIO_MODE_JOINT_STEREO) { if (p->audio_mode == V4L2_MPEG_AUDIO_MODE_JOINT_STEREO)
printk(", %s", printk(", %s", cx2341x_menu_item(p,
cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_MODE_EXTENSION)); V4L2_CID_MPEG_AUDIO_MODE_EXTENSION));
}
printk(", %s, %s\n", printk(", %s, %s\n",
cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_EMPHASIS), cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_EMPHASIS),
cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_CRC)); cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_CRC));
@ -975,33 +1010,33 @@ void cx2341x_log_status(struct cx2341x_mpeg_params *p, const char *prefix)
/* Encoding filters */ /* Encoding filters */
printk(KERN_INFO "%s: Spatial Filter: %s, Luma %s, Chroma %s, %d\n", printk(KERN_INFO "%s: Spatial Filter: %s, Luma %s, Chroma %s, %d\n",
prefix, prefix,
cx2341x_menu_item(p, V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE), cx2341x_menu_item(p,
cx2341x_menu_item(p, V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE), V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE),
cx2341x_menu_item(p, V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE), cx2341x_menu_item(p,
V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE),
cx2341x_menu_item(p,
V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE),
p->video_spatial_filter); p->video_spatial_filter);
if (p->width != 720 || p->height != (p->is_50hz ? 576 : 480)) {
if (p->width != 720 || p->height != (p->is_50hz ? 576 : 480))
temporal = 0; temporal = 0;
}
printk(KERN_INFO "%s: Temporal Filter: %s, %d\n", printk(KERN_INFO "%s: Temporal Filter: %s, %d\n",
prefix, prefix,
cx2341x_menu_item(p, V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE), cx2341x_menu_item(p,
V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE),
temporal); temporal);
printk(KERN_INFO "%s: Median Filter: %s, Luma [%d, %d], Chroma [%d, %d]\n", printk(KERN_INFO
"%s: Median Filter: %s, Luma [%d, %d], Chroma [%d, %d]\n",
prefix, prefix,
cx2341x_menu_item(p, V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE), cx2341x_menu_item(p,
V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE),
p->video_luma_median_filter_bottom, p->video_luma_median_filter_bottom,
p->video_luma_median_filter_top, p->video_luma_median_filter_top,
p->video_chroma_median_filter_bottom, p->video_chroma_median_filter_bottom,
p->video_chroma_median_filter_top); p->video_chroma_median_filter_top);
} }
EXPORT_SYMBOL(cx2341x_fill_defaults);
EXPORT_SYMBOL(cx2341x_ctrl_query);
EXPORT_SYMBOL(cx2341x_ctrl_get_menu);
EXPORT_SYMBOL(cx2341x_ext_ctrls);
EXPORT_SYMBOL(cx2341x_update);
EXPORT_SYMBOL(cx2341x_log_status); EXPORT_SYMBOL(cx2341x_log_status);
EXPORT_SYMBOL(cx2341x_mpeg_ctrls);
/* /*
* Local variables: * Local variables: