Commit 12d8b77b authored by Laurent Aimar's avatar Laurent Aimar

Extended filter_chain_VideoFilter to support filters returning multiple pictures at once.

parent 121a30e2
...@@ -46,6 +46,7 @@ typedef struct chained_filter_t ...@@ -46,6 +46,7 @@ typedef struct chained_filter_t
/* Private filter chain data (shhhh!) */ /* Private filter chain data (shhhh!) */
struct chained_filter_t *prev, *next; struct chained_filter_t *prev, *next;
vlc_mouse_t *mouse; vlc_mouse_t *mouse;
picture_t *pending;
} chained_filter_t; } chained_filter_t;
/* Only use this with filter objects from _this_ C module */ /* Only use this with filter objects from _this_ C module */
...@@ -98,6 +99,8 @@ static int filter_chain_DeleteFilterInternal( filter_chain_t *, filter_t * ); ...@@ -98,6 +99,8 @@ static int filter_chain_DeleteFilterInternal( filter_chain_t *, filter_t * );
static int UpdateBufferFunctions( filter_chain_t * ); static int UpdateBufferFunctions( filter_chain_t * );
static void FilterDeletePictures( filter_t *, picture_t * );
#undef filter_chain_New #undef filter_chain_New
/** /**
* Filter chain initialisation * Filter chain initialisation
...@@ -221,25 +224,57 @@ const es_format_t *filter_chain_GetFmtOut( filter_chain_t *p_chain ) ...@@ -221,25 +224,57 @@ const es_format_t *filter_chain_GetFmtOut( filter_chain_t *p_chain )
return &p_chain->fmt_out; return &p_chain->fmt_out;
} }
picture_t *filter_chain_VideoFilter( filter_chain_t *p_chain, picture_t *p_pic ) static picture_t *FilterChainVideoFilter( chained_filter_t *f, picture_t *p_pic )
{ {
for( chained_filter_t *f = p_chain->first; f != NULL; f = f->next ) for( ; f != NULL; f = f->next )
{ {
filter_t *p_filter = &f->filter; filter_t *p_filter = &f->filter;
p_pic = p_filter->pf_video_filter( p_filter, p_pic ); p_pic = p_filter->pf_video_filter( p_filter, p_pic );
if( !p_pic ) if( !p_pic )
break; break;
if( f->pending )
{
msg_Warn( p_filter, "dropping pictures" );
FilterDeletePictures( p_filter, f->pending );
}
f->pending = p_pic->p_next;
p_pic->p_next = NULL;
} }
return p_pic; return p_pic;
} }
picture_t *filter_chain_VideoFilter( filter_chain_t *p_chain, picture_t *p_pic )
{
if( p_pic )
{
p_pic = FilterChainVideoFilter( p_chain->first, p_pic );
if( p_pic )
return p_pic;
}
for( chained_filter_t *b = p_chain->last; b != NULL; b = b->prev )
{
p_pic = b->pending;
if( !p_pic )
continue;
b->pending = p_pic->p_next;
p_pic->p_next = NULL;
p_pic = FilterChainVideoFilter( b->next, p_pic );
if( p_pic )
return p_pic;
}
return NULL;
}
void filter_chain_VideoFlush( filter_chain_t *p_chain ) void filter_chain_VideoFlush( filter_chain_t *p_chain )
{ {
for( chained_filter_t *f = p_chain->first; f != NULL; f = f->next ) for( chained_filter_t *f = p_chain->first; f != NULL; f = f->next )
{ {
filter_t *p_filter = &f->filter; filter_t *p_filter = &f->filter;
FilterDeletePictures( p_filter, f->pending );
f->pending = NULL;
filter_FlushPictures( p_filter ); filter_FlushPictures( p_filter );
} }
} }
...@@ -380,6 +415,7 @@ static filter_t *filter_chain_AppendFilterInternal( filter_chain_t *p_chain, ...@@ -380,6 +415,7 @@ static filter_t *filter_chain_AppendFilterInternal( filter_chain_t *p_chain,
if( p_mouse ) if( p_mouse )
vlc_mouse_Init( p_mouse ); vlc_mouse_Init( p_mouse );
p_chained->mouse = p_mouse; p_chained->mouse = p_mouse;
p_chained->pending = NULL;
msg_Dbg( p_chain->p_this, "Filter '%s' (%p) appended to chain", msg_Dbg( p_chain->p_this, "Filter '%s' (%p) appended to chain",
psz_name ? psz_name : module_get_name(p_filter->p_module, false), psz_name ? psz_name : module_get_name(p_filter->p_module, false),
...@@ -463,6 +499,8 @@ static int filter_chain_DeleteFilterInternal( filter_chain_t *p_chain, ...@@ -463,6 +499,8 @@ static int filter_chain_DeleteFilterInternal( filter_chain_t *p_chain,
msg_Dbg( p_chain->p_this, "Filter %p removed from chain", p_filter ); msg_Dbg( p_chain->p_this, "Filter %p removed from chain", p_filter );
FilterDeletePictures( &p_chained->filter, p_chained->pending );
/* Destroy the filter object */ /* Destroy the filter object */
if( IsInternalVideoAllocator( p_chained ) ) if( IsInternalVideoAllocator( p_chained ) )
AllocatorClean( &internal_video_allocator, p_chained ); AllocatorClean( &internal_video_allocator, p_chained );
...@@ -479,6 +517,16 @@ static int filter_chain_DeleteFilterInternal( filter_chain_t *p_chain, ...@@ -479,6 +517,16 @@ static int filter_chain_DeleteFilterInternal( filter_chain_t *p_chain,
return VLC_SUCCESS; return VLC_SUCCESS;
} }
static void FilterDeletePictures( filter_t *filter, picture_t *picture )
{
while( picture )
{
picture_t *next = picture->p_next;
filter_DeletePicture( filter, picture );
picture = next;
}
}
/** /**
* Internal chain buffer handling * Internal chain buffer handling
*/ */
......
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