00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "mpeg2config.h"
00026
00027 #include <inttypes.h>
00028 #include <stdlib.h>
00029 #include <string.h>
00030
00031 #include "mpeg2.h"
00032 #include "attributes.h"
00033 #include "mpeg2_internal.h"
00034
00035 #define SEQ_EXT 2
00036 #define SEQ_DISPLAY_EXT 4
00037 #define QUANT_MATRIX_EXT 8
00038 #define COPYRIGHT_EXT 0x10
00039 #define PIC_DISPLAY_EXT 0x80
00040 #define PIC_CODING_EXT 0x100
00041
00042
00043 static const uint8_t default_intra_quantizer_matrix[64] ATTR_ALIGN(16) = {
00044 8,
00045 16, 16,
00046 19, 16, 19,
00047 22, 22, 22, 22,
00048 22, 22, 26, 24, 26,
00049 27, 27, 27, 26, 26, 26,
00050 26, 27, 27, 27, 29, 29, 29,
00051 34, 34, 34, 29, 29, 29, 27, 27,
00052 29, 29, 32, 32, 34, 34, 37,
00053 38, 37, 35, 35, 34, 35,
00054 38, 38, 40, 40, 40,
00055 48, 48, 46, 46,
00056 56, 56, 58,
00057 69, 69,
00058 83
00059 };
00060
00061 uint8_t mpeg2_scan_norm[64] ATTR_ALIGN(16) = {
00062
00063 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5,
00064 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28,
00065 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51,
00066 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63
00067 };
00068
00069 uint8_t mpeg2_scan_alt[64] ATTR_ALIGN(16) = {
00070
00071 0, 8, 16, 24, 1, 9, 2, 10, 17, 25, 32, 40, 48, 56, 57, 49,
00072 41, 33, 26, 18, 3, 11, 4, 12, 19, 27, 34, 42, 50, 58, 35, 43,
00073 51, 59, 20, 28, 5, 13, 6, 14, 21, 29, 36, 44, 52, 60, 37, 45,
00074 53, 61, 22, 30, 7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63
00075 };
00076
00077 void mpeg2_header_state_init (mpeg2dec_t * mpeg2dec)
00078 {
00079 if (mpeg2dec->sequence.width != (unsigned)-1) {
00080 int i;
00081
00082 mpeg2dec->sequence.width = (unsigned)-1;
00083 if (!mpeg2dec->custom_fbuf)
00084 for (i = mpeg2dec->alloc_index_user;
00085 i < mpeg2dec->alloc_index; i++) {
00086 mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[0]);
00087 mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[1]);
00088 mpeg2_free (mpeg2dec->fbuf_alloc[i].fbuf.buf[2]);
00089 }
00090 if (mpeg2dec->convert_start)
00091 for (i = 0; i < 3; i++) {
00092 mpeg2_free (mpeg2dec->yuv_buf[i][0]);
00093 mpeg2_free (mpeg2dec->yuv_buf[i][1]);
00094 mpeg2_free (mpeg2dec->yuv_buf[i][2]);
00095 }
00096 if (mpeg2dec->decoder.convert_id)
00097 mpeg2_free (mpeg2dec->decoder.convert_id);
00098 }
00099 mpeg2dec->decoder.coding_type = I_TYPE;
00100 mpeg2dec->decoder.convert = NULL;
00101 mpeg2dec->decoder.convert_id = NULL;
00102 mpeg2dec->picture = mpeg2dec->pictures;
00103 mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[0].fbuf;
00104 mpeg2dec->fbuf[1] = &mpeg2dec->fbuf_alloc[1].fbuf;
00105 mpeg2dec->fbuf[2] = &mpeg2dec->fbuf_alloc[2].fbuf;
00106 mpeg2dec->first = 1;
00107 mpeg2dec->alloc_index = 0;
00108 mpeg2dec->alloc_index_user = 0;
00109 mpeg2dec->first_decode_slice = 1;
00110 mpeg2dec->nb_decode_slices = 0xb0 - 1;
00111 mpeg2dec->convert = NULL;
00112 mpeg2dec->convert_start = NULL;
00113 mpeg2dec->custom_fbuf = 0;
00114 mpeg2dec->yuv_index = 0;
00115 }
00116
00117 void mpeg2_reset_info (mpeg2_info_t * info)
00118 {
00119 info->current_picture = info->current_picture_2nd = NULL;
00120 info->display_picture = info->display_picture_2nd = NULL;
00121 info->current_fbuf = info->display_fbuf = info->discard_fbuf = NULL;
00122 }
00123
00124 static void info_user_data (mpeg2dec_t * mpeg2dec)
00125 {
00126 if (mpeg2dec->user_data_len) {
00127 mpeg2dec->info.user_data = mpeg2dec->chunk_buffer;
00128 mpeg2dec->info.user_data_len = mpeg2dec->user_data_len - 3;
00129 }
00130 }
00131
00132 int mpeg2_header_sequence (mpeg2dec_t * mpeg2dec)
00133 {
00134 uint8_t * buffer = mpeg2dec->chunk_start;
00135 mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence);
00136 static unsigned int frame_period[16] = {
00137 0, 1126125, 1125000, 1080000, 900900, 900000, 540000, 450450, 450000,
00138
00139 1800000,
00140
00141 5400000, 2700000, 2250000, 1800000, 0, 0
00142 };
00143 int i;
00144
00145 if ((buffer[6] & 0x20) != 0x20)
00146 return 1;
00147
00148 i = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2];
00149 if (! (sequence->display_width = sequence->picture_width = i >> 12))
00150 return 1;
00151 if (! (sequence->display_height = sequence->picture_height = i & 0xfff))
00152 return 1;
00153 sequence->width = (sequence->picture_width + 15) & ~15;
00154 sequence->height = (sequence->picture_height + 15) & ~15;
00155 sequence->chroma_width = sequence->width >> 1;
00156 sequence->chroma_height = sequence->height >> 1;
00157
00158 sequence->flags = (SEQ_FLAG_PROGRESSIVE_SEQUENCE |
00159 SEQ_VIDEO_FORMAT_UNSPECIFIED);
00160
00161 sequence->pixel_width = buffer[3] >> 4;
00162 sequence->frame_period = frame_period[buffer[3] & 15];
00163
00164 sequence->byte_rate = (buffer[4]<<10) | (buffer[5]<<2) | (buffer[6]>>6);
00165
00166 sequence->vbv_buffer_size = ((buffer[6]<<16)|(buffer[7]<<8))&0x1ff800;
00167
00168 if (buffer[7] & 4)
00169 sequence->flags |= SEQ_FLAG_CONSTRAINED_PARAMETERS;
00170
00171 mpeg2dec->copy_matrix = 3;
00172 if (buffer[7] & 2) {
00173 for (i = 0; i < 64; i++)
00174 mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] =
00175 (buffer[i+7] << 7) | (buffer[i+8] >> 1);
00176 buffer += 64;
00177 } else
00178 for (i = 0; i < 64; i++)
00179 mpeg2dec->new_quantizer_matrix[0][mpeg2_scan_norm[i]] =
00180 default_intra_quantizer_matrix[i];
00181
00182 if (buffer[7] & 1)
00183 for (i = 0; i < 64; i++)
00184 mpeg2dec->new_quantizer_matrix[1][mpeg2_scan_norm[i]] =
00185 buffer[i+8];
00186 else
00187 memset (mpeg2dec->new_quantizer_matrix[1], 16, 64);
00188
00189 sequence->profile_level_id = 0x80;
00190 sequence->colour_primaries = 0;
00191 sequence->transfer_characteristics = 0;
00192 sequence->matrix_coefficients = 0;
00193
00194 mpeg2dec->ext_state = SEQ_EXT;
00195 mpeg2dec->state = STATE_SEQUENCE;
00196 mpeg2dec->display_offset_x = mpeg2dec->display_offset_y = 0;
00197
00198 return 0;
00199 }
00200
00201 static int sequence_ext (mpeg2dec_t * mpeg2dec)
00202 {
00203 uint8_t * buffer = mpeg2dec->chunk_start;
00204 mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence);
00205 uint32_t flags;
00206
00207 if (!(buffer[3] & 1))
00208 return 1;
00209
00210 sequence->profile_level_id = (buffer[0] << 4) | (buffer[1] >> 4);
00211
00212 sequence->display_width = sequence->picture_width +=
00213 ((buffer[1] << 13) | (buffer[2] << 5)) & 0x3000;
00214 sequence->display_height = sequence->picture_height +=
00215 (buffer[2] << 7) & 0x3000;
00216 sequence->width = (sequence->picture_width + 15) & ~15;
00217 sequence->height = (sequence->picture_height + 15) & ~15;
00218 flags = sequence->flags | SEQ_FLAG_MPEG2;
00219 if (!(buffer[1] & 8)) {
00220 flags &= ~SEQ_FLAG_PROGRESSIVE_SEQUENCE;
00221 sequence->height = (sequence->height + 31) & ~31;
00222 }
00223 if (buffer[5] & 0x80)
00224 flags |= SEQ_FLAG_LOW_DELAY;
00225 sequence->flags = flags;
00226 sequence->chroma_width = sequence->width;
00227 sequence->chroma_height = sequence->height;
00228 switch (buffer[1] & 6) {
00229 case 0:
00230 return 1;
00231 case 2:
00232 sequence->chroma_height >>= 1;
00233 case 4:
00234 sequence->chroma_width >>= 1;
00235 }
00236
00237 sequence->byte_rate += ((buffer[2]<<25) | (buffer[3]<<17)) & 0x3ffc0000;
00238
00239 sequence->vbv_buffer_size |= buffer[4] << 21;
00240
00241 sequence->frame_period =
00242 sequence->frame_period * ((buffer[5]&31)+1) / (((buffer[5]>>2)&3)+1);
00243
00244 mpeg2dec->ext_state = SEQ_DISPLAY_EXT;
00245
00246 return 0;
00247 }
00248
00249 static int sequence_display_ext (mpeg2dec_t * mpeg2dec)
00250 {
00251 uint8_t * buffer = mpeg2dec->chunk_start;
00252 mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence);
00253
00254 sequence->flags = ((sequence->flags & ~SEQ_MASK_VIDEO_FORMAT) |
00255 ((buffer[0]<<4) & SEQ_MASK_VIDEO_FORMAT));
00256 if (buffer[0] & 1) {
00257 sequence->flags |= SEQ_FLAG_COLOUR_DESCRIPTION;
00258 sequence->colour_primaries = buffer[1];
00259 sequence->transfer_characteristics = buffer[2];
00260 sequence->matrix_coefficients = buffer[3];
00261 buffer += 3;
00262 }
00263
00264 if (!(buffer[2] & 2))
00265 return 1;
00266
00267 if( (buffer[1] << 6) | (buffer[2] >> 2) )
00268 sequence->display_width = (buffer[1] << 6) | (buffer[2] >> 2);
00269 if( ((buffer[2]& 1 ) << 13) | (buffer[3] << 5) | (buffer[4] >> 3) )
00270 sequence->display_height =
00271 ((buffer[2]& 1 ) << 13) | (buffer[3] << 5) | (buffer[4] >> 3);
00272
00273 return 0;
00274 }
00275
00276 static inline void simplify (unsigned int * u, unsigned int * v)
00277 {
00278 unsigned int a, b, tmp;
00279
00280 a = *u; b = *v;
00281 while (a) {
00282 tmp = a; a = b % tmp; b = tmp;
00283 }
00284 *u /= b; *v /= b;
00285 }
00286
00287 static inline void finalize_sequence (mpeg2_sequence_t * sequence)
00288 {
00289 int width;
00290 int height;
00291
00292 sequence->byte_rate *= 50;
00293
00294 if (sequence->flags & SEQ_FLAG_MPEG2) {
00295 switch (sequence->pixel_width) {
00296 case 1:
00297 sequence->pixel_width = sequence->pixel_height = 1; return;
00298 case 2:
00299 width = 4; height = 3; break;
00300 case 3:
00301 width = 16; height = 9; break;
00302 case 4:
00303 width = 221; height = 100; break;
00304 default:
00305 sequence->pixel_width = sequence->pixel_height = 0; return;
00306 }
00307 width *= sequence->display_height;
00308 height *= sequence->display_width;
00309
00310 } else {
00311 if (sequence->byte_rate == 50 * 0x3ffff)
00312 sequence->byte_rate = 0;
00313
00314 switch (sequence->pixel_width) {
00315 case 0: case 15:
00316 sequence->pixel_width = sequence->pixel_height = 0; return;
00317 case 1:
00318 sequence->pixel_width = sequence->pixel_height = 1; return;
00319 case 3:
00320 sequence->pixel_width = 64; sequence->pixel_height = 45; return;
00321 case 6:
00322 sequence->pixel_width = 32; sequence->pixel_height = 27; return;
00323 case 8:
00324 sequence->pixel_width = 59; sequence->pixel_height = 54; return;
00325 case 12:
00326 sequence->pixel_width = 10; sequence->pixel_height = 11; return;
00327 default:
00328 height = 88 * sequence->pixel_width + 1171;
00329 width = 2000;
00330 }
00331 }
00332
00333 sequence->pixel_width = width;
00334 sequence->pixel_height = height;
00335 simplify (&sequence->pixel_width, &sequence->pixel_height);
00336 }
00337
00338 int mpeg2_guess_aspect (const mpeg2_sequence_t * sequence,
00339 unsigned int * pixel_width,
00340 unsigned int * pixel_height)
00341 {
00342 static struct {
00343 unsigned int width, height;
00344 } video_modes[] = {
00345 {720, 576},
00346 {704, 576},
00347 {544, 576},
00348 {528, 576},
00349 {480, 576},
00350 {352, 576},
00351 {352, 288},
00352 {176, 144},
00353 {720, 486},
00354 {704, 486},
00355 {720, 480},
00356 {704, 480},
00357 {544, 480},
00358 {528, 480},
00359 {480, 480},
00360 {352, 480},
00361 {352, 240}
00362 };
00363 unsigned int width, height, pix_width, pix_height, i, DAR_16_9;
00364
00365 *pixel_width = sequence->pixel_width;
00366 *pixel_height = sequence->pixel_height;
00367 width = sequence->picture_width;
00368 height = sequence->picture_height;
00369 for (i = 0; i < sizeof (video_modes) / sizeof (video_modes[0]); i++)
00370 if (width == video_modes[i].width && height == video_modes[i].height)
00371 break;
00372 if (i == sizeof (video_modes) / sizeof (video_modes[0]) ||
00373 (sequence->pixel_width == 1 && sequence->pixel_height == 1) ||
00374 width != sequence->display_width || height != sequence->display_height)
00375 return 0;
00376
00377 for (pix_height = 1; height * pix_height < 480; pix_height <<= 1);
00378 height *= pix_height;
00379 for (pix_width = 1; width * pix_width <= 352; pix_width <<= 1);
00380 width *= pix_width;
00381
00382 if (! (sequence->flags & SEQ_FLAG_MPEG2)) {
00383 static unsigned int mpeg1_check[2][2] = {{11, 54}, {27, 45}};
00384 DAR_16_9 = (sequence->pixel_height == 27 ||
00385 sequence->pixel_height == 45);
00386 if (width < 704 ||
00387 sequence->pixel_height != mpeg1_check[DAR_16_9][height == 576])
00388 return 0;
00389 } else {
00390 DAR_16_9 = (3 * sequence->picture_width * sequence->pixel_width >
00391 4 * sequence->picture_height * sequence->pixel_height);
00392 switch (width) {
00393 case 528: case 544: pix_width *= 4; pix_height *= 3; break;
00394 case 480: pix_width *= 3; pix_height *= 2; break;
00395 }
00396 }
00397 if (DAR_16_9) {
00398 pix_width *= 4; pix_height *= 3;
00399 }
00400 if (height == 576) {
00401 pix_width *= 59; pix_height *= 54;
00402 } else {
00403 pix_width *= 10; pix_height *= 11;
00404 }
00405 *pixel_width = pix_width;
00406 *pixel_height = pix_height;
00407 simplify (pixel_width, pixel_height);
00408 return (height == 576) ? 1 : 2;
00409 }
00410
00411 static void copy_matrix (mpeg2dec_t * mpeg2dec, int index)
00412 {
00413 if (memcmp (mpeg2dec->quantizer_matrix[index],
00414 mpeg2dec->new_quantizer_matrix[index], 64)) {
00415 memcpy (mpeg2dec->quantizer_matrix[index],
00416 mpeg2dec->new_quantizer_matrix[index], 64);
00417 mpeg2dec->scaled[index] = -1;
00418 }
00419 }
00420
00421 static void finalize_matrix (mpeg2dec_t * mpeg2dec)
00422 {
00423 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
00424 int i;
00425
00426 for (i = 0; i < 2; i++) {
00427 if (mpeg2dec->copy_matrix & (1 << i))
00428 copy_matrix (mpeg2dec, i);
00429 if ((mpeg2dec->copy_matrix & (4 << i)) &&
00430 memcmp (mpeg2dec->quantizer_matrix[i],
00431 mpeg2dec->new_quantizer_matrix[i+2], 64)) {
00432 copy_matrix (mpeg2dec, i + 2);
00433 decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i+2];
00434 } else if (mpeg2dec->copy_matrix & (5 << i))
00435 decoder->chroma_quantizer[i] = decoder->quantizer_prescale[i];
00436 }
00437 }
00438
00439 static mpeg2_state_t invalid_end_action (mpeg2dec_t * mpeg2dec)
00440 {
00441 mpeg2_reset_info (&(mpeg2dec->info));
00442 mpeg2dec->info.gop = NULL;
00443 info_user_data (mpeg2dec);
00444 mpeg2_header_state_init (mpeg2dec);
00445 mpeg2dec->sequence = mpeg2dec->new_sequence;
00446 mpeg2dec->action = mpeg2_seek_header;
00447 mpeg2dec->state = STATE_SEQUENCE;
00448 return STATE_SEQUENCE;
00449 }
00450
00451 void mpeg2_header_sequence_finalize (mpeg2dec_t * mpeg2dec)
00452 {
00453 mpeg2_sequence_t * sequence = &(mpeg2dec->new_sequence);
00454 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
00455
00456 finalize_sequence (sequence);
00457 finalize_matrix (mpeg2dec);
00458
00459 decoder->mpeg1 = !(sequence->flags & SEQ_FLAG_MPEG2);
00460 decoder->width = sequence->width;
00461 decoder->height = sequence->height;
00462 decoder->vertical_position_extension = (sequence->picture_height > 2800);
00463 decoder->chroma_format = ((sequence->chroma_width == sequence->width) +
00464 (sequence->chroma_height == sequence->height));
00465
00466 if (mpeg2dec->sequence.width != (unsigned)-1) {
00467
00468
00469
00470
00471
00472
00473
00474
00475
00476 if (sequence->width != mpeg2dec->sequence.width ||
00477 sequence->height != mpeg2dec->sequence.height ||
00478 sequence->chroma_width != mpeg2dec->sequence.chroma_width ||
00479 sequence->chroma_height != mpeg2dec->sequence.chroma_height ||
00480 ((sequence->flags ^ mpeg2dec->sequence.flags) &
00481 SEQ_FLAG_LOW_DELAY)) {
00482 decoder->stride_frame = sequence->width;
00483 mpeg2_header_end (mpeg2dec);
00484 mpeg2dec->action = invalid_end_action;
00485 mpeg2dec->state = STATE_INVALID_END;
00486 return;
00487 }
00488 mpeg2dec->state = (memcmp (&(mpeg2dec->sequence), sequence,
00489 sizeof (mpeg2_sequence_t)) ?
00490 STATE_SEQUENCE_MODIFIED : STATE_SEQUENCE_REPEATED);
00491 } else
00492 decoder->stride_frame = sequence->width;
00493 mpeg2dec->sequence = *sequence;
00494 mpeg2_reset_info (&(mpeg2dec->info));
00495 mpeg2dec->info.sequence = &(mpeg2dec->sequence);
00496 mpeg2dec->info.gop = NULL;
00497 info_user_data (mpeg2dec);
00498 }
00499
00500 int mpeg2_header_gop (mpeg2dec_t * mpeg2dec)
00501 {
00502 uint8_t * buffer = mpeg2dec->chunk_start;
00503 mpeg2_gop_t * gop = &(mpeg2dec->new_gop);
00504
00505 if (! (buffer[1] & 8))
00506 return 1;
00507 gop->hours = (buffer[0] >> 2) & 31;
00508 gop->minutes = ((buffer[0] << 4) | (buffer[1] >> 4)) & 63;
00509 gop->seconds = ((buffer[1] << 3) | (buffer[2] >> 5)) & 63;
00510 gop->pictures = ((buffer[2] << 1) | (buffer[3] >> 7)) & 63;
00511 gop->flags = (buffer[0] >> 7) | ((buffer[3] >> 4) & 6);
00512 mpeg2dec->state = STATE_GOP;
00513 return 0;
00514 }
00515
00516 void mpeg2_header_gop_finalize (mpeg2dec_t * mpeg2dec)
00517 {
00518 mpeg2dec->gop = mpeg2dec->new_gop;
00519 mpeg2_reset_info (&(mpeg2dec->info));
00520 mpeg2dec->info.gop = &(mpeg2dec->gop);
00521 info_user_data (mpeg2dec);
00522 }
00523
00524 void mpeg2_set_fbuf (mpeg2dec_t * mpeg2dec, int b_type)
00525 {
00526 int i;
00527
00528 for (i = 0; i < 3; i++)
00529 if (mpeg2dec->fbuf[1] != &mpeg2dec->fbuf_alloc[i].fbuf &&
00530 mpeg2dec->fbuf[2] != &mpeg2dec->fbuf_alloc[i].fbuf) {
00531 mpeg2dec->fbuf[0] = &mpeg2dec->fbuf_alloc[i].fbuf;
00532 mpeg2dec->info.current_fbuf = mpeg2dec->fbuf[0];
00533 if (b_type || (mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) {
00534 if (b_type || mpeg2dec->convert)
00535 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[0];
00536 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[0];
00537 }
00538 break;
00539 }
00540 }
00541
00542 int mpeg2_header_picture (mpeg2dec_t * mpeg2dec)
00543 {
00544 uint8_t * buffer = mpeg2dec->chunk_start;
00545 mpeg2_picture_t * picture = &(mpeg2dec->new_picture);
00546 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
00547 int type;
00548
00549 mpeg2dec->state = ((mpeg2dec->state != STATE_SLICE_1ST) ?
00550 STATE_PICTURE : STATE_PICTURE_2ND);
00551 mpeg2dec->ext_state = PIC_CODING_EXT;
00552
00553 picture->temporal_reference = (buffer[0] << 2) | (buffer[1] >> 6);
00554
00555 type = (buffer [1] >> 3) & 7;
00556 if (type == PIC_FLAG_CODING_TYPE_P || type == PIC_FLAG_CODING_TYPE_B) {
00557
00558 decoder->f_motion.f_code[1] = (buffer[3] >> 2) & 1;
00559 decoder->f_motion.f_code[0] =
00560 (((buffer[3] << 1) | (buffer[4] >> 7)) & 7) - 1;
00561 decoder->b_motion.f_code[1] = (buffer[4] >> 6) & 1;
00562 decoder->b_motion.f_code[0] = ((buffer[4] >> 3) & 7) - 1;
00563 }
00564
00565 picture->flags = PIC_FLAG_PROGRESSIVE_FRAME | type;
00566 picture->tag = picture->tag2 = 0;
00567 if (mpeg2dec->num_tags) {
00568 if (mpeg2dec->bytes_since_tag >= mpeg2dec->chunk_ptr - buffer + 4) {
00569 mpeg2dec->num_tags = 0;
00570 picture->tag = mpeg2dec->tag_current;
00571 picture->tag2 = mpeg2dec->tag2_current;
00572 picture->flags |= PIC_FLAG_TAGS;
00573 } else if (mpeg2dec->num_tags > 1) {
00574 mpeg2dec->num_tags = 1;
00575 picture->tag = mpeg2dec->tag_previous;
00576 picture->tag2 = mpeg2dec->tag2_previous;
00577 picture->flags |= PIC_FLAG_TAGS;
00578 }
00579 }
00580 picture->nb_fields = 2;
00581 picture->display_offset[0].x = picture->display_offset[1].x =
00582 picture->display_offset[2].x = mpeg2dec->display_offset_x;
00583 picture->display_offset[0].y = picture->display_offset[1].y =
00584 picture->display_offset[2].y = mpeg2dec->display_offset_y;
00585
00586
00587
00588 mpeg2dec->q_scale_type = 0;
00589 decoder->intra_dc_precision = 7;
00590 decoder->frame_pred_frame_dct = 1;
00591 decoder->concealment_motion_vectors = 0;
00592 decoder->scan = mpeg2_scan_norm;
00593 decoder->picture_structure = FRAME_PICTURE;
00594 mpeg2dec->copy_matrix = 0;
00595
00596 return 0;
00597 }
00598
00599 static int picture_coding_ext (mpeg2dec_t * mpeg2dec)
00600 {
00601 uint8_t * buffer = mpeg2dec->chunk_start;
00602 mpeg2_picture_t * picture = &(mpeg2dec->new_picture);
00603 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
00604 uint32_t flags;
00605
00606
00607 decoder->f_motion.f_code[0] = (buffer[0] & 15) - 1;
00608 decoder->f_motion.f_code[1] = (buffer[1] >> 4) - 1;
00609 decoder->b_motion.f_code[0] = (buffer[1] & 15) - 1;
00610 decoder->b_motion.f_code[1] = (buffer[2] >> 4) - 1;
00611
00612 flags = picture->flags;
00613 decoder->intra_dc_precision = 7 - ((buffer[2] >> 2) & 3);
00614 decoder->picture_structure = buffer[2] & 3;
00615 switch (decoder->picture_structure) {
00616 case TOP_FIELD:
00617 flags |= PIC_FLAG_TOP_FIELD_FIRST;
00618 case BOTTOM_FIELD:
00619 picture->nb_fields = 1;
00620 break;
00621 case FRAME_PICTURE:
00622 if (!(mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)) {
00623 picture->nb_fields = (buffer[3] & 2) ? 3 : 2;
00624 flags |= (buffer[3] & 128) ? PIC_FLAG_TOP_FIELD_FIRST : 0;
00625 } else
00626 picture->nb_fields = (buffer[3]&2) ? ((buffer[3]&128) ? 6 : 4) : 2;
00627 break;
00628 default:
00629 return 1;
00630 }
00631 decoder->top_field_first = buffer[3] >> 7;
00632 decoder->frame_pred_frame_dct = (buffer[3] >> 6) & 1;
00633 decoder->concealment_motion_vectors = (buffer[3] >> 5) & 1;
00634 mpeg2dec->q_scale_type = buffer[3] & 16;
00635 decoder->intra_vlc_format = (buffer[3] >> 3) & 1;
00636 decoder->scan = (buffer[3] & 4) ? mpeg2_scan_alt : mpeg2_scan_norm;
00637 if (!(buffer[4] & 0x80))
00638 flags &= ~PIC_FLAG_PROGRESSIVE_FRAME;
00639 if (buffer[4] & 0x40)
00640 flags |= (((buffer[4]<<26) | (buffer[5]<<18) | (buffer[6]<<10)) &
00641 PIC_MASK_COMPOSITE_DISPLAY) | PIC_FLAG_COMPOSITE_DISPLAY;
00642 if ((buffer[3] >> 1) & 1)
00643 flags |= PIC_FLAG_REPEAT_FIELD;
00644 picture->flags = flags;
00645
00646 mpeg2dec->ext_state = PIC_DISPLAY_EXT | COPYRIGHT_EXT | QUANT_MATRIX_EXT;
00647
00648 return 0;
00649 }
00650
00651 static int picture_display_ext (mpeg2dec_t * mpeg2dec)
00652 {
00653 uint8_t * buffer = mpeg2dec->chunk_start;
00654 mpeg2_picture_t * picture = &(mpeg2dec->new_picture);
00655 int i, nb_pos;
00656
00657 nb_pos = picture->nb_fields;
00658 if (mpeg2dec->sequence.flags & SEQ_FLAG_PROGRESSIVE_SEQUENCE)
00659 nb_pos >>= 1;
00660
00661 for (i = 0; i < nb_pos; i++) {
00662 int x, y;
00663
00664 x = ((buffer[4*i] << 24) | (buffer[4*i+1] << 16) |
00665 (buffer[4*i+2] << 8) | buffer[4*i+3]) >> (11-2*i);
00666 y = ((buffer[4*i+2] << 24) | (buffer[4*i+3] << 16) |
00667 (buffer[4*i+4] << 8) | buffer[4*i+5]) >> (10-2*i);
00668 if (! (x & y & 1))
00669 return 1;
00670 picture->display_offset[i].x = mpeg2dec->display_offset_x = x >> 1;
00671 picture->display_offset[i].y = mpeg2dec->display_offset_y = y >> 1;
00672 }
00673 for (; i < 3; i++) {
00674 picture->display_offset[i].x = mpeg2dec->display_offset_x;
00675 picture->display_offset[i].y = mpeg2dec->display_offset_y;
00676 }
00677 return 0;
00678 }
00679
00680 void mpeg2_header_picture_finalize (mpeg2dec_t * mpeg2dec, uint32_t accels)
00681 {
00682 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
00683 int old_type_b = (decoder->coding_type == B_TYPE);
00684 int low_delay = mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY;
00685
00686 finalize_matrix (mpeg2dec);
00687 decoder->coding_type = mpeg2dec->new_picture.flags & PIC_MASK_CODING_TYPE;
00688
00689 if (mpeg2dec->state == STATE_PICTURE) {
00690 mpeg2_picture_t * picture;
00691 mpeg2_picture_t * other;
00692
00693 decoder->second_field = 0;
00694
00695 picture = other = mpeg2dec->pictures;
00696 if (old_type_b ^ (mpeg2dec->picture < mpeg2dec->pictures + 2))
00697 picture += 2;
00698 else
00699 other += 2;
00700 mpeg2dec->picture = picture;
00701 *picture = mpeg2dec->new_picture;
00702
00703 if (!old_type_b) {
00704 mpeg2dec->fbuf[2] = mpeg2dec->fbuf[1];
00705 mpeg2dec->fbuf[1] = mpeg2dec->fbuf[0];
00706 }
00707 mpeg2dec->fbuf[0] = NULL;
00708 mpeg2_reset_info (&(mpeg2dec->info));
00709 mpeg2dec->info.current_picture = picture;
00710 mpeg2dec->info.display_picture = picture;
00711 if (decoder->coding_type != B_TYPE) {
00712 if (!low_delay) {
00713 if (mpeg2dec->first) {
00714 mpeg2dec->info.display_picture = NULL;
00715 mpeg2dec->first = 0;
00716 } else {
00717 mpeg2dec->info.display_picture = other;
00718 if (other->nb_fields == 1)
00719 mpeg2dec->info.display_picture_2nd = other + 1;
00720 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[1];
00721 }
00722 }
00723 if (!low_delay + !mpeg2dec->convert)
00724 mpeg2dec->info.discard_fbuf =
00725 mpeg2dec->fbuf[!low_delay + !mpeg2dec->convert];
00726 }
00727 if (mpeg2dec->convert) {
00728 mpeg2_convert_init_t convert_init;
00729 if (!mpeg2dec->convert_start) {
00730 int y_size, uv_size;
00731
00732 mpeg2dec->decoder.convert_id =
00733 mpeg2_malloc (mpeg2dec->convert_id_size,
00734 MPEG2_ALLOC_CONVERT_ID);
00735 mpeg2dec->convert (MPEG2_CONVERT_START,
00736 mpeg2dec->decoder.convert_id,
00737 &(mpeg2dec->sequence),
00738 mpeg2dec->convert_stride, accels,
00739 mpeg2dec->convert_arg, &convert_init);
00740 mpeg2dec->convert_start = convert_init.start;
00741 mpeg2dec->decoder.convert = convert_init.copy;
00742
00743 y_size = decoder->stride_frame * mpeg2dec->sequence.height;
00744 uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format);
00745 mpeg2dec->yuv_buf[0][0] =
00746 (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV);
00747 mpeg2dec->yuv_buf[0][1] =
00748 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
00749 mpeg2dec->yuv_buf[0][2] =
00750 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
00751 mpeg2dec->yuv_buf[1][0] =
00752 (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV);
00753 mpeg2dec->yuv_buf[1][1] =
00754 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
00755 mpeg2dec->yuv_buf[1][2] =
00756 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
00757 y_size = decoder->stride_frame * 32;
00758 uv_size = y_size >> (2 - mpeg2dec->decoder.chroma_format);
00759 mpeg2dec->yuv_buf[2][0] =
00760 (uint8_t *) mpeg2_malloc (y_size, MPEG2_ALLOC_YUV);
00761 mpeg2dec->yuv_buf[2][1] =
00762 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
00763 mpeg2dec->yuv_buf[2][2] =
00764 (uint8_t *) mpeg2_malloc (uv_size, MPEG2_ALLOC_YUV);
00765 }
00766 if (!mpeg2dec->custom_fbuf) {
00767 while (mpeg2dec->alloc_index < 3) {
00768 mpeg2_fbuf_t * fbuf;
00769
00770 fbuf = &mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf;
00771 fbuf->id = NULL;
00772 fbuf->buf[0] =
00773 (uint8_t *) mpeg2_malloc (convert_init.buf_size[0],
00774 MPEG2_ALLOC_CONVERTED);
00775 fbuf->buf[1] =
00776 (uint8_t *) mpeg2_malloc (convert_init.buf_size[1],
00777 MPEG2_ALLOC_CONVERTED);
00778 fbuf->buf[2] =
00779 (uint8_t *) mpeg2_malloc (convert_init.buf_size[2],
00780 MPEG2_ALLOC_CONVERTED);
00781 }
00782 mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE));
00783 }
00784 } else if (!mpeg2dec->custom_fbuf) {
00785 while (mpeg2dec->alloc_index < 3) {
00786 mpeg2_fbuf_t * fbuf;
00787 int y_size, uv_size;
00788
00789 fbuf = &(mpeg2dec->fbuf_alloc[mpeg2dec->alloc_index++].fbuf);
00790 fbuf->id = NULL;
00791 y_size = decoder->stride_frame * mpeg2dec->sequence.height;
00792 uv_size = y_size >> (2 - decoder->chroma_format);
00793 fbuf->buf[0] = (uint8_t *) mpeg2_malloc (y_size,
00794 MPEG2_ALLOC_YUV);
00795 fbuf->buf[1] = (uint8_t *) mpeg2_malloc (uv_size,
00796 MPEG2_ALLOC_YUV);
00797 fbuf->buf[2] = (uint8_t *) mpeg2_malloc (uv_size,
00798 MPEG2_ALLOC_YUV);
00799 }
00800 mpeg2_set_fbuf (mpeg2dec, (decoder->coding_type == B_TYPE));
00801 }
00802 } else {
00803 decoder->second_field = 1;
00804 mpeg2dec->picture++;
00805 *(mpeg2dec->picture) = mpeg2dec->new_picture;
00806 mpeg2dec->info.current_picture_2nd = mpeg2dec->picture;
00807 if (low_delay || decoder->coding_type == B_TYPE)
00808 mpeg2dec->info.display_picture_2nd = mpeg2dec->picture;
00809 }
00810
00811 info_user_data (mpeg2dec);
00812 }
00813
00814 static int copyright_ext (mpeg2dec_t * mpeg2dec)
00815 {
00816 return 0;
00817 }
00818
00819 static int quant_matrix_ext (mpeg2dec_t * mpeg2dec)
00820 {
00821 uint8_t * buffer = mpeg2dec->chunk_start;
00822 int i, j;
00823
00824 for (i = 0; i < 4; i++)
00825 if (buffer[0] & (8 >> i)) {
00826 for (j = 0; j < 64; j++)
00827 mpeg2dec->new_quantizer_matrix[i][mpeg2_scan_norm[j]] =
00828 (buffer[j] << (i+5)) | (buffer[j+1] >> (3-i));
00829 mpeg2dec->copy_matrix |= 1 << i;
00830 buffer += 64;
00831 }
00832
00833 return 0;
00834 }
00835
00836 int mpeg2_header_extension (mpeg2dec_t * mpeg2dec)
00837 {
00838 static int (* parser[]) (mpeg2dec_t *) = {
00839 0, sequence_ext, sequence_display_ext, quant_matrix_ext,
00840 copyright_ext, 0, 0, picture_display_ext, picture_coding_ext
00841 };
00842 int ext, ext_bit;
00843
00844 ext = mpeg2dec->chunk_start[0] >> 4;
00845 ext_bit = 1 << ext;
00846
00847 if (!(mpeg2dec->ext_state & ext_bit))
00848 return 0;
00849 mpeg2dec->ext_state &= ~ext_bit;
00850 return parser[ext] (mpeg2dec);
00851 }
00852
00853 int mpeg2_header_user_data (mpeg2dec_t * mpeg2dec)
00854 {
00855 mpeg2dec->user_data_len += mpeg2dec->chunk_ptr - 1 - mpeg2dec->chunk_start;
00856 mpeg2dec->chunk_start = mpeg2dec->chunk_ptr - 1;
00857
00858 return 0;
00859 }
00860
00861 static void prescale (mpeg2dec_t * mpeg2dec, int index)
00862 {
00863 static int non_linear_scale [] = {
00864 0, 1, 2, 3, 4, 5, 6, 7,
00865 8, 10, 12, 14, 16, 18, 20, 22,
00866 24, 28, 32, 36, 40, 44, 48, 52,
00867 56, 64, 72, 80, 88, 96, 104, 112
00868 };
00869 int i, j, k;
00870 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
00871
00872 if (mpeg2dec->scaled[index] != mpeg2dec->q_scale_type) {
00873 mpeg2dec->scaled[index] = mpeg2dec->q_scale_type;
00874 for (i = 0; i < 32; i++) {
00875 k = mpeg2dec->q_scale_type ? non_linear_scale[i] : (i << 1);
00876 for (j = 0; j < 64; j++)
00877 decoder->quantizer_prescale[index][i][j] =
00878 k * mpeg2dec->quantizer_matrix[index][j];
00879 }
00880 }
00881 }
00882
00883 mpeg2_state_t mpeg2_header_slice_start (mpeg2dec_t * mpeg2dec)
00884 {
00885 mpeg2_decoder_t * decoder = &(mpeg2dec->decoder);
00886
00887 mpeg2dec->info.user_data = NULL; mpeg2dec->info.user_data_len = 0;
00888 mpeg2dec->state = ((mpeg2dec->picture->nb_fields > 1 ||
00889 mpeg2dec->state == STATE_PICTURE_2ND) ?
00890 STATE_SLICE : STATE_SLICE_1ST);
00891
00892 if (mpeg2dec->decoder.coding_type != D_TYPE) {
00893 prescale (mpeg2dec, 0);
00894 if (decoder->chroma_quantizer[0] == decoder->quantizer_prescale[2])
00895 prescale (mpeg2dec, 2);
00896 if (mpeg2dec->decoder.coding_type != I_TYPE) {
00897 prescale (mpeg2dec, 1);
00898 if (decoder->chroma_quantizer[1] == decoder->quantizer_prescale[3])
00899 prescale (mpeg2dec, 3);
00900 }
00901 }
00902
00903 if (!(mpeg2dec->nb_decode_slices))
00904 mpeg2dec->picture->flags |= PIC_FLAG_SKIP;
00905 else if (mpeg2dec->convert_start) {
00906 mpeg2dec->convert_start (decoder->convert_id, mpeg2dec->fbuf[0],
00907 mpeg2dec->picture, mpeg2dec->info.gop);
00908
00909 if (mpeg2dec->decoder.coding_type == B_TYPE)
00910 mpeg2_init_fbuf (&(mpeg2dec->decoder), mpeg2dec->yuv_buf[2],
00911 mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1],
00912 mpeg2dec->yuv_buf[mpeg2dec->yuv_index]);
00913 else {
00914 mpeg2_init_fbuf (&(mpeg2dec->decoder),
00915 mpeg2dec->yuv_buf[mpeg2dec->yuv_index ^ 1],
00916 mpeg2dec->yuv_buf[mpeg2dec->yuv_index],
00917 mpeg2dec->yuv_buf[mpeg2dec->yuv_index]);
00918 if (mpeg2dec->state == STATE_SLICE)
00919 mpeg2dec->yuv_index ^= 1;
00920 }
00921 } else {
00922 int b_type;
00923
00924 b_type = (mpeg2dec->decoder.coding_type == B_TYPE);
00925 mpeg2_init_fbuf (&(mpeg2dec->decoder), mpeg2dec->fbuf[0]->buf,
00926 mpeg2dec->fbuf[b_type + 1]->buf,
00927 mpeg2dec->fbuf[b_type]->buf);
00928 }
00929 mpeg2dec->action = NULL;
00930 return STATE_INTERNAL_NORETURN;
00931 }
00932
00933 static mpeg2_state_t seek_sequence (mpeg2dec_t * mpeg2dec)
00934 {
00935 mpeg2_reset_info (&(mpeg2dec->info));
00936 mpeg2dec->info.sequence = NULL;
00937 mpeg2dec->info.gop = NULL;
00938 mpeg2_header_state_init (mpeg2dec);
00939 mpeg2dec->action = mpeg2_seek_header;
00940 return mpeg2_seek_header (mpeg2dec);
00941 }
00942
00943 mpeg2_state_t mpeg2_header_end (mpeg2dec_t * mpeg2dec)
00944 {
00945 mpeg2_picture_t * picture;
00946 int b_type;
00947
00948 b_type = (mpeg2dec->decoder.coding_type == B_TYPE);
00949 picture = mpeg2dec->pictures;
00950 if ((mpeg2dec->picture >= picture + 2) ^ b_type)
00951 picture = mpeg2dec->pictures + 2;
00952
00953 mpeg2_reset_info (&(mpeg2dec->info));
00954 if (!(mpeg2dec->sequence.flags & SEQ_FLAG_LOW_DELAY)) {
00955 mpeg2dec->info.display_picture = picture;
00956 if (picture->nb_fields == 1)
00957 mpeg2dec->info.display_picture_2nd = picture + 1;
00958 mpeg2dec->info.display_fbuf = mpeg2dec->fbuf[b_type];
00959 if (!mpeg2dec->convert)
00960 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type + 1];
00961 } else if (!mpeg2dec->convert)
00962 mpeg2dec->info.discard_fbuf = mpeg2dec->fbuf[b_type];
00963 mpeg2dec->action = seek_sequence;
00964 return STATE_END;
00965 }