summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJames Courtier-Dutton <jcdutton@users.sourceforge.net>2002-01-10 12:20:17 +0000
committerJames Courtier-Dutton <jcdutton@users.sourceforge.net>2002-01-10 12:20:17 +0000
commitc6ef349e9687659a26041a7a74c5b8671e696159 (patch)
tree47b326c1d8178edd03d484535a948cca494b9552 /src
parent4733aeda97b6185b8c237ce4ac2b89ba167e6fa7 (diff)
downloadxine-lib-c6ef349e9687659a26041a7a74c5b8671e696159.tar.gz
xine-lib-c6ef349e9687659a26041a7a74c5b8671e696159.tar.bz2
More info is put in the vo_frame.
CVS patchset: 1382 CVS date: 2002/01/10 12:20:17
Diffstat (limited to 'src')
-rw-r--r--src/libmpeg2/decode.c71
-rw-r--r--src/libmpeg2/header.c38
-rw-r--r--src/libmpeg2/mpeg2.h2
-rw-r--r--src/libmpeg2/stats.c3
-rw-r--r--src/xine-engine/video_out.h14
5 files changed, 122 insertions, 6 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c
index bc7ad7758..8164230bf 100644
--- a/src/libmpeg2/decode.c
+++ b/src/libmpeg2/decode.c
@@ -73,11 +73,58 @@ void mpeg2_init (mpeg2dec_t * mpeg2dec,
header_state_init (mpeg2dec->picture);
}
+static int get_frame_duration(mpeg2dec_t * mpeg2dec, vo_frame_t * frame)
+{
+ int duration;
+ switch (frame->frame_rate_code) {
+ case 1: /* 23.976 fps */
+ frame->duration = 3913;
+ break;
+ case 2: /* 24 fps */
+ frame->duration = 3750;
+ break;
+ case 3: /* 25 fps */
+ frame->duration = frame->repeat_first_field ? 5400 : 3600;
+ break;
+ case 4: /* 29.97 fps */
+ if ((frame->repeat_first_field) || (mpeg2dec->last_repeat_first_field)) {
+ frame->duration = 3754;
+ frame->pts_corrector = frame->repeat_first_field ? 375 : -375;
+ } else {
+ frame->duration = 3003;
+ frame->pts_corrector = 0;
+ }
+// duration = 3754;
+// duration = frame->repeat_first_field ? 4504 : 3003;
+ break;
+ case 5: /* 30 fps */
+ frame->duration = 3000;
+ break;
+ case 6: /* 50 fps */
+ frame->duration = 1800;
+ break;
+ case 7: /* 59.94 fps */
+ frame->duration = 1525;
+ break;
+ case 8: /* 60 fps */
+ frame->duration = 1509;
+ break;
+ default:
+ /* printf ("invalid/unknown frame rate code : %d \n",
+ frame->frame_rate_code); */
+ duration = 3000;
+ }
+ /* printf("mpeg2dec: rff=%u\n",frame->repeat_first_field); */
+ mpeg2dec->last_repeat_first_field = frame->repeat_first_field;
+ return 1;
+}
+
static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
uint8_t * buffer)
{
picture_t * picture;
int is_frame_done;
+// printf("libmpeg2:code=0x%02x\n",code);
/*
printf ("libmpeg2: parse_chunk 0x%02x\n", code);
@@ -116,13 +163,16 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
picture->current_frame->bad_frame ? "BAD" : "good");
#endif
if (picture->picture_coding_type == B_TYPE) {
- if (picture->mpeg1)
+ if (picture->mpeg1) {
picture->current_frame->PTS = 0;
+ }
+ get_frame_duration(mpeg2dec, picture->current_frame);
mpeg2dec->frames_to_drop = picture->current_frame->draw (picture->current_frame);
picture->current_frame->free (picture->current_frame);
picture->current_frame = NULL;
picture->throwaway_frame = NULL;
} else if (picture->forward_reference_frame && !picture->forward_reference_frame->drawn) {
+ get_frame_duration(mpeg2dec, picture->forward_reference_frame);
mpeg2dec->frames_to_drop = picture->forward_reference_frame->draw (picture->forward_reference_frame);
picture->forward_reference_frame->drawn = 1;
}
@@ -227,6 +277,10 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
}
break;
+ case 0xb7: /* sequence end code */
+ printf ("libmpeg2:SEQUENCE END CODE NOT HANDLED!\n");
+ case 0xb8: /* group of pictures start code */
+ printf ("libmpeg2:GROUP of PICTURES NOT HANDLED!\n");
default:
if (code >= 0xb9)
fprintf (stderr, "stream not demultiplexed ?\n");
@@ -273,6 +327,15 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
picture->current_frame->drawn = 0;
picture->current_frame->PTS = mpeg2dec->pts;
picture->current_frame->SCR = mpeg2dec->scr;
+ picture->current_frame->aspect_ratio = picture->aspect_ratio_information;
+ picture->current_frame->frame_rate_code = picture->frame_rate_code;
+ picture->current_frame->top_field_first = picture->top_field_first;
+ picture->current_frame->progressive_sequence = picture->progressive_sequence;
+ picture->current_frame->repeat_first_field = picture->repeat_first_field;
+ picture->current_frame->progressive_frame = picture->progressive_frame;
+ picture->current_frame->picture_coding_type = picture->picture_coding_type;
+ picture->current_frame->bitrate = picture->bitrate;
+ picture->current_frame->repeat_first_field = picture->repeat_first_field;
mpeg2dec->pts = 0;
}
}
@@ -379,6 +442,7 @@ void mpeg2_flush (mpeg2dec_t * mpeg2dec) {
printf ("libmpeg2: blasting out backward reference frame on flush\n");
picture->backward_reference_frame->PTS = 0;
picture->backward_reference_frame->SCR = mpeg2dec->scr;
+ get_frame_duration(mpeg2dec, picture->backward_reference_frame);
picture->backward_reference_frame->bad_frame = 0;
picture->backward_reference_frame->drawn = 1;
picture->backward_reference_frame->displayed (picture->backward_reference_frame);
@@ -416,8 +480,9 @@ void mpeg2_close (mpeg2dec_t * mpeg2dec)
if (picture->forward_reference_frame) {
/*
printf ("libmpeg2: blasting out forward reference frame on close\n");
- picture->forward_reference_frame->PTS = 0;
+// picture->forward_reference_frame->PTS = 0;
picture->forward_reference_frame->bad_frame = 0;
+ get_frame_duration(mpeg2dec, picture->forward_reference_frame);
picture->forward_reference_frame->draw (picture->forward_reference_frame);
*/
picture->forward_reference_frame->displayed (picture->forward_reference_frame);
@@ -429,6 +494,7 @@ void mpeg2_close (mpeg2dec_t * mpeg2dec)
picture->throwaway_frame->PTS = 0;
picture->throwaway_frame->SCR = mpeg2dec->scr;
picture->throwaway_frame->bad_frame = 0;
+ get_frame_duration(mpeg2dec, picture->throwaway_frame);
picture->throwaway_frame->draw (picture->throwaway_frame);
picture->throwaway_frame->free (picture->throwaway_frame);
}
@@ -437,6 +503,7 @@ void mpeg2_close (mpeg2dec_t * mpeg2dec)
printf ("libmpeg2: blasting out backward reference frame on close\n");
picture->backward_reference_frame->PTS = 0;
picture->backward_reference_frame->SCR = mpeg2dec->scr;
+ get_frame_duration(mpeg2dec, picture->backward_reference_frame);
picture->backward_reference_frame->bad_frame = 0;
if( !picture->backward_reference_frame->drawn)
picture->backward_reference_frame->draw (picture->backward_reference_frame);
diff --git a/src/libmpeg2/header.c b/src/libmpeg2/header.c
index 9c4ac36f0..2b0d496eb 100644
--- a/src/libmpeg2/header.c
+++ b/src/libmpeg2/header.c
@@ -242,15 +242,53 @@ static int header_process_picture_coding_extension (picture_t * picture, uint8_t
int header_process_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);
+ case 0x20: /* sequence display extension for Pan & Scan */
+ return 0;
+
case 0x30: /* quant matrix extension */
return header_process_quant_matrix_extension (picture, buffer);
+ case 0x40: /* copyright extension */
+ return 0;
+
+ case 0x50: /* sequence scalable extension */
+ return 0;
+
+ case 0x60: /* reserved */
+ return 0;
+
+ case 0x70: /* picture display extension for Pan & Scan */
+ return 0;
+
case 0x80: /* picture coding extension */
return header_process_picture_coding_extension (picture, buffer);
}
+ case 0x90: /* picture spacial scalable extension */
+ return 0;
+
+ case 0xA0: /* picture temporal scalable extension */
+ return 0;
+
+ case 0xB0: /* camera parameters extension */
+ return 0;
+
+ case 0xC0: /* ITU-T extension */
+ return 0;
+
+ case 0xD0: /* reserved */
+ return 0;
+
+ case 0xE0: /* reserved */
+ return 0;
+
+ case 0xF0: /* reserved */
+ return 0;
return 0;
}
diff --git a/src/libmpeg2/mpeg2.h b/src/libmpeg2/mpeg2.h
index f1a09b5dd..983eb9eaa 100644
--- a/src/libmpeg2/mpeg2.h
+++ b/src/libmpeg2/mpeg2.h
@@ -44,7 +44,7 @@ typedef struct mpeg2dec_s {
uint8_t code;
uint32_t pts, scr;
-
+ uint32_t last_repeat_first_field;
xine_t *xine;
} mpeg2dec_t ;
diff --git a/src/libmpeg2/stats.c b/src/libmpeg2/stats.c
index f3456058d..46d91b84a 100644
--- a/src/libmpeg2/stats.c
+++ b/src/libmpeg2/stats.c
@@ -27,7 +27,8 @@
#include "mpeg2_internal.h"
-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 */
diff --git a/src/xine-engine/video_out.h b/src/xine-engine/video_out.h
index c615a7fa8..d5e7f1590 100644
--- a/src/xine-engine/video_out.h
+++ b/src/xine-engine/video_out.h
@@ -17,7 +17,7 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
*
- * $Id: video_out.h,v 1.35 2002/01/09 22:33:04 jcdutton Exp $
+ * $Id: video_out.h,v 1.36 2002/01/10 12:20:17 jcdutton Exp $
*
*
* xine version of video_out.h
@@ -65,6 +65,7 @@ struct vo_frame_s {
struct vo_frame_s *next;
uint32_t PTS;
+ uint32_t pts_corrector; /* Repeat first field tricks */
uint32_t SCR;
int bad_frame; /* e.g. frame skipped or based on skipped frame */
int drawn;
@@ -73,7 +74,16 @@ struct vo_frame_s {
/* additional information to be able to duplicate frames: */
int width, height;
- int ratio, format, duration;
+ int ratio, format;
+ int duration;
+ int aspect_ratio;
+ int frame_rate_code;
+ int progressive_sequence;
+ int top_field_first;
+ int repeat_first_field;
+ int progressive_frame;
+ int picture_coding_type;
+ int bitrate;
int display_locked, decoder_locked, driver_locked;
pthread_mutex_t mutex; /* so the various locks will be serialized */