[media] dvb-core: move dvb_filter out of the DVB core
authorMauro Carvalho Chehab <mchehab@s-opensource.com>
Thu, 13 Oct 2016 10:41:38 +0000 (07:41 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Fri, 21 Oct 2016 10:44:08 +0000 (08:44 -0200)
The dvb_filter.c can hardly be considered as part of the DVB
core. More than half of the code there is commented out by
av7110 and ttusb_dec.

On the latter, just two small helper functions and a struct
definition is used.

Being part of the core means that it would require an
amount of work to fix issues in it, like bad printk's
on it, and to document it on some future, like other kAPI
headers. It simply not worth the effort for something that
seems to be deprecated, as no new drivers use it.

So, move it out of the core, by moving it to pci/ttpci
directory, where av7110 driver is kept, and copy the two
routines used by ttyusb_dec directly into its code.

Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/common/b2c2/flexcop-common.h
drivers/media/dvb-core/Makefile
drivers/media/dvb-core/dvb_filter.c [deleted file]
drivers/media/dvb-core/dvb_filter.h [deleted file]
drivers/media/pci/ttpci/Makefile
drivers/media/pci/ttpci/dvb_filter.c [new file with mode: 0644]
drivers/media/pci/ttpci/dvb_filter.h [new file with mode: 0644]
drivers/media/usb/ttusb-dec/ttusb_dec.c

index 2b2460e9e6b4fcd9538653f7adf46c69d79539ae..2533574c0cf41a49e0e0538217a01d94bb6de493 100644 (file)
@@ -14,7 +14,6 @@
 
 #include "dmxdev.h"
 #include "dvb_demux.h"
-#include "dvb_filter.h"
 #include "dvb_net.h"
 #include "dvb_frontend.h"
 
index 8f22bcd7c1f9122694e552cb1c39688ee95b1518..281bc89576e6d981a726e0251797e7d787457f00 100644 (file)
@@ -4,7 +4,7 @@
 
 dvb-net-$(CONFIG_DVB_NET) := dvb_net.o
 
-dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o dvb_filter.o    \
+dvb-core-objs := dvbdev.o dmxdev.o dvb_demux.o                 \
                 dvb_ca_en50221.o dvb_frontend.o                \
                 $(dvb-net-y) dvb_ringbuffer.o dvb_math.o
 
diff --git a/drivers/media/dvb-core/dvb_filter.c b/drivers/media/dvb-core/dvb_filter.c
deleted file mode 100644 (file)
index 772003f..0000000
+++ /dev/null
@@ -1,603 +0,0 @@
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/string.h>
-#include "dvb_filter.h"
-
-#if 0
-static unsigned int bitrates[3][16] =
-{{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0},
- {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,0},
- {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}};
-#endif
-
-static u32 freq[4] = {480, 441, 320, 0};
-
-static unsigned int ac3_bitrates[32] =
-    {32,40,48,56,64,80,96,112,128,160,192,224,256,320,384,448,512,576,640,
-     0,0,0,0,0,0,0,0,0,0,0,0,0};
-
-static u32 ac3_frames[3][32] =
-    {{64,80,96,112,128,160,192,224,256,320,384,448,512,640,768,896,1024,
-      1152,1280,0,0,0,0,0,0,0,0,0,0,0,0,0},
-     {69,87,104,121,139,174,208,243,278,348,417,487,557,696,835,975,1114,
-      1253,1393,0,0,0,0,0,0,0,0,0,0,0,0,0},
-     {96,120,144,168,192,240,288,336,384,480,576,672,768,960,1152,1344,
-      1536,1728,1920,0,0,0,0,0,0,0,0,0,0,0,0,0}};
-
-
-
-#if 0
-static void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv,
-                 void (*pes_write)(u8 *buf, int count, void *data),
-                 void *priv)
-{
-       dvb_filter_ipack_init(pa, IPACKS, pes_write);
-       dvb_filter_ipack_init(pv, IPACKS, pes_write);
-       pa->pid = pida;
-       pv->pid = pidv;
-       pa->data = priv;
-       pv->data = priv;
-}
-#endif
-
-#if 0
-static void ts_to_pes(ipack *p, u8 *buf) // don't need count (=188)
-{
-       u8 off = 0;
-
-       if (!buf || !p ){
-               printk("NULL POINTER IDIOT\n");
-               return;
-       }
-       if (buf[1]&PAY_START) {
-               if (p->plength == MMAX_PLENGTH-6 && p->found>6){
-                       p->plength = p->found-6;
-                       p->found = 0;
-                       send_ipack(p);
-                       dvb_filter_ipack_reset(p);
-               }
-       }
-       if (buf[3] & ADAPT_FIELD) {  // adaptation field?
-               off = buf[4] + 1;
-               if (off+4 > 187) return;
-       }
-       dvb_filter_instant_repack(buf+4+off, TS_SIZE-4-off, p);
-}
-#endif
-
-#if 0
-/* needs 5 byte input, returns picture coding type*/
-static int read_picture_header(u8 *headr, struct mpg_picture *pic, int field, int pr)
-{
-       u8 pct;
-
-       if (pr) printk( "Pic header: ");
-       pic->temporal_reference[field] = (( headr[0] << 2 ) |
-                                         (headr[1] & 0x03) )& 0x03ff;
-       if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]);
-
-       pct = ( headr[1] >> 2 ) & 0x07;
-       pic->picture_coding_type[field] = pct;
-       if (pr) {
-               switch(pct){
-                       case I_FRAME:
-                               printk( "  I-FRAME");
-                               break;
-                       case B_FRAME:
-                               printk( "  B-FRAME");
-                               break;
-                       case P_FRAME:
-                               printk( "  P-FRAME");
-                               break;
-               }
-       }
-
-
-       pic->vinfo.vbv_delay  = (( headr[1] >> 5 ) | ( headr[2] << 3) |
-                                ( (headr[3] & 0x1F) << 11) ) & 0xffff;
-
-       if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay);
-
-       pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
-               ((headr[4] & 0x80) >> 3);
-
-       if ( pct == B_FRAME ){
-               pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
-       }
-       if (pr) printk( " pic head param: 0x%x",
-                       pic->picture_header_parameter);
-
-       return pct;
-}
-#endif
-
-#if 0
-/* needs 4 byte input */
-static int read_gop_header(u8 *headr, struct mpg_picture *pic, int pr)
-{
-       if (pr) printk("GOP header: ");
-
-       pic->time_code  = (( headr[0] << 17 ) | ( headr[1] << 9) |
-                          ( headr[2] << 1 ) | (headr[3] &0x01)) & 0x1ffffff;
-
-       if (pr) printk(" time: %d:%d.%d ", (headr[0]>>2)& 0x1F,
-                      ((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F),
-                      ((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F));
-
-       if ( ( headr[3] & 0x40 ) != 0 ){
-               pic->closed_gop = 1;
-       } else {
-               pic->closed_gop = 0;
-       }
-       if (pr) printk("closed: %d", pic->closed_gop);
-
-       if ( ( headr[3] & 0x20 ) != 0 ){
-               pic->broken_link = 1;
-       } else {
-               pic->broken_link = 0;
-       }
-       if (pr) printk(" broken: %d\n", pic->broken_link);
-
-       return 0;
-}
-#endif
-
-#if 0
-/* needs 8 byte input */
-static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
-{
-       int sw;
-       int form = -1;
-
-       if (pr) printk("Reading sequence header\n");
-
-       vi->horizontal_size     = ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
-       vi->vertical_size       = ((headr[1] &0x0F) << 8) | (headr[2]);
-
-       sw = (int)((headr[3]&0xF0) >> 4) ;
-
-       switch( sw ){
-       case 1:
-               if (pr)
-                       printk("Videostream: ASPECT: 1:1");
-               vi->aspect_ratio = 100;
-               break;
-       case 2:
-               if (pr)
-                       printk("Videostream: ASPECT: 4:3");
-               vi->aspect_ratio = 133;
-               break;
-       case 3:
-               if (pr)
-                       printk("Videostream: ASPECT: 16:9");
-               vi->aspect_ratio = 177;
-               break;
-       case 4:
-               if (pr)
-                       printk("Videostream: ASPECT: 2.21:1");
-               vi->aspect_ratio = 221;
-               break;
-
-       case 5 ... 15:
-               if (pr)
-                       printk("Videostream: ASPECT: reserved");
-               vi->aspect_ratio = 0;
-               break;
-
-       default:
-               vi->aspect_ratio = 0;
-               return -1;
-       }
-
-       if (pr)
-               printk("  Size = %dx%d",vi->horizontal_size,vi->vertical_size);
-
-       sw = (int)(headr[3]&0x0F);
-
-       switch ( sw ) {
-       case 1:
-               if (pr)
-                       printk("  FRate: 23.976 fps");
-               vi->framerate = 23976;
-               form = -1;
-               break;
-       case 2:
-               if (pr)
-                       printk("  FRate: 24 fps");
-               vi->framerate = 24000;
-               form = -1;
-               break;
-       case 3:
-               if (pr)
-                       printk("  FRate: 25 fps");
-               vi->framerate = 25000;
-               form = VIDEO_MODE_PAL;
-               break;
-       case 4:
-               if (pr)
-                       printk("  FRate: 29.97 fps");
-               vi->framerate = 29970;
-               form = VIDEO_MODE_NTSC;
-               break;
-       case 5:
-               if (pr)
-                       printk("  FRate: 30 fps");
-               vi->framerate = 30000;
-               form = VIDEO_MODE_NTSC;
-               break;
-       case 6:
-               if (pr)
-                       printk("  FRate: 50 fps");
-               vi->framerate = 50000;
-               form = VIDEO_MODE_PAL;
-               break;
-       case 7:
-               if (pr)
-                       printk("  FRate: 60 fps");
-               vi->framerate = 60000;
-               form = VIDEO_MODE_NTSC;
-               break;
-       }
-
-       vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03);
-
-       vi->vbv_buffer_size
-               = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
-
-       if (pr){
-               printk("  BRate: %d Mbit/s",4*(vi->bit_rate)/10000);
-               printk("  vbvbuffer %d",16*1024*(vi->vbv_buffer_size));
-               printk("\n");
-       }
-
-       vi->video_format = form;
-
-       return 0;
-}
-#endif
-
-
-#if 0
-static int get_vinfo(u8 *mbuf, int count, struct dvb_video_info *vi, int pr)
-{
-       u8 *headr;
-       int found = 0;
-       int c = 0;
-
-       while (found < 4 && c+4 < count){
-               u8 *b;
-
-               b = mbuf+c;
-               if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01
-                    && b[3] == 0xb3) found = 4;
-               else {
-                       c++;
-               }
-       }
-
-       if (! found) return -1;
-       c += 4;
-       if (c+12 >= count) return -1;
-       headr = mbuf+c;
-       if (read_sequence_header(headr, vi, pr) < 0) return -1;
-       vi->off = c-4;
-       return 0;
-}
-#endif
-
-
-#if 0
-static int get_ainfo(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
-{
-       u8 *headr;
-       int found = 0;
-       int c = 0;
-       int fr = 0;
-
-       while (found < 2 && c < count){
-               u8 b[2];
-               memcpy( b, mbuf+c, 2);
-
-               if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
-                       found = 2;
-               else {
-                       c++;
-               }
-       }
-
-       if (!found) return -1;
-
-       if (c+3 >= count) return -1;
-       headr = mbuf+c;
-
-       ai->layer = (headr[1] & 0x06) >> 1;
-
-       if (pr)
-               printk("Audiostream: Layer: %d", 4-ai->layer);
-
-
-       ai->bit_rate = bitrates[(3-ai->layer)][(headr[2] >> 4 )]*1000;
-
-       if (pr){
-               if (ai->bit_rate == 0)
-                       printk("  Bit rate: free");
-               else if (ai->bit_rate == 0xf)
-                       printk("  BRate: reserved");
-               else
-                       printk("  BRate: %d kb/s", ai->bit_rate/1000);
-       }
-
-       fr = (headr[2] & 0x0c ) >> 2;
-       ai->frequency = freq[fr]*100;
-       if (pr){
-               if (ai->frequency == 3)
-                       printk("  Freq: reserved\n");
-               else
-                       printk("  Freq: %d kHz\n",ai->frequency);
-
-       }
-       ai->off = c;
-       return 0;
-}
-#endif
-
-
-int dvb_filter_get_ac3info(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
-{
-       u8 *headr;
-       int found = 0;
-       int c = 0;
-       u8 frame = 0;
-       int fr = 0;
-
-       while ( !found  && c < count){
-               u8 *b = mbuf+c;
-
-               if ( b[0] == 0x0b &&  b[1] == 0x77 )
-                       found = 1;
-               else {
-                       c++;
-               }
-       }
-
-       if (!found) return -1;
-       if (pr)
-               printk("Audiostream: AC3");
-
-       ai->off = c;
-       if (c+5 >= count) return -1;
-
-       ai->layer = 0;  // 0 for AC3
-       headr = mbuf+c+2;
-
-       frame = (headr[2]&0x3f);
-       ai->bit_rate = ac3_bitrates[frame >> 1]*1000;
-
-       if (pr)
-               printk("  BRate: %d kb/s", (int) ai->bit_rate/1000);
-
-       ai->frequency = (headr[2] & 0xc0 ) >> 6;
-       fr = (headr[2] & 0xc0 ) >> 6;
-       ai->frequency = freq[fr]*100;
-       if (pr) printk ("  Freq: %d Hz\n", (int) ai->frequency);
-
-
-       ai->framesize = ac3_frames[fr][frame >> 1];
-       if ((frame & 1) &&  (fr == 1)) ai->framesize++;
-       ai->framesize = ai->framesize << 1;
-       if (pr) printk ("  Framesize %d\n",(int) ai->framesize);
-
-
-       return 0;
-}
-EXPORT_SYMBOL(dvb_filter_get_ac3info);
-
-
-#if 0
-static u8 *skip_pes_header(u8 **bufp)
-{
-       u8 *inbuf = *bufp;
-       u8 *buf = inbuf;
-       u8 *pts = NULL;
-       int skip = 0;
-
-       static const int mpeg1_skip_table[16] = {
-               1, 0xffff,      5,     10, 0xffff, 0xffff, 0xffff, 0xffff,
-               0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
-       };
-
-
-       if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */
-               if (buf[7] & PTS_ONLY)
-                       pts = buf+9;
-               else pts = NULL;
-               buf = inbuf + 9 + inbuf[8];
-       } else {        /* mpeg1 */
-               for (buf = inbuf + 6; *buf == 0xff; buf++)
-                       if (buf == inbuf + 6 + 16) {
-                               break;
-                       }
-               if ((*buf & 0xc0) == 0x40)
-                       buf += 2;
-               skip = mpeg1_skip_table [*buf >> 4];
-               if (skip == 5 || skip == 10) pts = buf;
-               else pts = NULL;
-
-               buf += mpeg1_skip_table [*buf >> 4];
-       }
-
-       *bufp = buf;
-       return pts;
-}
-#endif
-
-#if 0
-static void initialize_quant_matrix( u32 *matrix )
-{
-       int i;
-
-       matrix[0]  = 0x08101013;
-       matrix[1]  = 0x10131616;
-       matrix[2]  = 0x16161616;
-       matrix[3]  = 0x1a181a1b;
-       matrix[4]  = 0x1b1b1a1a;
-       matrix[5]  = 0x1a1a1b1b;
-       matrix[6]  = 0x1b1d1d1d;
-       matrix[7]  = 0x2222221d;
-       matrix[8]  = 0x1d1d1b1b;
-       matrix[9]  = 0x1d1d2020;
-       matrix[10] = 0x22222526;
-       matrix[11] = 0x25232322;
-       matrix[12] = 0x23262628;
-       matrix[13] = 0x28283030;
-       matrix[14] = 0x2e2e3838;
-       matrix[15] = 0x3a454553;
-
-       for ( i = 16 ; i < 32 ; i++ )
-               matrix[i] = 0x10101010;
-}
-#endif
-
-#if 0
-static void initialize_mpg_picture(struct mpg_picture *pic)
-{
-       int i;
-
-       /* set MPEG1 */
-       pic->mpeg1_flag = 1;
-       pic->profile_and_level = 0x4A ;        /* MP@LL */
-       pic->progressive_sequence = 1;
-       pic->low_delay = 0;
-
-       pic->sequence_display_extension_flag = 0;
-       for ( i = 0 ; i < 4 ; i++ ){
-               pic->frame_centre_horizontal_offset[i] = 0;
-               pic->frame_centre_vertical_offset[i] = 0;
-       }
-       pic->last_frame_centre_horizontal_offset = 0;
-       pic->last_frame_centre_vertical_offset = 0;
-
-       pic->picture_display_extension_flag[0] = 0;
-       pic->picture_display_extension_flag[1] = 0;
-       pic->sequence_header_flag = 0;
-       pic->gop_flag = 0;
-       pic->sequence_end_flag = 0;
-}
-#endif
-
-#if 0
-static void mpg_set_picture_parameter( int32_t field_type, struct mpg_picture *pic )
-{
-       int16_t last_h_offset;
-       int16_t last_v_offset;
-
-       int16_t *p_h_offset;
-       int16_t *p_v_offset;
-
-       if ( pic->mpeg1_flag ){
-               pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
-               pic->top_field_first = 0;
-               pic->repeat_first_field = 0;
-               pic->progressive_frame = 1;
-               pic->picture_coding_parameter = 0x000010;
-       }
-
-       /* Reset flag */
-       pic->picture_display_extension_flag[field_type] = 0;
-
-       last_h_offset = pic->last_frame_centre_horizontal_offset;
-       last_v_offset = pic->last_frame_centre_vertical_offset;
-       if ( field_type == FIRST_FIELD ){
-               p_h_offset = pic->frame_centre_horizontal_offset;
-               p_v_offset = pic->frame_centre_vertical_offset;
-               *p_h_offset = last_h_offset;
-               *(p_h_offset + 1) = last_h_offset;
-               *(p_h_offset + 2) = last_h_offset;
-               *p_v_offset = last_v_offset;
-               *(p_v_offset + 1) = last_v_offset;
-               *(p_v_offset + 2) = last_v_offset;
-       } else {
-               pic->frame_centre_horizontal_offset[3] = last_h_offset;
-               pic->frame_centre_vertical_offset[3] = last_v_offset;
-       }
-}
-#endif
-
-#if 0
-static void init_mpg_picture( struct mpg_picture *pic, int chan, int32_t field_type)
-{
-       pic->picture_header = 0;
-       pic->sequence_header_data
-               = ( INIT_HORIZONTAL_SIZE << 20 )
-                       | ( INIT_VERTICAL_SIZE << 8 )
-                       | ( INIT_ASPECT_RATIO << 4 )
-                       | ( INIT_FRAME_RATE );
-       pic->mpeg1_flag = 0;
-       pic->vinfo.horizontal_size
-               = INIT_DISP_HORIZONTAL_SIZE;
-       pic->vinfo.vertical_size
-               = INIT_DISP_VERTICAL_SIZE;
-       pic->picture_display_extension_flag[field_type]
-               = 0;
-       pic->pts_flag[field_type] = 0;
-
-       pic->sequence_gop_header = 0;
-       pic->picture_header = 0;
-       pic->sequence_header_flag = 0;
-       pic->gop_flag = 0;
-       pic->sequence_end_flag = 0;
-       pic->sequence_display_extension_flag = 0;
-       pic->last_frame_centre_horizontal_offset = 0;
-       pic->last_frame_centre_vertical_offset = 0;
-       pic->channel = chan;
-}
-#endif
-
-void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid,
-                           dvb_filter_pes2ts_cb_t *cb, void *priv)
-{
-       unsigned char *buf=p2ts->buf;
-
-       buf[0]=0x47;
-       buf[1]=(pid>>8);
-       buf[2]=pid&0xff;
-       p2ts->cc=0;
-       p2ts->cb=cb;
-       p2ts->priv=priv;
-}
-EXPORT_SYMBOL(dvb_filter_pes2ts_init);
-
-int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
-                     int len, int payload_start)
-{
-       unsigned char *buf=p2ts->buf;
-       int ret=0, rest;
-
-       //len=6+((pes[4]<<8)|pes[5]);
-
-       if (payload_start)
-               buf[1]|=0x40;
-       else
-               buf[1]&=~0x40;
-       while (len>=184) {
-               buf[3]=0x10|((p2ts->cc++)&0x0f);
-               memcpy(buf+4, pes, 184);
-               if ((ret=p2ts->cb(p2ts->priv, buf)))
-                       return ret;
-               len-=184; pes+=184;
-               buf[1]&=~0x40;
-       }
-       if (!len)
-               return 0;
-       buf[3]=0x30|((p2ts->cc++)&0x0f);
-       rest=183-len;
-       if (rest) {
-               buf[5]=0x00;
-               if (rest-1)
-                       memset(buf+6, 0xff, rest-1);
-       }
-       buf[4]=rest;
-       memcpy(buf+5+rest, pes, len);
-       return p2ts->cb(p2ts->priv, buf);
-}
-EXPORT_SYMBOL(dvb_filter_pes2ts);
diff --git a/drivers/media/dvb-core/dvb_filter.h b/drivers/media/dvb-core/dvb_filter.h
deleted file mode 100644 (file)
index 375e3be..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-/*
- * dvb_filter.h
- *
- * Copyright (C) 2003 Convergence GmbH
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
- */
-
-#ifndef _DVB_FILTER_H_
-#define _DVB_FILTER_H_
-
-#include <linux/slab.h>
-
-#include "demux.h"
-
-typedef int (dvb_filter_pes2ts_cb_t) (void *, unsigned char *);
-
-struct dvb_filter_pes2ts {
-       unsigned char buf[188];
-       unsigned char cc;
-       dvb_filter_pes2ts_cb_t *cb;
-       void *priv;
-};
-
-void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid,
-                           dvb_filter_pes2ts_cb_t *cb, void *priv);
-
-int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
-                     int len, int payload_start);
-
-
-#define PROG_STREAM_MAP  0xBC
-#define PRIVATE_STREAM1  0xBD
-#define PADDING_STREAM   0xBE
-#define PRIVATE_STREAM2  0xBF
-#define AUDIO_STREAM_S   0xC0
-#define AUDIO_STREAM_E   0xDF
-#define VIDEO_STREAM_S   0xE0
-#define VIDEO_STREAM_E   0xEF
-#define ECM_STREAM       0xF0
-#define EMM_STREAM       0xF1
-#define DSM_CC_STREAM    0xF2
-#define ISO13522_STREAM  0xF3
-#define PROG_STREAM_DIR  0xFF
-
-#define DVB_PICTURE_START    0x00
-#define DVB_USER_START       0xb2
-#define DVB_SEQUENCE_HEADER  0xb3
-#define DVB_SEQUENCE_ERROR   0xb4
-#define DVB_EXTENSION_START  0xb5
-#define DVB_SEQUENCE_END     0xb7
-#define DVB_GOP_START        0xb8
-#define DVB_EXCEPT_SLICE     0xb0
-
-#define SEQUENCE_EXTENSION           0x01
-#define SEQUENCE_DISPLAY_EXTENSION   0x02
-#define PICTURE_CODING_EXTENSION     0x08
-#define QUANT_MATRIX_EXTENSION       0x03
-#define PICTURE_DISPLAY_EXTENSION    0x07
-
-#define I_FRAME 0x01
-#define B_FRAME 0x02
-#define P_FRAME 0x03
-
-/* Initialize sequence_data */
-#define INIT_HORIZONTAL_SIZE        720
-#define INIT_VERTICAL_SIZE          576
-#define INIT_ASPECT_RATIO          0x02
-#define INIT_FRAME_RATE            0x03
-#define INIT_DISP_HORIZONTAL_SIZE   540
-#define INIT_DISP_VERTICAL_SIZE     576
-
-
-//flags2
-#define PTS_DTS_FLAGS    0xC0
-#define ESCR_FLAG        0x20
-#define ES_RATE_FLAG     0x10
-#define DSM_TRICK_FLAG   0x08
-#define ADD_CPY_FLAG     0x04
-#define PES_CRC_FLAG     0x02
-#define PES_EXT_FLAG     0x01
-
-//pts_dts flags
-#define PTS_ONLY         0x80
-#define PTS_DTS          0xC0
-
-#define TS_SIZE        188
-#define TRANS_ERROR    0x80
-#define PAY_START      0x40
-#define TRANS_PRIO     0x20
-#define PID_MASK_HI    0x1F
-//flags
-#define TRANS_SCRMBL1  0x80
-#define TRANS_SCRMBL2  0x40
-#define ADAPT_FIELD    0x20
-#define PAYLOAD        0x10
-#define COUNT_MASK     0x0F
-
-// adaptation flags
-#define DISCON_IND     0x80
-#define RAND_ACC_IND   0x40
-#define ES_PRI_IND     0x20
-#define PCR_FLAG       0x10
-#define OPCR_FLAG      0x08
-#define SPLICE_FLAG    0x04
-#define TRANS_PRIV     0x02
-#define ADAP_EXT_FLAG  0x01
-
-// adaptation extension flags
-#define LTW_FLAG       0x80
-#define PIECE_RATE     0x40
-#define SEAM_SPLICE    0x20
-
-
-#define MAX_PLENGTH 0xFFFF
-#define MMAX_PLENGTH (256*MAX_PLENGTH)
-
-#ifndef IPACKS
-#define IPACKS 2048
-#endif
-
-struct ipack {
-       int size;
-       int found;
-       u8 *buf;
-       u8 cid;
-       u32 plength;
-       u8 plen[2];
-       u8 flag1;
-       u8 flag2;
-       u8 hlength;
-       u8 pts[5];
-       u16 *pid;
-       int mpeg;
-       u8 check;
-       int which;
-       int done;
-       void *data;
-       void (*func)(u8 *buf,  int size, void *priv);
-       int count;
-       int repack_subids;
-};
-
-struct dvb_video_info {
-       u32 horizontal_size;
-       u32 vertical_size;
-       u32 aspect_ratio;
-       u32 framerate;
-       u32 video_format;
-       u32 bit_rate;
-       u32 comp_bit_rate;
-       u32 vbv_buffer_size;
-       s16 vbv_delay;
-       u32 CSPF;
-       u32 off;
-};
-
-#define OFF_SIZE 4
-#define FIRST_FIELD 0
-#define SECOND_FIELD 1
-#define VIDEO_FRAME_PICTURE 0x03
-
-struct mpg_picture {
-       int       channel;
-       struct dvb_video_info vinfo;
-       u32      *sequence_gop_header;
-       u32      *picture_header;
-       s32       time_code;
-       int       low_delay;
-       int       closed_gop;
-       int       broken_link;
-       int       sequence_header_flag;
-       int       gop_flag;
-       int       sequence_end_flag;
-
-       u8        profile_and_level;
-       s32       picture_coding_parameter;
-       u32       matrix[32];
-       s8        matrix_change_flag;
-
-       u8        picture_header_parameter;
-  /* bit 0 - 2: bwd f code
-     bit 3    : fpb vector
-     bit 4 - 6: fwd f code
-     bit 7    : fpf vector */
-
-       int       mpeg1_flag;
-       int       progressive_sequence;
-       int       sequence_display_extension_flag;
-       u32       sequence_header_data;
-       s16       last_frame_centre_horizontal_offset;
-       s16       last_frame_centre_vertical_offset;
-
-       u32       pts[2]; /* [0] 1st field, [1] 2nd field */
-       int       top_field_first;
-       int       repeat_first_field;
-       int       progressive_frame;
-       int       bank;
-       int       forward_bank;
-       int       backward_bank;
-       int       compress;
-       s16       frame_centre_horizontal_offset[OFF_SIZE];
-                 /* [0-2] 1st field, [3] 2nd field */
-       s16       frame_centre_vertical_offset[OFF_SIZE];
-                 /* [0-2] 1st field, [3] 2nd field */
-       s16       temporal_reference[2];
-                 /* [0] 1st field, [1] 2nd field */
-
-       s8        picture_coding_type[2];
-                 /* [0] 1st field, [1] 2nd field */
-       s8        picture_structure[2];
-                 /* [0] 1st field, [1] 2nd field */
-       s8        picture_display_extension_flag[2];
-                 /* [0] 1st field, [1] 2nd field */
-                 /* picture_display_extenion() 0:no 1:exit*/
-       s8        pts_flag[2];
-                 /* [0] 1st field, [1] 2nd field */
-};
-
-struct dvb_audio_info {
-       int layer;
-       u32 bit_rate;
-       u32 frequency;
-       u32 mode;
-       u32 mode_extension ;
-       u32 emphasis;
-       u32 framesize;
-       u32 off;
-};
-
-int dvb_filter_get_ac3info(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr);
-
-
-#endif
index 49f71b1eaf14b529689f82e658d44a09b285ddbf..3cf617737f7c525d1c5b6709e7726e2689531a02 100644 (file)
@@ -3,7 +3,7 @@
 # and the AV7110 DVB device driver
 #
 
