diff options
Diffstat (limited to 'src/libmpeg2/header.c')
-rw-r--r-- | src/libmpeg2/header.c | 103 |
1 files changed, 44 insertions, 59 deletions
diff --git a/src/libmpeg2/header.c b/src/libmpeg2/header.c index 21157d3c4..44e7695f0 100644 --- a/src/libmpeg2/header.c +++ b/src/libmpeg2/header.c @@ -1,8 +1,10 @@ /* - * slice.c - * Copyright (C) 1999-2001 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> + * header.c + * Copyright (C) 2000-2002 Michel Lespinasse <walken@zoy.org> + * Copyright (C) 1999-2000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca> * * This file is part of mpeg2dec, a free MPEG-2 video stream decoder. + * See http://libmpeg2.sourceforge.net/ for updates. * * mpeg2dec is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -50,7 +52,7 @@ static uint8_t default_intra_quantizer_matrix[64] ATTR_ALIGN(16) = { 83 }; -uint8_t scan_norm[64] ATTR_ALIGN(16) = +uint8_t mpeg2_scan_norm[64] ATTR_ALIGN(16) = { /* Zig-Zag scan pattern */ 0, 1, 8,16, 9, 2, 3,10, @@ -63,7 +65,7 @@ uint8_t scan_norm[64] ATTR_ALIGN(16) = 53,60,61,54,47,55,62,63 }; -uint8_t scan_alt[64] ATTR_ALIGN(16) = +uint8_t mpeg2_scan_alt[64] ATTR_ALIGN(16) = { /* Alternate scan pattern */ 0,8,16,24,1,9,2,10,17,25,32,40,48,56,57,49, @@ -99,31 +101,26 @@ static uint32_t get_bits(uint8_t *buffer, uint32_t count, uint32_t *bit_position return result; } - - -void header_state_init (picture_t * picture) +void mpeg2_header_state_init (picture_t * picture) { - picture->scan = scan_norm; + picture->scan = mpeg2_scan_norm; } -int header_process_sequence_header (picture_t * picture, uint8_t * buffer) +int mpeg2_header_sequence (picture_t * picture, uint8_t * buffer) { int width, height; int i; - if ((buffer[6] & 0x20) != 0x20) { + if ((buffer[6] & 0x20) != 0x20) return 1; /* missing marker_bit */ - } height = (buffer[0] << 16) | (buffer[1] << 8) | buffer[2]; width = ((height >> 12) + 15) & ~15; height = ((height & 0xfff) + 15) & ~15; - if ((width > 768) || (height > 576)) { - /* printf ("%d x %d\n", width, height); */ - /*return 1;*/ /* size restrictions for MP@ML or MPEG1 */ - } + if ((width > 1920) || (height > 1152)) + return 1; /* size restrictions for MP@HL */ picture->coded_picture_width = width; picture->coded_picture_height = height; @@ -131,27 +128,25 @@ int header_process_sequence_header (picture_t * picture, uint8_t * buffer) /* this is not used by the decoder */ picture->aspect_ratio_information = buffer[3] >> 4; picture->frame_rate_code = buffer[3] & 15; - /* picture->bitrate = (buffer[4]<<10)|(buffer[5]<<2)|(buffer[6]>>6); */ + picture->bitrate = (buffer[4]<<10)|(buffer[5]<<2)|(buffer[6]>>6); if (buffer[7] & 2) { for (i = 0; i < 64; i++) - picture->intra_quantizer_matrix[scan_norm[i]] = + picture->intra_quantizer_matrix[mpeg2_scan_norm[i]] = (buffer[i+7] << 7) | (buffer[i+8] >> 1); buffer += 64; - } else { + } else for (i = 0; i < 64; i++) - picture->intra_quantizer_matrix[scan_norm[i]] = + picture->intra_quantizer_matrix[mpeg2_scan_norm[i]] = default_intra_quantizer_matrix [i]; - } - if (buffer[7] & 1) { + if (buffer[7] & 1) for (i = 0; i < 64; i++) - picture->non_intra_quantizer_matrix[scan_norm[i]] = + picture->non_intra_quantizer_matrix[mpeg2_scan_norm[i]] = buffer[i+8]; - } else { + else for (i = 0; i < 64; i++) picture->non_intra_quantizer_matrix[i] = 16; - } /* MPEG1 - for testing only */ picture->mpeg1 = 1; @@ -162,13 +157,11 @@ int header_process_sequence_header (picture_t * picture, uint8_t * buffer) /* picture->alternate_scan = 0; */ picture->picture_structure = FRAME_PICTURE; /* picture->second_field = 0; */ - picture->last_mba = ((width * height) >> 8) - 1; return 0; } -static int header_process_sequence_extension (picture_t * picture, - uint8_t * buffer) +static int sequence_extension (picture_t * picture, uint8_t * buffer) { /* check chroma format, size extensions, marker bit */ if (((buffer[1] & 0x07) != 0x02) || (buffer[2] & 0xe0) || @@ -180,10 +173,10 @@ static int header_process_sequence_extension (picture_t * picture, picture->low_delay = buffer[5] & 0x80; - if (picture->progressive_sequence) + if (!picture->progressive_sequence) picture->coded_picture_height = (picture->coded_picture_height + 31) & ~31; - + /* printf ("libmpeg2: low_delay : %d\n", picture->low_delay); */ /* @@ -197,35 +190,27 @@ static int header_process_sequence_extension (picture_t * picture, return 0; } -static int header_process_quant_matrix_extension (picture_t * picture, - uint8_t * buffer) +static int quant_matrix_extension (picture_t * picture, uint8_t * buffer) { int i; -#ifdef LOG_PAN_SCAN - printf ("libmpeg2: quant_matrix extension\n"); -#endif if (buffer[0] & 8) { for (i = 0; i < 64; i++) - picture->intra_quantizer_matrix[scan_norm[i]] = + picture->intra_quantizer_matrix[mpeg2_scan_norm[i]] = (buffer[i] << 5) | (buffer[i+1] >> 3); buffer += 64; } - if (buffer[0] & 4) { + if (buffer[0] & 4) for (i = 0; i < 64; i++) - picture->non_intra_quantizer_matrix[scan_norm[i]] = + picture->non_intra_quantizer_matrix[mpeg2_scan_norm[i]] = (buffer[i] << 6) | (buffer[i+1] >> 2); - } return 0; } -static int header_process_picture_coding_extension (picture_t * picture, uint8_t * buffer) +static int picture_coding_extension (picture_t * picture, uint8_t * buffer) { -/* - printf ("libmpeg2: picture_coding_extension\n"); - */ /* pre subtract 1 for use later in compute_motion_vector */ picture->f_motion.f_code[0] = (buffer[0] & 15) - 1; picture->f_motion.f_code[1] = (buffer[1] >> 4) - 1; @@ -240,9 +225,9 @@ static int header_process_picture_coding_extension (picture_t * picture, uint8_t picture->intra_vlc_format = (buffer[3] >> 3) & 1; if (buffer[3] & 4) /* alternate_scan */ - picture->scan = scan_alt; + picture->scan = mpeg2_scan_alt; else - picture->scan = scan_norm; + picture->scan = mpeg2_scan_norm; /* these are not used by the decoder */ picture->top_field_first = buffer[3] >> 7; @@ -252,10 +237,11 @@ static int header_process_picture_coding_extension (picture_t * picture, uint8_t return 0; } -static int header_process_sequence_display_extension (picture_t * picture, uint8_t * buffer) { +static int sequence_display_extension (picture_t * picture, uint8_t * buffer) { /* FIXME: implement. */ uint32_t bit_position; uint32_t padding; + bit_position = 0; padding = get_bits(buffer, 4, &bit_position); picture->video_format = get_bits(buffer, 3, &bit_position); @@ -268,6 +254,7 @@ static int header_process_sequence_display_extension (picture_t * picture, uint8 picture->display_horizontal_size = get_bits(buffer, 14, &bit_position); padding = get_bits(buffer, 1, &bit_position); picture->display_vertical_size = get_bits(buffer, 14, &bit_position); + #ifdef LOG_PAN_SCAN printf("Sequence_display_extension\n"); printf(" video_format: %u\n", picture->video_format); @@ -284,12 +271,14 @@ static int header_process_sequence_display_extension (picture_t * picture, uint8 return 0; } -static int header_process_picture_display_extension (picture_t * picture, uint8_t * buffer) { +static int picture_display_extension (picture_t * picture, uint8_t * buffer) { uint32_t bit_position; uint32_t padding; + #ifdef LOG_PAN_SCAN printf ("libmpeg2: picture_display_extension\n"); #endif + bit_position = 0; padding = get_bits(buffer, 4, &bit_position); picture->frame_centre_horizontal_offset = get_bits(buffer, 16, &bit_position); @@ -302,27 +291,24 @@ static int header_process_picture_display_extension (picture_t * picture, uint8_ picture->frame_centre_horizontal_offset, picture->frame_centre_vertical_offset); #endif -// printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"); -// close(stdout); -// _exit(0); return 0; } -int header_process_extension (picture_t * picture, uint8_t * buffer) +int mpeg2_header_extension (picture_t * picture, uint8_t * buffer) { switch (buffer[0] & 0xf0) { case 0x00: /* reserved */ return 0; case 0x10: /* sequence extension */ - return header_process_sequence_extension (picture, buffer); + return sequence_extension (picture, buffer); case 0x20: /* sequence display extension for Pan & Scan */ - return header_process_sequence_display_extension (picture, buffer); + return sequence_display_extension (picture, buffer); case 0x30: /* quant matrix extension */ - return header_process_quant_matrix_extension (picture, buffer); + return quant_matrix_extension (picture, buffer); case 0x40: /* copyright extension */ return 0; @@ -334,10 +320,10 @@ int header_process_extension (picture_t * picture, uint8_t * buffer) return 0; case 0x70: /* picture display extension for Pan & Scan */ - return header_process_picture_display_extension (picture, buffer); + return picture_display_extension (picture, buffer); case 0x80: /* picture coding extension */ - return header_process_picture_coding_extension (picture, buffer); + return picture_coding_extension (picture, buffer); case 0x90: /* picture spacial scalable extension */ return 0; @@ -364,10 +350,11 @@ int header_process_extension (picture_t * picture, uint8_t * buffer) return 0; } -int header_process_group_of_pictures (picture_t * picture, uint8_t * buffer) { +int mpeg2_header_group_of_pictures (picture_t * picture, uint8_t * buffer) { uint32_t bit_position; uint32_t padding; bit_position = 0; + picture->drop_frame_flag = get_bits(buffer, 1, &bit_position); picture->time_code_hours = get_bits(buffer, 5, &bit_position); picture->time_code_minutes = get_bits(buffer, 6, &bit_position); @@ -392,7 +379,7 @@ int header_process_group_of_pictures (picture_t * picture, uint8_t * buffer) { return 0; } -int header_process_picture_header (picture_t *picture, uint8_t * buffer) +int mpeg2_header_picture (picture_t * picture, uint8_t * buffer) { picture->picture_coding_type = (buffer [1] >> 3) & 7; picture->vbv_delay = ((buffer[1] << 13) | (buffer[2] << 5) | @@ -412,5 +399,3 @@ int header_process_picture_header (picture_t *picture, uint8_t * buffer) return 0; } - - |