#include "dmxdev.h"
 #include "dvb_demux.h"
-#include "dvb_filter.h"
 #include "dvb_net.h"
 #include "dvb_frontend.h"
 
 
 
 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
 
 
+++ /dev/null
-#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);
 
+++ /dev/null
-/*
- * 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
 
 # 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
 
--- /dev/null
+#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);
+}
 
--- /dev/null
+/*
+ * 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
 
 
 #include "dmxdev.h"
 #include "dvb_demux.h"
-#include "dvb_filter.h"
 #include "dvb_frontend.h"
 #include "dvb_net.h"
 #include "ttusbdecfe.h"
        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;
        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);