00001 #include "../mpeg3demux.h"
00002 #include "../mpeg3private.h"
00003 #include "../mpeg3protos.h"
00004 #include "mpeg3video.h"
00005
00006 #include <stdio.h>
00007 #include <stdlib.h>
00008
00009 int mpeg3video_getseqhdr(mpeg3video_t *video)
00010 {
00011 int i;
00012 mpeg3_t *file = video->file;
00013
00014 int aspect_ratio, picture_rate, vbv_buffer_size;
00015 int constrained_parameters_flag;
00016 int load_intra_quantizer_matrix, load_non_intra_quantizer_matrix;
00017
00018
00019 video->horizontal_size = mpeg3bits_getbits(video->vstream, 12);
00020 video->vertical_size = mpeg3bits_getbits(video->vstream, 12);
00021 aspect_ratio = mpeg3bits_getbits(video->vstream, 4);
00022 video->framerate_code = mpeg3bits_getbits(video->vstream, 4);
00023 video->bitrate = mpeg3bits_getbits(video->vstream, 18);
00024 mpeg3bits_getbit_noptr(video->vstream);
00025 vbv_buffer_size = mpeg3bits_getbits(video->vstream, 10);
00026 constrained_parameters_flag = mpeg3bits_getbit_noptr(video->vstream);
00027 video->frame_rate = mpeg3_frame_rate_table[video->framerate_code];
00028
00029 load_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
00030 if(load_intra_quantizer_matrix)
00031 {
00032 for(i = 0; i < 64; i++)
00033 video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
00034 }
00035 else
00036 {
00037 for(i = 0; i < 64; i++)
00038 video->intra_quantizer_matrix[i] = mpeg3_default_intra_quantizer_matrix[i];
00039 }
00040
00041 load_non_intra_quantizer_matrix = mpeg3bits_getbit_noptr(video->vstream);
00042 if(load_non_intra_quantizer_matrix)
00043 {
00044 for(i = 0; i < 64; i++)
00045 video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
00046 }
00047 else
00048 {
00049 for(i = 0; i < 64; i++)
00050 video->non_intra_quantizer_matrix[i] = 16;
00051 }
00052
00053
00054 for(i = 0; i < 64; i++)
00055 {
00056 video->chroma_intra_quantizer_matrix[i] = video->intra_quantizer_matrix[i];
00057 video->chroma_non_intra_quantizer_matrix[i] = video->non_intra_quantizer_matrix[i];
00058 }
00059
00060
00061 return 0;
00062 }
00063
00064
00065
00066
00067 int mpeg3video_sequence_extension(mpeg3video_t *video)
00068 {
00069 int prof_lev;
00070 int horizontal_size_extension, vertical_size_extension;
00071 int bit_rate_extension, vbv_buffer_size_extension, low_delay;
00072 int frame_rate_extension_n, frame_rate_extension_d;
00073 int pos = 0;
00074
00075 video->mpeg2 = 1;
00076 video->scalable_mode = SC_NONE;
00077 prof_lev = mpeg3bits_getbyte_noptr(video->vstream);
00078 video->prog_seq = mpeg3bits_getbit_noptr(video->vstream);
00079 video->chroma_format = mpeg3bits_getbits(video->vstream, 2);
00080 horizontal_size_extension = mpeg3bits_getbits(video->vstream, 2);
00081 vertical_size_extension = mpeg3bits_getbits(video->vstream, 2);
00082 bit_rate_extension = mpeg3bits_getbits(video->vstream, 12);
00083 mpeg3bits_getbit_noptr(video->vstream);
00084 vbv_buffer_size_extension = mpeg3bits_getbyte_noptr(video->vstream);
00085 low_delay = mpeg3bits_getbit_noptr(video->vstream);
00086 frame_rate_extension_n = mpeg3bits_getbits(video->vstream, 2);
00087 frame_rate_extension_d = mpeg3bits_getbits(video->vstream, 5);
00088 video->horizontal_size = (horizontal_size_extension << 12) | (video->horizontal_size & 0x0fff);
00089 video->vertical_size = (vertical_size_extension << 12) | (video->vertical_size & 0x0fff);
00090 return 0;
00091 }
00092
00093
00094
00095
00096 int mpeg3video_sequence_display_extension(mpeg3video_t *video)
00097 {
00098 int colour_primaries = 0, transfer_characteristics = 0;
00099 int display_horizontal_size, display_vertical_size;
00100 int pos = 0;
00101 int video_format = mpeg3bits_getbits(video->vstream, 3);
00102 int colour_description = mpeg3bits_getbit_noptr(video->vstream);
00103
00104 if(colour_description)
00105 {
00106 colour_primaries = mpeg3bits_getbyte_noptr(video->vstream);
00107 transfer_characteristics = mpeg3bits_getbyte_noptr(video->vstream);
00108 video->matrix_coefficients = mpeg3bits_getbyte_noptr(video->vstream);
00109 }
00110
00111 display_horizontal_size = mpeg3bits_getbits(video->vstream, 14);
00112 mpeg3bits_getbit_noptr(video->vstream);
00113 display_vertical_size = mpeg3bits_getbits(video->vstream, 14);
00114 return 0;
00115 }
00116
00117
00118
00119
00120 int mpeg3video_quant_matrix_extension(mpeg3video_t *video)
00121 {
00122 int i;
00123 int load_intra_quantiser_matrix, load_non_intra_quantiser_matrix;
00124 int load_chroma_intra_quantiser_matrix;
00125 int load_chroma_non_intra_quantiser_matrix;
00126 int pos = 0;
00127
00128 if((load_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
00129 {
00130 for(i = 0; i < 64; i++)
00131 {
00132 video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
00133 = video->intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
00134 = mpeg3bits_getbyte_noptr(video->vstream);
00135 }
00136 }
00137
00138 if((load_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
00139 {
00140 for (i = 0; i < 64; i++)
00141 {
00142 video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
00143 = video->non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]]
00144 = mpeg3bits_getbyte_noptr(video->vstream);
00145 }
00146 }
00147
00148 if((load_chroma_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
00149 {
00150 for(i = 0; i < 64; i++)
00151 video->chroma_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
00152 }
00153
00154 if((load_chroma_non_intra_quantiser_matrix = mpeg3bits_getbit_noptr(video->vstream)) != 0)
00155 {
00156 for(i = 0; i < 64; i++)
00157 video->chroma_non_intra_quantizer_matrix[video->mpeg3_zigzag_scan_table[i]] = mpeg3bits_getbyte_noptr(video->vstream);
00158 }
00159 return 0;
00160 }
00161
00162
00163
00164
00165 int mpeg3video_sequence_scalable_extension(mpeg3video_t *video)
00166 {
00167 int layer_id;
00168
00169 video->scalable_mode = mpeg3bits_getbits(video->vstream, 2) + 1;
00170 layer_id = mpeg3bits_getbits(video->vstream, 4);
00171
00172 if(video->scalable_mode == SC_SPAT)
00173 {
00174 video->llw = mpeg3bits_getbits(video->vstream, 14);
00175 mpeg3bits_getbit_noptr(video->vstream);
00176 video->llh = mpeg3bits_getbits(video->vstream, 14);
00177 video->hm = mpeg3bits_getbits(video->vstream, 5);
00178 video->hn = mpeg3bits_getbits(video->vstream, 5);
00179 video->vm = mpeg3bits_getbits(video->vstream, 5);
00180 video->vn = mpeg3bits_getbits(video->vstream, 5);
00181 }
00182
00183 if(video->scalable_mode == SC_TEMP)
00184 fprintf(stderr, "mpeg3video_sequence_scalable_extension: temporal scalability not implemented\n");
00185 return 0;
00186 }
00187
00188
00189
00190
00191 int mpeg3video_picture_display_extension(mpeg3video_t *video)
00192 {
00193 int n, i;
00194 short frame_centre_horizontal_offset[3];
00195 short frame_centre_vertical_offset[3];
00196
00197
00198
00199 if(video->prog_seq || video->pict_struct != FRAME_PICTURE)
00200 n = 1;
00201 else
00202 n = video->repeatfirst ? 3 : 2;
00203
00204
00205
00206
00207 for(i = 0; i < n; i++)
00208 {
00209 frame_centre_horizontal_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
00210 mpeg3bits_getbit_noptr(video->vstream);
00211 frame_centre_vertical_offset[i] = (short)mpeg3bits_getbits(video->vstream, 16);
00212 mpeg3bits_getbit_noptr(video->vstream);
00213 }
00214 return 0;
00215 }
00216
00217
00218
00219
00220 int mpeg3video_picture_coding_extension(mpeg3video_t *video)
00221 {
00222 int chroma_420_type, composite_display_flag;
00223 int v_axis = 0, sub_carrier = 0, burst_amplitude = 0, sub_carrier_phase = 0;
00224
00225 video->h_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
00226 video->v_forw_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
00227 video->h_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
00228 video->v_back_r_size = mpeg3bits_getbits(video->vstream, 4) - 1;
00229 video->dc_prec = mpeg3bits_getbits(video->vstream, 2);
00230 video->pict_struct = mpeg3bits_getbits(video->vstream, 2);
00231 video->topfirst = mpeg3bits_getbit_noptr(video->vstream);
00232 video->frame_pred_dct = mpeg3bits_getbit_noptr(video->vstream);
00233 video->conceal_mv = mpeg3bits_getbit_noptr(video->vstream);
00234 video->qscale_type = mpeg3bits_getbit_noptr(video->vstream);
00235 video->intravlc = mpeg3bits_getbit_noptr(video->vstream);
00236 video->altscan = mpeg3bits_getbit_noptr(video->vstream);
00237
00238
00239 video->repeatfirst = mpeg3bits_getbit_noptr(video->vstream);
00240
00241
00242 chroma_420_type = mpeg3bits_getbit_noptr(video->vstream);
00243 video->prog_frame = mpeg3bits_getbit_noptr(video->vstream);
00244
00245 if(video->repeat_count > 100)
00246 video->repeat_count = 0;
00247 video->repeat_count += 100;
00248
00249 video->current_repeat = 0;
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261 if(video->repeatfirst)
00262 {
00263 if(video->prog_seq)
00264 {
00265 if(video->topfirst)
00266 video->repeat_count += 200;
00267 else
00268 video->repeat_count += 100;
00269 }
00270 else
00271 if(video->prog_frame)
00272 {
00273 video->repeat_count += 50;
00274 }
00275 }
00276
00277 composite_display_flag = mpeg3bits_getbit_noptr(video->vstream);
00278
00279 if(composite_display_flag)
00280 {
00281 v_axis = mpeg3bits_getbit_noptr(video->vstream);
00282 video->field_sequence = mpeg3bits_getbits(video->vstream, 3);
00283 sub_carrier = mpeg3bits_getbit_noptr(video->vstream);
00284 burst_amplitude = mpeg3bits_getbits(video->vstream, 7);
00285 sub_carrier_phase = mpeg3bits_getbyte_noptr(video->vstream);
00286 }
00287 return 0;
00288 }
00289
00290
00291
00292
00293 int mpeg3video_picture_spatial_scalable_extension(mpeg3video_t *video)
00294 {
00295 video->pict_scal = 1;
00296
00297 video->lltempref = mpeg3bits_getbits(video->vstream, 10);
00298 mpeg3bits_getbit_noptr(video->vstream);
00299 video->llx0 = mpeg3bits_getbits(video->vstream, 15);
00300 if(video->llx0 >= 16384) video->llx0 -= 32768;
00301 mpeg3bits_getbit_noptr(video->vstream);
00302 video->lly0 = mpeg3bits_getbits(video->vstream, 15);
00303 if(video->lly0 >= 16384) video->lly0 -= 32768;
00304 video->stwc_table_index = mpeg3bits_getbits(video->vstream, 2);
00305 video->llprog_frame = mpeg3bits_getbit_noptr(video->vstream);
00306 video->llfieldsel = mpeg3bits_getbit_noptr(video->vstream);
00307 return 0;
00308 }
00309
00310
00311
00312
00313
00314
00315
00316
00317 int mpeg3video_picture_temporal_scalable_extension(mpeg3video_t *video)
00318 {
00319 fprintf(stderr, "mpeg3video_picture_temporal_scalable_extension: temporal scalability not supported\n");
00320 return 0;
00321 }
00322
00323
00324
00325
00326 int mpeg3video_ext_user_data(mpeg3video_t *video)
00327 {
00328 int code = mpeg3bits_next_startcode(video->vstream);
00329
00330
00331 while((code == MPEG3_EXT_START_CODE || code == MPEG3_USER_START_CODE) &&
00332 !mpeg3bits_eof(video->vstream))
00333 {
00334 mpeg3bits_refill(video->vstream);
00335
00336 if(code == MPEG3_EXT_START_CODE)
00337 {
00338 int ext_id = mpeg3bits_getbits(video->vstream, 4);
00339 switch(ext_id)
00340 {
00341 case SEQ_ID:
00342 mpeg3video_sequence_extension(video);
00343 break;
00344 case DISP_ID:
00345 mpeg3video_sequence_display_extension(video);
00346 break;
00347 case QUANT_ID:
00348 mpeg3video_quant_matrix_extension(video);
00349 break;
00350 case SEQSCAL_ID:
00351 mpeg3video_sequence_scalable_extension(video);
00352 break;
00353 case PANSCAN_ID:
00354 mpeg3video_picture_display_extension(video);
00355 break;
00356 case CODING_ID:
00357 mpeg3video_picture_coding_extension(video);
00358 break;
00359 case SPATSCAL_ID:
00360 mpeg3video_picture_spatial_scalable_extension(video);
00361 break;
00362 case TEMPSCAL_ID:
00363 mpeg3video_picture_temporal_scalable_extension(video);
00364 break;
00365 default:
00366 fprintf(stderr,"mpeg3video_ext_user_data: reserved extension start code ID %d\n", ext_id);
00367 break;
00368 }
00369 }
00370 code = mpeg3bits_next_startcode(video->vstream);
00371 }
00372
00373
00374
00375
00376
00377
00378 return 0;
00379 }
00380
00381
00382
00383
00384 int mpeg3video_getgophdr(mpeg3video_t *video)
00385 {
00386 int drop_flag, closed_gop, broken_link;
00387
00388
00389 video->has_gops = 1;
00390 drop_flag = mpeg3bits_getbit_noptr(video->vstream);
00391 video->gop_timecode.hour = mpeg3bits_getbits(video->vstream, 5);
00392 video->gop_timecode.minute = mpeg3bits_getbits(video->vstream, 6);
00393 mpeg3bits_getbit_noptr(video->vstream);
00394 video->gop_timecode.second = mpeg3bits_getbits(video->vstream, 6);
00395 video->gop_timecode.frame = mpeg3bits_getbits(video->vstream, 6);
00396 closed_gop = mpeg3bits_getbit_noptr(video->vstream);
00397 broken_link = mpeg3bits_getbit_noptr(video->vstream);
00398
00399
00400
00401
00402
00403
00404 return mpeg3bits_error(video->vstream);
00405 }
00406
00407
00408
00409 int mpeg3video_getpicturehdr(mpeg3video_t *video)
00410 {
00411 int temp_ref, vbv_delay;
00412
00413 video->pict_scal = 0;
00414
00415 temp_ref = mpeg3bits_getbits(video->vstream, 10);
00416 video->pict_type = mpeg3bits_getbits(video->vstream, 3);
00417 vbv_delay = mpeg3bits_getbits(video->vstream, 16);
00418
00419 if(video->pict_type == P_TYPE || video->pict_type == B_TYPE)
00420 {
00421 video->full_forw = mpeg3bits_getbit_noptr(video->vstream);
00422 video->forw_r_size = mpeg3bits_getbits(video->vstream, 3) - 1;
00423 }
00424
00425 if(video->pict_type == B_TYPE)
00426 {
00427 video->full_back = mpeg3bits_getbit_noptr(video->vstream);
00428 video->back_r_size = mpeg3bits_getbits(video->vstream, 3) - 1;
00429 }
00430
00431
00432 while(mpeg3bits_getbit_noptr(video->vstream) &&
00433 !mpeg3bits_eof(video->vstream))
00434 mpeg3bits_getbyte_noptr(video->vstream);
00435 return 0;
00436 }
00437
00438
00439 int mpeg3video_get_header(mpeg3video_t *video, int dont_repeat)
00440 {
00441 unsigned int code;
00442 mpeg3_t *file = video->file;
00443 mpeg3_vtrack_t *track = video->track;
00444 mpeg3_bits_t *vstream = video->vstream;
00445 mpeg3_demuxer_t *demuxer = track->demuxer;
00446
00447
00448
00449
00450
00451 if(video->repeat_count - video->current_repeat >= 100 && !dont_repeat)
00452 {
00453 return 0;
00454 }
00455
00456 if(dont_repeat)
00457 {
00458 video->repeat_count = 0;
00459 video->current_repeat = 0;
00460 }
00461 else
00462 video->repeat_count -= video->current_repeat;
00463
00464
00465 if(video->repeat_count < 0) video->repeat_count = 0;
00466
00467 while(1)
00468 {
00469
00470 code = mpeg3bits_next_startcode(vstream);
00471
00472
00473 if(mpeg3bits_eof(vstream)) return 1;
00474
00475
00476 if(code != MPEG3_SEQUENCE_END_CODE) mpeg3bits_refill(vstream);
00477
00478 switch(code)
00479 {
00480 case MPEG3_SEQUENCE_START_CODE:
00481 video->found_seqhdr = 1;
00482 mpeg3video_getseqhdr(video);
00483 mpeg3video_ext_user_data(video);
00484 break;
00485
00486 case MPEG3_GOP_START_CODE:
00487 mpeg3video_getgophdr(video);
00488 mpeg3video_ext_user_data(video);
00489 break;
00490
00491 case MPEG3_PICTURE_START_CODE:
00492 mpeg3video_getpicturehdr(video);
00493 mpeg3video_ext_user_data(video);
00494 if(video->found_seqhdr) return 0;
00495 break;
00496
00497 case MPEG3_SEQUENCE_END_CODE:
00498
00499 mpeg3bits_refill(vstream);
00500 break;
00501
00502 default:
00503 break;
00504 }
00505 }
00506
00507
00508 return 1;
00509 }
00510
00511 int mpeg3video_ext_bit_info(mpeg3_slice_buffer_t *slice_buffer)
00512 {
00513 while(mpeg3slice_getbit(slice_buffer)) mpeg3slice_getbyte(slice_buffer);
00514 return 0;
00515 }
00516
00517
00518 int mpeg3video_getslicehdr(mpeg3_slice_t *slice, mpeg3video_t *video)
00519 {
00520 int slice_vertical_position_extension, intra_slice;
00521 int qs;
00522
00523 slice_vertical_position_extension = (video->mpeg2 && video->vertical_size > 2800) ?
00524 mpeg3slice_getbits(slice->slice_buffer, 3) : 0;
00525
00526 if(video->scalable_mode == SC_DP) slice->pri_brk = mpeg3slice_getbits(slice->slice_buffer, 7);
00527
00528 qs = mpeg3slice_getbits(slice->slice_buffer, 5);
00529 slice->quant_scale = video->mpeg2 ? (video->qscale_type ? mpeg3_non_linear_mquant_table[qs] : (qs << 1)) : qs;
00530
00531 if(mpeg3slice_getbit(slice->slice_buffer))
00532 {
00533 intra_slice = mpeg3slice_getbit(slice->slice_buffer);
00534 mpeg3slice_getbits(slice->slice_buffer, 7);
00535 mpeg3video_ext_bit_info(slice->slice_buffer);
00536 }
00537 else
00538 intra_slice = 0;
00539
00540 return slice_vertical_position_extension;
00541 }
00542
00543