diff options
author | James Courtier-Dutton <jcdutton@users.sourceforge.net> | 2002-01-10 14:19:19 +0000 |
---|---|---|
committer | James Courtier-Dutton <jcdutton@users.sourceforge.net> | 2002-01-10 14:19:19 +0000 |
commit | d0dda56ad1f8f852455d87b2570f40c9dda10a36 (patch) | |
tree | a1c4c95fe7be61726b553ccfc6c8097a4d5b04dc /src | |
parent | c6ef349e9687659a26041a7a74c5b8671e696159 (diff) | |
download | xine-lib-d0dda56ad1f8f852455d87b2570f40c9dda10a36.tar.gz xine-lib-d0dda56ad1f8f852455d87b2570f40c9dda10a36.tar.bz2 |
Small steps towards Pan & Scan
CVS patchset: 1383
CVS date: 2002/01/10 14:19:19
Diffstat (limited to 'src')
-rw-r--r-- | src/libmpeg2/header.c | 71 | ||||
-rw-r--r-- | src/libmpeg2/mpeg2_internal.h | 3 | ||||
-rw-r--r-- | src/libmpeg2/stats.c | 4 |
3 files changed, 73 insertions, 5 deletions
diff --git a/src/libmpeg2/header.c b/src/libmpeg2/header.c index 2b0d496eb..d249a8899 100644 --- a/src/libmpeg2/header.c +++ b/src/libmpeg2/header.c @@ -21,6 +21,7 @@ #include "config.h" +#include <stdio.h> /* For printf debugging */ #include <inttypes.h> #include "mpeg2_internal.h" @@ -67,6 +68,33 @@ uint8_t scan_alt[64] ATTR_ALIGN(16) = 53,61,22,30,7,15,23,31,38,46,54,62,39,47,55,63 }; +/* count must be between 1 and 32 */ +static uint32_t get_bits(uint8_t *buffer, uint32_t count, uint32_t *bit_position) { + uint32_t byte_offset; + uint32_t bit_offset; + uint32_t bit_mask; + uint32_t bit_bite; + uint32_t result=0; + if (count == 0) return 0; + do { + byte_offset = *bit_position >> 3; /* Div 8 */ + bit_offset = 8 - (*bit_position & 0x7); /* Bits got 87654321 */ + bit_mask = ((1 << (bit_offset)) - 1); + bit_bite = bit_offset; + if (count < bit_offset) { + bit_mask ^= ((1 << (bit_offset-count)) - 1); + bit_bite -= count; + } + printf("Bitmask=0x%04x byte_offset=%u bit_offset=%u\n",bit_mask, byte_offset, bit_offset); + result = (result << bit_bite) | ((buffer[byte_offset] & bit_mask) >> (bit_offset-bit_bite)); + *bit_position+=bit_bite; + count-=bit_bite; + } while (count > 0); + return result; +} + + + void header_state_init (picture_t * picture) { picture->scan = scan_norm; @@ -239,56 +267,93 @@ 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) { + /* FIXME: implement. */ + return 0; +} + +static int header_process_picture_display_extension (picture_t * picture, uint8_t * buffer) { + /* FIXME: implement. */ + uint32_t bit_position; + uint32_t padding; + 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); + + printf("Pan & Scan centre (x,y) = (%u, %u)\n", + picture->frame_centre_horizontal_offset, + picture->frame_centre_vertical_offset); + + return 0; +} + 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 */ - return 0; + 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 */ - return 0; + //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; + } return 0; } diff --git a/src/libmpeg2/mpeg2_internal.h b/src/libmpeg2/mpeg2_internal.h index d9bc71c62..13ef3cf0a 100644 --- a/src/libmpeg2/mpeg2_internal.h +++ b/src/libmpeg2/mpeg2_internal.h @@ -137,6 +137,9 @@ typedef struct picture_s { int repeat_first_field; int progressive_frame; int bitrate; + uint32_t frame_centre_horizontal_offset; + uint32_t frame_centre_vertical_offset; + } picture_t; typedef struct mpeg2_config_s { diff --git a/src/libmpeg2/stats.c b/src/libmpeg2/stats.c index 46d91b84a..d62edb412 100644 --- a/src/libmpeg2/stats.c +++ b/src/libmpeg2/stats.c @@ -27,8 +27,8 @@ #include "mpeg2_internal.h" -//static int debug_level = -1; -static int debug_level = 1; +static int debug_level = -1; +//static int debug_level = 1; /* Determine is debug output is required. */ /* We could potentially have multiple levels of debug info */ |