diff options
Diffstat (limited to 'src/libmpeg2')
-rw-r--r-- | src/libmpeg2/decode.c | 21 | ||||
-rw-r--r-- | src/libmpeg2/mpeg2.h | 1 | ||||
-rw-r--r-- | src/libmpeg2/xine_decoder.c | 14 |
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; |