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