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:
parent
0453abddee
commit
6d41261399
@ -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.
|
||||
*/
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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" );
|
||||
|
@ -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)
|
||||
|
@ -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. */
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -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,
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -79,7 +79,7 @@ vlc_module_end ()
|
||||
|
||||
static const struct filter_video_callbacks filter_video_edge_cbs =
|
||||
{
|
||||
new_frame,
|
||||
new_frame, NULL,
|
||||
};
|
||||
|
||||
/*****************************************************************************
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user