summaryrefslogtreecommitdiff
path: root/src/libmpeg2/decode.c
diff options
context:
space:
mode:
authorMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-04-09 03:37:59 +0000
committerMiguel Freitas <miguelfreitas@users.sourceforge.net>2002-04-09 03:37:59 +0000
commit645f84663db1951293a7c821dccba45ebdabfcfe (patch)
tree25921d66b1107950db591aa98e2086623c5e83cd /src/libmpeg2/decode.c
parent28fd212fe15c240f337575a12057d3468e5ee05d (diff)
downloadxine-lib-645f84663db1951293a7c821dccba45ebdabfcfe.tar.gz
xine-lib-645f84663db1951293a7c821dccba45ebdabfcfe.tar.bz2
- new (fast) demuxer seeking scheme
- updated decoder api to allow reseting internal state on seeks CVS patchset: 1696 CVS date: 2002/04/09 03:37:59
Diffstat (limited to 'src/libmpeg2/decode.c')
-rw-r--r--src/libmpeg2/decode.c39
1 files changed, 37 insertions, 2 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c
index 86d9cc0f4..f5bff3815 100644
--- a/src/libmpeg2/decode.c
+++ b/src/libmpeg2/decode.c
@@ -181,8 +181,8 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
if (((picture->picture_structure == FRAME_PICTURE) ||
(picture->second_field)) ) {
- if (!mpeg2dec->drop_frame)
- picture->current_frame->bad_frame = 0;
+ if (mpeg2dec->drop_frame)
+ picture->current_frame->bad_frame = 1;
if (picture->picture_coding_type == B_TYPE) {
if( picture->current_frame && !picture->current_frame->drawn ) {
@@ -481,6 +481,41 @@ int mpeg2_decode_data (mpeg2dec_t * mpeg2dec, uint8_t * current, uint8_t * end,
return ret;
}
+void mpeg2_reset (mpeg2dec_t * mpeg2dec) {
+
+ picture_t *picture = mpeg2dec->picture;
+
+ if( !picture )
+ return;
+
+ mpeg2dec->pts = 0;
+
+ if( !picture->mpeg1 )
+ mpeg2dec->is_sequence_needed = 1;
+
+ mpeg2dec->in_slice = 0;
+
+ /* to free reference frames one also needs to fix slice.c to
+ * abort when they are NULL. unfortunately it seems to break
+ * DVD menus.
+ */
+ /*
+ if ( picture->current_frame &&
+ picture->current_frame != picture->backward_reference_frame &&
+ picture->current_frame != picture->forward_reference_frame )
+ picture->current_frame->free (picture->current_frame);
+ picture->current_frame = NULL;
+
+ if (picture->forward_reference_frame)
+ picture->forward_reference_frame->free (picture->forward_reference_frame);
+ picture->forward_reference_frame = NULL;
+
+ if (picture->backward_reference_frame)
+ picture->backward_reference_frame->free (picture->backward_reference_frame);
+ picture->backward_reference_frame = NULL;
+ */
+}
+
void mpeg2_flush (mpeg2dec_t * mpeg2dec) {
picture_t *picture = mpeg2dec->picture;