1#include <linux/kernel.h>
2#include <linux/module.h>
3#include <linux/string.h>
4#include "dvb_filter.h"
5
6#if 0
7static unsigned int bitrates[3][16] =
8{{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0},
9 {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,0},
10 {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}};
11#endif
12
13static u32 freq[4] = {480, 441, 320, 0};
14
15static unsigned int ac3_bitrates[32] =
16    {32,40,48,56,64,80,96,112,128,160,192,224,256,320,384,448,512,576,640,
17     0,0,0,0,0,0,0,0,0,0,0,0,0};
18
19static u32 ac3_frames[3][32] =
20    {{64,80,96,112,128,160,192,224,256,320,384,448,512,640,768,896,1024,
21      1152,1280,0,0,0,0,0,0,0,0,0,0,0,0,0},
22     {69,87,104,121,139,174,208,243,278,348,417,487,557,696,835,975,1114,
23      1253,1393,0,0,0,0,0,0,0,0,0,0,0,0,0},
24     {96,120,144,168,192,240,288,336,384,480,576,672,768,960,1152,1344,
25      1536,1728,1920,0,0,0,0,0,0,0,0,0,0,0,0,0}};
26
27
28
29#if 0
30static void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv,
31		  void (*pes_write)(u8 *buf, int count, void *data),
32		  void *priv)
33{
34	dvb_filter_ipack_init(pa, IPACKS, pes_write);
35	dvb_filter_ipack_init(pv, IPACKS, pes_write);
36	pa->pid = pida;
37	pv->pid = pidv;
38	pa->data = priv;
39	pv->data = priv;
40}
41#endif
42
43#if 0
44static void ts_to_pes(ipack *p, u8 *buf) // don't need count (=188)
45{
46	u8 off = 0;
47
48	if (!buf || !p ){
49		printk("NULL POINTER IDIOT\n");
50		return;
51	}
52	if (buf[1]&PAY_START) {
53		if (p->plength == MMAX_PLENGTH-6 && p->found>6){
54			p->plength = p->found-6;
55			p->found = 0;
56			send_ipack(p);
57			dvb_filter_ipack_reset(p);
58		}
59	}
60	if (buf[3] & ADAPT_FIELD) {  // adaptation field?
61		off = buf[4] + 1;
62		if (off+4 > 187) return;
63	}
64	dvb_filter_instant_repack(buf+4+off, TS_SIZE-4-off, p);
65}
66#endif
67
68#if 0
69/* needs 5 byte input, returns picture coding type*/
70static int read_picture_header(u8 *headr, struct mpg_picture *pic, int field, int pr)
71{
72	u8 pct;
73
74	if (pr) printk( "Pic header: ");
75	pic->temporal_reference[field] = (( headr[0] << 2 ) |
76					  (headr[1] & 0x03) )& 0x03ff;
77	if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]);
78
79	pct = ( headr[1] >> 2 ) & 0x07;
80	pic->picture_coding_type[field] = pct;
81	if (pr) {
82		switch(pct){
83			case I_FRAME:
84				printk( "  I-FRAME");
85				break;
86			case B_FRAME:
87				printk( "  B-FRAME");
88				break;
89			case P_FRAME:
90				printk( "  P-FRAME");
91				break;
92		}
93	}
94
95
96	pic->vinfo.vbv_delay  = (( headr[1] >> 5 ) | ( headr[2] << 3) |
97				 ( (headr[3] & 0x1F) << 11) ) & 0xffff;
98
99	if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay);
100
101	pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
102		((headr[4] & 0x80) >> 3);
103
104	if ( pct == B_FRAME ){
105		pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
106	}
107	if (pr) printk( " pic head param: 0x%x",
108			pic->picture_header_parameter);
109
110	return pct;
111}
112#endif
113
114#if 0
115/* needs 4 byte input */
116static int read_gop_header(u8 *headr, struct mpg_picture *pic, int pr)
117{
118	if (pr) printk("GOP header: ");
119
120	pic->time_code  = (( headr[0] << 17 ) | ( headr[1] << 9) |
121			   ( headr[2] << 1 ) | (headr[3] &0x01)) & 0x1ffffff;
122
123	if (pr) printk(" time: %d:%d.%d ", (headr[0]>>2)& 0x1F,
124		       ((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F),
125		       ((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F));
126
127	if ( ( headr[3] & 0x40 ) != 0 ){
128		pic->closed_gop = 1;
129	} else {
130		pic->closed_gop = 0;
131	}
132	if (pr) printk("closed: %d", pic->closed_gop);
133
134	if ( ( headr[3] & 0x20 ) != 0 ){
135		pic->broken_link = 1;
136	} else {
137		pic->broken_link = 0;
138	}
139	if (pr) printk(" broken: %d\n", pic->broken_link);
140
141	return 0;
142}
143#endif
144
145#if 0
146/* needs 8 byte input */
147static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
148{
149	int sw;
150	int form = -1;
151
152	if (pr) printk("Reading sequence header\n");
153
154	vi->horizontal_size	= ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
155	vi->vertical_size	= ((headr[1] &0x0F) << 8) | (headr[2]);
156
157	sw = (int)((headr[3]&0xF0) >> 4) ;
158
159	switch( sw ){
160	case 1:
161		if (pr)
162			printk("Videostream: ASPECT: 1:1");
163		vi->aspect_ratio = 100;
164		break;
165	case 2:
166		if (pr)
167			printk("Videostream: ASPECT: 4:3");
168		vi->aspect_ratio = 133;
169		break;
170	case 3:
171		if (pr)
172			printk("Videostream: ASPECT: 16:9");
173		vi->aspect_ratio = 177;
174		break;
175	case 4:
176		if (pr)
177			printk("Videostream: ASPECT: 2.21:1");
178		vi->aspect_ratio = 221;
179		break;
180
181	case 5 ... 15:
182		if (pr)
183			printk("Videostream: ASPECT: reserved");
184		vi->aspect_ratio = 0;
185		break;
186
187	default:
188		vi->aspect_ratio = 0;
189		return -1;
190	}
191
192	if (pr)
193		printk("  Size = %dx%d",vi->horizontal_size,vi->vertical_size);
194
195	sw = (int)(headr[3]&0x0F);
196
197	switch ( sw ) {
198	case 1:
199		if (pr)
200			printk("  FRate: 23.976 fps");
201		vi->framerate = 23976;
202		form = -1;
203		break;
204	case 2:
205		if (pr)
206			printk("  FRate: 24 fps");
207		vi->framerate = 24000;
208		form = -1;
209		break;
210	case 3:
211		if (pr)
212			printk("  FRate: 25 fps");
213		vi->framerate = 25000;
214		form = VIDEO_MODE_PAL;
215		break;
216	case 4:
217		if (pr)
218			printk("  FRate: 29.97 fps");
219		vi->framerate = 29970;
220		form = VIDEO_MODE_NTSC;
221		break;
222	case 5:
223		if (pr)
224			printk("  FRate: 30 fps");
225		vi->framerate = 30000;
226		form = VIDEO_MODE_NTSC;
227		break;
228	case 6:
229		if (pr)
230			printk("  FRate: 50 fps");
231		vi->framerate = 50000;
232		form = VIDEO_MODE_PAL;
233		break;
234	case 7:
235		if (pr)
236			printk("  FRate: 60 fps");
237		vi->framerate = 60000;
238		form = VIDEO_MODE_NTSC;
239		break;
240	}
241
242	vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03);
243
244	vi->vbv_buffer_size
245		= (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
246
247	if (pr){
248		printk("  BRate: %d Mbit/s",4*(vi->bit_rate)/10000);
249		printk("  vbvbuffer %d",16*1024*(vi->vbv_buffer_size));
250		printk("\n");
251	}
252
253	vi->video_format = form;
254
255	return 0;
256}
257#endif
258
259
260#if 0
261static int get_vinfo(u8 *mbuf, int count, struct dvb_video_info *vi, int pr)
262{
263	u8 *headr;
264	int found = 0;
265	int c = 0;
266
267	while (found < 4 && c+4 < count){
268		u8 *b;
269
270		b = mbuf+c;
271		if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01
272		     && b[3] == 0xb3) found = 4;
273		else {
274			c++;
275		}
276	}
277
278	if (! found) return -1;
279	c += 4;
280	if (c+12 >= count) return -1;
281	headr = mbuf+c;
282	if (read_sequence_header(headr, vi, pr) < 0) return -1;
283	vi->off = c-4;
284	return 0;
285}
286#endif
287
288
289#if 0
290static int get_ainfo(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
291{
292	u8 *headr;
293	int found = 0;
294	int c = 0;
295	int fr = 0;
296
297	while (found < 2 && c < count){
298		u8 b[2];
299		memcpy( b, mbuf+c, 2);
300
301		if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
302			found = 2;
303		else {
304			c++;
305		}
306	}
307
308	if (!found) return -1;
309
310	if (c+3 >= count) return -1;
311	headr = mbuf+c;
312
313	ai->layer = (headr[1] & 0x06) >> 1;
314
315	if (pr)
316		printk("Audiostream: Layer: %d", 4-ai->layer);
317
318
319	ai->bit_rate = bitrates[(3-ai->layer)][(headr[2] >> 4 )]*1000;
320
321	if (pr){
322		if (ai->bit_rate == 0)
323			printk("  Bit rate: free");
324		else if (ai->bit_rate == 0xf)
325			printk("  BRate: reserved");
326		else
327			printk("  BRate: %d kb/s", ai->bit_rate/1000);
328	}
329
330	fr = (headr[2] & 0x0c ) >> 2;
331	ai->frequency = freq[fr]*100;
332	if (pr){
333		if (ai->frequency == 3)
334			printk("  Freq: reserved\n");
335		else
336			printk("  Freq: %d kHz\n",ai->frequency);
337
338	}
339	ai->off = c;
340	return 0;
341}
342#endif
343
344
345int dvb_filter_get_ac3info(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
346{
347	u8 *headr;
348	int found = 0;
349	int c = 0;
350	u8 frame = 0;
351	int fr = 0;
352
353	while ( !found  && c < count){
354		u8 *b = mbuf+c;
355
356		if ( b[0] == 0x0b &&  b[1] == 0x77 )
357			found = 1;
358		else {
359			c++;
360		}
361	}
362
363	if (!found) return -1;
364	if (pr)
365		printk("Audiostream: AC3");
366
367	ai->off = c;
368	if (c+5 >= count) return -1;
369
370	ai->layer = 0;  // 0 for AC3
371	headr = mbuf+c+2;
372
373	frame = (headr[2]&0x3f);
374	ai->bit_rate = ac3_bitrates[frame >> 1]*1000;
375
376	if (pr)
377		printk("  BRate: %d kb/s", (int) ai->bit_rate/1000);
378
379	ai->frequency = (headr[2] & 0xc0 ) >> 6;
380	fr = (headr[2] & 0xc0 ) >> 6;
381	ai->frequency = freq[fr]*100;
382	if (pr) printk ("  Freq: %d Hz\n", (int) ai->frequency);
383
384
385	ai->framesize = ac3_frames[fr][frame >> 1];
386	if ((frame & 1) &&  (fr == 1)) ai->framesize++;
387	ai->framesize = ai->framesize << 1;
388	if (pr) printk ("  Framesize %d\n",(int) ai->framesize);
389
390
391	return 0;
392}
393EXPORT_SYMBOL(dvb_filter_get_ac3info);
394
395
396#if 0
397static u8 *skip_pes_header(u8 **bufp)
398{
399	u8 *inbuf = *bufp;
400	u8 *buf = inbuf;
401	u8 *pts = NULL;
402	int skip = 0;
403
404	static const int mpeg1_skip_table[16] = {
405		1, 0xffff,      5,     10, 0xffff, 0xffff, 0xffff, 0xffff,
406		0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
407	};
408
409
410	if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */
411		if (buf[7] & PTS_ONLY)
412			pts = buf+9;
413		else pts = NULL;
414		buf = inbuf + 9 + inbuf[8];
415	} else {        /* mpeg1 */
416		for (buf = inbuf + 6; *buf == 0xff; buf++)
417			if (buf == inbuf + 6 + 16) {
418				break;
419			}
420		if ((*buf & 0xc0) == 0x40)
421			buf += 2;
422		skip = mpeg1_skip_table [*buf >> 4];
423		if (skip == 5 || skip == 10) pts = buf;
424		else pts = NULL;
425
426		buf += mpeg1_skip_table [*buf >> 4];
427	}
428
429	*bufp = buf;
430	return pts;
431}
432#endif
433
434#if 0
435static void initialize_quant_matrix( u32 *matrix )
436{
437	int i;
438
439	matrix[0]  = 0x08101013;
440	matrix[1]  = 0x10131616;
441	matrix[2]  = 0x16161616;
442	matrix[3]  = 0x1a181a1b;
443	matrix[4]  = 0x1b1b1a1a;
444	matrix[5]  = 0x1a1a1b1b;
445	matrix[6]  = 0x1b1d1d1d;
446	matrix[7]  = 0x2222221d;
447	matrix[8]  = 0x1d1d1b1b;
448	matrix[9]  = 0x1d1d2020;
449	matrix[10] = 0x22222526;
450	matrix[11] = 0x25232322;
451	matrix[12] = 0x23262628;
452	matrix[13] = 0x28283030;
453	matrix[14] = 0x2e2e3838;
454	matrix[15] = 0x3a454553;
455
456	for ( i = 16 ; i < 32 ; i++ )
457		matrix[i] = 0x10101010;
458}
459#endif
460
461#if 0
462static void initialize_mpg_picture(struct mpg_picture *pic)
463{
464	int i;
465
466	/* set MPEG1 */
467	pic->mpeg1_flag = 1;
468	pic->profile_and_level = 0x4A ;        /* MP@LL */
469	pic->progressive_sequence = 1;
470	pic->low_delay = 0;
471
472	pic->sequence_display_extension_flag = 0;
473	for ( i = 0 ; i < 4 ; i++ ){
474		pic->frame_centre_horizontal_offset[i] = 0;
475		pic->frame_centre_vertical_offset[i] = 0;
476	}
477	pic->last_frame_centre_horizontal_offset = 0;
478	pic->last_frame_centre_vertical_offset = 0;
479
480	pic->picture_display_extension_flag[0] = 0;
481	pic->picture_display_extension_flag[1] = 0;
482	pic->sequence_header_flag = 0;
483	pic->gop_flag = 0;
484	pic->sequence_end_flag = 0;
485}
486#endif
487
488#if 0
489static void mpg_set_picture_parameter( int32_t field_type, struct mpg_picture *pic )
490{
491	int16_t last_h_offset;
492	int16_t last_v_offset;
493
494	int16_t *p_h_offset;
495	int16_t *p_v_offset;
496
497	if ( pic->mpeg1_flag ){
498		pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
499		pic->top_field_first = 0;
500		pic->repeat_first_field = 0;
501		pic->progressive_frame = 1;
502		pic->picture_coding_parameter = 0x000010;
503	}
504
505	/* Reset flag */
506	pic->picture_display_extension_flag[field_type] = 0;
507
508	last_h_offset = pic->last_frame_centre_horizontal_offset;
509	last_v_offset = pic->last_frame_centre_vertical_offset;
510	if ( field_type == FIRST_FIELD ){
511		p_h_offset = pic->frame_centre_horizontal_offset;
512		p_v_offset = pic->frame_centre_vertical_offset;
513		*p_h_offset = last_h_offset;
514		*(p_h_offset + 1) = last_h_offset;
515		*(p_h_offset + 2) = last_h_offset;
516		*p_v_offset = last_v_offset;
517		*(p_v_offset + 1) = last_v_offset;
518		*(p_v_offset + 2) = last_v_offset;
519	} else {
520		pic->frame_centre_horizontal_offset[3] = last_h_offset;
521		pic->frame_centre_vertical_offset[3] = last_v_offset;
522	}
523}
524#endif
525
526#if 0
527static void init_mpg_picture( struct mpg_picture *pic, int chan, int32_t field_type)
528{
529	pic->picture_header = 0;
530	pic->sequence_header_data
531		= ( INIT_HORIZONTAL_SIZE << 20 )
532			| ( INIT_VERTICAL_SIZE << 8 )
533			| ( INIT_ASPECT_RATIO << 4 )
534			| ( INIT_FRAME_RATE );
535	pic->mpeg1_flag = 0;
536	pic->vinfo.horizontal_size
537		= INIT_DISP_HORIZONTAL_SIZE;
538	pic->vinfo.vertical_size
539		= INIT_DISP_VERTICAL_SIZE;
540	pic->picture_display_extension_flag[field_type]
541		= 0;
542	pic->pts_flag[field_type] = 0;
543
544	pic->sequence_gop_header = 0;
545	pic->picture_header = 0;
546	pic->sequence_header_flag = 0;
547	pic->gop_flag = 0;
548	pic->sequence_end_flag = 0;
549	pic->sequence_display_extension_flag = 0;
550	pic->last_frame_centre_horizontal_offset = 0;
551	pic->last_frame_centre_vertical_offset = 0;
552	pic->channel = chan;
553}
554#endif
555
556void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid,
557			    dvb_filter_pes2ts_cb_t *cb, void *priv)
558{
559	unsigned char *buf=p2ts->buf;
560
561	buf[0]=0x47;
562	buf[1]=(pid>>8);
563	buf[2]=pid&0xff;
564	p2ts->cc=0;
565	p2ts->cb=cb;
566	p2ts->priv=priv;
567}
568EXPORT_SYMBOL(dvb_filter_pes2ts_init);
569
570int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
571		      int len, int payload_start)
572{
573	unsigned char *buf=p2ts->buf;
574	int ret=0, rest;
575
576	//len=6+((pes[4]<<8)|pes[5]);
577
578	if (payload_start)
579		buf[1]|=0x40;
580	else
581		buf[1]&=~0x40;
582	while (len>=184) {
583		buf[3]=0x10|((p2ts->cc++)&0x0f);
584		memcpy(buf+4, pes, 184);
585		if ((ret=p2ts->cb(p2ts->priv, buf)))
586			return ret;
587		len-=184; pes+=184;
588		buf[1]&=~0x40;
589	}
590	if (!len)
591		return 0;
592	buf[3]=0x30|((p2ts->cc++)&0x0f);
593	rest=183-len;
594	if (rest) {
595		buf[5]=0x00;
596		if (rest-1)
597			memset(buf+6, 0xff, rest-1);
598	}
599	buf[4]=rest;
600	memcpy(buf+5+rest, pes, len);
601	return p2ts->cb(p2ts->priv, buf);
602}
603EXPORT_SYMBOL(dvb_filter_pes2ts);
604