[vlc-devel] [PATCH 1/1] vout: add I420 as middle-man if filters chain fails
Thomas Guillem
thomas at gllm.fr
Wed May 24 14:58:41 CEST 2017
Refs #18078 #14037
Fixes #13066 #16466
---
src/video_output/video_output.c | 34 +++++++++++++++++++++++++++++++++-
1 file changed, 33 insertions(+), 1 deletion(-)
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 730b902b24..1d55ef2791 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -695,6 +695,37 @@ typedef struct {
config_chain_t *cfg;
} vout_filter_t;
+static int ThreadFilterInsertMiddleMan(vout_thread_t *vout, filter_chain_t *chain,
+ const char *name, config_chain_t *cfg)
+{
+ /* This function is called when a filter insertion failed. This function
+ * will try to append a converter to convert from video.i_chroma to I420.
+ * This chroma is used as middle-man since it's the most used by VLC
+ * filters. */
+
+ const es_format_t *fmt_in = filter_chain_GetFmtOut(chain);
+ if (fmt_in->video.i_chroma == VLC_CODEC_I420)
+ return VLC_EGENERIC;
+
+ vlc_fourcc_t i_orig_chroma = fmt_in->video.i_chroma;
+ es_format_t fmt_middleman = *fmt_in;
+ fmt_middleman.video.i_chroma = VLC_CODEC_I420;
+ if (filter_chain_AppendConverter(chain, fmt_in, &fmt_middleman) != 0)
+ {
+ msg_Err(vout, "Failed to convert from '%4.4s' to '%4.4s'",
+ (const char *) &i_orig_chroma,
+ (const char *) &fmt_middleman.video.i_chroma);
+ return VLC_EGENERIC;
+ }
+ if (!filter_chain_AppendFilter(chain, name, cfg, NULL, NULL))
+ return VLC_EGENERIC;
+
+ msg_Info(vout, "adding '%4.4s' -> '%4.4s' derive converter needed by '%s'"
+ " filter", (const char *) &i_orig_chroma,
+ (const char *) &fmt_middleman.video.i_chroma, name);
+ return VLC_SUCCESS;
+}
+
static void ThreadChangeFilters(vout_thread_t *vout,
const video_format_t *source,
const char *filters,
@@ -770,7 +801,8 @@ static void ThreadChangeFilters(vout_thread_t *vout,
for (size_t i = 0; i < vlc_array_count(array); i++) {
vout_filter_t *e = vlc_array_item_at_index(array, i);
msg_Dbg(vout, "Adding '%s' as %s", e->name, a == 0 ? "static" : "interactive");
- if (!filter_chain_AppendFilter(chain, e->name, e->cfg, NULL, NULL)) {
+ if (!filter_chain_AppendFilter(chain, e->name, e->cfg, NULL, NULL)
+ && ThreadFilterInsertMiddleMan(vout, chain, e->name, e->cfg)) {
msg_Err(vout, "Failed to add filter '%s'", e->name);
config_ChainDestroy(e->cfg);
}
--
2.11.0
More information about the vlc-devel
mailing list