1*989cf18eSMauro Carvalho Chehab /*
2*989cf18eSMauro Carvalho Chehab  * dvb_filter.h
3*989cf18eSMauro Carvalho Chehab  *
4*989cf18eSMauro Carvalho Chehab  * Copyright (C) 2003 Convergence GmbH
5*989cf18eSMauro Carvalho Chehab  *
6*989cf18eSMauro Carvalho Chehab  * This program is free software; you can redistribute it and/or
7*989cf18eSMauro Carvalho Chehab  * modify it under the terms of the GNU Lesser General Public License
8*989cf18eSMauro Carvalho Chehab  * as published by the Free Software Foundation; either version 2.1
9*989cf18eSMauro Carvalho Chehab  * of the License, or (at your option) any later version.
10*989cf18eSMauro Carvalho Chehab  *
11*989cf18eSMauro Carvalho Chehab  * This program is distributed in the hope that it will be useful,
12*989cf18eSMauro Carvalho Chehab  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13*989cf18eSMauro Carvalho Chehab  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*989cf18eSMauro Carvalho Chehab  * GNU General Public License for more details.
15*989cf18eSMauro Carvalho Chehab  */
16*989cf18eSMauro Carvalho Chehab 
17*989cf18eSMauro Carvalho Chehab #ifndef _DVB_FILTER_H_
18*989cf18eSMauro Carvalho Chehab #define _DVB_FILTER_H_
19*989cf18eSMauro Carvalho Chehab 
20*989cf18eSMauro Carvalho Chehab #include <linux/slab.h>
21*989cf18eSMauro Carvalho Chehab 
22*989cf18eSMauro Carvalho Chehab #include <media/demux.h>
23*989cf18eSMauro Carvalho Chehab 
24*989cf18eSMauro Carvalho Chehab typedef int (dvb_filter_pes2ts_cb_t) (void *, unsigned char *);
25*989cf18eSMauro Carvalho Chehab 
26*989cf18eSMauro Carvalho Chehab struct dvb_filter_pes2ts {
27*989cf18eSMauro Carvalho Chehab 	unsigned char buf[188];
28*989cf18eSMauro Carvalho Chehab 	unsigned char cc;
29*989cf18eSMauro Carvalho Chehab 	dvb_filter_pes2ts_cb_t *cb;
30*989cf18eSMauro Carvalho Chehab 	void *priv;
31*989cf18eSMauro Carvalho Chehab };
32*989cf18eSMauro Carvalho Chehab 
33*989cf18eSMauro Carvalho Chehab void dvb_filter_pes2ts_init(struct dvb_filter_pes2ts *p2ts, unsigned short pid,
34*989cf18eSMauro Carvalho Chehab 			    dvb_filter_pes2ts_cb_t *cb, void *priv);
35*989cf18eSMauro Carvalho Chehab 
36*989cf18eSMauro Carvalho Chehab int dvb_filter_pes2ts(struct dvb_filter_pes2ts *p2ts, unsigned char *pes,
37*989cf18eSMauro Carvalho Chehab 		      int len, int payload_start);
38*989cf18eSMauro Carvalho Chehab 
39*989cf18eSMauro Carvalho Chehab 
40*989cf18eSMauro Carvalho Chehab #define PROG_STREAM_MAP  0xBC
41*989cf18eSMauro Carvalho Chehab #define PRIVATE_STREAM1  0xBD
42*989cf18eSMauro Carvalho Chehab #define PADDING_STREAM   0xBE
43*989cf18eSMauro Carvalho Chehab #define PRIVATE_STREAM2  0xBF
44*989cf18eSMauro Carvalho Chehab #define AUDIO_STREAM_S   0xC0
45*989cf18eSMauro Carvalho Chehab #define AUDIO_STREAM_E   0xDF
46*989cf18eSMauro Carvalho Chehab #define VIDEO_STREAM_S   0xE0
47*989cf18eSMauro Carvalho Chehab #define VIDEO_STREAM_E   0xEF
48*989cf18eSMauro Carvalho Chehab #define ECM_STREAM       0xF0
49*989cf18eSMauro Carvalho Chehab #define EMM_STREAM       0xF1
50*989cf18eSMauro Carvalho Chehab #define DSM_CC_STREAM    0xF2
51*989cf18eSMauro Carvalho Chehab #define ISO13522_STREAM  0xF3
52*989cf18eSMauro Carvalho Chehab #define PROG_STREAM_DIR  0xFF
53*989cf18eSMauro Carvalho Chehab 
54*989cf18eSMauro Carvalho Chehab #define DVB_PICTURE_START    0x00
55*989cf18eSMauro Carvalho Chehab #define DVB_USER_START       0xb2
56*989cf18eSMauro Carvalho Chehab #define DVB_SEQUENCE_HEADER  0xb3
57*989cf18eSMauro Carvalho Chehab #define DVB_SEQUENCE_ERROR   0xb4
58*989cf18eSMauro Carvalho Chehab #define DVB_EXTENSION_START  0xb5
59*989cf18eSMauro Carvalho Chehab #define DVB_SEQUENCE_END     0xb7
60*989cf18eSMauro Carvalho Chehab #define DVB_GOP_START        0xb8
61*989cf18eSMauro Carvalho Chehab #define DVB_EXCEPT_SLICE     0xb0
62*989cf18eSMauro Carvalho Chehab 
63*989cf18eSMauro Carvalho Chehab #define SEQUENCE_EXTENSION           0x01
64*989cf18eSMauro Carvalho Chehab #define SEQUENCE_DISPLAY_EXTENSION   0x02
65*989cf18eSMauro Carvalho Chehab #define PICTURE_CODING_EXTENSION     0x08
66*989cf18eSMauro Carvalho Chehab #define QUANT_MATRIX_EXTENSION       0x03
67*989cf18eSMauro Carvalho Chehab #define PICTURE_DISPLAY_EXTENSION    0x07
68*989cf18eSMauro Carvalho Chehab 
69*989cf18eSMauro Carvalho Chehab #define I_FRAME 0x01
70*989cf18eSMauro Carvalho Chehab #define B_FRAME 0x02
71*989cf18eSMauro Carvalho Chehab #define P_FRAME 0x03
72*989cf18eSMauro Carvalho Chehab 
73*989cf18eSMauro Carvalho Chehab /* Initialize sequence_data */
74*989cf18eSMauro Carvalho Chehab #define INIT_HORIZONTAL_SIZE        720
75*989cf18eSMauro Carvalho Chehab #define INIT_VERTICAL_SIZE          576
76*989cf18eSMauro Carvalho Chehab #define INIT_ASPECT_RATIO          0x02
77*989cf18eSMauro Carvalho Chehab #define INIT_FRAME_RATE            0x03
78*989cf18eSMauro Carvalho Chehab #define INIT_DISP_HORIZONTAL_SIZE   540
79*989cf18eSMauro Carvalho Chehab #define INIT_DISP_VERTICAL_SIZE     576
80*989cf18eSMauro Carvalho Chehab 
81*989cf18eSMauro Carvalho Chehab 
82*989cf18eSMauro Carvalho Chehab //flags2
83*989cf18eSMauro Carvalho Chehab #define PTS_DTS_FLAGS    0xC0
84*989cf18eSMauro Carvalho Chehab #define ESCR_FLAG        0x20
85*989cf18eSMauro Carvalho Chehab #define ES_RATE_FLAG     0x10
86*989cf18eSMauro Carvalho Chehab #define DSM_TRICK_FLAG   0x08
87*989cf18eSMauro Carvalho Chehab #define ADD_CPY_FLAG     0x04
88*989cf18eSMauro Carvalho Chehab #define PES_CRC_FLAG     0x02
89*989cf18eSMauro Carvalho Chehab #define PES_EXT_FLAG     0x01
90*989cf18eSMauro Carvalho Chehab 
91*989cf18eSMauro Carvalho Chehab //pts_dts flags
92*989cf18eSMauro Carvalho Chehab #define PTS_ONLY         0x80
93*989cf18eSMauro Carvalho Chehab #define PTS_DTS          0xC0
94*989cf18eSMauro Carvalho Chehab 
95*989cf18eSMauro Carvalho Chehab #define TS_SIZE        188
96*989cf18eSMauro Carvalho Chehab #define TRANS_ERROR    0x80
97*989cf18eSMauro Carvalho Chehab #define PAY_START      0x40
98*989cf18eSMauro Carvalho Chehab #define TRANS_PRIO     0x20
99*989cf18eSMauro Carvalho Chehab #define PID_MASK_HI    0x1F
100*989cf18eSMauro Carvalho Chehab //flags
101*989cf18eSMauro Carvalho Chehab #define TRANS_SCRMBL1  0x80
102*989cf18eSMauro Carvalho Chehab #define TRANS_SCRMBL2  0x40
103*989cf18eSMauro Carvalho Chehab #define ADAPT_FIELD    0x20
104*989cf18eSMauro Carvalho Chehab #define PAYLOAD        0x10
105*989cf18eSMauro Carvalho Chehab #define COUNT_MASK     0x0F
106*989cf18eSMauro Carvalho Chehab 
107*989cf18eSMauro Carvalho Chehab // adaptation flags
108*989cf18eSMauro Carvalho Chehab #define DISCON_IND     0x80
109*989cf18eSMauro Carvalho Chehab #define RAND_ACC_IND   0x40
110*989cf18eSMauro Carvalho Chehab #define ES_PRI_IND     0x20
111*989cf18eSMauro Carvalho Chehab #define PCR_FLAG       0x10
112*989cf18eSMauro Carvalho Chehab #define OPCR_FLAG      0x08
113*989cf18eSMauro Carvalho Chehab #define SPLICE_FLAG    0x04
114*989cf18eSMauro Carvalho Chehab #define TRANS_PRIV     0x02
115*989cf18eSMauro Carvalho Chehab #define ADAP_EXT_FLAG  0x01
116*989cf18eSMauro Carvalho Chehab 
117*989cf18eSMauro Carvalho Chehab // adaptation extension flags
118*989cf18eSMauro Carvalho Chehab #define LTW_FLAG       0x80
119*989cf18eSMauro Carvalho Chehab #define PIECE_RATE     0x40
120*989cf18eSMauro Carvalho Chehab #define SEAM_SPLICE    0x20
121*989cf18eSMauro Carvalho Chehab 
122*989cf18eSMauro Carvalho Chehab 
123*989cf18eSMauro Carvalho Chehab #define MAX_PLENGTH 0xFFFF
124*989cf18eSMauro Carvalho Chehab #define MMAX_PLENGTH (256*MAX_PLENGTH)
125*989cf18eSMauro Carvalho Chehab 
126*989cf18eSMauro Carvalho Chehab #ifndef IPACKS
127*989cf18eSMauro Carvalho Chehab #define IPACKS 2048
128*989cf18eSMauro Carvalho Chehab #endif
129*989cf18eSMauro Carvalho Chehab 
130*989cf18eSMauro Carvalho Chehab struct ipack {
131*989cf18eSMauro Carvalho Chehab 	int size;
132*989cf18eSMauro Carvalho Chehab 	int found;
133*989cf18eSMauro Carvalho Chehab 	u8 *buf;
134*989cf18eSMauro Carvalho Chehab 	u8 cid;
135*989cf18eSMauro Carvalho Chehab 	u32 plength;
136*989cf18eSMauro Carvalho Chehab 	u8 plen[2];
137*989cf18eSMauro Carvalho Chehab 	u8 flag1;
138*989cf18eSMauro Carvalho Chehab 	u8 flag2;
139*989cf18eSMauro Carvalho Chehab 	u8 hlength;
140*989cf18eSMauro Carvalho Chehab 	u8 pts[5];
141*989cf18eSMauro Carvalho Chehab 	u16 *pid;
142*989cf18eSMauro Carvalho Chehab 	int mpeg;
143*989cf18eSMauro Carvalho Chehab 	u8 check;
144*989cf18eSMauro Carvalho Chehab 	int which;
145*989cf18eSMauro Carvalho Chehab 	int done;
146*989cf18eSMauro Carvalho Chehab 	void *data;
147*989cf18eSMauro Carvalho Chehab 	void (*func)(u8 *buf,  int size, void *priv);
148*989cf18eSMauro Carvalho Chehab 	int count;
149*989cf18eSMauro Carvalho Chehab 	int repack_subids;
150*989cf18eSMauro Carvalho Chehab };
151*989cf18eSMauro Carvalho Chehab 
152*989cf18eSMauro Carvalho Chehab struct dvb_video_info {
153*989cf18eSMauro Carvalho Chehab 	u32 horizontal_size;
154*989cf18eSMauro Carvalho Chehab 	u32 vertical_size;
155*989cf18eSMauro Carvalho Chehab 	u32 aspect_ratio;
156*989cf18eSMauro Carvalho Chehab 	u32 framerate;
157*989cf18eSMauro Carvalho Chehab 	u32 video_format;
158*989cf18eSMauro Carvalho Chehab 	u32 bit_rate;
159*989cf18eSMauro Carvalho Chehab 	u32 comp_bit_rate;
160*989cf18eSMauro Carvalho Chehab 	u32 vbv_buffer_size;
161*989cf18eSMauro Carvalho Chehab 	s16 vbv_delay;
162*989cf18eSMauro Carvalho Chehab 	u32 CSPF;
163*989cf18eSMauro Carvalho Chehab 	u32 off;
164*989cf18eSMauro Carvalho Chehab };
165*989cf18eSMauro Carvalho Chehab 
166*989cf18eSMauro Carvalho Chehab #define OFF_SIZE 4
167*989cf18eSMauro Carvalho Chehab #define FIRST_FIELD 0
168*989cf18eSMauro Carvalho Chehab #define SECOND_FIELD 1
169*989cf18eSMauro Carvalho Chehab #define VIDEO_FRAME_PICTURE 0x03
170*989cf18eSMauro Carvalho Chehab 
171*989cf18eSMauro Carvalho Chehab struct mpg_picture {
172*989cf18eSMauro Carvalho Chehab 	int       channel;
173*989cf18eSMauro Carvalho Chehab 	struct dvb_video_info vinfo;
174*989cf18eSMauro Carvalho Chehab 	u32      *sequence_gop_header;
175*989cf18eSMauro Carvalho Chehab 	u32      *picture_header;
176*989cf18eSMauro Carvalho Chehab 	s32       time_code;
177*989cf18eSMauro Carvalho Chehab 	int       low_delay;
178*989cf18eSMauro Carvalho Chehab 	int       closed_gop;
179*989cf18eSMauro Carvalho Chehab 	int       broken_link;
180*989cf18eSMauro Carvalho Chehab 	int       sequence_header_flag;
181*989cf18eSMauro Carvalho Chehab 	int       gop_flag;
182*989cf18eSMauro Carvalho Chehab 	int       sequence_end_flag;
183*989cf18eSMauro Carvalho Chehab 
184*989cf18eSMauro Carvalho Chehab 	u8        profile_and_level;
185*989cf18eSMauro Carvalho Chehab 	s32       picture_coding_parameter;
186*989cf18eSMauro Carvalho Chehab 	u32       matrix[32];
187*989cf18eSMauro Carvalho Chehab 	s8        matrix_change_flag;
188*989cf18eSMauro Carvalho Chehab 
189*989cf18eSMauro Carvalho Chehab 	u8        picture_header_parameter;
190*989cf18eSMauro Carvalho Chehab   /* bit 0 - 2: bwd f code
191*989cf18eSMauro Carvalho Chehab      bit 3    : fpb vector
192*989cf18eSMauro Carvalho Chehab      bit 4 - 6: fwd f code
193*989cf18eSMauro Carvalho Chehab      bit 7    : fpf vector */
194*989cf18eSMauro Carvalho Chehab 
195*989cf18eSMauro Carvalho Chehab 	int       mpeg1_flag;
196*989cf18eSMauro Carvalho Chehab 	int       progressive_sequence;
197*989cf18eSMauro Carvalho Chehab 	int       sequence_display_extension_flag;
198*989cf18eSMauro Carvalho Chehab 	u32       sequence_header_data;
199*989cf18eSMauro Carvalho Chehab 	s16       last_frame_centre_horizontal_offset;
200*989cf18eSMauro Carvalho Chehab 	s16       last_frame_centre_vertical_offset;
201*989cf18eSMauro Carvalho Chehab 
202*989cf18eSMauro Carvalho Chehab 	u32       pts[2]; /* [0] 1st field, [1] 2nd field */
203*989cf18eSMauro Carvalho Chehab 	int       top_field_first;
204*989cf18eSMauro Carvalho Chehab 	int       repeat_first_field;
205*989cf18eSMauro Carvalho Chehab 	int       progressive_frame;
206*989cf18eSMauro Carvalho Chehab 	int       bank;
207*989cf18eSMauro Carvalho Chehab 	int       forward_bank;
208*989cf18eSMauro Carvalho Chehab 	int       backward_bank;
209*989cf18eSMauro Carvalho Chehab 	int       compress;
210*989cf18eSMauro Carvalho Chehab 	s16       frame_centre_horizontal_offset[OFF_SIZE];
211*989cf18eSMauro Carvalho Chehab 		  /* [0-2] 1st field, [3] 2nd field */
212*989cf18eSMauro Carvalho Chehab 	s16       frame_centre_vertical_offset[OFF_SIZE];
213*989cf18eSMauro Carvalho Chehab 		  /* [0-2] 1st field, [3] 2nd field */
214*989cf18eSMauro Carvalho Chehab 	s16       temporal_reference[2];
215*989cf18eSMauro Carvalho Chehab 		  /* [0] 1st field, [1] 2nd field */
216*989cf18eSMauro Carvalho Chehab 
217*989cf18eSMauro Carvalho Chehab 	s8        picture_coding_type[2];
218*989cf18eSMauro Carvalho Chehab 		  /* [0] 1st field, [1] 2nd field */
219*989cf18eSMauro Carvalho Chehab 	s8        picture_structure[2];
220*989cf18eSMauro Carvalho Chehab 		  /* [0] 1st field, [1] 2nd field */
221*989cf18eSMauro Carvalho Chehab 	s8        picture_display_extension_flag[2];
222*989cf18eSMauro Carvalho Chehab 		  /* [0] 1st field, [1] 2nd field */
223*989cf18eSMauro Carvalho Chehab 		  /* picture_display_extenion() 0:no 1:exit*/
224*989cf18eSMauro Carvalho Chehab 	s8        pts_flag[2];
225*989cf18eSMauro Carvalho Chehab 		  /* [0] 1st field, [1] 2nd field */
226*989cf18eSMauro Carvalho Chehab };
227*989cf18eSMauro Carvalho Chehab 
228*989cf18eSMauro Carvalho Chehab struct dvb_audio_info {
229*989cf18eSMauro Carvalho Chehab 	int layer;
230*989cf18eSMauro Carvalho Chehab 	u32 bit_rate;
231*989cf18eSMauro Carvalho Chehab 	u32 frequency;
232*989cf18eSMauro Carvalho Chehab 	u32 mode;
233*989cf18eSMauro Carvalho Chehab 	u32 mode_extension ;
234*989cf18eSMauro Carvalho Chehab 	u32 emphasis;
235*989cf18eSMauro Carvalho Chehab 	u32 framesize;
236*989cf18eSMauro Carvalho Chehab 	u32 off;
237*989cf18eSMauro Carvalho Chehab };
238*989cf18eSMauro Carvalho Chehab 
239*989cf18eSMauro Carvalho Chehab int dvb_filter_get_ac3info(u8 *mbuf, int count, struct dvb_audio_info *ai, int pr);
240*989cf18eSMauro Carvalho Chehab 
241*989cf18eSMauro Carvalho Chehab 
242*989cf18eSMauro Carvalho Chehab #endif
243