+
+void input_DecoderStartBuffering( decoder_t *p_dec )
+{
+ decoder_owner_sys_t *p_owner = p_dec->p_owner;
+
+ vlc_mutex_lock( &p_owner->lock );
+
+ DecoderFlush( p_dec );
+
+ p_owner->buffer.b_first = true;
+ p_owner->buffer.b_full = false;
+ p_owner->buffer.i_count = 0;
+
+ assert( !p_owner->buffer.p_picture && !p_owner->buffer.p_subpic && !p_owner->buffer.p_audio );
+
+ p_owner->buffer.p_picture = NULL;
+ p_owner->buffer.pp_picture_next = &p_owner->buffer.p_picture;
+
+ p_owner->buffer.p_subpic = NULL;
+ p_owner->buffer.pp_subpic_next = &p_owner->buffer.p_subpic;
+
+ p_owner->buffer.p_audio = NULL;
+ p_owner->buffer.pp_audio_next = &p_owner->buffer.p_audio;
+
+ p_owner->b_buffering = true;
+
+ vlc_cond_signal( &p_owner->wait );
+
+ vlc_mutex_unlock( &p_owner->lock );
+}
+
+void input_DecoderStopBuffering( decoder_t *p_dec )
+{
+ decoder_owner_sys_t *p_owner = p_dec->p_owner;
+
+ vlc_mutex_lock( &p_owner->lock );
+
+ p_owner->b_buffering = false;
+
+ vlc_cond_signal( &p_owner->wait );
+
+ vlc_mutex_unlock( &p_owner->lock );
+}
+
+void input_DecoderWaitBuffering( decoder_t *p_dec )
+{
+ decoder_owner_sys_t *p_owner = p_dec->p_owner;
+
+ vlc_mutex_lock( &p_owner->lock );
+
+ while( vlc_object_alive( p_dec ) && p_owner->b_buffering && !p_owner->buffer.b_full )
+ {
+ block_FifoWake( p_owner->p_fifo );
+ vlc_cond_wait( &p_owner->wait, &p_owner->lock );
+ }
+
+ vlc_mutex_unlock( &p_owner->lock );
+}
+void input_DecoderFrameNext( decoder_t *p_dec, mtime_t *pi_duration )
+{
+ decoder_owner_sys_t *p_owner = p_dec->p_owner;
+
+ *pi_duration = 0;
+
+ vlc_mutex_lock( &p_owner->lock );
+ if( p_dec->fmt_in.i_cat == VIDEO_ES )
+ {
+ if( p_owner->b_paused && p_owner->p_vout )
+ {
+ vout_NextPicture( p_owner->p_vout, pi_duration );
+ p_owner->pause.i_ignore++;
+ vlc_cond_signal( &p_owner->wait );
+ }
+ }
+ else
+ {
+ /* TODO subtitle should not be flushed */
+ DecoderFlush( p_dec );
+ }
+ vlc_mutex_unlock( &p_owner->lock );
+}
+
+/*****************************************************************************
+ * Internal functions
+ *****************************************************************************/
+
+/* */
+static void DecoderUnsupportedCodec( decoder_t *p_dec, vlc_fourcc_t codec )
+{
+ msg_Err( p_dec, "no suitable decoder module for fourcc `%4.4s'.\n"
+ "VLC probably does not support this sound or video format.",
+ (char*)&codec );
+ intf_UserFatal( p_dec, false, _("No suitable decoder module"),
+ _("VLC does not support the audio or video format \"%4.4s\". "
+ "Unfortunately there is no way for you to fix this."), (char*)&codec );
+}
+
+