-dvb-ttpci-objs := av7110_hw.o av7110_v4l.o av7110_av.o av7110_ca.o av7110.o av7110_ipack.o
+dvb-ttpci-objs := av7110_hw.o av7110_v4l.o av7110_av.o av7110_ca.o av7110.o av7110_ipack.o dvb_filter.o
 
 ifdef CONFIG_DVB_AV7110_IR
 dvb-ttpci-objs += av7110_ir.o
diff --git a/drivers/media/pci/ttpci/dvb_filter.c b/drivers/media/pci/ttpci/dvb_filter.c
new file mode 100644 (file)
index 0000000..6395812
--- /dev/null
@@ -0,0 +1,600 @@
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/string.h>
+#include "dvb_filter.h"
+
+#if 0
+static unsigned int bitrates[3][16] =
+{{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,0},
+ {0,32,48,56,64,80,96,112,128,160,192,224,256,320,384,0},
+ {0,32,40,48,56,64,80,96,112,128,160,192,224,256,320,0}};
+#endif
+
+static u32 freq[4] = {480, 441, 320, 0};
+
+static unsigned int ac3_bitrates[32] =
+    {32,40,48,56,64,80,96,112,128,160,192,224,256,320,384,448,512,576,640,
+     0,0,0,0,0,0,0,0,0,0,0,0,0};
+
+static u32 ac3_frames[3][32] =
+    {{64,80,96,112,128,160,192,224,256,320,384,448,512,640,768,896,1024,
+      1152,1280,0,0,0,0,0,0,0,0,0,0,0,0,0},
+     {69,87,104,121,139,174,208,243,278,348,417,487,557,696,835,975,1114,
+      1253,1393,0,0,0,0,0,0,0,0,0,0,0,0,0},
+     {96,120,144,168,192,240,288,336,384,480,576,672,768,960,1152,1344,
+      1536,1728,1920,0,0,0,0,0,0,0,0,0,0,0,0,0}};
+
+
+
+#if 0
+static void setup_ts2pes(ipack *pa, ipack *pv, u16 *pida, u16 *pidv,
+                 void (*pes_write)(u8 *buf, int count, void *data),
+                 void *priv)
+{
+       dvb_filter_ipack_init(pa, IPACKS, pes_write);
+       dvb_filter_ipack_init(pv, IPACKS, pes_write);
+       pa->pid = pida;
+       pv->pid = pidv;
+       pa->data = priv;
+       pv->data = priv;
+}
+#endif
+
+#if 0
+static void ts_to_pes(ipack *p, u8 *buf) // don't need count (=188)
+{
+       u8 off = 0;
+
+       if (!buf || !p ){
+               printk("NULL POINTER IDIOT\n");
+               return;
+       }
+       if (buf[1]&PAY_START) {
+               if (p->plength == MMAX_PLENGTH-6 && p->found>6){
+                       p->plength = p->found-6;
+                       p->found = 0;
+                       send_ipack(p);
+                       dvb_filter_ipack_reset(p);
+               }
+       }
+       if (buf[3] & ADAPT_FIELD) {  // adaptation field?
+               off = buf[4] + 1;
+               if (off+4 > 187) return;
+       }
+       dvb_filter_instant_repack(buf+4+off, TS_SIZE-4-off, p);
+}
+#endif
+
+#if 0
+/* needs 5 byte input, returns picture coding type*/
+static int read_picture_header(u8 *headr, struct mpg_picture *pic, int field, int pr)
+{
+       u8 pct;
+
+       if (pr) printk( "Pic header: ");
+       pic->temporal_reference[field] = (( headr[0] << 2 ) |
+                                         (headr[1] & 0x03) )& 0x03ff;
+       if (pr) printk( " temp ref: 0x%04x", pic->temporal_reference[field]);
+
+       pct = ( headr[1] >> 2 ) & 0x07;
+       pic->picture_coding_type[field] = pct;
+       if (pr) {
+               switch(pct){
+                       case I_FRAME:
+                               printk( "  I-FRAME");
+                               break;
+                       case B_FRAME:
+                               printk( "  B-FRAME");
+                               break;
+                       case P_FRAME:
+                               printk( "  P-FRAME");
+                               break;
+               }
+       }
+
+
+       pic->vinfo.vbv_delay  = (( headr[1] >> 5 ) | ( headr[2] << 3) |
+                                ( (headr[3] & 0x1F) << 11) ) & 0xffff;
+
+       if (pr) printk( " vbv delay: 0x%04x", pic->vinfo.vbv_delay);
+
+       pic->picture_header_parameter = ( headr[3] & 0xe0 ) |
+               ((headr[4] & 0x80) >> 3);
+
+       if ( pct == B_FRAME ){
+               pic->picture_header_parameter |= ( headr[4] >> 3 ) & 0x0f;
+       }
+       if (pr) printk( " pic head param: 0x%x",
+                       pic->picture_header_parameter);
+
+       return pct;
+}
+#endif
+
+#if 0
+/* needs 4 byte input */
+static int read_gop_header(u8 *headr, struct mpg_picture *pic, int pr)
+{
+       if (pr) printk("GOP header: ");
+
+       pic->time_code  = (( headr[0] << 17 ) | ( headr[1] << 9) |
+                          ( headr[2] << 1 ) | (headr[3] &0x01)) & 0x1ffffff;
+
+       if (pr) printk(" time: %d:%d.%d ", (headr[0]>>2)& 0x1F,
+                      ((headr[0]<<4)& 0x30)| ((headr[1]>>4)& 0x0F),
+                      ((headr[1]<<3)& 0x38)| ((headr[2]>>5)& 0x0F));
+
+       if ( ( headr[3] & 0x40 ) != 0 ){
+               pic->closed_gop = 1;
+       } else {
+               pic->closed_gop = 0;
+       }
+       if (pr) printk("closed: %d", pic->closed_gop);
+
+       if ( ( headr[3] & 0x20 ) != 0 ){
+               pic->broken_link = 1;
+       } else {
+               pic->broken_link = 0;
+       }
+       if (pr) printk(" broken: %d\n", pic->broken_link);
+
+       return 0;
+}
+#endif
+
+#if 0
+/* needs 8 byte input */
+static int read_sequence_header(u8 *headr, struct dvb_video_info *vi, int pr)
+{
+       int sw;
+       int form = -1;
+
+       if (pr) printk("Reading sequence header\n");
+
+       vi->horizontal_size     = ((headr[1] &0xF0) >> 4) | (headr[0] << 4);
+       vi->vertical_size       = ((headr[1] &0x0F) << 8) | (headr[2]);
+
+       sw = (int)((headr[3]&0xF0) >> 4) ;
+
+       switch( sw ){
+       case 1:
+               if (pr)
+                       printk("Videostream: ASPECT: 1:1");
+               vi->aspect_ratio = 100;
+               break;
+       case 2:
+               if (pr)
+                       printk("Videostream: ASPECT: 4:3");
+               vi->aspect_ratio = 133;
+               break;
+       case 3:
+               if (pr)
+                       printk("Videostream: ASPECT: 16:9");
+               vi->aspect_ratio = 177;
+               break;
+       case 4:
+               if (pr)
+                       printk("Videostream: ASPECT: 2.21:1");
+               vi->aspect_ratio = 221;
+               break;
+
+       case 5 ... 15:
+               if (pr)
+                       printk("Videostream: ASPECT: reserved");
+               vi->aspect_ratio = 0;
+               break;
+
+       default:
+               vi->aspect_ratio = 0;
+               return -1;
+       }
+
+       if (pr)
+               printk("  Size = %dx%d",vi->horizontal_size,vi->vertical_size);
+
+       sw = (int)(headr[3]&0x0F);
+
+       switch ( sw ) {
+       case 1:
+               if (pr)
+                       printk("  FRate: 23.976 fps");
+               vi->framerate = 23976;
+               form = -1;
+               break;
+       case 2:
+               if (pr)
+                       printk("  FRate: 24 fps");
+               vi->framerate = 24000;
+               form = -1;
+               break;
+       case 3:
+               if (pr)
+                       printk("  FRate: 25 fps");
+               vi->framerate = 25000;
+               form = VIDEO_MODE_PAL;
+               break;
+       case 4:
+               if (pr)
+                       printk("  FRate: 29.97 fps");
+               vi->framerate = 29970;
+               form = VIDEO_MODE_NTSC;
+               break;
+       case 5:
+               if (pr)
+                       printk("  FRate: 30 fps");
+               vi->framerate = 30000;
+               form = VIDEO_MODE_NTSC;
+               break;
+       case 6:
+               if (pr)
+                       printk("  FRate: 50 fps");
+               vi->framerate = 50000;
+               form = VIDEO_MODE_PAL;
+               break;
+       case 7:
+               if (pr)
+                       printk("  FRate: 60 fps");
+               vi->framerate = 60000;
+               form = VIDEO_MODE_NTSC;
+               break;
+       }
+
+       vi->bit_rate = (headr[4] << 10) | (headr[5] << 2) | (headr[6] & 0x03);
+
+       vi->vbv_buffer_size
+               = (( headr[6] & 0xF8) >> 3 ) | (( headr[7] & 0x1F )<< 5);
+
+       if (pr){
+               printk("  BRate: %d Mbit/s",4*(vi->bit_rate)/10000);
+               printk("  vbvbuffer %d",16*1024*(vi->vbv_buffer_size));
+               printk("\n");
+       }
+
+       vi->video_format = form;
+
+       return 0;
+}
+#endif
+
+
+#if 0
+static int get_vinfo(u8 *mbuf, int count, struct dvb_video_info *vi, int pr)
+{
+       u8 *headr;
+       int found = 0;
+       int c = 0;
+
+       while (found < 4 && c+4 < count){
+               u8 *b;
+
+               b = mbuf+c;
+               if ( b[0] == 0x00 && b[1] == 0x00 && b[2] == 0x01
+                    && b[3] == 0xb3) found = 4;
+               else {
+                       c++;
+               }
+       }
+
+       if (! found) return -1;
+       c += 4;
+       if (c+12 >= count) return -1;
+       headr = mbuf+c;
+       if (read_sequence_header(headr, vi, pr) < 0) return -1;
+       vi->off = c-4;
+       return 0;
+}
+#endif
+
+
+#if 0
+static int get_ainfo(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
+{
+       u8 *headr;
+       int found = 0;
+       int c = 0;
+       int fr = 0;
+
+       while (found < 2 && c < count){
+               u8 b[2];
+               memcpy( b, mbuf+c, 2);
+
+               if ( b[0] == 0xff && (b[1] & 0xf8) == 0xf8)
+                       found = 2;
+               else {
+                       c++;
+               }
+       }
+
+       if (!found) return -1;
+
+       if (c+3 >= count) return -1;
+       headr = mbuf+c;
+
+       ai->layer = (headr[1] & 0x06) >> 1;
+
+       if (pr)
+               printk("Audiostream: Layer: %d", 4-ai->layer);
+
+
+       ai->bit_rate = bitrates[(3-ai->layer)][(headr[2] >> 4 )]*1000;
+
+       if (pr){
+               if (ai->bit_rate == 0)
+                       printk("  Bit rate: free");
+               else if (ai->bit_rate == 0xf)
+                       printk("  BRate: reserved");
+               else
+                       printk("  BRate: %d kb/s", ai->bit_rate/1000);
+       }
+
+       fr = (headr[2] & 0x0c ) >> 2;
+       ai->frequency = freq[fr]*100;
+       if (pr){
+               if (ai->frequency == 3)
+                       printk("  Freq: reserved\n");
+               else
+                       printk("  Freq: %d kHz\n",ai->frequency);
+
+       }
+       ai->off = c;
+       return 0;
+}
+#endif
+
+
+int dvb_filter_get_ac3info(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr)
+{
+       u8 *headr;
+       int found = 0;
+       int c = 0;
+       u8 frame = 0;
+       int fr = 0;
+
+       while ( !found  && c < count){
+               u8 *b = mbuf+c;
+
+               if ( b[0] == 0x0b &&  b[1] == 0x77 )
+                       found = 1;
+               else {
+                       c++;
+               }
+       }
+
+       if (!found) return -1;
+       if (pr)
+               printk("Audiostream: AC3");
+
+       ai->off = c;
+       if (c+5 >= count) return -1;
+
+       ai->layer = 0;  // 0 for AC3
+       headr = mbuf+c+2;
+
+       frame = (headr[2]&0x3f);
+       ai->bit_rate = ac3_bitrates[frame >> 1]*1000;
+
+       if (pr)
+               printk("  BRate: %d kb/s", (int) ai->bit_rate/1000);
+
+       ai->frequency = (headr[2] & 0xc0 ) >> 6;
+       fr = (headr[2] & 0xc0 ) >> 6;
+       ai->frequency = freq[fr]*100;
+       if (pr) printk ("  Freq: %d Hz\n", (int) ai->frequency);
+
+
+       ai->framesize = ac3_frames[fr][frame >> 1];
+       if ((frame & 1) &&  (fr == 1)) ai->framesize++;
+       ai->framesize = ai->framesize << 1;
+       if (pr) printk ("  Framesize %d\n",(int) ai->framesize);
+
+
+       return 0;
+}
+
+
+#if 0
+static u8 *skip_pes_header(u8 **bufp)
+{
+       u8 *inbuf = *bufp;
+       u8 *buf = inbuf;
+       u8 *pts = NULL;
+       int skip = 0;
+
+       static const int mpeg1_skip_table[16] = {
+               1, 0xffff,      5,     10, 0xffff, 0xffff, 0xffff, 0xffff,
+               0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+       };
+
+
+       if ((inbuf[6] & 0xc0) == 0x80){ /* mpeg2 */
+               if (buf[7] & PTS_ONLY)
+                       pts = buf+9;
+               else pts = NULL;
+               buf = inbuf + 9 + inbuf[8];
+       } else {        /* mpeg1 */
+               for (buf = inbuf + 6; *buf == 0xff; buf++)
+                       if (buf == inbuf + 6 + 16) {
+                               break;
+                       }
+               if ((*buf & 0xc0) == 0x40)
+                       buf += 2;
+               skip = mpeg1_skip_table [*buf >> 4];
+               if (skip == 5 || skip == 10) pts = buf;
+               else pts = NULL;
+
+               buf += mpeg1_skip_table [*buf >> 4];
+       }
+
+       *bufp = buf;
+       return pts;
+}
+#endif
+
+#if 0
+static void initialize_quant_matrix( u32 *matrix )
+{
+       int i;
+
+       matrix[0]  = 0x08101013;
+       matrix[1]  = 0x10131616;
+       matrix[2]  = 0x16161616;
+       matrix[3]  = 0x1a181a1b;
+       matrix[4]  = 0x1b1b1a1a;
+       matrix[5]  = 0x1a1a1b1b;
+       matrix[6]  = 0x1b1d1d1d;
+       matrix[7]  = 0x2222221d;
+       matrix[8]  = 0x1d1d1b1b;
+       matrix[9]  = 0x1d1d2020;
+       matrix[10] = 0x22222526;
+       matrix[11] = 0x25232322;
+       matrix[12] = 0x23262628;
+       matrix[13] = 0x28283030;
+       matrix[14] = 0x2e2e3838;
+       matrix[15] = 0x3a454553;
+
+       for ( i = 16 ; i < 32 ; i++ )
+               matrix[i] = 0x10101010;
+}
+#endif
+
+#if 0
+static void initialize_mpg_picture(struct mpg_picture *pic)
+{
+       int i;
+
+       /* set MPEG1 */
+       pic->mpeg1_flag = 1;
+       pic->profile_and_level = 0x4A ;        /* MP@LL */
+       pic->progressive_sequence = 1;
+       pic->low_delay = 0;
+
+       pic->sequence_display_extension_flag = 0;
+       for ( i = 0 ; i < 4 ; i++ ){
+               pic->frame_centre_horizontal_offset[i] = 0;
+               pic->frame_centre_vertical_offset[i] = 0;
+       }
+       pic->last_frame_centre_horizontal_offset = 0;
+       pic->last_frame_centre_vertical_offset = 0;
+
+       pic->picture_display_extension_flag[0] = 0;
+       pic->picture_display_extension_flag[1] = 0;
+       pic->sequence_header_flag = 0;
+       pic->gop_flag = 0;
+       pic->sequence_end_flag = 0;
+}
+#endif
+
+#if 0
+static void mpg_set_picture_parameter( int32_t field_type, struct mpg_picture *pic )
+{
+       int16_t last_h_offset;
+       int16_t last_v_offset;
+
+       int16_t *p_h_offset;
+       int16_t *p_v_offset;
+
+       if ( pic->mpeg1_flag ){
+               pic->picture_structure[field_type] = VIDEO_FRAME_PICTURE;
+               pic->top_field_first = 0;
+               pic->repeat_first_field = 0;
+               pic->progressive_frame = 1;
+               pic->picture_coding_parameter = 0x000010;
+       }
+
+       /* Reset flag */
+       pic->picture_display_extension_flag[field_type] = 0;
+
+       last_h_offset = pic->last_frame_centre_horizontal_offset;
+       last_v_offset = pic->last_frame_centre_vertical_offset;
+       if ( field_type == FIRST_FIELD ){
+               p_h_offset = pic->frame_centre_horizontal_offset;
+               p_v_offset = pic->frame_centre_vertical_offset;
+               *p_h_offset = last_h_offset;
+               *(p_h_offset + 1) = last_h_offset;
+               *(p_h_offset + 2) = last_h_offset;
+               *p_v_offset = last_v_offset;
+               *(p_v_offset + 1) = last_v_offset;
+               *(p_v_offset + 2) = last_v_offset;
+       } else {
+               pic->frame_centre_horizontal_offset[3] = last_h_offset;
+               pic->frame_centre_vertical_offset[3] = last_v_offset;
+       }
+}
+#endif
+
+#if 0
+static void init_mpg_picture( struct mpg_picture *pic, int chan, int32_t field_type)
+{
+       pic->picture_header = 0;
+       pic->sequence_header_data
+               = ( INIT_HORIZONTAL_SIZE << 20 )
+                       | ( INIT_VERTICAL_SIZE << 8 )
+                       | ( INIT_ASPECT_RATIO << 4 )
+                       | ( INIT_FRAME_RATE );
+       pic->mpeg1_flag = 0;
+       pic->vinfo.horizontal_size
+               = INIT_DISP_HORIZONTAL_SIZE;
+       pic->vinfo.vertical_size
+               = INIT_DISP_VERTICAL_SIZE;
+       pic->picture_display_extension_flag[field_type]
+               = 0;
+       pic->pts_flag[field_type] = 0;
+
+       pic->sequence_gop_header = 0;
+       pic->picture_header = 0;
+       pic->sequence_header_flag = 0;
+       pic->gop_flag = 0;
+       pic->sequence_end_flag = 0;
+       pic->sequence_display_extension_flag = 0;
+       pic->last_frame_centre_horizontal_offset = 0;
+       pic->last_frame_centre_vertical_offset = 0;
+       pic->channel = chan;
+}
+#endif
+
+void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid,
+                           dvb_filter_pes2ts_cb_t *cb, void *priv)
+{
+       unsigned char *buf=p2ts->buf;
+
+       buf[0]=0x47;
+       buf[1]=(pid>>8);
+       buf[2]=pid&0xff;
+       p2ts->cc=0;
+       p2ts->cb=cb;
+       p2ts->priv=priv;
+}
+
+int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
+                     int len, int payload_start)
+{
+       unsigned char *buf=p2ts->buf;
+       int ret=0, rest;
+
+       //len=6+((pes[4]<<8)|pes[5]);
+
+       if (payload_start)
+               buf[1]|=0x40;
+       else
+               buf[1]&=~0x40;
+       while (len>=184) {
+               buf[3]=0x10|((p2ts->cc++)&0x0f);
+               memcpy(buf+4, pes, 184);
+               if ((ret=p2ts->cb(p2ts->priv, buf)))
+                       return ret;
+               len-=184; pes+=184;
+               buf[1]&=~0x40;
+       }
+       if (!len)
+               return 0;
+       buf[3]=0x30|((p2ts->cc++)&0x0f);
+       rest=183-len;
+       if (rest) {
+               buf[5]=0x00;
+               if (rest-1)
+                       memset(buf+6, 0xff, rest-1);
+       }
+       buf[4]=rest;
+       memcpy(buf+5+rest, pes, len);
+       return p2ts->cb(p2ts->priv, buf);
+}
diff --git a/drivers/media/pci/ttpci/dvb_filter.h b/drivers/media/pci/ttpci/dvb_filter.h
new file mode 100644 (file)
index 0000000..375e3be
--- /dev/null
@@ -0,0 +1,246 @@
+/*
+ * dvb_filter.h
+ *
+ * Copyright (C) 2003 Convergence GmbH
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ */
+
+#ifndef _DVB_FILTER_H_
+#define _DVB_FILTER_H_
+
+#include <linux/slab.h>
+
+#include "demux.h"
+
+typedef int (dvb_filter_pes2ts_cb_t) (void *, unsigned char *);
+
+struct dvb_filter_pes2ts {
+       unsigned char buf[188];
+       unsigned char cc;
+       dvb_filter_pes2ts_cb_t *cb;
+       void *priv;
+};
+
+void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid,
+                           dvb_filter_pes2ts_cb_t *cb, void *priv);
+
+int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
+                     int len, int payload_start);
+
+
+#define PROG_STREAM_MAP  0xBC
+#define PRIVATE_STREAM1  0xBD
+#define PADDING_STREAM   0xBE
+#define PRIVATE_STREAM2  0xBF
+#define AUDIO_STREAM_S   0xC0
+#define AUDIO_STREAM_E   0xDF
+#define VIDEO_STREAM_S   0xE0
+#define VIDEO_STREAM_E   0xEF
+#define ECM_STREAM       0xF0
+#define EMM_STREAM       0xF1
+#define DSM_CC_STREAM    0xF2
+#define ISO13522_STREAM  0xF3
+#define PROG_STREAM_DIR  0xFF
+
+#define DVB_PICTURE_START    0x00
+#define DVB_USER_START       0xb2
+#define DVB_SEQUENCE_HEADER  0xb3
+#define DVB_SEQUENCE_ERROR   0xb4
+#define DVB_EXTENSION_START  0xb5
+#define DVB_SEQUENCE_END     0xb7
+#define DVB_GOP_START        0xb8
+#define DVB_EXCEPT_SLICE     0xb0
+
+#define SEQUENCE_EXTENSION           0x01
+#define SEQUENCE_DISPLAY_EXTENSION   0x02
+#define PICTURE_CODING_EXTENSION     0x08
+#define QUANT_MATRIX_EXTENSION       0x03
+#define PICTURE_DISPLAY_EXTENSION    0x07
+
+#define I_FRAME 0x01
+#define B_FRAME 0x02
+#define P_FRAME 0x03
+
+/* Initialize sequence_data */
+#define INIT_HORIZONTAL_SIZE        720
+#define INIT_VERTICAL_SIZE          576
+#define INIT_ASPECT_RATIO          0x02
+#define INIT_FRAME_RATE            0x03
+#define INIT_DISP_HORIZONTAL_SIZE   540
+#define INIT_DISP_VERTICAL_SIZE     576
+
+
+//flags2
+#define PTS_DTS_FLAGS    0xC0
+#define ESCR_FLAG        0x20
+#define ES_RATE_FLAG     0x10
+#define DSM_TRICK_FLAG   0x08
+#define ADD_CPY_FLAG     0x04
+#define PES_CRC_FLAG     0x02
+#define PES_EXT_FLAG     0x01
+
+//pts_dts flags
+#define PTS_ONLY         0x80
+#define PTS_DTS          0xC0
+
+#define TS_SIZE        188
+#define TRANS_ERROR    0x80
+#define PAY_START      0x40
+#define TRANS_PRIO     0x20
+#define PID_MASK_HI    0x1F
+//flags
+#define TRANS_SCRMBL1  0x80
+#define TRANS_SCRMBL2  0x40
+#define ADAPT_FIELD    0x20
+#define PAYLOAD        0x10
+#define COUNT_MASK     0x0F
+
+// adaptation flags
+#define DISCON_IND     0x80
+#define RAND_ACC_IND   0x40
+#define ES_PRI_IND     0x20
+#define PCR_FLAG       0x10
+#define OPCR_FLAG      0x08
+#define SPLICE_FLAG    0x04
+#define TRANS_PRIV     0x02
+#define ADAP_EXT_FLAG  0x01
+
+// adaptation extension flags
+#define LTW_FLAG       0x80
+#define PIECE_RATE     0x40
+#define SEAM_SPLICE    0x20
+
+
+#define MAX_PLENGTH 0xFFFF
+#define MMAX_PLENGTH (256*MAX_PLENGTH)
+
+#ifndef IPACKS
+#define IPACKS 2048
+#endif
+
+struct ipack {
+       int size;
+       int found;
+       u8 *buf;
+       u8 cid;
+       u32 plength;
+       u8 plen[2];
+       u8 flag1;
+       u8 flag2;
+       u8 hlength;
+       u8 pts[5];
+       u16 *pid;
+       int mpeg;
+       u8 check;
+       int which;
+       int done;
+       void *data;
+       void (*func)(u8 *buf,  int size, void *priv);
+       int count;
+       int repack_subids;
+};
+
+struct dvb_video_info {
+       u32 horizontal_size;
+       u32 vertical_size;
+       u32 aspect_ratio;
+       u32 framerate;
+       u32 video_format;
+       u32 bit_rate;
+       u32 comp_bit_rate;
+       u32 vbv_buffer_size;
+       s16 vbv_delay;
+       u32 CSPF;
+       u32 off;
+};
+
+#define OFF_SIZE 4
+#define FIRST_FIELD 0
+#define SECOND_FIELD 1
+#define VIDEO_FRAME_PICTURE 0x03
+
+struct mpg_picture {
+       int       channel;
+       struct dvb_video_info vinfo;
+       u32      *sequence_gop_header;
+       u32      *picture_header;
+       s32       time_code;
+       int       low_delay;
+       int       closed_gop;
+       int       broken_link;
+       int       sequence_header_flag;
+       int       gop_flag;
+       int       sequence_end_flag;
+
+       u8        profile_and_level;
+       s32       picture_coding_parameter;
+       u32       matrix[32];
+       s8        matrix_change_flag;
+
+       u8        picture_header_parameter;
+  /* bit 0 - 2: bwd f code
+     bit 3    : fpb vector
+     bit 4 - 6: fwd f code
+     bit 7    : fpf vector */
+
+       int       mpeg1_flag;
+       int       progressive_sequence;
+       int       sequence_display_extension_flag;
+       u32       sequence_header_data;
+       s16       last_frame_centre_horizontal_offset;
+       s16       last_frame_centre_vertical_offset;
+
+       u32       pts[2]; /* [0] 1st field, [1] 2nd field */
+       int       top_field_first;
+       int       repeat_first_field;
+       int       progressive_frame;
+       int       bank;
+       int       forward_bank;
+       int       backward_bank;
+       int       compress;
+       s16       frame_centre_horizontal_offset[OFF_SIZE];
+                 /* [0-2] 1st field, [3] 2nd field */
+       s16       frame_centre_vertical_offset[OFF_SIZE];
+                 /* [0-2] 1st field, [3] 2nd field */
+       s16       temporal_reference[2];
+                 /* [0] 1st field, [1] 2nd field */
+
+       s8        picture_coding_type[2];
+                 /* [0] 1st field, [1] 2nd field */
+       s8        picture_structure[2];
+                 /* [0] 1st field, [1] 2nd field */
+       s8        picture_display_extension_flag[2];
+                 /* [0] 1st field, [1] 2nd field */
+                 /* picture_display_extenion() 0:no 1:exit*/
+       s8        pts_flag[2];
+                 /* [0] 1st field, [1] 2nd field */
+};
+
+struct dvb_audio_info {
+       int layer;
+       u32 bit_rate;
+       u32 frequency;
+       u32 mode;
+       u32 mode_extension ;
+       u32 emphasis;
+       u32 framesize;
+       u32 off;
+};
+
+int dvb_filter_get_ac3info(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr);
+
+
+#endif
index 4e7671a3a1e4a2408c02d1e0a8c3d57038a60571..35d5003ff8092b512f748eb26eadd8f2404f79e8 100644 (file)
@@ -36,7 +36,6 @@
 
 #include "dmxdev.h"
 #include "dvb_demux.h"
