Commit da62e6d3 authored by Laurent Aimar's avatar Laurent Aimar

Fixed DMO wrapper.

 One input buffer can create multiples output ones and so need to be fetched
before provided a new input one.
parent cd2fbd0a
...@@ -141,7 +141,9 @@ struct decoder_sys_t ...@@ -141,7 +141,9 @@ struct decoder_sys_t
vlc_cond_t wait_input, wait_output; vlc_cond_t wait_input, wait_output;
bool b_ready, b_works; bool b_ready, b_works;
block_t **pp_input; block_t **pp_input;
void *p_output;
int i_output;
void **pp_output;
}; };
const GUID IID_IWMCodecPrivateData = {0x73f0be8e, 0x57f7, 0x4f01, {0xaa, 0x66, 0x9f, 0x57, 0x34, 0xc, 0xfe, 0xe}}; const GUID IID_IWMCodecPrivateData = {0x73f0be8e, 0x57f7, 0x4f01, {0xaa, 0x66, 0x9f, 0x57, 0x34, 0xc, 0xfe, 0xe}};
...@@ -300,7 +302,7 @@ found: ...@@ -300,7 +302,7 @@ found:
p_sys->b_works = p_sys->b_works =
p_sys->b_ready = false; p_sys->b_ready = false;
p_sys->pp_input = NULL; p_sys->pp_input = NULL;
p_sys->p_output = NULL; TAB_INIT( p_sys->i_output, p_sys->pp_output );
if( vlc_clone( &p_sys->thread, DecoderThread, p_dec, if( vlc_clone( &p_sys->thread, DecoderThread, p_dec,
VLC_THREAD_PRIORITY_INPUT ) ) VLC_THREAD_PRIORITY_INPUT ) )
...@@ -337,6 +339,7 @@ static void DecoderClose( vlc_object_t *p_this ) ...@@ -337,6 +339,7 @@ static void DecoderClose( vlc_object_t *p_this )
vlc_mutex_unlock( &p_sys->lock ); vlc_mutex_unlock( &p_sys->lock );
vlc_join( p_sys->thread, NULL ); vlc_join( p_sys->thread, NULL );
TAB_CLEAN( p_sys->i_output, p_sys->pp_output );
vlc_cond_destroy( &p_sys->wait_input ); vlc_cond_destroy( &p_sys->wait_input );
vlc_cond_destroy( &p_sys->wait_output ); vlc_cond_destroy( &p_sys->wait_output );
vlc_mutex_destroy( &p_sys->lock ); vlc_mutex_destroy( &p_sys->lock );
...@@ -349,12 +352,22 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block ) ...@@ -349,12 +352,22 @@ static void *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
void *p_ret; void *p_ret;
vlc_mutex_lock( &p_sys->lock ); vlc_mutex_lock( &p_sys->lock );
p_sys->pp_input = pp_block; if( p_sys->i_output <= 0 )
vlc_cond_signal( &p_sys->wait_input ); {
p_sys->pp_input = pp_block;
vlc_cond_signal( &p_sys->wait_input );
while( p_sys->pp_input )
vlc_cond_wait( &p_sys->wait_output, &p_sys->lock );
}
p_ret = NULL;
if( p_sys->i_output > 0 )
{
p_ret = p_sys->pp_output[0];
TAB_REMOVE( p_sys->i_output, p_sys->pp_output, p_ret );
}
while( p_sys->pp_input )
vlc_cond_wait( &p_sys->wait_output, &p_sys->lock );
p_ret = p_sys->p_output;
vlc_mutex_unlock( &p_sys->lock ); vlc_mutex_unlock( &p_sys->lock );
return p_ret; return p_ret;
...@@ -1042,7 +1055,13 @@ static void *DecoderThread( void *data ) ...@@ -1042,7 +1055,13 @@ static void *DecoderThread( void *data )
if( !p_sys->b_ready ) if( !p_sys->b_ready )
break; break;
p_sys->p_output = DecBlock( p_dec, p_sys->pp_input ); for( ;; )
{
void *p_output = DecBlock( p_dec, p_sys->pp_input );
if( !p_output )
break;
TAB_APPEND( p_sys->i_output, p_sys->pp_output, p_output );
}
p_sys->pp_input = NULL; p_sys->pp_input = NULL;
vlc_cond_signal( &p_sys->wait_output ); vlc_cond_signal( &p_sys->wait_output );
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment