aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/cx88/cx88-blackbird.c
diff options
context:
space:
mode:
authorHans Verkuil <hverkuil@xs4all.nl>2006-06-18 15:11:06 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2006-06-25 01:05:22 -0400
commitf022156b33ffa32c26a86540fe4f6fe56cff0963 (patch)
treeba896ea08b1215135986fe353a39bfbd0db2f5de /drivers/media/video/cx88/cx88-blackbird.c
parent54f577b7f46f48b8bea0bd5eb8c42d711b3e006f (diff)
V4L/DVB (4196): Port cx88-blackbird to the new MPEG API.
Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video/cx88/cx88-blackbird.c')
-rw-r--r--drivers/media/video/cx88/cx88-blackbird.c771
1 files changed, 72 insertions, 699 deletions
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c
index f366b86e4693..9fa1ddbe3fd8 100644
--- a/drivers/media/video/cx88/cx88-blackbird.c
+++ b/drivers/media/video/cx88/cx88-blackbird.c
@@ -84,163 +84,11 @@ enum blackbird_framerate {
84 BLACKBIRD_FRAMERATE_NTSC_30, /* NTSC: 30fps */ 84 BLACKBIRD_FRAMERATE_NTSC_30, /* NTSC: 30fps */
85 BLACKBIRD_FRAMERATE_PAL_25 /* PAL: 25fps */ 85 BLACKBIRD_FRAMERATE_PAL_25 /* PAL: 25fps */
86}; 86};
87enum blackbird_video_bitrate_type {
88 BLACKBIRD_VIDEO_VBR,
89 BLACKBIRD_VIDEO_CBR
90};
91#define BLACKBIRD_PEAK_RATE_DIVISOR 400
92enum blackbird_mux_rate {
93 BLACKBIRD_MUX_RATE_DEFAULT,
94 /* dvd mux rate: multiply by 400 to get the actual rate */
95 BLACKBIRD_MUX_RATE_DVD = 25200
96};
97enum blackbird_aspect_ratio {
98 BLACKBIRD_ASPECT_RATIO_FORBIDDEN,
99 BLACKBIRD_ASPECT_RATIO_1_1_SQUARE,
100 BLACKBIRD_ASPECT_RATIO_4_3,
101 BLACKBIRD_ASPECT_RATIO_16_9,
102 BLACKBIRD_ASPECT_RATIO_221_100,
103 BLACKBIRD_ASPECT_RATIO_RESERVED
104};
105enum blackbird_dnr_bits {
106 BLACKBIRD_DNR_BITS_MANUAL,
107 BLACKBIRD_DNR_BITS_AUTO_SPATIAL,
108 BLACKBIRD_DNR_BITS_AUTO_TEMPORAL,
109 BLACKBIRD_DNR_BITS_AUTO
110};
111enum blackbird_median_filter {
112 BLACKBIRD_MEDIAN_FILTER_DISABLED,
113 BLACKBIRD_MEDIAN_FILTER_HORIZONTAL,
114 BLACKBIRD_MEDIAN_FILTER_VERTICAL,
115 BLACKBIRD_MEDIAN_FILTER_HV,
116 BLACKBIRD_MEDIAN_FILTER_DIAGONAL
117};
118enum blackbird_spatial_filter_luma {
119 BLACKBIRD_SPATIAL_FILTER_LUMA_DISABLED,
120 BLACKBIRD_SPATIAL_FILTER_LUMA_1D_HORIZ,
121 BLACKBIRD_SPATIAL_FILTER_LUMA_1D_VERT,
122 BLACKBIRD_SPATIAL_FILTER_LUMA_2D_HV, /* separable, default */
123 BLACKBIRD_SPATIAL_FILTER_LUMA_2D_SYMM /* symmetric non-separable */
124};
125enum blackbird_spatial_filter_chroma {
126 BLACKBIRD_SPATIAL_FILTER_CHROMA_DISABLED,
127 BLACKBIRD_SPATIAL_FILTER_CHROMA_1D_HORIZ /* default */
128};
129enum blackbird_pulldown {
130 BLACKBIRD_3_2_PULLDOWN_DISABLED,
131 BLACKBIRD_3_2_PULLDOWN_ENABLED
132};
133enum blackbird_vbi_line_bits {
134 BLACKBIRD_VBI_LINE_BITS_TOP_FIELD,
135 BLACKBIRD_VBI_LINE_BITS_BOT_FIELD = (1 << 31),
136 BLACKBIRD_VBI_LINE_BITS_ALL_LINES = 0xFFFFFFFF
137};
138enum blackbird_vbi_line {
139 BLACKBIRD_VBI_LINE_DISABLED,
140 BLACKBIRD_VBI_LINE_ENABLED
141};
142enum blackbird_vbi_slicing {
143 BLACKBIRD_VBI_SLICING_NONE,
144 BLACKBIRD_VBI_SLICING_CLOSED_CAPTION
145};
146enum blackbird_stream_type {
147 BLACKBIRD_STREAM_PROGRAM,
148 BLACKBIRD_STREAM_TRANSPORT,
149 BLACKBIRD_STREAM_MPEG1,
150 BLACKBIRD_STREAM_PES_AV,
151 BLACKBIRD_STREAM_UNKNOWN4,
152 BLACKBIRD_STREAM_PES_VIDEO,
153 BLACKBIRD_STREAM_UNKNOWN6,
154 BLACKBIRD_STREAM_PES_AUDIO,
155 BLACKBIRD_STREAM_UNKNOWN8,
156 BLACKBIRD_STREAM_UNKNOWN9, /* audio/pcm ? */
157 BLACKBIRD_STREAM_DVD,
158 BLACKBIRD_STREAM_VCD,
159 BLACKBIRD_STREAM_UNKNOWN12 /* svcd/xvcd ? */
160};
161enum blackbird_stream_port { 87enum blackbird_stream_port {
162 BLACKBIRD_OUTPUT_PORT_MEMORY, 88 BLACKBIRD_OUTPUT_PORT_MEMORY,
163 BLACKBIRD_OUTPUT_PORT_STREAMING, 89 BLACKBIRD_OUTPUT_PORT_STREAMING,
164 BLACKBIRD_OUTPUT_PORT_SERIAL 90 BLACKBIRD_OUTPUT_PORT_SERIAL
165}; 91};
166enum blackbird_audio_bits_sample_rate {
167 BLACKBIRD_AUDIO_BITS_44100HZ,
168 BLACKBIRD_AUDIO_BITS_48000HZ,
169 BLACKBIRD_AUDIO_BITS_32000HZ,
170 BLACKBIRD_AUDIO_BITS_RESERVED_HZ,
171};
172enum blackbird_audio_bits_encoding {
173 BLACKBIRD_AUDIO_BITS_LAYER_1 = 0x1 << 2,
174 BLACKBIRD_AUDIO_BITS_LAYER_2 = 0x2 << 2,
175};
176enum blackbird_audio_bits_bitrate_layer_1 {
177 BLACKBIRD_AUDIO_BITS_LAYER_1_FREE_FORMAT,
178 BLACKBIRD_AUDIO_BITS_LAYER_1_32 = 0x01 << 4,
179 BLACKBIRD_AUDIO_BITS_LAYER_1_64 = 0x02 << 4,
180 BLACKBIRD_AUDIO_BITS_LAYER_1_96 = 0x03 << 4,
181 BLACKBIRD_AUDIO_BITS_LAYER_1_128 = 0x04 << 4,
182 BLACKBIRD_AUDIO_BITS_LAYER_1_160 = 0x05 << 4,
183 BLACKBIRD_AUDIO_BITS_LAYER_1_192 = 0x06 << 4,
184 BLACKBIRD_AUDIO_BITS_LAYER_1_224 = 0x07 << 4,
185 BLACKBIRD_AUDIO_BITS_LAYER_1_256 = 0x08 << 4,
186 BLACKBIRD_AUDIO_BITS_LAYER_1_288 = 0x09 << 4,
187 BLACKBIRD_AUDIO_BITS_LAYER_1_320 = 0x0A << 4,
188 BLACKBIRD_AUDIO_BITS_LAYER_1_352 = 0x0B << 4,
189 BLACKBIRD_AUDIO_BITS_LAYER_1_384 = 0x0C << 4,
190 BLACKBIRD_AUDIO_BITS_LAYER_1_416 = 0x0D << 4,
191 BLACKBIRD_AUDIO_BITS_LAYER_1_448 = 0x0E << 4,
192};
193enum blackbird_audio_bits_bitrate_layer_2 {
194 BLACKBIRD_AUDIO_BITS_LAYER_2_FREE_FORMAT,
195 BLACKBIRD_AUDIO_BITS_LAYER_2_32 = 0x01 << 4,
196 BLACKBIRD_AUDIO_BITS_LAYER_2_48 = 0x02 << 4,
197 BLACKBIRD_AUDIO_BITS_LAYER_2_56 = 0x03 << 4,
198 BLACKBIRD_AUDIO_BITS_LAYER_2_64 = 0x04 << 4,
199 BLACKBIRD_AUDIO_BITS_LAYER_2_80 = 0x05 << 4,
200 BLACKBIRD_AUDIO_BITS_LAYER_2_96 = 0x06 << 4,
201 BLACKBIRD_AUDIO_BITS_LAYER_2_112 = 0x07 << 4,
202 BLACKBIRD_AUDIO_BITS_LAYER_2_128 = 0x08 << 4,
203 BLACKBIRD_AUDIO_BITS_LAYER_2_160 = 0x09 << 4,
204 BLACKBIRD_AUDIO_BITS_LAYER_2_192 = 0x0A << 4,
205 BLACKBIRD_AUDIO_BITS_LAYER_2_224 = 0x0B << 4,
206 BLACKBIRD_AUDIO_BITS_LAYER_2_256 = 0x0C << 4,
207 BLACKBIRD_AUDIO_BITS_LAYER_2_320 = 0x0D << 4,
208 BLACKBIRD_AUDIO_BITS_LAYER_2_384 = 0x0E << 4,
209};
210enum blackbird_audio_bits_mode {
211 BLACKBIRD_AUDIO_BITS_STEREO,
212 BLACKBIRD_AUDIO_BITS_JOINT_STEREO = 0x1 << 8,
213 BLACKBIRD_AUDIO_BITS_DUAL = 0x2 << 8,
214 BLACKBIRD_AUDIO_BITS_MONO = 0x3 << 8,
215};
216enum blackbird_audio_bits_mode_extension {
217 BLACKBIRD_AUDIO_BITS_BOUND_4,
218 BLACKBIRD_AUDIO_BITS_BOUND_8 = 0x1 << 10,
219 BLACKBIRD_AUDIO_BITS_BOUND_12 = 0x2 << 10,
220 BLACKBIRD_AUDIO_BITS_BOUND_16 = 0x3 << 10,
221};
222enum blackbird_audio_bits_emphasis {
223 BLACKBIRD_AUDIO_BITS_EMPHASIS_NONE,
224 BLACKBIRD_AUDIO_BITS_EMPHASIS_50_15 = 0x1 << 12,
225 BLACKBIRD_AUDIO_BITS_EMPHASIS_RESERVED = 0x2 << 12,
226 BLACKBIRD_AUDIO_BITS_EMPHASIS_CCITT_J17 = 0x3 << 12,
227};
228enum blackbird_audio_bits_crc {
229 BLACKBIRD_AUDIO_BITS_CRC_OFF,
230 BLACKBIRD_AUDIO_BITS_CRC_ON = 0x1 << 14,
231};
232enum blackbird_audio_bits_copyright {
233 BLACKBIRD_AUDIO_BITS_COPYRIGHT_OFF,
234 BLACKBIRD_AUDIO_BITS_COPYRIGHT_ON = 0x1 << 15,
235};
236enum blackbird_audio_bits_original {
237 BLACKBIRD_AUDIO_BITS_COPY,
238 BLACKBIRD_AUDIO_BITS_ORIGINAL = 0x1 << 16,
239};
240enum blackbird_gop_closure {
241 BLACKBIRD_GOP_CLOSURE_OFF,
242 BLACKBIRD_GOP_CLOSURE_ON,
243};
244enum blackbird_data_xfer_status { 92enum blackbird_data_xfer_status {
245 BLACKBIRD_MORE_BUFFERS_FOLLOW, 93 BLACKBIRD_MORE_BUFFERS_FOLLOW,
246 BLACKBIRD_LAST_BUFFER, 94 BLACKBIRD_LAST_BUFFER,
@@ -458,15 +306,12 @@ static int register_read(struct cx88_core *core, u32 address, u32 *value)
458 306
459/* ------------------------------------------------------------------ */ 307/* ------------------------------------------------------------------ */
460 308
461/* We don't need to call the API often, so using just one mailbox will probably suffice */ 309static int blackbird_mbox_func(void *priv, int command, int in, int out, u32 data[CX2341X_MBOX_MAX_DATA])
462static int blackbird_api_cmd(struct cx8802_dev *dev, u32 command,
463 u32 inputcnt, u32 outputcnt, ...)
464{ 310{
311 struct cx8802_dev *dev = priv;
465 unsigned long timeout; 312 unsigned long timeout;
466 u32 value, flag, retval; 313 u32 value, flag, retval;
467 int i; 314 int i;
468 va_list args;
469 va_start(args, outputcnt);
470 315
471 dprintk(1,"%s: 0x%X\n", __FUNCTION__, command); 316 dprintk(1,"%s: 0x%X\n", __FUNCTION__, command);
472 317
@@ -490,12 +335,11 @@ static int blackbird_api_cmd(struct cx8802_dev *dev, u32 command,
490 /* write command + args + fill remaining with zeros */ 335 /* write command + args + fill remaining with zeros */
491 memory_write(dev->core, dev->mailbox + 1, command); /* command code */ 336 memory_write(dev->core, dev->mailbox + 1, command); /* command code */
492 memory_write(dev->core, dev->mailbox + 3, IVTV_API_STD_TIMEOUT); /* timeout */ 337 memory_write(dev->core, dev->mailbox + 3, IVTV_API_STD_TIMEOUT); /* timeout */
493 for (i = 0; i < inputcnt ; i++) { 338 for (i = 0; i < in; i++) {
494 value = va_arg(args, int); 339 memory_write(dev->core, dev->mailbox + 4 + i, data[i]);
495 memory_write(dev->core, dev->mailbox + 4 + i, value); 340 dprintk(1, "API Input %d = %d\n", i, data[i]);
496 dprintk(1, "API Input %d = %d\n", i, value);
497 } 341 }
498 for (; i < 16 ; i++) 342 for (; i < CX2341X_MBOX_MAX_DATA; i++)
499 memory_write(dev->core, dev->mailbox + 4 + i, 0); 343 memory_write(dev->core, dev->mailbox + 4 + i, 0);
500 344
501 flag |= 3; /* tell 'em we're done writing */ 345 flag |= 3; /* tell 'em we're done writing */
@@ -515,12 +359,10 @@ static int blackbird_api_cmd(struct cx8802_dev *dev, u32 command,
515 } 359 }
516 360
517 /* read output values */ 361 /* read output values */
518 for (i = 0; i < outputcnt ; i++) { 362 for (i = 0; i < out; i++) {
519 int *vptr = va_arg(args, int *); 363 memory_read(dev->core, dev->mailbox + 4 + i, data + i);
520 memory_read(dev->core, dev->mailbox + 4 + i, vptr); 364 dprintk(1, "API Output %d = %d\n", i, data[i]);
521 dprintk(1, "API Output %d = %d\n", i, *vptr);
522 } 365 }
523 va_end(args);
524 366
525 memory_read(dev->core, dev->mailbox + 2, &retval); 367 memory_read(dev->core, dev->mailbox + 2, &retval);
526 dprintk(1, "API result = %d\n",retval); 368 dprintk(1, "API result = %d\n",retval);
@@ -529,7 +371,29 @@ static int blackbird_api_cmd(struct cx8802_dev *dev, u32 command,
529 memory_write(dev->core, dev->mailbox, flag); 371 memory_write(dev->core, dev->mailbox, flag);
530 return retval; 372 return retval;
531} 373}
374/* ------------------------------------------------------------------ */
532 375
376/* We don't need to call the API often, so using just one mailbox will probably suffice */
377static int blackbird_api_cmd(struct cx8802_dev *dev, u32 command,
378 u32 inputcnt, u32 outputcnt, ...)
379{
380 u32 data[CX2341X_MBOX_MAX_DATA];
381 va_list vargs;
382 int i, err;
383
384 va_start(vargs, outputcnt);
385
386 for (i = 0; i < inputcnt; i++) {
387 data[i] = va_arg(vargs, int);
388 }
389 err = blackbird_mbox_func(dev, command, inputcnt, outputcnt, data);
390 for (i = 0; i < outputcnt; i++) {
391 int *vptr = va_arg(vargs, int *);
392 *vptr = data[i];
393 }
394 va_end(vargs);
395 return err;
396}
533 397
534static int blackbird_find_mailbox(struct cx8802_dev *dev) 398static int blackbird_find_mailbox(struct cx8802_dev *dev)
535{ 399{
@@ -646,12 +510,19 @@ DB* DVD | MPEG2 | 720x576PAL | CBR | 600 :Good | 6000 Kbps | 25fps | M
646*DB: "DirectBurn" 510*DB: "DirectBurn"
647*/ 511*/
648 512
649static struct blackbird_dnr default_dnr_params = { 513static void blackbird_codec_settings(struct cx8802_dev *dev)
650 .mode = BLACKBIRD_DNR_BITS_MANUAL, 514{
651 .type = BLACKBIRD_MEDIAN_FILTER_DISABLED, 515 /* assign frame size */
652 .spatial = 0, 516 blackbird_api_cmd(dev, CX2341X_ENC_SET_FRAME_SIZE, 2, 0,
653 .temporal = 0 517 dev->height, dev->width);
654}; 518
519 dev->params.width = dev->width;
520 dev->params.height = dev->height;
521 dev->params.is_50hz = (dev->core->tvnorm->id & V4L2_STD_625_50) != 0;
522
523 cx2341x_update(dev, blackbird_mbox_func, NULL, &dev->params);
524}
525
655static struct v4l2_mpeg_compression default_mpeg_params = { 526static struct v4l2_mpeg_compression default_mpeg_params = {
656 .st_type = V4L2_MPEG_PS_2, 527 .st_type = V4L2_MPEG_PS_2,
657 .st_bitrate = { 528 .st_bitrate = {
@@ -672,7 +543,7 @@ static struct v4l2_mpeg_compression default_mpeg_params = {
672 .target = 224, 543 .target = 224,
673 .max = 224 544 .max = 224
674 }, 545 },
675 .au_sample_rate = 44100, 546 .au_sample_rate = 48000,
676 .au_pesid = 0, 547 .au_pesid = 0,
677 .vi_type = V4L2_MPEG_VI_2, 548 .vi_type = V4L2_MPEG_VI_2,
678 .vi_aspect_ratio = V4L2_MPEG_ASPECT_4_3, 549 .vi_aspect_ratio = V4L2_MPEG_ASPECT_4_3,
@@ -683,524 +554,13 @@ static struct v4l2_mpeg_compression default_mpeg_params = {
683 .max = 6000 554 .max = 6000
684 }, 555 },
685 .vi_frame_rate = 25, 556 .vi_frame_rate = 25,
686 .vi_frames_per_gop = 15, 557 .vi_frames_per_gop = 12,
687 .vi_bframes_count = 2, 558 .vi_bframes_count = 2,
688 .vi_pesid = 0, 559 .vi_pesid = 0,
689 .closed_gops = 0, 560 .closed_gops = 1,
690 .pulldown = 0 561 .pulldown = 0
691}; 562};
692 563
693static enum blackbird_stream_type mpeg_stream_types[] = {
694 [V4L2_MPEG_SS_1] = BLACKBIRD_STREAM_MPEG1,
695 [V4L2_MPEG_PS_2] = BLACKBIRD_STREAM_PROGRAM,
696 [V4L2_MPEG_TS_2] = BLACKBIRD_STREAM_TRANSPORT,
697 [V4L2_MPEG_PS_DVD] = BLACKBIRD_STREAM_DVD,
698};
699static enum blackbird_aspect_ratio mpeg_stream_ratios[] = {
700 [V4L2_MPEG_ASPECT_SQUARE] = BLACKBIRD_ASPECT_RATIO_1_1_SQUARE,
701 [V4L2_MPEG_ASPECT_4_3] = BLACKBIRD_ASPECT_RATIO_4_3,
702 [V4L2_MPEG_ASPECT_16_9] = BLACKBIRD_ASPECT_RATIO_16_9,
703 [V4L2_MPEG_ASPECT_1_221] = BLACKBIRD_ASPECT_RATIO_221_100,
704};
705static enum blackbird_video_bitrate_type mpeg_video_bitrates[] = {
706 [V4L2_BITRATE_NONE] = BLACKBIRD_VIDEO_CBR,
707 [V4L2_BITRATE_CBR] = BLACKBIRD_VIDEO_CBR,
708 [V4L2_BITRATE_VBR] = BLACKBIRD_VIDEO_VBR,
709};
710/* find the best layer I/II bitrate to fit a given numeric value */
711struct bitrate_bits {
712 u32 bits; /* layer bits for the best fit */
713 u32 rate; /* actual numeric value for the layer best fit */
714};
715struct bitrate_approximation {
716 u32 target; /* numeric value of the rate we want */
717 struct bitrate_bits layer[2];
718};
719static struct bitrate_approximation mpeg_audio_bitrates[] = {
720 /* target layer[0].bits layer[0].rate layer[1].bits layer[1].rate */
721 { 0, { { 0, 0, }, { 0, 0, }, }, },
722 { 32, { { BLACKBIRD_AUDIO_BITS_LAYER_1_32 , 32, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_32 , 32, }, }, },
723 { 48, { { BLACKBIRD_AUDIO_BITS_LAYER_1_64 , 64, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_48 , 48, }, }, },
724 { 56, { { BLACKBIRD_AUDIO_BITS_LAYER_1_64 , 64, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_56 , 56, }, }, },
725 { 64, { { BLACKBIRD_AUDIO_BITS_LAYER_1_64 , 64, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_64 , 64, }, }, },
726 { 80, { { BLACKBIRD_AUDIO_BITS_LAYER_1_96 , 96, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_80 , 80, }, }, },
727 { 96, { { BLACKBIRD_AUDIO_BITS_LAYER_1_96 , 96, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_96 , 96, }, }, },
728 { 112, { { BLACKBIRD_AUDIO_BITS_LAYER_1_128, 128, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_112, 112, }, }, },
729 { 128, { { BLACKBIRD_AUDIO_BITS_LAYER_1_128, 128, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_128, 128, }, }, },
730 { 160, { { BLACKBIRD_AUDIO_BITS_LAYER_1_160, 160, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_160, 160, }, }, },
731 { 192, { { BLACKBIRD_AUDIO_BITS_LAYER_1_192, 192, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_192, 192, }, }, },
732 { 224, { { BLACKBIRD_AUDIO_BITS_LAYER_1_224, 224, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_224, 224, }, }, },
733 { 256, { { BLACKBIRD_AUDIO_BITS_LAYER_1_256, 256, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_256, 256, }, }, },
734 { 288, { { BLACKBIRD_AUDIO_BITS_LAYER_1_288, 288, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_320, 320, }, }, },
735 { 320, { { BLACKBIRD_AUDIO_BITS_LAYER_1_320, 320, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_320, 320, }, }, },
736 { 352, { { BLACKBIRD_AUDIO_BITS_LAYER_1_352, 352, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_384, 384, }, }, },
737 { 384, { { BLACKBIRD_AUDIO_BITS_LAYER_1_384, 384, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_384, 384, }, }, },
738 { 416, { { BLACKBIRD_AUDIO_BITS_LAYER_1_416, 416, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_384, 384, }, }, },
739 { 448, { { BLACKBIRD_AUDIO_BITS_LAYER_1_448, 448, }, { BLACKBIRD_AUDIO_BITS_LAYER_2_384, 384, }, }, },
740};
741static const int BITRATES_SIZE = ARRAY_SIZE(mpeg_audio_bitrates);
742
743static void blackbird_set_default_params(struct cx8802_dev *dev)
744{
745 struct v4l2_mpeg_compression *params = &dev->params;
746 u32 au_params;
747
748 /* assign stream type */
749 if( params->st_type >= ARRAY_SIZE(mpeg_stream_types) )
750 params->st_type = V4L2_MPEG_PS_2;
751 if( params->st_type == V4L2_MPEG_SS_1 )
752 params->vi_type = V4L2_MPEG_VI_1;
753 else
754 params->vi_type = V4L2_MPEG_VI_2;
755 blackbird_api_cmd(dev, CX2341X_ENC_SET_STREAM_TYPE, 1, 0, mpeg_stream_types[params->st_type]);
756
757 /* assign framerate */
758 if( params->vi_frame_rate <= 25 )
759 {
760 params->vi_frame_rate = 25;
761 blackbird_api_cmd(dev, CX2341X_ENC_SET_FRAME_RATE, 1, 0, BLACKBIRD_FRAMERATE_PAL_25);
762 }
763 else
764 {
765 params->vi_frame_rate = 30;
766 blackbird_api_cmd(dev, CX2341X_ENC_SET_FRAME_RATE, 1, 0, BLACKBIRD_FRAMERATE_NTSC_30);
767 }
768
769 /* assign aspect ratio */
770 if( params->vi_aspect_ratio >= ARRAY_SIZE(mpeg_stream_ratios) )
771 params->vi_aspect_ratio = V4L2_MPEG_ASPECT_4_3;
772 blackbird_api_cmd(dev, CX2341X_ENC_SET_ASPECT_RATIO, 1, 0, mpeg_stream_ratios[params->vi_aspect_ratio]);
773
774 /* assign gop properties */
775 blackbird_api_cmd(dev, CX2341X_ENC_SET_GOP_PROPERTIES, 2, 0, params->vi_frames_per_gop, params->vi_bframes_count+1);
776
777 /* assign gop closure */
778 blackbird_api_cmd(dev, CX2341X_ENC_SET_GOP_CLOSURE, 1, 0, params->closed_gops);
779
780 /* assign 3 2 pulldown */
781 blackbird_api_cmd(dev, CX2341X_ENC_SET_3_2_PULLDOWN, 1, 0, params->pulldown);
782
783 /* make sure the params are within bounds */
784 if( params->st_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) )
785 params->vi_bitrate.mode = V4L2_BITRATE_NONE;
786 if( params->vi_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) )
787 params->vi_bitrate.mode = V4L2_BITRATE_NONE;
788 if( params->au_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) )
789 params->au_bitrate.mode = V4L2_BITRATE_NONE;
790
791 /* assign audio properties */
792 /* note: it's not necessary to set the samplerate, the mpeg encoder seems to autodetect/adjust */
793 au_params = BLACKBIRD_AUDIO_BITS_STEREO |
794 /* BLACKBIRD_AUDIO_BITS_BOUND_4 | */
795 BLACKBIRD_AUDIO_BITS_EMPHASIS_NONE |
796 BLACKBIRD_AUDIO_BITS_CRC_OFF |
797 BLACKBIRD_AUDIO_BITS_COPYRIGHT_OFF |
798 BLACKBIRD_AUDIO_BITS_COPY |
799 0;
800 if( params->au_sample_rate <= 32000 )
801 {
802 params->au_sample_rate = 32000;
803 au_params |= BLACKBIRD_AUDIO_BITS_32000HZ;
804 }
805 else if( params->au_sample_rate <= 44100 )
806 {
807 params->au_sample_rate = 44100;
808 au_params |= BLACKBIRD_AUDIO_BITS_44100HZ;
809 }
810 else
811 {
812 params->au_sample_rate = 48000;
813 au_params |= BLACKBIRD_AUDIO_BITS_48000HZ;
814 }
815 if( params->au_type == V4L2_MPEG_AU_2_I )
816 {
817 au_params |= BLACKBIRD_AUDIO_BITS_LAYER_1;
818 }
819 else
820 {
821 /* TODO: try to handle the other formats more gracefully */
822 params->au_type = V4L2_MPEG_AU_2_II;
823 au_params |= BLACKBIRD_AUDIO_BITS_LAYER_2;
824 }
825 if( params->au_bitrate.mode )
826 {
827 int layer;
828
829 if( params->au_bitrate.mode == V4L2_BITRATE_CBR )
830 params->au_bitrate.max = params->vi_bitrate.target;
831 else
832 params->au_bitrate.target = params->vi_bitrate.max;
833
834 layer = params->au_type;
835 if( params->au_bitrate.target == 0 )
836 {
837 /* TODO: use the minimum possible bitrate instead of 0 ? */
838 au_params |= 0;
839 }
840 else if( params->au_bitrate.target >=
841 mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].rate )
842 {
843 /* clamp the bitrate to the max supported by the standard */
844 params->au_bitrate.target = mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].rate;
845 params->au_bitrate.max = params->au_bitrate.target;
846 au_params |= mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].bits;
847 }
848 else
849 {
850 /* round up to the nearest supported bitrate */
851 int i;
852 for(i = 1; i < BITRATES_SIZE; i++)
853 {
854 if( params->au_bitrate.target > mpeg_audio_bitrates[i-1].layer[layer].rate &&
855 params->au_bitrate.target <= mpeg_audio_bitrates[i].layer[layer].rate )
856 {
857 params->au_bitrate.target = mpeg_audio_bitrates[i].layer[layer].rate;
858 params->au_bitrate.max = params->au_bitrate.target;
859 au_params |= mpeg_audio_bitrates[i].layer[layer].bits;
860 break;
861 }
862 }
863 }
864 }
865 else
866 {
867 /* TODO: ??? */
868 params->au_bitrate.target = params->au_bitrate.max = 0;
869 au_params |= 0;
870 }
871 blackbird_api_cmd(dev, CX2341X_ENC_SET_AUDIO_PROPERTIES, 1, 0, au_params );
872
873 /* assign bitrates */
874 if( params->vi_bitrate.mode )
875 {
876 /* bitrate is set, let's figure out the cbr/vbr mess */
877 if( params->vi_bitrate.max < params->vi_bitrate.target )
878 {
879 if( params->vi_bitrate.mode == V4L2_BITRATE_CBR )
880 params->vi_bitrate.max = params->vi_bitrate.target;
881 else
882 params->vi_bitrate.target = params->vi_bitrate.max;
883 }
884 }
885 else
886 {
887 if( params->st_bitrate.max < params->st_bitrate.target )
888 {
889 if( params->st_bitrate.mode == V4L2_BITRATE_VBR )
890 params->st_bitrate.target = params->st_bitrate.max;
891 else
892 params->st_bitrate.max = params->st_bitrate.target;
893 }
894 /* calculate vi_bitrate = st_bitrate - au_bitrate */
895 params->vi_bitrate.max = params->st_bitrate.max - params->au_bitrate.max;
896 params->vi_bitrate.target = params->st_bitrate.target - params->au_bitrate.target;
897 }
898 blackbird_api_cmd(dev, CX2341X_ENC_SET_BIT_RATE, 4, 0,
899 mpeg_video_bitrates[params->vi_bitrate.mode],
900 params->vi_bitrate.target * 1000, /* kbps -> bps */
901 params->vi_bitrate.max * 1000 / BLACKBIRD_PEAK_RATE_DIVISOR, /* peak/400 */
902 BLACKBIRD_MUX_RATE_DEFAULT /*, 0x70*/); /* encoding buffer, ckennedy */
903
904 /* TODO: implement the stream ID stuff:
905 ts_pid_pmt, ts_pid_audio, ts_pid_video, ts_pid_pcr,
906 ps_size, au_pesid, vi_pesid
907 */
908}
909#define CHECK_PARAM( name ) ( dev->params.name != params->name )
910#define IF_PARAM( name ) if( CHECK_PARAM( name ) )
911#define UPDATE_PARAM( name ) dev->params.name = params->name
912void blackbird_set_params(struct cx8802_dev *dev, struct v4l2_mpeg_compression *params)
913{
914 u32 au_params;
915
916 /* assign stream type */
917 if( params->st_type >= ARRAY_SIZE(mpeg_stream_types) )
918 params->st_type = V4L2_MPEG_PS_2;
919 if( params->st_type == V4L2_MPEG_SS_1 )
920 params->vi_type = V4L2_MPEG_VI_1;
921 else
922 params->vi_type = V4L2_MPEG_VI_2;
923 if( CHECK_PARAM( st_type ) || CHECK_PARAM( vi_type ) )
924 {
925 UPDATE_PARAM( st_type );
926 UPDATE_PARAM( vi_type );
927 blackbird_api_cmd(dev, CX2341X_ENC_SET_STREAM_TYPE, 1, 0, mpeg_stream_types[params->st_type]);
928 }
929
930 /* assign framerate */
931 if( params->vi_frame_rate <= 25 )
932 params->vi_frame_rate = 25;
933 else
934 params->vi_frame_rate = 30;
935 IF_PARAM( vi_frame_rate )
936 {
937 UPDATE_PARAM( vi_frame_rate );
938 if( params->vi_frame_rate == 25 )
939 blackbird_api_cmd(dev, CX2341X_ENC_SET_FRAME_RATE, 1, 0, BLACKBIRD_FRAMERATE_PAL_25);
940 else
941 blackbird_api_cmd(dev, CX2341X_ENC_SET_FRAME_RATE, 1, 0, BLACKBIRD_FRAMERATE_NTSC_30);
942 }
943
944 /* assign aspect ratio */
945 if( params->vi_aspect_ratio >= ARRAY_SIZE(mpeg_stream_ratios) )
946 params->vi_aspect_ratio = V4L2_MPEG_ASPECT_4_3;
947 IF_PARAM( vi_aspect_ratio )
948 {
949 UPDATE_PARAM( vi_aspect_ratio );
950 blackbird_api_cmd(dev, CX2341X_ENC_SET_ASPECT_RATIO, 1, 0, mpeg_stream_ratios[params->vi_aspect_ratio]);
951 }
952
953 /* assign gop properties */
954 if( CHECK_PARAM( vi_frames_per_gop ) || CHECK_PARAM( vi_bframes_count ) )
955 {
956 UPDATE_PARAM( vi_frames_per_gop );
957 UPDATE_PARAM( vi_bframes_count );
958 blackbird_api_cmd(dev, CX2341X_ENC_SET_GOP_PROPERTIES, 2, 0, params->vi_frames_per_gop, params->vi_bframes_count+1);
959 }
960
961 /* assign gop closure */
962 IF_PARAM( closed_gops )
963 {
964 UPDATE_PARAM( closed_gops );
965 blackbird_api_cmd(dev, CX2341X_ENC_SET_GOP_CLOSURE, 1, 0, params->closed_gops);
966 }
967
968 /* assign 3 2 pulldown */
969 IF_PARAM( pulldown )
970 {
971 UPDATE_PARAM( pulldown );
972 blackbird_api_cmd(dev, CX2341X_ENC_SET_3_2_PULLDOWN, 1, 0, params->pulldown);
973 }
974
975 /* make sure the params are within bounds */
976 if( params->st_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) )
977 params->vi_bitrate.mode = V4L2_BITRATE_NONE;
978 if( params->vi_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) )
979 params->vi_bitrate.mode = V4L2_BITRATE_NONE;
980 if( params->au_bitrate.mode >= ARRAY_SIZE(mpeg_video_bitrates) )
981 params->au_bitrate.mode = V4L2_BITRATE_NONE;
982
983 /* assign audio properties */
984 /* note: it's not necessary to set the samplerate, the mpeg encoder seems to autodetect/adjust */
985 au_params = BLACKBIRD_AUDIO_BITS_STEREO |
986 /* BLACKBIRD_AUDIO_BITS_BOUND_4 | */
987 BLACKBIRD_AUDIO_BITS_EMPHASIS_NONE |
988 BLACKBIRD_AUDIO_BITS_CRC_OFF |
989 BLACKBIRD_AUDIO_BITS_COPYRIGHT_OFF |
990 BLACKBIRD_AUDIO_BITS_COPY |
991 0;
992 if( params->au_sample_rate < 32000 )
993 {
994 params->au_sample_rate = 32000;
995 au_params |= BLACKBIRD_AUDIO_BITS_32000HZ;
996 }
997 else if( params->au_sample_rate < 44100 )
998 {
999 params->au_sample_rate = 44100;
1000 au_params |= BLACKBIRD_AUDIO_BITS_44100HZ;
1001 }
1002 else
1003 {
1004 params->au_sample_rate = 48000;
1005 au_params |= BLACKBIRD_AUDIO_BITS_48000HZ;
1006 }
1007 if( params->au_type == V4L2_MPEG_AU_2_I )
1008 {
1009 au_params |= BLACKBIRD_AUDIO_BITS_LAYER_1;
1010 }
1011 else
1012 {
1013 /* TODO: try to handle the other formats more gracefully */
1014 params->au_type = V4L2_MPEG_AU_2_II;
1015 au_params |= BLACKBIRD_AUDIO_BITS_LAYER_2;
1016 }
1017 if( params->au_bitrate.mode )
1018 {
1019 int layer;
1020
1021 if( params->au_bitrate.mode == V4L2_BITRATE_CBR )
1022 params->au_bitrate.max = params->vi_bitrate.target;
1023 else
1024 params->au_bitrate.target = params->vi_bitrate.max;
1025
1026 layer = params->au_type;
1027 if( params->au_bitrate.target == 0 )
1028 {
1029 /* TODO: use the minimum possible bitrate instead of 0 ? */
1030 au_params |= 0;
1031 }
1032 else if( params->au_bitrate.target >=
1033 mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].rate )
1034 {
1035 /* clamp the bitrate to the max supported by the standard */
1036 params->au_bitrate.target = mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].rate;
1037 params->au_bitrate.max = params->au_bitrate.target;
1038 au_params |= mpeg_audio_bitrates[BITRATES_SIZE-1].layer[layer].bits;
1039 }
1040 else
1041 {
1042 /* round up to the nearest supported bitrate */
1043 int i;
1044 for(i = 1; i < BITRATES_SIZE; i++)
1045 {
1046 if( params->au_bitrate.target > mpeg_audio_bitrates[i-1].layer[layer].rate &&
1047 params->au_bitrate.target <= mpeg_audio_bitrates[i].layer[layer].rate )
1048 {
1049 params->au_bitrate.target = mpeg_audio_bitrates[i].layer[layer].rate;
1050 params->au_bitrate.max = params->au_bitrate.target;
1051 au_params |= mpeg_audio_bitrates[i].layer[layer].bits;
1052 break;
1053 }
1054 }
1055 }
1056 }
1057 else
1058 {
1059 /* TODO: ??? */
1060 params->au_bitrate.target = params->au_bitrate.max = 0;
1061 au_params |= 0;
1062 }
1063 if( CHECK_PARAM( au_type ) || CHECK_PARAM( au_sample_rate )
1064 || CHECK_PARAM( au_bitrate.mode ) || CHECK_PARAM( au_bitrate.max )
1065 || CHECK_PARAM( au_bitrate.target )
1066 )
1067 {
1068 UPDATE_PARAM( au_type );
1069 UPDATE_PARAM( au_sample_rate );
1070 UPDATE_PARAM( au_bitrate );
1071 blackbird_api_cmd(dev, CX2341X_ENC_SET_AUDIO_PROPERTIES, 1, 0, au_params );
1072 }
1073
1074 /* assign bitrates */
1075 if( params->vi_bitrate.mode )
1076 {
1077 /* bitrate is set, let's figure out the cbr/vbr mess */
1078 if( params->vi_bitrate.max < params->vi_bitrate.target )
1079 {
1080 if( params->vi_bitrate.mode == V4L2_BITRATE_CBR )
1081 params->vi_bitrate.max = params->vi_bitrate.target;
1082 else
1083 params->vi_bitrate.target = params->vi_bitrate.max;
1084 }
1085 }
1086 else
1087 {
1088 if( params->st_bitrate.max < params->st_bitrate.target )
1089 {
1090 if( params->st_bitrate.mode == V4L2_BITRATE_VBR )
1091 params->st_bitrate.target = params->st_bitrate.max;
1092 else
1093 params->st_bitrate.max = params->st_bitrate.target;
1094 }
1095 /* calculate vi_bitrate = st_bitrate - au_bitrate */
1096 params->vi_bitrate.max = params->st_bitrate.max - params->au_bitrate.max;
1097 params->vi_bitrate.target = params->st_bitrate.target - params->au_bitrate.target;
1098 }
1099 UPDATE_PARAM( st_bitrate );
1100 if( CHECK_PARAM( vi_bitrate.mode ) || CHECK_PARAM( vi_bitrate.max )
1101 || CHECK_PARAM( vi_bitrate.target )
1102 )
1103 {
1104 UPDATE_PARAM( vi_bitrate );
1105 blackbird_api_cmd(dev, CX2341X_ENC_SET_BIT_RATE, 4, 0,
1106 mpeg_video_bitrates[params->vi_bitrate.mode],
1107 params->vi_bitrate.target * 1000, /* kbps -> bps */
1108 params->vi_bitrate.max * 1000 / BLACKBIRD_PEAK_RATE_DIVISOR, /* peak/400 */
1109 BLACKBIRD_MUX_RATE_DEFAULT /*, 0x70*/); /* encoding buffer, ckennedy */
1110 }
1111
1112 /* TODO: implement the stream ID stuff:
1113 ts_pid_pmt, ts_pid_audio, ts_pid_video, ts_pid_pcr,
1114 ps_size, au_pesid, vi_pesid
1115 */
1116 UPDATE_PARAM( ts_pid_pmt );
1117 UPDATE_PARAM( ts_pid_audio );
1118 UPDATE_PARAM( ts_pid_video );
1119 UPDATE_PARAM( ts_pid_pcr );
1120 UPDATE_PARAM( ps_size );
1121 UPDATE_PARAM( au_pesid );
1122 UPDATE_PARAM( vi_pesid );
1123}
1124
1125static void blackbird_set_default_dnr_params(struct cx8802_dev *dev)
1126{
1127 /* assign dnr filter mode */
1128 if( dev->dnr_params.mode > BLACKBIRD_DNR_BITS_AUTO )
1129 dev->dnr_params.mode = BLACKBIRD_DNR_BITS_MANUAL;
1130 if( dev->dnr_params.type > BLACKBIRD_MEDIAN_FILTER_DIAGONAL )
1131 dev->dnr_params.type = BLACKBIRD_MEDIAN_FILTER_DISABLED;
1132 blackbird_api_cmd(dev, CX2341X_ENC_SET_DNR_FILTER_MODE, 2, 0,
1133 dev->dnr_params.mode,
1134 dev->dnr_params.type
1135 );
1136
1137 /* assign dnr filter props*/
1138 if( dev->dnr_params.spatial > 15 )
1139 dev->dnr_params.spatial = 15;
1140 if( dev->dnr_params.temporal > 31 )
1141 dev->dnr_params.temporal = 31;
1142 blackbird_api_cmd(dev, CX2341X_ENC_SET_DNR_FILTER_PROPS, 2, 0,
1143 dev->dnr_params.spatial,
1144 dev->dnr_params.temporal
1145 );
1146}
1147#define CHECK_DNR_PARAM( name ) ( dev->dnr_params.name != dnr_params->name )
1148#define UPDATE_DNR_PARAM( name ) dev->dnr_params.name = dnr_params->name
1149void blackbird_set_dnr_params(struct cx8802_dev *dev, struct blackbird_dnr* dnr_params)
1150{
1151 /* assign dnr filter mode */
1152 /* clamp values */
1153 if( dnr_params->mode > BLACKBIRD_DNR_BITS_AUTO )
1154 dnr_params->mode = BLACKBIRD_DNR_BITS_MANUAL;
1155 if( dnr_params->type > BLACKBIRD_MEDIAN_FILTER_DIAGONAL )
1156 dnr_params->type = BLACKBIRD_MEDIAN_FILTER_DISABLED;
1157 /* check if the params actually changed */
1158 if( CHECK_DNR_PARAM( mode ) || CHECK_DNR_PARAM( type ) )
1159 {
1160 UPDATE_DNR_PARAM( mode );
1161 UPDATE_DNR_PARAM( type );
1162 blackbird_api_cmd(dev, CX2341X_ENC_SET_DNR_FILTER_MODE, 2, 0, dnr_params->mode, dnr_params->type);
1163 }
1164
1165 /* assign dnr filter props*/
1166 if( dnr_params->spatial > 15 )
1167 dnr_params->spatial = 15;
1168 if( dnr_params->temporal > 31 )
1169 dnr_params->temporal = 31;
1170 if( CHECK_DNR_PARAM( spatial ) || CHECK_DNR_PARAM( temporal ) )
1171 {
1172 UPDATE_DNR_PARAM( spatial );
1173 UPDATE_DNR_PARAM( temporal );
1174 blackbird_api_cmd(dev, CX2341X_ENC_SET_DNR_FILTER_PROPS, 2, 0, dnr_params->spatial, dnr_params->temporal);
1175 }
1176}
1177
1178static void blackbird_codec_settings(struct cx8802_dev *dev)
1179{
1180
1181 /* assign output port */
1182 blackbird_api_cmd(dev, CX2341X_ENC_SET_OUTPUT_PORT, 1, 0, BLACKBIRD_OUTPUT_PORT_STREAMING); /* Host */
1183
1184 /* assign frame size */
1185 blackbird_api_cmd(dev, CX2341X_ENC_SET_FRAME_SIZE, 2, 0,
1186 dev->height, dev->width);
1187
1188 /* assign coring levels (luma_h, luma_l, chroma_h, chroma_l) */
1189 blackbird_api_cmd(dev, CX2341X_ENC_SET_CORING_LEVELS, 4, 0, 0, 255, 0, 255);
1190
1191 /* assign spatial filter type: luma_t: horiz_only, chroma_t: horiz_only */
1192 blackbird_api_cmd(dev, CX2341X_ENC_SET_SPATIAL_FILTER_TYPE, 2, 0,
1193 BLACKBIRD_SPATIAL_FILTER_LUMA_1D_HORIZ,
1194 BLACKBIRD_SPATIAL_FILTER_CHROMA_1D_HORIZ
1195 );
1196
1197 /* assign frame drop rate */
1198 /* blackbird_api_cmd(dev, IVTV_API_ASSIGN_FRAME_DROP_RATE, 1, 0, 0); */
1199
1200 blackbird_set_default_params(dev);
1201 blackbird_set_default_dnr_params(dev);
1202}
1203
1204static int blackbird_initialize_codec(struct cx8802_dev *dev) 564static int blackbird_initialize_codec(struct cx8802_dev *dev)
1205{ 565{
1206 struct cx88_core *core = dev->core; 566 struct cx88_core *core = dev->core;
@@ -1445,15 +805,35 @@ static int mpeg_do_ioctl(struct inode *inode, struct file *file,
1445 { 805 {
1446 struct v4l2_mpeg_compression *f = arg; 806 struct v4l2_mpeg_compression *f = arg;
1447 807
1448 memcpy(f,&dev->params,sizeof(*f)); 808 memcpy(f,&default_mpeg_params,sizeof(*f));
1449 return 0; 809 return 0;
1450 } 810 }
1451 case VIDIOC_S_MPEGCOMP: 811 case VIDIOC_S_MPEGCOMP:
812 return 0;
813 case VIDIOC_G_EXT_CTRLS:
1452 { 814 {
1453 struct v4l2_mpeg_compression *f = arg; 815 struct v4l2_ext_controls *f = arg;
1454 816
1455 blackbird_set_params(dev, f); 817 if (f->ctrl_class != V4L2_CTRL_CLASS_MPEG)
1456 return 0; 818 return -EINVAL;
819 return cx2341x_ext_ctrls(&dev->params, f, cmd);
820 }
821 case VIDIOC_S_EXT_CTRLS:
822 case VIDIOC_TRY_EXT_CTRLS:
823 {
824 struct v4l2_ext_controls *f = arg;
825 struct cx2341x_mpeg_params p;
826 int err;
827
828 if (f->ctrl_class != V4L2_CTRL_CLASS_MPEG)
829 return -EINVAL;
830 p = dev->params;
831 err = cx2341x_ext_ctrls(&p, f, cmd);
832 if (err == 0 && cmd == VIDIOC_S_EXT_CTRLS) {
833 err = cx2341x_update(dev, blackbird_mbox_func, &dev->params, &p);
834 dev->params = p;
835 }
836 return err;
1457 } 837 }
1458 case VIDIOC_S_FREQUENCY: 838 case VIDIOC_S_FREQUENCY:
1459 { 839 {
@@ -1658,26 +1038,21 @@ static int __devinit blackbird_probe(struct pci_dev *pci_dev,
1658 dev->core = core; 1038 dev->core = core;
1659 dev->width = 720; 1039 dev->width = 720;
1660 dev->height = 576; 1040 dev->height = 576;
1661 memcpy(&dev->params,&default_mpeg_params,sizeof(default_mpeg_params)); 1041 cx2341x_fill_defaults(&dev->params);
1662 memcpy(&dev->dnr_params,&default_dnr_params,sizeof(default_dnr_params));
1663 1042
1664 switch (core->board) { 1043 switch (core->board) {
1665 case CX88_BOARD_HAUPPAUGE_ROSLYN: 1044 case CX88_BOARD_HAUPPAUGE_ROSLYN:
1666 if (core->tuner_formats & V4L2_STD_525_60) { 1045 if (core->tuner_formats & V4L2_STD_525_60) {
1667 dev->height = 480; 1046 dev->height = 480;
1668 dev->params.vi_frame_rate = 30;
1669 } else { 1047 } else {
1670 dev->height = 576; 1048 dev->height = 576;
1671 dev->params.vi_frame_rate = 25;
1672 } 1049 }
1673 break; 1050 break;
1674 case CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT: 1051 case CX88_BOARD_KWORLD_HARDWARE_MPEG_TV_XPERT:
1675 if (core->tvnorm->id & V4L2_STD_525_60) { 1052 if (core->tvnorm->id & V4L2_STD_525_60) {
1676 dev->height = 480; 1053 dev->height = 480;
1677 dev->params.vi_frame_rate = 30;
1678 } else { 1054 } else {
1679 dev->height = 576; 1055 dev->height = 576;
1680 dev->params.vi_frame_rate = 25;
1681 } 1056 }
1682 break; 1057 break;
1683 } 1058 }
@@ -1765,8 +1140,6 @@ module_exit(blackbird_fini);
1765 1140
1766EXPORT_SYMBOL(cx88_ioctl_hook); 1141EXPORT_SYMBOL(cx88_ioctl_hook);
1767EXPORT_SYMBOL(cx88_ioctl_translator); 1142EXPORT_SYMBOL(cx88_ioctl_translator);
1768EXPORT_SYMBOL(blackbird_set_params);
1769EXPORT_SYMBOL(blackbird_set_dnr_params);
1770 1143
1771/* ----------------------------------------------------------- */ 1144/* ----------------------------------------------------------- */
1772/* 1145/*