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