summaryrefslogtreecommitdiff
path: root/core/multimedia/opieplayer/libmpeg3/video/headers.c
Unidiff
Diffstat (limited to 'core/multimedia/opieplayer/libmpeg3/video/headers.c') (more/less context) (ignore whitespace changes)
-rw-r--r--core/multimedia/opieplayer/libmpeg3/video/headers.c492
1 files changed, 492 insertions, 0 deletions
diff --git a/core/multimedia/opieplayer/libmpeg3/video/headers.c b/core/multimedia/opieplayer/libmpeg3/video/headers.c
new file mode 100644
index 0000000..5274530
--- a/dev/null
+++ b/core/multimedia/opieplayer/libmpeg3/video/headers.c
@@ -0,0 +1,492 @@
1#include "../mpeg3demux.h"
2#include "../libmpeg3.h"
3#include "../mpeg3protos.h"
4#include "mpeg3video.h"
5
6#include <stdio.h>
7#include <stdlib.h>
8
9int mpeg3video_getseqhdr(mpeg3video_t *video)
10{
11 int i;
12 mpeg3_t *file = video->file;
13
14 int aspect_ratio, picture_rate, vbv_buffer_size;
15 int constrained_parameters_flag;
16 int load_intra_quantizer_matrix, load_non_intra_quantizer_matrix;
17
18 video->horizontal_size = mpeg3bits_getbits(video->vstream, 12);
19 video->vertical_size = mpeg3bits_getbits(video->vstream, 12);
20 aspect_ratio = mpeg3bits_getbits(video->vstream, 4);
21 video->framerate_code = mpeg3bits_getbits(video->vstream, 4);
22 video->bitrate = mpeg3bits_getbits(video->vstream, 18);
23 mpeg3bits_getbit_noptr(video->vstream); /* marker bit (=1) */
24 vbv_buffer_size = mpeg3bits_getbits(video->vstream, 10);
25 constrained_parameters_flag = mpeg3bits_getbit_noptr(video->vstream);
26 video->frame_rate = mpeg3_frame_rate_table[video->framerate_code];
27
28 load_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
29 if(load_intra_quantizer_matrix)
30 {
31 for(i = 0; i < 64; i++)
32 video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
33 }
34 else
35 {
36 for(i = 0; i < 64; i++)
37 video->intra_quantizer_matrix[i] = mpeg3_default_intra_quantizer_matrix[i];
38 }
39
40 load_non_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
41 if(load_non_intra_quantizer_matrix)
42 {
43 for(i = 0; i < 64; i++)
44 video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
45 }
46 else
47 {
48 for(i = 0; i < 64; i++)
49 video->non_intra_quantizer_matrix[i] = 16;
50 }
51
52/* copy luminance to chrominance matrices */
53 for(i = 0; i < 64; i++)
54 {
55 video->chroma_intra_quantizer_matrix[i] = video->intra_quantizer_matrix[i];
56 video->chroma_non_intra_quantizer_matrix[i] = video->non_intra_quantizer_matrix[i];
57 }
58
59 return 0;
60}
61
62
63/* decode sequence extension */
64
65int mpeg3video_sequence_extension(mpeg3video_t *video)
66{
67 int prof_lev;
68 int horizontal_size_extension, vertical_size_extension;
69 int bit_rate_extension, vbv_buffer_size_extension, low_delay;
70 int frame_rate_extension_n, frame_rate_extension_d;
71 int pos = 0;
72
73 video->mpeg2 = 1;
74 video->scalable_mode = SC_NONE; /* unless overwritten by seq. scal. ext. */
75 prof_lev = mpeg3bits_getbyte_noptr(video->vstream);
76 video->prog_seq = mpeg3bits_getbit_noptr(video->vstream);
77 video->chroma_format = mpeg3bits_getbits(video->vstream, 2);
78 horizontal_size_extension = mpeg3bits_getbits(video->vstream, 2);
79 vertical_size_extension = mpeg3bits_getbits(video->vstream, 2);
80 bit_rate_extension = mpeg3bits_getbits(video->vstream, 12);
81 mpeg3bits_getbit_noptr(video->vstream);
82 vbv_buffer_size_extension = mpeg3bits_getbyte_noptr(video->vstream);
83 low_delay = mpeg3bits_getbit_noptr(video->vstream);
84 frame_rate_extension_n = mpeg3bits_getbits(video->vstream, 2);
85 frame_rate_extension_d = mpeg3bits_getbits(video->vstream, 5);
86 video->horizontal_size = (horizontal_size_extension << 12) | (video->horizontal_size & 0x0fff);
87 video->vertical_size = (vertical_size_extension << 12) | (video->vertical_size & 0x0fff);
88}
89
90
91/* decode sequence display extension */
92
93int mpeg3video_sequence_display_extension(mpeg3video_t *video)
94{
95 int colour_primaries = 0, transfer_characteristics = 0;
96 int display_horizontal_size, display_vertical_size;
97 int pos = 0;
98 int video_format = mpeg3bits_getbits(video->vstream, 3);
99 int colour_description = mpeg3bits_getbit_noptr(video->vstream);
100
101 if(colour_description)
102 {
103 colour_primaries = mpeg3bits_getbyte_noptr(video->vstream);
104 transfer_characteristics = mpeg3bits_getbyte_noptr(video->vstream);
105 video->matrix_coefficients = mpeg3bits_getbyte_noptr(video->vstream);
106 }
107
108 display_horizontal_size = mpeg3bits_getbits(video->vstream, 14);
109 mpeg3bits_getbit_noptr(video->vstream);
110 display_vertical_size = mpeg3bits_getbits(video->vstream, 14);
111}
112
113
114/* decode quant matrix entension */
115
116int mpeg3video_quant_matrix_extension(mpeg3video_t *video)
117{
118 int i;
119 int load_intra_quantiser_matrix, load_non_intra_quantiser_matrix;
120 int load_chroma_intra_quantiser_matrix;
121 int load_chroma_non_intra_quantiser_matrix;
122 int pos = 0;
123
124 if((load_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
125 {
126 for(i = 0; i < 64; i++)
127 {
128 video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
129 = video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
130 = mpeg3bits_getbyte_noptr(video->vstream);
131 }
132 }
133
134 if((load_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
135 {
136 for (i = 0; i < 64; i++)
137 {
138 video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
139 = video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
140 = mpeg3bits_getbyte_noptr(video->vstream);
141 }
142 }
143
144 if((load_chroma_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
145 {
146 for(i = 0; i < 64; i++)
147 video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
148 }
149
150 if((load_chroma_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
151 {
152 for(i = 0; i < 64; i++)
153 video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
154 }
155}
156
157
158/* decode sequence scalable extension */
159
160int mpeg3video_sequence_scalable_extension(mpeg3video_t *video)
161{
162 int layer_id;
163
164 video->scalable_mode = mpeg3bits_getbits(video->vstream, 2) + 1; /* add 1 to make SC_DP != SC_NONE */
165 layer_id = mpeg3bits_getbits(video->vstream, 4);
166
167 if(video->scalable_mode == SC_SPAT)
168 {
169 video->llw = mpeg3bits_getbits(video->vstream, 14); /* lower_layer_prediction_horizontal_size */
170 mpeg3bits_getbit_noptr(video->vstream);
171 video->llh = mpeg3bits_getbits(video->vstream, 14); /* lower_layer_prediction_vertical_size */
172 video->hm = mpeg3bits_getbits(video->vstream, 5);
173 video->hn = mpeg3bits_getbits(video->vstream, 5);
174 video->vm = mpeg3bits_getbits(video->vstream, 5);
175 video->vn = mpeg3bits_getbits(video->vstream, 5);
176 }
177
178 if(video->scalable_mode == SC_TEMP)
179 fprintf(stderr, "mpeg3video_sequence_scalable_extension: temporal scalability not implemented\n");
180}
181
182
183/* decode picture display extension */
184
185int mpeg3video_picture_display_extension(mpeg3video_t *video)
186{
187 int n, i;
188 short frame_centre_horizontal_offset[3];
189 short frame_centre_vertical_offset[3];
190
191 if(video->prog_seq || video->pict_struct != FRAME_PICTURE)
192 n = 1;
193 else
194 n = video->repeatfirst ? 3 : 2;
195
196 for(i = 0; i < n; i++)
197 {
198 frame_centre_horizontal_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
199 mpeg3bits_getbit_noptr(video->vstream);
200 frame_centre_vertical_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
201 mpeg3bits_getbit_noptr(video->vstream);
202 }
203}
204
205
206/* decode picture coding extension */
207
208int mpeg3video_picture_coding_extension(mpeg3video_t *video)
209{
210 int chroma_420_type, composite_display_flag;
211 int v_axis = 0, field_sequence = 0, sub_carrier = 0, burst_amplitude = 0, sub_carrier_phase = 0;
212
213 video->h_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
214 video->v_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
215 video->h_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
216 video->v_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
217 video->dc_prec = mpeg3bits_getbits(video->vstream, 2);
218 video->pict_struct = mpeg3bits_getbits(video->vstream, 2);
219 video->topfirst = mpeg3bits_getbit_noptr(video->vstream);
220 video->frame_pred_dct = mpeg3bits_getbit_noptr(video->vstream);
221 video->conceal_mv = mpeg3bits_getbit_noptr(video->vstream);
222 video->qscale_type = mpeg3bits_getbit_noptr(video->vstream);
223 video->intravlc = mpeg3bits_getbit_noptr(video->vstream);
224 video->altscan = mpeg3bits_getbit_noptr(video->vstream);
225 video->repeatfirst = mpeg3bits_getbit_noptr(video->vstream);
226 chroma_420_type = mpeg3bits_getbit_noptr(video->vstream);
227 video->prog_frame = mpeg3bits_getbit_noptr(video->vstream);
228
229 if(video->repeat_count > 100)
230 video->repeat_count = 0;
231 video->repeat_count += 100;
232
233 video->current_repeat = 0;
234
235 if(video->prog_seq)
236 {
237 if(video->repeatfirst)
238 {
239 if(video->topfirst)
240 video->repeat_count += 200;
241 else
242 video->repeat_count += 100;
243 }
244 }
245 else
246 if(video->prog_frame)
247 {
248 if(video->repeatfirst)
249 {
250 video->repeat_count += 50;
251 }
252 }
253
254/*printf("mpeg3video_picture_coding_extension %d\n", video->repeat_count); */
255 composite_display_flag = mpeg3bits_getbit_noptr(video->vstream);
256
257 if(composite_display_flag)
258 {
259 v_axis = mpeg3bits_getbit_noptr(video->vstream);
260 field_sequence = mpeg3bits_getbits(video->vstream, 3);
261 sub_carrier = mpeg3bits_getbit_noptr(video->vstream);
262 burst_amplitude = mpeg3bits_getbits(video->vstream, 7);
263 sub_carrier_phase = mpeg3bits_getbyte_noptr(video->vstream);
264 }
265}
266
267
268/* decode picture spatial scalable extension */
269
270int mpeg3video_picture_spatial_scalable_extension(mpeg3video_t *video)
271{
272 video->pict_scal = 1; /* use spatial scalability in this picture */
273
274 video->lltempref = mpeg3bits_getbits(video->vstream, 10);
275 mpeg3bits_getbit_noptr(video->vstream);
276 video->llx0 = mpeg3bits_getbits(video->vstream, 15);
277 if(video->llx0 >= 16384) video->llx0 -= 32768;
278 mpeg3bits_getbit_noptr(video->vstream);
279 video->lly0 = mpeg3bits_getbits(video->vstream, 15);
280 if(video->lly0 >= 16384) video->lly0 -= 32768;
281 video->stwc_table_index = mpeg3bits_getbits(video->vstream, 2);
282 video->llprog_frame = mpeg3bits_getbit_noptr(video->vstream);
283 video->llfieldsel = mpeg3bits_getbit_noptr(video->vstream);
284}
285
286
287/* decode picture temporal scalable extension
288 *
289 * not implemented
290 *
291 */
292
293int mpeg3video_picture_temporal_scalable_extension(mpeg3video_t *video)
294{
295 fprintf(stderr, "mpeg3video_picture_temporal_scalable_extension: temporal scalability not supported\n");
296}
297
298
299/* decode extension and user data */
300
301int mpeg3video_ext_user_data(mpeg3video_t *video)
302{
303 int code = mpeg3bits_next_startcode(video->vstream);
304
305
306 while(code == MPEG3_EXT_START_CODE || code == MPEG3_USER_START_CODE &&
307 !mpeg3bits_eof(video->vstream))
308 {
309 mpeg3bits_refill(video->vstream);
310
311 if(code == MPEG3_EXT_START_CODE)
312 {
313 int ext_id = mpeg3bits_getbits(video->vstream, 4);
314 switch(ext_id)
315 {
316 case SEQ_ID:
317 mpeg3video_sequence_extension(video);
318 break;
319 case DISP_ID:
320 mpeg3video_sequence_display_extension(video);
321 break;
322 case QUANT_ID:
323 mpeg3video_quant_matrix_extension(video);
324 break;
325 case SEQSCAL_ID:
326 mpeg3video_sequence_scalable_extension(video);
327 break;
328 case PANSCAN_ID:
329 mpeg3video_picture_display_extension(video);
330 break;
331 case CODING_ID:
332 mpeg3video_picture_coding_extension(video);
333 break;
334 case SPATSCAL_ID:
335 mpeg3video_picture_spatial_scalable_extension(video);
336 break;
337 case TEMPSCAL_ID:
338 mpeg3video_picture_temporal_scalable_extension(video);
339 break;
340 default:
341 fprintf(stderr,"mpeg3video_ext_user_data: reserved extension start code ID %d\n", ext_id);
342 break;
343 }
344 }
345 code = mpeg3bits_next_startcode(video->vstream);
346 }
347}
348
349
350/* decode group of pictures header */
351
352int mpeg3video_getgophdr(mpeg3video_t *video)
353{
354 int drop_flag, closed_gop, broken_link;
355
356 drop_flag = mpeg3bits_getbit_noptr(video->vstream);
357 video->gop_timecode.hour = mpeg3bits_getbits(video->vstream, 5);
358 video->gop_timecode.minute = mpeg3bits_getbits(video->vstream, 6);
359 mpeg3bits_getbit_noptr(video->vstream);
360 video->gop_timecode.second = mpeg3bits_getbits(video->vstream, 6);
361 video->gop_timecode.frame = mpeg3bits_getbits(video->vstream, 6);
362 closed_gop = mpeg3bits_getbit_noptr(video->vstream);
363 broken_link = mpeg3bits_getbit_noptr(video->vstream);
364
365/*
366 * printf("%d:%d:%d:%d %d %d %d\n", video->gop_timecode.hour, video->gop_timecode.minute, video->gop_timecode.second, video->gop_timecode.frame,
367 * drop_flag, closed_gop, broken_link);
368 */
369 return mpeg3bits_error(video->vstream);
370}
371
372/* decode picture header */
373
374int mpeg3video_getpicturehdr(mpeg3video_t *video)
375{
376 int temp_ref, vbv_delay;
377
378 video->pict_scal = 0; /* unless overwritten by pict. spat. scal. ext. */
379
380 temp_ref = mpeg3bits_getbits(video->vstream, 10);
381 video->pict_type = mpeg3bits_getbits(video->vstream, 3);
382 vbv_delay = mpeg3bits_getbits(video->vstream, 16);
383
384 if(video->pict_type == P_TYPE || video->pict_type == B_TYPE)
385 {
386 video->full_forw = mpeg3bits_getbit_noptr(video->vstream);
387 video->forw_r_size = mpeg3bits_getbits(video->vstream, 3) - 1;
388 }
389
390 if(video->pict_type == B_TYPE)
391 {
392 video->full_back = mpeg3bits_getbit_noptr(video->vstream);
393 video->back_r_size = mpeg3bits_getbits(video->vstream, 3) - 1;
394 }
395
396/* get extra bit picture */
397 while(mpeg3bits_getbit_noptr(video->vstream) &&
398 !mpeg3bits_eof(video->vstream)) mpeg3bits_getbyte_noptr(video->vstream);
399 return 0;
400}
401
402
403int mpeg3video_get_header(mpeg3video_t *video, int dont_repeat)
404{
405 unsigned int code;
406
407/* a sequence header should be found before returning from `getheader' the */
408/* first time (this is to set horizontal/vertical size properly) */
409
410/* Repeat the frame until it's less than 1 count from repeat_count */
411 if(video->repeat_count - video->current_repeat >= 100 && !dont_repeat)
412 {
413 return 0;
414 }
415
416 if(dont_repeat)
417 {
418 video->repeat_count = 0;
419 video->current_repeat = 0;
420 }
421 else
422 video->repeat_count -= video->current_repeat;
423
424 while(1)
425 {
426/* look for startcode */
427 code = mpeg3bits_next_startcode(video->vstream);
428 if(mpeg3bits_eof(video->vstream)) return 1;
429 if(code != MPEG3_SEQUENCE_END_CODE) mpeg3bits_refill(video->vstream);
430
431 switch(code)
432 {
433 case MPEG3_SEQUENCE_START_CODE:
434 video->found_seqhdr = 1;
435 mpeg3video_getseqhdr(video);
436 mpeg3video_ext_user_data(video);
437 break;
438
439 case MPEG3_GOP_START_CODE:
440 mpeg3video_getgophdr(video);
441 mpeg3video_ext_user_data(video);
442 break;
443
444 case MPEG3_PICTURE_START_CODE:
445 mpeg3video_getpicturehdr(video);
446 mpeg3video_ext_user_data(video);
447 if(video->found_seqhdr) return 0; /* Exit here */
448 break;
449
450 case MPEG3_SEQUENCE_END_CODE:
451// Continue until the end
452 mpeg3bits_refill(video->vstream);
453 break;
454
455 default:
456 break;
457 }
458 }
459 return 1; /* Shouldn't be reached. */
460}
461
462int mpeg3video_ext_bit_info(mpeg3_slice_buffer_t *slice_buffer)
463{
464 while(mpeg3slice_getbit(slice_buffer)) mpeg3slice_getbyte(slice_buffer);
465 return 0;
466}
467
468/* decode slice header */
469int mpeg3video_getslicehdr(mpeg3_slice_t *slice, mpeg3video_t *video)
470{
471 int slice_vertical_position_extension, intra_slice;
472 int qs;
473
474 slice_vertical_position_extension = (video->mpeg2 && video->vertical_size > 2800) ?
475 mpeg3slice_getbits(slice->slice_buffer, 3) : 0;
476
477 if(video->scalable_mode == SC_DP) slice->pri_brk = mpeg3slice_getbits(slice->slice_buffer, 7);
478
479 qs = mpeg3slice_getbits(slice->slice_buffer, 5);
480 slice->quant_scale = video->mpeg2 ? (video->qscale_type ? mpeg3_non_linear_mquant_table[qs] : (qs << 1)) : qs;
481
482 if(mpeg3slice_getbit(slice->slice_buffer))
483 {
484 intra_slice = mpeg3slice_getbit(slice->slice_buffer);
485 mpeg3slice_getbits(slice->slice_buffer, 7);
486 mpeg3video_ext_bit_info(slice->slice_buffer);
487 }
488 else
489 intra_slice = 0;
490
491 return slice_vertical_position_extension;
492}