-#include "dvb_filter.h"
 #include "dvb_frontend.h"
 #include "dvb_net.h"
 #include "ttusbdecfe.h"
@@ -92,6 +91,15 @@ enum ttusb_dec_interface {
        TTUSB_DEC_INTERFACE_OUT
 };
 
+typedef int (dvb_filter_pes2ts_cb_t) (void *, unsigned char *);
+
+struct dvb_filter_pes2ts {
+       unsigned char buf[188];
+       unsigned char cc;
+       dvb_filter_pes2ts_cb_t *cb;
+       void *priv;
+};
+
 struct ttusb_dec {
        enum ttusb_dec_model            model;
        char                            *model_name;
@@ -201,6 +209,54 @@ static u16 rc_keys[] = {
        KEY_RADIO
 };
 
+static void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts,
+                                  unsigned short pid,
+                                  dvb_filter_pes2ts_cb_t *cb, void *priv)
+{
+       unsigned char *buf=p2ts->buf;
+
+       buf[0]=0x47;
+       buf[1]=(pid>>8);
+       buf[2]=pid&0xff;
+       p2ts->cc=0;
+       p2ts->cb=cb;
+       p2ts->priv=priv;
+}
+
+static int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts,
+                            unsigned char *pes, int len, int payload_start)
+{
+       unsigned char *buf=p2ts->buf;
+       int ret=0, rest;
+
+       //len=6+((pes[4]<<8)|pes[5]);
+
+       if (payload_start)
+               buf[1]|=0x40;
+       else
+               buf[1]&=~0x40;
+       while (len>=184) {
+               buf[3]=0x10|((p2ts->cc++)&0x0f);
+               memcpy(buf+4, pes, 184);
+               if ((ret=p2ts->cb(p2ts->priv, buf)))
+                       return ret;
+               len-=184; pes+=184;
+               buf[1]&=~0x40;
+       }
+       if (!len)
+               return 0;
+       buf[3]=0x30|((p2ts->cc++)&0x0f);
+       rest=183-len;
+       if (rest) {
+               buf[5]=0x00;
+               if (rest-1)
+                       memset(buf+6, 0xff, rest-1);
+       }
+       buf[4]=rest;
+       memcpy(buf+5+rest, pes, len);
+       return p2ts->cb(p2ts->priv, buf);
+}
+
 static void ttusb_dec_set_model(struct ttusb_dec *dec,
                                enum ttusb_dec_model model);