summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Courtier-Dutton <jcdutton@users.sourceforge.net>2002-01-10 18:15:45 +0000
committerJames Courtier-Dutton <jcdutton@users.sourceforge.net>2002-01-10 18:15:45 +0000
commit1913ebea573e2f7490358a082d76afc2d7ff2555 (patch)
tree2aebe94fefa610f9aad64af28c0125d5f36a1825
parent6a5c026f0dcae3af708bf9a64aff67fe1dfb43dc (diff)
downloadxine-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.c8
-rw-r--r--src/libmpeg2/header.c57
-rw-r--r--src/libmpeg2/mpeg2_internal.h7
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;