[vlc-devel] [PATCH 10/31] decoder: get the decoder device from the vout
Steve Lhomme
robux4 at ycbcr.xyz
Fri Jul 5 16:19:49 CEST 2019
---
src/audio_output/filters.c | 8 +++++++-
src/input/decoder.c | 11 +++++++++--
src/input/resource.c | 6 ++++--
src/input/resource.h | 3 ++-
src/video_output/video_output.c | 8 +++++++-
src/video_output/vout_internal.h | 5 ++++-
6 files changed, 33 insertions(+), 8 deletions(-)
diff --git a/src/audio_output/filters.c b/src/audio_output/filters.c
index 6a37c8e8ab..efe6a11973 100644
--- a/src/audio_output/filters.c
+++ b/src/audio_output/filters.c
@@ -36,6 +36,7 @@
#include <vlc_modules.h>
#include <vlc_aout.h>
#include <vlc_filter.h>
+#include <vlc_codec.h>
#include <libvlc.h>
#include "aout_internal.h"
#include "../video_output/vout_internal.h" /* for vout_Request */
@@ -395,10 +396,15 @@ vout_thread_t *aout_filter_GetVout(filter_t *filter, const video_format_t *fmt)
video_format_AdjustColorSpace(&adj_fmt);
- if (vout_Request(&cfg, NULL)) {
+ vlc_decoder_device *dec_dev = NULL;
+ if (vout_Request(&cfg, &dec_dev, NULL)) {
+ if (dec_dev)
+ vlc_decoder_device_Release(dec_dev);
vout_Close(vout);
vout = NULL;
}
+ /* FIXME unused for now */
+ vlc_decoder_device_Release(dec_dev);
return vout;
}
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 77cae4a419..d19d75f5e4 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -105,6 +105,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 */
@@ -446,6 +447,7 @@ static int vout_update_format( decoder_t *p_dec )
if( need_vout )
{
vout_thread_t *p_vout;
+ vlc_decoder_device *p_dec_dev;
if( !p_dec->fmt_out.video.i_width ||
!p_dec->fmt_out.video.i_height ||
@@ -516,7 +518,9 @@ static int vout_update_format( decoder_t *p_dec )
vlc_mutex_lock( &p_owner->lock );
p_vout = p_owner->p_vout;
+ p_dec_dev = p_owner->p_dec_dev;
p_owner->p_vout = NULL;
+ p_owner->p_dec_dev = NULL;
vlc_mutex_unlock( &p_owner->lock );
unsigned dpb_size;
@@ -541,17 +545,20 @@ static int vout_update_format( decoder_t *p_dec )
break;
}
enum vlc_vout_order order;
+ vlc_decoder_device *dec_dev;
p_vout = input_resource_GetVout( 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 );
+ .mouse_event = MouseEvent, .mouse_opaque = p_dec,
+ .dec_devive = p_dec_dev,
+ }, &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;
+ p_owner->p_dec_dev = dec_dev;
DecoderUpdateFormatLocked( p_dec );
p_owner->fmt.video.i_chroma = p_dec->fmt_out.i_codec;
diff --git a/src/input/resource.c b/src/input/resource.c
index b4ffbd68ce..c0ae038c35 100644
--- a/src/input/resource.c
+++ b/src/input/resource.c
@@ -370,7 +370,8 @@ void input_resource_PutVout(input_resource_t *p_resource,
vout_thread_t *input_resource_GetVout(input_resource_t *p_resource,
const vout_configuration_t *cfg,
- enum vlc_vout_order *order)
+ enum vlc_vout_order *order,
+ vlc_decoder_device **dec_dev)
{
vout_configuration_t cfg_buf;
vout_thread_t *vout;
@@ -425,13 +426,14 @@ vout_thread_t *input_resource_GetVout(input_resource_t *p_resource,
}
#endif
- if (vout_Request(cfg, p_resource->p_input)) {
+ if (vout_Request(cfg, dec_dev, p_resource->p_input)) {
input_resource_PutVoutLocked(p_resource, cfg->vout, false);
vlc_mutex_unlock(&p_resource->lock);
return NULL;
}
vout = cfg->vout;
+ *dec_dev = cfg->dec_devive;
DisplayVoutTitle(p_resource, vout);
/* Send original viewpoint to the input in order to update other ESes */
diff --git a/src/input/resource.h b/src/input/resource.h
index a13ca0dc85..468ae196fb 100644
--- a/src/input/resource.h
+++ b/src/input/resource.h
@@ -39,7 +39,8 @@ sout_instance_t *input_resource_RequestSout( input_resource_t *, sout_instance_t
vout_thread_t *input_resource_GetVout(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 *);
/**
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index c5b2d032a0..7c03b6ed47 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -1862,7 +1862,8 @@ vout_thread_t *vout_Hold(vout_thread_t *vout)
return vout;
}
-int vout_Request(const vout_configuration_t *cfg, input_thread_t *input)
+int vout_Request(const vout_configuration_t *cfg, vlc_decoder_device **dec_dev,
+ input_thread_t *input)
{
vout_thread_t *vout = cfg->vout;
vout_thread_sys_t *sys = vout->p;
@@ -1918,6 +1919,7 @@ int vout_Request(const vout_configuration_t *cfg, input_thread_t *input)
}
sys->window_enabled = true;
+ assert(sys->dec_device == NULL);
sys->dec_device = vlc_decoder_device_Create(sys->display_cfg.window);
/* temporary until it comes from the decoder/filters */
sys->video_context.device = sys->dec_device;
@@ -1949,6 +1951,10 @@ error:
return -1;
}
+ vlc_mutex_lock(&sys->window_lock);
+ *dec_dev = sys->dec_device ? vlc_decoder_device_Hold( sys->dec_device ) : NULL;
+ vlc_mutex_unlock(&sys->window_lock);
+
if (input != NULL && sys->spu)
spu_Attach(sys->spu, input);
vout_IntfReinit(vout);
diff --git a/src/video_output/vout_internal.h b/src/video_output/vout_internal.h
index f328fa1973..247e214c57 100644
--- a/src/video_output/vout_internal.h
+++ b/src/video_output/vout_internal.h
@@ -48,6 +48,7 @@
*/
typedef struct {
vout_thread_t *vout;
+ vlc_decoder_device *dec_devive;
vlc_clock_t *clock;
const video_format_t *fmt;
unsigned dpb_size;
@@ -209,11 +210,13 @@ vout_thread_t *vout_CreateDummy(vlc_object_t *obj) VLC_USED;
* You can release the returned value either by vout_Request() or vout_Close().
*
* \param cfg the video configuration requested.
+ * \param dec_dev pointer to receive the decoder device to use with the vout
* \param input used to get attachments for spu filters
* \retval 0 on success
* \retval -1 on error
*/
-int vout_Request(const vout_configuration_t *cfg, input_thread_t *input);
+int vout_Request(const vout_configuration_t *cfg, vlc_decoder_device **dec_dev,
+ input_thread_t *input);
/**
* Disables a vout.
--
2.17.1
More information about the vlc-devel
mailing list