summaryrefslogtreecommitdiff
path: root/src/libmpeg2
diff options
context:
space:
mode:
authorReinhard Nißl <rnissl@gmx.de>2008-01-01 00:01:29 +0100
committerReinhard Nißl <rnissl@gmx.de>2008-01-01 00:01:29 +0100
commitd3e2c4e2f1dd26f4abb62622a1e3a2869d2f3dc5 (patch)
treea5fccd79bf091b614ea444ae9d1cc82e4ee01af2 /src/libmpeg2
parent3a636d2081083046da558174b945c390eeb9341f (diff)
downloadxine-lib-d3e2c4e2f1dd26f4abb62622a1e3a2869d2f3dc5.tar.gz
xine-lib-d3e2c4e2f1dd26f4abb62622a1e3a2869d2f3dc5.tar.bz2
Use signed data type for pan&scan center offset components.
According to specification the center offset components are signed integers.
Diffstat (limited to 'src/libmpeg2')
-rw-r--r--src/libmpeg2/header.c14
-rw-r--r--src/libmpeg2/mpeg2_internal.h4
2 files changed, 13 insertions, 5 deletions
diff --git a/src/libmpeg2/header.c b/src/libmpeg2/header.c
index 7f1ef1fc8..c0df02c7f 100644
--- a/src/libmpeg2/header.c
+++ b/src/libmpeg2/header.c
@@ -101,6 +101,14 @@ static uint32_t get_bits(uint8_t *buffer, uint32_t count, uint32_t *bit_position
return result;
}
+static int32_t get_bits_signed(uint8_t *buffer, uint32_t count, uint32_t *bit_position) {
+ uint32_t value = get_bits(buffer, count, bit_position);
+ uint32_t sign_mask = (uint32_t)(-1 << (count - 1));
+ if (value & sign_mask)
+ value |= sign_mask; /* sign-extend value */
+ return (int32_t)value;
+}
+
void mpeg2_header_state_init (picture_t * picture)
{
picture->scan = mpeg2_scan_norm;
@@ -291,13 +299,13 @@ static int picture_display_extension (picture_t * picture, uint8_t * buffer) {
bit_position = 0;
padding = get_bits(buffer, 4, &bit_position);
- picture->frame_centre_horizontal_offset = get_bits(buffer, 16, &bit_position);
+ picture->frame_centre_horizontal_offset = get_bits_signed(buffer, 16, &bit_position);
padding = get_bits(buffer, 1, &bit_position);
- picture->frame_centre_vertical_offset = get_bits(buffer, 16, &bit_position);
+ picture->frame_centre_vertical_offset = get_bits_signed(buffer, 16, &bit_position);
padding = get_bits(buffer, 1, &bit_position);
#ifdef LOG_PAN_SCAN
- printf("Pan & Scan centre (x,y) = (%u, %u)\n",
+ printf("Pan & Scan centre (x,y) = (%d, %d)\n",
picture->frame_centre_horizontal_offset,
picture->frame_centre_vertical_offset);
#endif
diff --git a/src/libmpeg2/mpeg2_internal.h b/src/libmpeg2/mpeg2_internal.h
index c2ffbf909..345e73080 100644
--- a/src/libmpeg2/mpeg2_internal.h
+++ b/src/libmpeg2/mpeg2_internal.h
@@ -177,8 +177,8 @@ typedef struct picture_s {
int progressive_sequence;
int repeat_first_field;
int progressive_frame;
- uint32_t frame_centre_horizontal_offset;
- uint32_t frame_centre_vertical_offset;
+ int32_t frame_centre_horizontal_offset;
+ int32_t frame_centre_vertical_offset;
uint32_t video_format;
uint32_t colour_description;
uint32_t colour_primatives;