Commit 0c5adb0e authored by Laurent Aimar's avatar Laurent Aimar

Modified vout_*Picture API.

It is a bit simpler and cleaner.
I plan to remove the need for specific vout
vout_HoldPicture/ReleasePicture functions, but it is not yet possible.
parent 11ac4b09
...@@ -161,11 +161,11 @@ VLC_EXPORT( int, vout_GetSnapshot, ( vout_thread_t *p_vout, ...@@ -161,11 +161,11 @@ VLC_EXPORT( int, vout_GetSnapshot, ( vout_thread_t *p_vout,
const char *psz_format, mtime_t i_timeout ) ); const char *psz_format, mtime_t i_timeout ) );
/* */ /* */
VLC_EXPORT( picture_t *, vout_CreatePicture, ( vout_thread_t *, bool, bool, unsigned int ) ); VLC_EXPORT( picture_t *, vout_GetPicture, ( vout_thread_t * ) );
VLC_EXPORT( void, vout_DestroyPicture, ( vout_thread_t *, picture_t * ) ); VLC_EXPORT( void, vout_PutPicture, ( vout_thread_t *, picture_t * ) );
VLC_EXPORT( void, vout_DisplayPicture, ( vout_thread_t *, picture_t * ) );
VLC_EXPORT( void, vout_LinkPicture, ( vout_thread_t *, picture_t * ) ); VLC_EXPORT( void, vout_HoldPicture, ( vout_thread_t *, picture_t * ) );
VLC_EXPORT( void, vout_UnlinkPicture, ( vout_thread_t *, picture_t * ) ); VLC_EXPORT( void, vout_ReleasePicture, ( vout_thread_t *, picture_t * ) );
/** /**
* Return the spu_t object associated to a vout_thread_t. * Return the spu_t object associated to a vout_thread_t.
......
...@@ -353,7 +353,7 @@ static void* Thread( vlc_object_t *p_this ) ...@@ -353,7 +353,7 @@ static void* Thread( vlc_object_t *p_this )
free( p_thread->psz_title ); free( p_thread->psz_title );
p_thread->psz_title = NULL; p_thread->psz_title = NULL;
while( !( p_pic = vout_CreatePicture( p_thread->p_vout, 0, 0, 0 ) ) && while( !( p_pic = vout_GetPicture( p_thread->p_vout ) ) &&
vlc_object_alive (p_thread) ) vlc_object_alive (p_thread) )
{ {
msleep( VOUT_OUTMEM_SLEEP ); msleep( VOUT_OUTMEM_SLEEP );
...@@ -364,7 +364,7 @@ static void* Thread( vlc_object_t *p_this ) ...@@ -364,7 +364,7 @@ static void* Thread( vlc_object_t *p_this )
memcpy( p_pic->p[0].p_pixels, plane, width * height * 4 ); memcpy( p_pic->p[0].p_pixels, plane, width * height * 4 );
p_pic->date = date_Get( &i_pts ) + GOOM_DELAY; p_pic->date = date_Get( &i_pts ) + GOOM_DELAY;
vout_DisplayPicture( p_thread->p_vout, p_pic ); vout_PutPicture( p_thread->p_vout, p_pic );
} }
goom_close( p_plugin_info ); goom_close( p_plugin_info );
......
...@@ -336,7 +336,7 @@ static block_t *DoWork( filter_t *p_filter, block_t *p_in_buf ) ...@@ -336,7 +336,7 @@ static block_t *DoWork( filter_t *p_filter, block_t *p_in_buf )
int i; int i;
/* First, get a new picture */ /* First, get a new picture */
while( ( p_outpic = vout_CreatePicture( p_sys->p_vout, 0, 0, 3 ) ) == NULL) while( ( p_outpic = vout_GetPicture( p_sys->p_vout ) ) == NULL)
{ /* XXX: This looks like a bad idea. Don't run to me for sympathy if it { /* XXX: This looks like a bad idea. Don't run to me for sympathy if it
* dead locks... */ * dead locks... */
if( !vlc_object_alive (p_sys->p_vout) ) if( !vlc_object_alive (p_sys->p_vout) )
...@@ -365,7 +365,7 @@ static block_t *DoWork( filter_t *p_filter, block_t *p_in_buf ) ...@@ -365,7 +365,7 @@ static block_t *DoWork( filter_t *p_filter, block_t *p_in_buf )
p_outpic->date = p_in_buf->i_pts + (p_in_buf->i_length / 2); p_outpic->date = p_in_buf->i_pts + (p_in_buf->i_length / 2);
vout_DisplayPicture( p_sys->p_vout, p_outpic ); vout_PutPicture( p_sys->p_vout, p_outpic );
return p_in_buf; return p_in_buf;
} }
......
...@@ -1339,10 +1339,10 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, ...@@ -1339,10 +1339,10 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
{ {
msg_Warn( p_vout, "non-dated video buffer received" ); msg_Warn( p_vout, "non-dated video buffer received" );
*pi_lost_sum += 1; *pi_lost_sum += 1;
vout_DropPicture( p_vout, p_picture ); vout_ReleasePicture( p_vout, p_picture );
return; return;
} }
vout_LinkPicture( p_vout, p_picture ); vout_HoldPicture( p_vout, p_picture );
/* */ /* */
vlc_mutex_lock( &p_owner->lock ); vlc_mutex_lock( &p_owner->lock );
...@@ -1421,8 +1421,8 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, ...@@ -1421,8 +1421,8 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
vout_Flush( p_vout, p_picture->date ); vout_Flush( p_vout, p_picture->date );
p_owner->i_last_rate = i_rate; p_owner->i_last_rate = i_rate;
} }
vout_DisplayPicture( p_vout, p_picture ); vout_PutPicture( p_vout, p_picture );
vout_UnlinkPicture( p_vout, p_picture ); vout_ReleasePicture( p_vout, p_picture );
} }
else else
{ {
...@@ -1432,8 +1432,8 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture, ...@@ -1432,8 +1432,8 @@ static void DecoderPlayVideo( decoder_t *p_dec, picture_t *p_picture,
msg_Warn( p_vout, "non-dated video buffer received" ); msg_Warn( p_vout, "non-dated video buffer received" );
*pi_lost_sum += 1; *pi_lost_sum += 1;
vout_UnlinkPicture( p_vout, p_picture ); vout_ReleasePicture( p_vout, p_picture );
vout_DropPicture( p_vout, p_picture ); vout_ReleasePicture( p_vout, p_picture );
} }
int i_tmp_display; int i_tmp_display;
int i_tmp_lost; int i_tmp_lost;
...@@ -1469,7 +1469,7 @@ static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block ) ...@@ -1469,7 +1469,7 @@ static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
if( p_dec->b_die ) if( p_dec->b_die )
{ {
/* It prevent freezing VLC in case of broken decoder */ /* It prevent freezing VLC in case of broken decoder */
vout_DropPicture( p_vout, p_pic ); vout_ReleasePicture( p_vout, p_pic );
if( p_block ) if( p_block )
block_Release( p_block ); block_Release( p_block );
break; break;
...@@ -1479,7 +1479,7 @@ static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block ) ...@@ -1479,7 +1479,7 @@ static void DecoderDecodeVideo( decoder_t *p_dec, block_t *p_block )
if( p_owner->i_preroll_end > VLC_TS_INVALID && p_pic->date < p_owner->i_preroll_end ) if( p_owner->i_preroll_end > VLC_TS_INVALID && p_pic->date < p_owner->i_preroll_end )
{ {
vout_DropPicture( p_vout, p_pic ); vout_ReleasePicture( p_vout, p_pic );
continue; continue;
} }
...@@ -1687,8 +1687,8 @@ static void DecoderFlushBuffering( decoder_t *p_dec ) ...@@ -1687,8 +1687,8 @@ static void DecoderFlushBuffering( decoder_t *p_dec )
if( p_owner->p_vout ) if( p_owner->p_vout )
{ {
vout_UnlinkPicture( p_owner->p_vout, p_picture ); vout_ReleasePicture( p_owner->p_vout, p_picture );
vout_DropPicture( p_owner->p_vout, p_picture ); vout_ReleasePicture( p_owner->p_vout, p_picture );
} }
if( !p_owner->buffer.p_picture ) if( !p_owner->buffer.p_picture )
...@@ -2353,7 +2353,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec ) ...@@ -2353,7 +2353,7 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
if( p_dec->b_die || p_dec->b_error ) if( p_dec->b_die || p_dec->b_error )
return NULL; return NULL;
picture_t *p_picture = vout_CreatePicture( p_owner->p_vout, 0, 0, 0 ); picture_t *p_picture = vout_GetPicture( p_owner->p_vout );
if( p_picture ) if( p_picture )
return p_picture; return p_picture;
...@@ -2373,17 +2373,17 @@ static picture_t *vout_new_buffer( decoder_t *p_dec ) ...@@ -2373,17 +2373,17 @@ static picture_t *vout_new_buffer( decoder_t *p_dec )
static void vout_del_buffer( decoder_t *p_dec, picture_t *p_pic ) static void vout_del_buffer( decoder_t *p_dec, picture_t *p_pic )
{ {
vout_DropPicture( p_dec->p_owner->p_vout, p_pic ); vout_ReleasePicture( p_dec->p_owner->p_vout, p_pic );
} }
static void vout_link_picture( decoder_t *p_dec, picture_t *p_pic ) static void vout_link_picture( decoder_t *p_dec, picture_t *p_pic )
{ {
vout_LinkPicture( p_dec->p_owner->p_vout, p_pic ); vout_HoldPicture( p_dec->p_owner->p_vout, p_pic );
} }
static void vout_unlink_picture( decoder_t *p_dec, picture_t *p_pic ) static void vout_unlink_picture( decoder_t *p_dec, picture_t *p_pic )
{ {
vout_UnlinkPicture( p_dec->p_owner->p_vout, p_pic ); vout_ReleasePicture( p_dec->p_owner->p_vout, p_pic );
} }
static subpicture_t *spu_new_buffer( decoder_t *p_dec ) static subpicture_t *spu_new_buffer( decoder_t *p_dec )
......
...@@ -609,13 +609,13 @@ vlm_MessageSimpleNew ...@@ -609,13 +609,13 @@ vlm_MessageSimpleNew
vlm_New vlm_New
vout_Close vout_Close
vout_Create vout_Create
vout_CreatePicture vout_GetPicture
vout_DestroyPicture vout_PutPicture
vout_DisplayPicture vout_HoldPicture
vout_ReleasePicture
vout_EnableFilter vout_EnableFilter
vout_GetSnapshot vout_GetSnapshot
vout_GetSpu vout_GetSpu
vout_LinkPicture
vout_OSDIcon vout_OSDIcon
vout_OSDMessage vout_OSDMessage
vout_OSDEpg vout_OSDEpg
...@@ -623,7 +623,6 @@ vout_OSDSlider ...@@ -623,7 +623,6 @@ vout_OSDSlider
vout_Request vout_Request
vout_ShowTextAbsolute vout_ShowTextAbsolute
vout_ShowTextRelative vout_ShowTextRelative
vout_UnlinkPicture
vout_window_New vout_window_New
vout_window_Control vout_window_Control
vout_window_Delete vout_window_Delete
......
...@@ -65,11 +65,6 @@ void vout_FixLeaks( vout_thread_t *p_vout ); ...@@ -65,11 +65,6 @@ void vout_FixLeaks( vout_thread_t *p_vout );
*/ */
void vout_Reset( vout_thread_t *p_vout ); void vout_Reset( vout_thread_t *p_vout );
/**
* This functions will drop a picture retreived by vout_CreatePicture.
*/
void vout_DropPicture( vout_thread_t *p_vout, picture_t * );
/** /**
* This function will force to display the next picture while paused * This function will force to display the next picture while paused
*/ */
......
...@@ -45,37 +45,16 @@ ...@@ -45,37 +45,16 @@
#include "vout_internal.h" #include "vout_internal.h"
/** /**
* Display a picture * It retreives a picture from the vout or NULL if no pictures are
* available yet.
* *
* Remove the reservation flag of a picture, which will cause it to be ready * You MUST call vout_PutPicture or vout_ReleasePicture on it.
* for display.
*/
void vout_DisplayPicture( vout_thread_t *p_vout, picture_t *p_pic )
{
vlc_mutex_lock( &p_vout->p->picture_lock );
p_pic->p_next = NULL;
picture_fifo_Push(p_vout->p->decoder_fifo, p_pic);
vlc_cond_signal( &p_vout->p->picture_wait );
vlc_mutex_unlock( &p_vout->p->picture_lock );
}
/**
* Allocate a picture in the video output heap.
* *
* This function creates a reserved image in the video output heap. * You may use vout_HoldPicture(paired with vout_ReleasePicture) to keep a
* A null pointer is returned if the function fails. This method provides an * read-only reference.
* already allocated zone of memory in the picture data fields.
* It needs locking since several pictures can be created by several producers
* threads.
*/ */
picture_t *vout_CreatePicture( vout_thread_t *p_vout, picture_t *vout_GetPicture( vout_thread_t *p_vout )
bool b_progressive,
bool b_top_field_first,
unsigned int i_nb_fields )
{ {
#warning "TODO remove unused vout_CreatePicture parameters"
/* Get lock */ /* Get lock */
vlc_mutex_lock( &p_vout->p->picture_lock ); vlc_mutex_lock( &p_vout->p->picture_lock );
picture_t *p_pic = picture_pool_Get(p_vout->p->decoder_pool); picture_t *p_pic = picture_pool_Get(p_vout->p->decoder_pool);
...@@ -88,47 +67,48 @@ picture_t *vout_CreatePicture( vout_thread_t *p_vout, ...@@ -88,47 +67,48 @@ picture_t *vout_CreatePicture( vout_thread_t *p_vout,
return p_pic; return p_pic;
} }
/* */ /**
void vout_DropPicture( vout_thread_t *p_vout, picture_t *p_pic ) * It gives to the vout a picture to be displayed.
*
* The given picture MUST comes from vout_GetPicture.
*
* Becareful, after vout_PutPicture is called, picture_t::p_next cannot be
* read/used.
*/
void vout_PutPicture( vout_thread_t *p_vout, picture_t *p_pic )
{ {
vlc_mutex_lock( &p_vout->p->picture_lock ); vlc_mutex_lock( &p_vout->p->picture_lock );
picture_Release( p_pic ); p_pic->p_next = NULL;
picture_fifo_Push(p_vout->p->decoder_fifo, p_pic);
vlc_cond_signal( &p_vout->p->picture_wait ); vlc_cond_signal( &p_vout->p->picture_wait );
vlc_mutex_unlock( &p_vout->p->picture_lock ); vlc_mutex_unlock( &p_vout->p->picture_lock );
} }
void vout_DestroyPicture( vout_thread_t *p_vout, picture_t *p_pic )
{
vout_DropPicture( p_vout, p_pic );
}
/** /**
* Increment reference counter of a picture * It releases a picture retreived by vout_GetPicture.
*
* This function increments the reference counter of a picture in the video
* heap. It needs a lock since several producer threads can access the picture.
*/ */
void vout_LinkPicture( vout_thread_t *p_vout, picture_t *p_pic ) void vout_ReleasePicture( vout_thread_t *p_vout, picture_t *p_pic )
{ {
vlc_mutex_lock( &p_vout->p->picture_lock ); vlc_mutex_lock( &p_vout->p->picture_lock );
picture_Hold( p_pic );
picture_Release( p_pic );
vlc_cond_signal( &p_vout->p->picture_wait );
vlc_mutex_unlock( &p_vout->p->picture_lock ); vlc_mutex_unlock( &p_vout->p->picture_lock );
} }
/** /**
* Decrement reference counter of a picture * It increment the reference counter of a picture retreived by
* * vout_GetPicture.
* This function decrement the reference counter of a picture in the video heap
*/ */
void vout_UnlinkPicture( vout_thread_t *p_vout, picture_t *p_pic ) void vout_HoldPicture( vout_thread_t *p_vout, picture_t *p_pic )
{ {
vlc_mutex_lock( &p_vout->p->picture_lock ); vlc_mutex_lock( &p_vout->p->picture_lock );
picture_Release( p_pic );
vlc_cond_signal( &p_vout->p->picture_wait ); picture_Hold( p_pic );
vlc_mutex_unlock( &p_vout->p->picture_lock ); vlc_mutex_unlock( &p_vout->p->picture_lock );
} }
......
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