summaryrefslogtreecommitdiff
path: root/src/libmpeg2
diff options
context:
space:
mode:
Diffstat (limited to 'src/libmpeg2')
-rw-r--r--src/libmpeg2/decode.c21
-rw-r--r--src/libmpeg2/mpeg2.h1
-rw-r--r--src/libmpeg2/xine_decoder.c14
3 files changed, 31 insertions, 5 deletions
diff --git a/src/libmpeg2/decode.c b/src/libmpeg2/decode.c
index fb28f5d28..1064e6fed 100644
--- a/src/libmpeg2/decode.c
+++ b/src/libmpeg2/decode.c
@@ -119,8 +119,9 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
picture->current_frame->free (picture->current_frame);
picture->current_frame = NULL;
picture->throwaway_frame = NULL;
- } else if (picture->forward_reference_frame) {
+ } else if (picture->forward_reference_frame && !picture->forward_reference_frame->drawn) {
mpeg2dec->frames_to_drop = picture->forward_reference_frame->draw (picture->forward_reference_frame);
+ picture->forward_reference_frame->drawn = 1;
}
#ifdef ARCH_X86
@@ -256,6 +257,7 @@ static inline int parse_chunk (mpeg2dec_t * mpeg2dec, int code,
picture->backward_reference_frame = picture->current_frame;
}
picture->current_frame->bad_frame = 0;
+ picture->current_frame->drawn = 0;
picture->current_frame->PTS = mpeg2dec->pts;
picture->current_frame->SCR = mpeg2dec->scr;
mpeg2dec->pts = 0;
@@ -354,6 +356,21 @@ int mpeg2_decode_data (mpeg2dec_t * mpeg2dec, uint8_t * current, uint8_t * end,
return ret;
}
+void mpeg2_flush (mpeg2dec_t * mpeg2dec) {
+
+ picture_t *picture = mpeg2dec->picture;
+
+ if (picture->backward_reference_frame && !picture->backward_reference_frame->drawn) {
+ printf ("libmpeg2: blasting out backward reference frame on flush\n");
+ picture->backward_reference_frame->PTS = 0;
+ picture->backward_reference_frame->SCR = mpeg2dec->scr;
+ picture->backward_reference_frame->bad_frame = 0;
+ picture->backward_reference_frame->drawn = 1;
+ picture->backward_reference_frame->draw (picture->backward_reference_frame);
+ }
+
+}
+
void mpeg2_close (mpeg2dec_t * mpeg2dec)
{
picture_t *picture = mpeg2dec->picture;
@@ -389,7 +406,7 @@ void mpeg2_close (mpeg2dec_t * mpeg2dec)
picture->throwaway_frame->free (picture->throwaway_frame);
}
- if (picture->backward_reference_frame) {
+ if (picture->backward_reference_frame && !picture->backward_reference_frame->drawn) {
printf ("libmpeg2: blasting out backward reference frame on close\n");
picture->backward_reference_frame->PTS = 0;
picture->backward_reference_frame->SCR = mpeg2dec->scr;
diff --git a/src/libmpeg2/mpeg2.h b/src/libmpeg2/mpeg2.h
index c4f250f6d..32ea7a72e 100644
--- a/src/libmpeg2/mpeg2.h
+++ b/src/libmpeg2/mpeg2.h
@@ -66,3 +66,4 @@ void mpeg2_find_sequence_header (mpeg2dec_t * mpeg2dec,
uint8_t * data_start, uint8_t * data_end);
+void mpeg2_flush (mpeg2dec_t * mpeg2dec);
diff --git a/src/libmpeg2/xine_decoder.c b/src/libmpeg2/xine_decoder.c
index 5c4885237..e7c9920a3 100644
--- a/src/libmpeg2/xine_decoder.c
+++ b/src/libmpeg2/xine_decoder.c
@@ -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: xine_decoder.c,v 1.16 2001/11/10 13:48:03 guenter Exp $
+ * $Id: xine_decoder.c,v 1.17 2001/11/13 21:47:58 heikos Exp $
*
* stuff needed to turn libmpeg2 into a xine decoder plugin
*/
@@ -78,6 +78,13 @@ static void mpeg2dec_decode_data (video_decoder_t *this_gen, buf_element_t *buf)
}
+static void mpeg2dec_flush (video_decoder_t *this_gen) {
+ mpeg2dec_decoder_t *this = (mpeg2dec_decoder_t *) this_gen;
+
+ mpeg2_flush (&this->mpeg2);
+
+}
+
static void mpeg2dec_close (video_decoder_t *this_gen) {
mpeg2dec_decoder_t *this = (mpeg2dec_decoder_t *) this_gen;
@@ -101,7 +108,7 @@ video_decoder_t *init_video_decoder_plugin (int iface_version, config_values_t *
mpeg2dec_decoder_t *this ;
- if (iface_version != 2) {
+ if (iface_version != 3) {
printf( "libmpeg2: plugin doesn't support plugin API version %d.\n"
"libmpeg2: this means there's a version mismatch between xine and this "
"libmpeg2: decoder plugin.\nInstalling current plugins should help.\n",
@@ -112,10 +119,11 @@ video_decoder_t *init_video_decoder_plugin (int iface_version, config_values_t *
this = (mpeg2dec_decoder_t *) malloc (sizeof (mpeg2dec_decoder_t));
memset(this, 0, sizeof (mpeg2dec_decoder_t));
- this->video_decoder.interface_version = 2;
+ this->video_decoder.interface_version = 3;
this->video_decoder.can_handle = mpeg2dec_can_handle;
this->video_decoder.init = mpeg2dec_init;
this->video_decoder.decode_data = mpeg2dec_decode_data;
+ this->video_decoder.flush = mpeg2dec_flush;
this->video_decoder.close = mpeg2dec_close;
this->video_decoder.get_identifier = mpeg2dec_get_id;
this->video_decoder.priority = 1;