[vlc-devel] [PATCH 03/31] decoder: request decoder device when getting the vout
Steve Lhomme
robux4 at ycbcr.xyz
Mon Sep 23 17:01:08 CEST 2019
---
src/input/decoder.c | 12 ++++++++++--
src/input/resource.c | 7 ++++---
src/input/resource.h | 5 +++--
3 files changed, 17 insertions(+), 7 deletions(-)
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 57c9de6a1ee..f2f69a05fd1 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -122,6 +122,7 @@ struct decoder_owner
audio_output_t *p_aout;
vout_thread_t *p_vout;
+ vlc_decoder_device *p_dec_dev;
/* -- Theses variables need locking on read *and* write -- */
/* Preroll */
@@ -560,17 +561,21 @@ static int ModuleThread_UpdateVideoFormat( decoder_t *p_dec )
break;
}
enum vlc_vout_order order;
- p_vout = input_resource_GetVout( p_owner->p_resource,
+ vlc_decoder_device *dec_dev = NULL;
+ p_vout = input_resource_GetVoutHoldDevice( p_owner->p_resource,
&(vout_configuration_t) {
.vout = p_vout, .clock = p_owner->p_clock, .fmt = &fmt,
.dpb_size = dpb_size + p_dec->i_extra_picture_buffers + 1,
.mouse_event = MouseEvent, .mouse_opaque = p_dec
- }, &order );
+ }, &order, &dec_dev );
if (p_vout)
decoder_Notify(p_owner, on_vout_added, p_vout, order);
vlc_mutex_lock( &p_owner->lock );
p_owner->p_vout = p_vout;
+ if ( p_owner->p_dec_dev != NULL )
+ vlc_decoder_device_Release( p_owner->p_dec_dev );
+ p_owner->p_dec_dev = dec_dev;
DecoderUpdateFormatLocked( p_owner );
p_owner->fmt.video.i_chroma = p_dec->fmt_out.i_codec;
@@ -1906,6 +1911,9 @@ static void DeleteDecoder( decoder_t * p_dec )
const enum es_format_category_e i_cat =p_dec->fmt_in.i_cat;
decoder_Clean( p_dec );
+ if ( p_owner->p_dec_dev )
+ vlc_decoder_device_Release( p_owner->p_dec_dev );
+
/* Free all packets still in the decoder fifo. */
block_FifoRelease( p_owner->p_fifo );
diff --git a/src/input/resource.c b/src/input/resource.c
index 46f2f339ab8..f05b6716e7b 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -368,9 +368,10 @@ void input_resource_PutVout(input_resource_t *p_resource,
vlc_mutex_unlock( &p_resource->lock );
}
-vout_thread_t *input_resource_GetVout(input_resource_t *p_resource,
+vout_thread_t *input_resource_GetVoutHoldDevice(input_resource_t *p_resource,
const vout_configuration_t *cfg,
- enum vlc_vout_order *order)
+ enum vlc_vout_order *order,
+ vlc_decoder_device **pp_dec_dev)
{
vout_configuration_t cfg_buf;
vout_thread_t *vout;
@@ -425,7 +426,7 @@ vout_thread_t *input_resource_GetVout(input_resource_t *p_resource,
}
#endif
- if (vout_Request(cfg, NULL, p_resource->p_input)) {
+ if (vout_Request(cfg, pp_dec_dev, p_resource->p_input)) {
input_resource_PutVoutLocked(p_resource, cfg->vout, false);
vlc_mutex_unlock(&p_resource->lock);
return NULL;
diff --git a/src/input/resource.h b/src/input/resource.h
index a13ca0dc85c..ab456d7ce5d 100644
--- a/src/input/resource.h
+++ b/src/input/resource.h
@@ -37,9 +37,10 @@ void input_resource_SetInput( input_resource_t *, input_thread_t * );
*/
sout_instance_t *input_resource_RequestSout( input_resource_t *, sout_instance_t *, const char *psz_sout );
-vout_thread_t *input_resource_GetVout(input_resource_t *,
+vout_thread_t *input_resource_GetVoutHoldDevice(input_resource_t *,
const vout_configuration_t *,
- enum vlc_vout_order *order);
+ enum vlc_vout_order *order,
+ vlc_decoder_device **);
void input_resource_PutVout(input_resource_t *, vout_thread_t *);
/**
--
2.17.1
More information about the vlc-devel
mailing list