diff --git a/lib/upipe-filters/upipe_filter_blend.c b/lib/upipe-filters/upipe_filter_blend.c index 9c3c18bd2..1e054ac4a 100644 --- a/lib/upipe-filters/upipe_filter_blend.c +++ b/lib/upipe-filters/upipe_filter_blend.c @@ -1,8 +1,10 @@ /* * Copyright (C) 2011 VLC authors and VideoLAN * Copyright (C) 2013-2014 OpenHeadend S.A.R.L. + * Copyright (C) 2026 EasyTools * * Authors: Benjamin Cohen + * Arnaud de Turckheim * * SPDX-License-Identifier: LGPL-2.1-or-later */ @@ -68,6 +70,9 @@ struct upipe_filter_blend { /** list of blockers (used during udeal) */ struct uchain blockers; + /** bypass? */ + bool bypass; + /** public structure */ struct upipe upipe; }; @@ -103,7 +108,12 @@ static struct upipe *upipe_filter_blend_alloc(struct upipe_mgr *mgr, upipe_filter_blend_init_ubuf_mgr(upipe); upipe_filter_blend_init_output(upipe); upipe_filter_blend_init_input(upipe); + struct upipe_filter_blend *upipe_filter_blend = + upipe_filter_blend_from_upipe(upipe); + upipe_filter_blend->bypass = false; + upipe_throw_ready(upipe); + return upipe; } @@ -195,8 +205,20 @@ static bool upipe_filter_blend_handle(struct upipe *upipe, struct uref *uref, struct upipe_filter_blend *upipe_filter_blend = upipe_filter_blend_from_upipe(upipe); const char *def; if (unlikely(ubase_check(uref_flow_get_def(uref, &def)))) { - upipe_filter_blend_store_flow_def(upipe, NULL); - upipe_filter_blend_require_ubuf_mgr(upipe, uref); + upipe_filter_blend->bypass = uref_pic_check_progressive(uref); + if (!upipe_filter_blend->bypass) { + uref_pic_set_progressive(uref, true); + uref_pic_delete_tff(uref); + upipe_filter_blend_store_flow_def(upipe, NULL); + upipe_filter_blend_require_ubuf_mgr(upipe, uref); + } else { + upipe_filter_blend_store_flow_def(upipe, uref); + } + return true; + } + + if (upipe_filter_blend->bypass) { + upipe_filter_blend_output(upipe, uref, upump_p); return true; } @@ -327,7 +349,6 @@ static int upipe_filter_blend_set_flow_def(struct upipe *upipe, upipe_throw_fatal(upipe, UBASE_ERR_ALLOC); return UBASE_ERR_ALLOC; } - UBASE_RETURN(uref_pic_set_progressive(flow_def_dup, true)) upipe_input(upipe, flow_def_dup, NULL); return UBASE_ERR_NONE; }