diff options
author | James Courtier-Dutton <jcdutton@users.sourceforge.net> | 2002-01-10 18:15:45 +0000 |
---|---|---|
committer | James Courtier-Dutton <jcdutton@users.sourceforge.net> | 2002-01-10 18:15:45 +0000 |
commit | 1913ebea573e2f7490358a082d76afc2d7ff2555 (patch) | |
tree | 2aebe94fefa610f9aad64af28c0125d5f36a1825 | |
parent | 6a5c026f0dcae3af708bf9a64aff67fe1dfb43dc (diff) | |
download | xine-lib-1913ebea573e2f7490358a082d76afc2d7ff2555.tar.gz xine-lib-1913ebea573e2f7490358a082d76afc2d7ff2555.tar.bz2 |
More Pan & Scan work.
CVS patchset: 1386
CVS date: 2002/01/10 18:15:45
-rw-r--r-- | src/libmpeg2/decode.c | 8 | ||||
-rw-r--r-- | src/libmpeg2/header.c | 57 | ||||
-rw-r--r-- | src/libmpeg2/mpeg2_internal.h | 7 |
3 files changed, 55 insertions, 17 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c index 8164230bf..462bea407 100644 --- a/src/libmpeg2/decode.c +++ b/src/libmpeg2/decode.c @@ -22,6 +22,10 @@ * */ +/* +#define LOG_PAN_SCAN +*/ + #include "config.h" #include <stdio.h> @@ -278,9 +282,13 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code, break; case 0xb7: /* sequence end code */ +#ifdef LOG_PAN_SCAN printf ("libmpeg2:SEQUENCE END CODE NOT HANDLED!\n"); +#endif case 0xb8: /* group of pictures start code */ +#ifdef LOG_PAN_SCAN printf ("libmpeg2:GROUP of PICTURES NOT HANDLED!\n"); +#endif default: if (code >= 0xb9) fprintf (stderr, "stream not demultiplexed ?\n"); diff --git a/src/libmpeg2/header.c b/src/libmpeg2/header.c index d249a8899..2e7b634d5 100644 --- a/src/libmpeg2/header.c +++ b/src/libmpeg2/header.c @@ -19,6 +19,10 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +/* +#define LOG_PAN_SCAN +*/ + #include "config.h" #include <stdio.h> /* For printf debugging */ @@ -83,13 +87,15 @@ static uint32_t get_bits(uint8_t *buffer, uint32_t count, uint32_t *bit_position bit_bite = bit_offset; if (count < bit_offset) { bit_mask ^= ((1 << (bit_offset-count)) - 1); - bit_bite -= count; + bit_bite = count; } - printf("Bitmask=0x%04x byte_offset=%u bit_offset=%u\n",bit_mask, byte_offset, bit_offset); +#ifdef LOG_PAN_SCAN + printf("Byte=0x%02x Bitmask=0x%04x byte_offset=%u bit_offset=%u bit_byte=%u count=%u\n",buffer[byte_offset], bit_mask, byte_offset, bit_offset, bit_bite,count); +#endif result = (result << bit_bite) | ((buffer[byte_offset] & bit_mask) >> (bit_offset-bit_bite)); *bit_position+=bit_bite; count-=bit_bite; - } while (count > 0); + } while ((count > 0) && (byte_offset<50) ); return result; } @@ -269,6 +275,34 @@ static int header_process_picture_coding_extension (picture_t * picture, uint8_t static int header_process_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); + picture->colour_description = get_bits(buffer, 1, &bit_position); + if(picture->colour_description) { + picture->colour_primatives = get_bits(buffer, 8, &bit_position); + picture->transfer_characteristics = get_bits(buffer, 8, &bit_position); + picture->matrix_coefficients = get_bits(buffer, 8, &bit_position); + } + 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); + printf(" colour_description: %u\n", picture->colour_description); + if(picture->colour_description) { + printf(" colour_primatives: %u\n", picture->colour_primatives); + printf(" transfer_characteristics %u\n", picture->transfer_characteristics); + printf(" matrix_coefficients %u\n", picture->matrix_coefficients); + } + printf(" display_horizontal_size %u\n", picture->display_horizontal_size); + printf(" display_vertical_size %u\n", picture->display_vertical_size); +#endif + + return 0; } @@ -276,15 +310,18 @@ static int header_process_picture_display_extension (picture_t * picture, uint8_ /* FIXME: implement. */ uint32_t bit_position; uint32_t padding; + bit_position = 0; padding = get_bits(buffer, 4, &bit_position); picture->frame_centre_horizontal_offset = get_bits(buffer, 16, &bit_position); padding = get_bits(buffer, 1, &bit_position); picture->frame_centre_vertical_offset = get_bits(buffer, 16, &bit_position); padding = get_bits(buffer, 1, &bit_position); +#ifdef LOG_PAN_SCAN printf("Pan & Scan centre (x,y) = (%u, %u)\n", picture->frame_centre_horizontal_offset, picture->frame_centre_vertical_offset); +#endif return 0; } @@ -293,65 +330,51 @@ int header_process_extension (picture_t * picture, uint8_t * buffer) { switch (buffer[0] & 0xf0) { case 0x00: /* reserved */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0x10: /* sequence extension */ return header_process_sequence_extension (picture, buffer); case 0x20: /* sequence display extension for Pan & Scan */ - printf("Extension=0x%02x\n",buffer[0] & 0xf0); return header_process_sequence_display_extension (picture, buffer); case 0x30: /* quant matrix extension */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return header_process_quant_matrix_extension (picture, buffer); case 0x40: /* copyright extension */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0x50: /* sequence scalable extension */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0x60: /* reserved */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0x70: /* picture display extension for Pan & Scan */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return header_process_picture_display_extension (picture, buffer); case 0x80: /* picture coding extension */ return header_process_picture_coding_extension (picture, buffer); case 0x90: /* picture spacial scalable extension */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0xA0: /* picture temporal scalable extension */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0xB0: /* camera parameters extension */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0xC0: /* ITU-T extension */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0xD0: /* reserved */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0xE0: /* reserved */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; case 0xF0: /* reserved */ - //printf("Extension=0x%02x\n",buffer[0] & 0xf0); return 0; } diff --git a/src/libmpeg2/mpeg2_internal.h b/src/libmpeg2/mpeg2_internal.h index 13ef3cf0a..262eaf5dc 100644 --- a/src/libmpeg2/mpeg2_internal.h +++ b/src/libmpeg2/mpeg2_internal.h @@ -139,6 +139,13 @@ typedef struct picture_s { int bitrate; uint32_t frame_centre_horizontal_offset; uint32_t frame_centre_vertical_offset; + uint32_t video_format; + uint32_t colour_description; + uint32_t colour_primatives; + uint32_t transfer_characteristics; + uint32_t matrix_coefficients; + uint32_t display_horizontal_size; + uint32_t display_vertical_size; } picture_t; |