1
mirror of https://code.videolan.org/videolan/vlc synced 2024-10-03 01:31:53 +02:00

filters: provide the decoder device to filter so they can create a video context

Typically used when a CPU to GPU converter is used. It cannot deduce the decoder
device or the video context from the input. Since we are pushing the video
context we don't want to get it from the output/environment either.

When the callback is not provided, a NULL decoder device is returned.
This commit is contained in:
Steve Lhomme 2019-09-24 13:58:07 +02:00
parent 0453abddee
commit 6d41261399
12 changed files with 44 additions and 12 deletions

View File

@ -40,6 +40,7 @@
struct filter_video_callbacks
{
picture_t *(*buffer_new)(filter_t *);
vlc_decoder_device * (*hold_device)(vlc_object_t *, void *sys);
};
struct filter_subpicture_callbacks
@ -192,6 +193,14 @@ static inline void filter_ChangeViewpoint( filter_t *p_filter,
p_filter->pf_change_viewpoint( p_filter, vp );
}
static inline vlc_decoder_device * filter_HoldDecoderDevice( filter_t *p_filter )
{
if ( !p_filter->owner.video || !p_filter->owner.video->hold_device )
return NULL;
return p_filter->owner.video->hold_device( VLC_OBJECT(p_filter), p_filter->owner.sys );
}
/**
* This function will drain, then flush an audio filter.
*/

View File

@ -511,7 +511,7 @@ static filter_t *CreateCPUtoGPUFilter( vlc_object_t *p_this, const es_format_t *
if (unlikely(p_filter == NULL))
return NULL;
static const struct filter_video_callbacks cbs = { NewBuffer };
static const struct filter_video_callbacks cbs = { NewBuffer, NULL /*TODO*/ };
p_filter->b_allow_fmt_out_change = false;
p_filter->owner.video = &cbs;
p_filter->owner.sys = p_this;

View File

@ -203,7 +203,7 @@ static filter_t *CreateFilter( vlc_object_t *p_this, const es_format_t *p_fmt_in
if (unlikely(p_filter == NULL))
return NULL;
static const struct filter_video_callbacks cbs = { NewBuffer };
static const struct filter_video_callbacks cbs = { NewBuffer, NULL/*TODO*/ };
p_filter->b_allow_fmt_out_change = false;
p_filter->owner.video = &cbs;
p_filter->owner.sys = p_this;

View File

@ -298,7 +298,7 @@ static void *Add( sout_stream_t *p_stream, const es_format_t *p_fmt )
/* Create user specified video filters */
static const struct filter_video_callbacks cbs =
{
video_new_buffer_filter,
video_new_buffer_filter, NULL/*TODO*/,
};
psz_chain = var_GetNonEmptyString( p_stream, CFG_PREFIX "vfilter" );

View File

@ -500,7 +500,7 @@ static picture_t *transcode_video_filter_buffer_new(filter_t *p_filter)
static const struct filter_video_callbacks transcode_filter_video_cbs =
{
transcode_video_filter_buffer_new,
transcode_video_filter_buffer_new, NULL,
};
filter_chain_t * VideoDecodedStream::VideoFilterCreate(const es_format_t *p_srcfmt)

View File

@ -234,7 +234,7 @@ int transcode_video_init( sout_stream_t *p_stream, const es_format_t *p_fmt,
static const struct filter_video_callbacks transcode_filter_video_cbs =
{
transcode_video_filter_buffer_new,
transcode_video_filter_buffer_new, NULL/*TODO*/,
};
/* Take care of the scaling and chroma conversions. */

View File

@ -140,9 +140,16 @@ static picture_t *BufferChainNew( filter_t *p_filter )
#define CHAIN_LEVEL_MAX 2
static vlc_decoder_device * HoldChainDecoderDevice(vlc_object_t *o, void *sys)
{
VLC_UNUSED(o);
filter_t *p_chain_parent = sys;
return filter_HoldDecoderDevice( p_chain_parent );
}
static const struct filter_video_callbacks filter_video_chain_cbs =
{
BufferChainNew,
BufferChainNew, HoldChainDecoderDevice,
};
/*****************************************************************************

View File

@ -141,7 +141,7 @@ static picture_t *video_chain_new( filter_t *p_filter )
static const struct filter_video_callbacks canvas_cbs =
{
video_chain_new,
video_chain_new, NULL,
};
/*****************************************************************************

View File

@ -79,7 +79,7 @@ vlc_module_end ()
static const struct filter_video_callbacks filter_video_edge_cbs =
{
new_frame,
new_frame, NULL,
};
/*****************************************************************************

View File

@ -123,9 +123,18 @@ static picture_t *filter_chain_VideoBufferNew( filter_t *filter )
return pic;
}
static vlc_decoder_device * filter_chain_HoldDecoderDevice(vlc_object_t *o, void *sys)
{
filter_chain_t *chain = sys;
if (!chain->parent_video_owner.video->hold_device)
return NULL;
return chain->parent_video_owner.video->hold_device(o, chain->parent_video_owner.sys);
}
static const struct filter_video_callbacks filter_chain_video_cbs =
{
filter_chain_VideoBufferNew,
filter_chain_VideoBufferNew, filter_chain_HoldDecoderDevice,
};
#undef filter_chain_NewVideo

View File

@ -288,8 +288,15 @@ typedef struct {
picture_pool_t *pool;
} vout_display_priv_t;
static vlc_decoder_device * DisplayHoldDecoderDevice(vlc_object_t *o, void *sys)
{
vout_display_t *vd = sys;
vout_display_priv_t *osys = container_of(vd, vout_display_priv_t, display);
return osys->src_vctx ? vlc_video_context_HoldDevice(osys->src_vctx) : NULL;
}
static const struct filter_video_callbacks vout_display_filter_cbs = {
VideoBufferNew,
VideoBufferNew, DisplayHoldDecoderDevice,
};
static int VoutDisplayCreateRender(vout_display_t *vd)

View File

@ -1522,10 +1522,10 @@ static int vout_Start(vout_thread_t *vout, vlc_video_context *vctx, const vout_c
video_format_Copy(&sys->filter.src_fmt, &sys->original);
static const struct filter_video_callbacks static_cbs = {
VoutVideoFilterStaticNewPicture,
VoutVideoFilterStaticNewPicture, NULL/*TODO*/,
};
static const struct filter_video_callbacks interactive_cbs = {
VoutVideoFilterInteractiveNewPicture,
VoutVideoFilterInteractiveNewPicture, NULL/*TODO*/,
};
filter_owner_t owner = {
.video = &static_cbs,