diff --git a/doc/tutorials.mkdoc b/doc/tutorials.mkdoc index f26b1b96e..1647032f7 100644 --- a/doc/tutorials.mkdoc +++ b/doc/tutorials.mkdoc @@ -154,13 +154,13 @@ static int avcdec_catch(struct uprobe *uprobe, struct upipe *upipe, return UBASE_ERR_UNHANDLED; } wanted_hsize = (hsize * sar.num / sar.den / 2) * 2; - progressive = ubase_check(uref_pic_get_progressive(flow_def)); + progressive = ubase_check(uref_pic_check_progressive(flow_def)); struct uref *flow_def2 = uref_dup(flow_def); upipe_use(upipe); if (!progressive) { - uref_pic_set_progressive(flow_def2); + uref_pic_set_progressive(flow_def2, true); struct upipe *deint = upipe_void_alloc_output(upipe, upipe_filter_blend_mgr, uprobe_pfx_alloc(uprobe_use(logger), diff --git a/examples/extract_pic.c b/examples/extract_pic.c index 8eb35d559..42425c3ad 100644 --- a/examples/extract_pic.c +++ b/examples/extract_pic.c @@ -153,7 +153,7 @@ static int avcdec_catch(struct uprobe *uprobe, struct upipe *upipe, return UBASE_ERR_UNHANDLED; } wanted_hsize = (hsize * sar.num / sar.den / 2) * 2; - progressive = ubase_check(uref_pic_get_progressive(flow_def)); + progressive = ubase_check(uref_pic_check_progressive(flow_def)); /* supported format of the jpeg encoder */ const struct uref_pic_flow_format *supported_formats[] = { @@ -173,7 +173,7 @@ static int avcdec_catch(struct uprobe *uprobe, struct upipe *upipe, struct uref *flow_def2 = uref_dup(flow_def); upipe_use(upipe); - uref_pic_set_progressive(flow_def2); + uref_pic_set_progressive(flow_def2, true); uref_pic_flow_set_hsize(flow_def2, wanted_hsize); if (!supported) uref_pic_flow_set_format(flow_def2, diff --git a/include/upipe/uref_attr.h b/include/upipe/uref_attr.h index 561b4c099..6d44e713e 100644 --- a/include/upipe/uref_attr.h +++ b/include/upipe/uref_attr.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2012-2016 OpenHeadend S.A.R.L. + * Copyright (C) 2026 EasyTools * * Authors: Christophe Massiot * @@ -1016,6 +1017,18 @@ static inline int uref_##group##_get_##attr(struct uref *uref, bool *p) \ { \ return uref_attr_get_bool(uref, p, UDICT_TYPE_BOOL, name); \ } \ +/** @This checks if the desc attribute of a uref is set and true. \ + * \ + * @param uref pointer to the uref \ + * @return an error code \ + */ \ +static inline int uref_##group##_check_##attr(struct uref *uref) \ +{ \ + bool v = false; \ + int ret = uref_##group##_get_##attr(uref, &v); \ + return ubase_check(ret) ? \ + (v == true ? UBASE_ERR_NONE : UBASE_ERR_INVALID) : ret; \ +} \ /** @This sets the desc attribute of a uref. \ * \ * @param uref pointer to the uref \ @@ -1083,6 +1096,18 @@ static inline int uref_##group##_get_##attr(struct uref *uref, bool *p) \ { \ return uref_attr_get_bool(uref, p, type, NULL); \ } \ +/** @This checks if the desc attribute of a uref is set and true. \ + * \ + * @param uref pointer to the uref \ + * @return an error code \ + */ \ +static inline int uref_##group##_check_##attr(struct uref *uref) \ +{ \ + bool v = false; \ + int ret = uref_##group##_get_##attr(uref, &v); \ + return ubase_check(ret) ? \ + (v == true ? UBASE_ERR_NONE : UBASE_ERR_INVALID) : ret; \ +} \ /** @This sets the desc attribute of a uref. \ * \ * @param uref pointer to the uref \ diff --git a/include/upipe/uref_pic.h b/include/upipe/uref_pic.h index b7129d24e..29d40d239 100644 --- a/include/upipe/uref_pic.h +++ b/include/upipe/uref_pic.h @@ -1,5 +1,6 @@ /* * Copyright (C) 2012-2016 OpenHeadend S.A.R.L. + * Copyright (C) 2026 EasyTools * * Authors: Christophe Massiot * @@ -34,10 +35,10 @@ UREF_ATTR_UNSIGNED_SH(pic, lpadding, UDICT_TYPE_PIC_LPADDING, left padding) UREF_ATTR_UNSIGNED_SH(pic, rpadding, UDICT_TYPE_PIC_RPADDING, right padding) UREF_ATTR_UNSIGNED_SH(pic, tpadding, UDICT_TYPE_PIC_TPADDING, top padding) UREF_ATTR_UNSIGNED_SH(pic, bpadding, UDICT_TYPE_PIC_BPADDING, bottom padding) -UREF_ATTR_VOID_SH(pic, progressive, UDICT_TYPE_PIC_PROGRESSIVE, progressive) +UREF_ATTR_BOOL_SH(pic, progressive, UDICT_TYPE_PIC_PROGRESSIVE, progressive) UREF_ATTR_VOID_SH(pic, tf, UDICT_TYPE_PIC_TF, top field present) UREF_ATTR_VOID_SH(pic, bf, UDICT_TYPE_PIC_BF, bottom field present) -UREF_ATTR_VOID_SH(pic, tff, UDICT_TYPE_PIC_TFF, top field first) +UREF_ATTR_BOOL_SH(pic, tff, UDICT_TYPE_PIC_TFF, top field first) UREF_ATTR_SMALL_UNSIGNED_SH(pic, afd, UDICT_TYPE_PIC_AFD, active format description) UREF_ATTR_OPAQUE_SH(pic, cea_708, UDICT_TYPE_PIC_CEA_708, cea-708 captions) UREF_ATTR_OPAQUE_SH(pic, bar_data, UDICT_TYPE_PIC_BAR_DATA, afd bar data) diff --git a/lib/upipe-av/upipe_av.c b/lib/upipe-av/upipe_av.c index 3fa17ab36..c534d3230 100644 --- a/lib/upipe-av/upipe_av.c +++ b/lib/upipe-av/upipe_av.c @@ -122,18 +122,18 @@ int upipe_av_set_frame_properties(struct upipe *upipe, { #if LIBAVUTIL_VERSION_INT < AV_VERSION_INT(58, 7, 100) frame->key_frame = ubase_check(uref_pic_get_key(uref)); - frame->interlaced_frame = !ubase_check(uref_pic_get_progressive(uref)); - frame->top_field_first = ubase_check(uref_pic_get_tff(uref)); + frame->interlaced_frame = !ubase_check(uref_pic_check_progressive(uref)); + frame->top_field_first = ubase_check(uref_pic_check_tff(uref)); #else if (ubase_check(uref_pic_get_key(uref))) frame->flags |= AV_FRAME_FLAG_KEY; else frame->flags &= ~AV_FRAME_FLAG_KEY; - if (!ubase_check(uref_pic_get_progressive(uref))) + if (!ubase_check(uref_pic_check_progressive(uref))) frame->flags |= AV_FRAME_FLAG_INTERLACED; else frame->flags &= ~AV_FRAME_FLAG_INTERLACED; - if (ubase_check(uref_pic_get_tff(uref))) + if (ubase_check(uref_pic_check_tff(uref))) frame->flags |= AV_FRAME_FLAG_TOP_FIELD_FIRST; else frame->flags &= ~AV_FRAME_FLAG_TOP_FIELD_FIRST; diff --git a/lib/upipe-av/upipe_avcodec_decode.c b/lib/upipe-av/upipe_avcodec_decode.c index f3d0a6c9d..b7eed2b33 100644 --- a/lib/upipe-av/upipe_avcodec_decode.c +++ b/lib/upipe-av/upipe_avcodec_decode.c @@ -1110,7 +1110,7 @@ static void upipe_avcdec_output_sub(struct upipe *upipe, AVSubtitle *sub, !ubase_check(uref_pic_flow_set_bgra(flow_def_attr)) || #endif !ubase_check(uref_flow_set_def(flow_def_attr, UREF_PIC_SUB_FLOW_DEF)) || - !ubase_check(uref_pic_set_progressive(flow_def_attr)) || + !ubase_check(uref_pic_set_progressive(flow_def_attr, true)) || !ubase_check(uref_pic_flow_set_full_range(flow_def_attr)))) { uref_free(flow_def_attr); @@ -1191,7 +1191,7 @@ static void upipe_avcdec_output_sub(struct upipe *upipe, AVSubtitle *sub, return; } - uref_pic_set_progressive(uref); + uref_pic_set_progressive(uref, true); ubuf_pic_clear(ubuf, 0, 0, -1, -1, 1); uref_attach_ubuf(uref, ubuf); @@ -1352,9 +1352,9 @@ static void upipe_avcdec_output_pic(struct upipe *upipe, struct upump **upump_p) UBASE_FATAL(upipe, uref_pic_set_tf(uref)) UBASE_FATAL(upipe, uref_pic_set_bf(uref)) if (!interlaced_frame) - UBASE_FATAL(upipe, uref_pic_set_progressive(uref)) + UBASE_FATAL(upipe, uref_pic_set_progressive(uref, true)) else if (top_field_first) - UBASE_FATAL(upipe, uref_pic_set_tff(uref)) + UBASE_FATAL(upipe, uref_pic_set_tff(uref, true)) uint64_t duration = 0; AVRational uclock_time_base = av_make_q(1, UCLOCK_FREQ); diff --git a/lib/upipe-av/upipe_avcodec_encode.c b/lib/upipe-av/upipe_avcodec_encode.c index d40d52d8c..5871153d5 100644 --- a/lib/upipe-av/upipe_avcodec_encode.c +++ b/lib/upipe-av/upipe_avcodec_encode.c @@ -1538,10 +1538,10 @@ static int upipe_avcenc_set_flow_def(struct upipe *upipe, struct uref *flow_def) uref_pic_flow_get_matrix_coefficients_val(flow_def, &val))) context->colorspace = val; - if (!ubase_check(uref_pic_get_progressive(flow_def))) { + if (!ubase_check(uref_pic_check_progressive(flow_def))) { context->flags |= AV_CODEC_FLAG_INTERLACED_DCT | AV_CODEC_FLAG_INTERLACED_ME; - if (ubase_check(uref_pic_get_tff(flow_def))) + if (ubase_check(uref_pic_check_tff(flow_def))) context->field_order = AV_FIELD_TT; else context->field_order = AV_FIELD_BB; diff --git a/lib/upipe-av/upipe_avfilter.c b/lib/upipe-av/upipe_avfilter.c index 498586a23..9b87946dc 100644 --- a/lib/upipe-av/upipe_avfilter.c +++ b/lib/upipe-av/upipe_avfilter.c @@ -310,7 +310,7 @@ static int build_video_flow_def(struct uref *flow_def, #endif if (!interlaced_frame) - UBASE_RETURN(uref_pic_set_progressive(flow_def)) + UBASE_RETURN(uref_pic_set_progressive(flow_def, true)) if (color_range == AVCOL_RANGE_JPEG) UBASE_RETURN(uref_pic_flow_set_full_range(flow_def)) @@ -578,9 +578,9 @@ upipe_avfilt_sub_frame_to_uref(struct upipe *upipe, AVFrame *frame) #endif if (!interlaced_frame) - UBASE_ERROR(upipe, uref_pic_set_progressive(uref)) + UBASE_ERROR(upipe, uref_pic_set_progressive(uref, true)) else if (top_field_first) - UBASE_ERROR(upipe, uref_pic_set_tff(uref)) + UBASE_ERROR(upipe, uref_pic_set_tff(uref, true)) if (key_frame) UBASE_ERROR(upipe, uref_pic_set_key(uref)) @@ -1993,9 +1993,9 @@ static void upipe_avfilt_output_frame(struct upipe *upipe, #endif if (!interlaced_frame) - UBASE_ERROR(upipe, uref_pic_set_progressive(uref)) + UBASE_ERROR(upipe, uref_pic_set_progressive(uref, true)) else if (top_field_first) - UBASE_ERROR(upipe, uref_pic_set_tff(uref)) + UBASE_ERROR(upipe, uref_pic_set_tff(uref, true)) if (key_frame) UBASE_ERROR(upipe, uref_pic_set_key(uref)) diff --git a/lib/upipe-blackmagic/upipe_blackmagic_sink.cpp b/lib/upipe-blackmagic/upipe_blackmagic_sink.cpp index 66bb9c611..cf120cd54 100644 --- a/lib/upipe-blackmagic/upipe_blackmagic_sink.cpp +++ b/lib/upipe-blackmagic/upipe_blackmagic_sink.cpp @@ -1223,7 +1223,7 @@ uint32_t upipe_bmd_mode_from_flow_def(struct upipe *upipe, struct uref *flow_def return bmdModeUnknown; } - bool interlaced = !ubase_check(uref_pic_get_progressive(flow_def)); + bool interlaced = !ubase_check(uref_pic_check_progressive(flow_def)); upipe_notice_va(upipe, "%" PRIu64"x%" PRIu64" %" PRId64"/%" PRIu64" interlaced %d", hsize, vsize, fps.num, fps.den, interlaced); diff --git a/lib/upipe-blackmagic/upipe_blackmagic_source.cpp b/lib/upipe-blackmagic/upipe_blackmagic_source.cpp index ecc905e00..26dbe3de0 100644 --- a/lib/upipe-blackmagic/upipe_blackmagic_source.cpp +++ b/lib/upipe-blackmagic/upipe_blackmagic_source.cpp @@ -360,7 +360,7 @@ static int upipe_bmd_src_build_video(struct upipe *upipe, case bmdUnknownFieldDominance: /* sensible defaults */ case bmdUpperFieldFirst: - UBASE_RETURN(uref_pic_set_tff(flow_def)); + UBASE_RETURN(uref_pic_set_tff(flow_def, true)); uref_pic_delete_progressive(flow_def); upipe_bmd_src->tff = true; upipe_bmd_src->progressive = false; @@ -368,7 +368,7 @@ static int upipe_bmd_src_build_video(struct upipe *upipe, case bmdProgressiveFrame: case bmdProgressiveSegmentedFrame: uref_pic_delete_tff(flow_def); - UBASE_RETURN(uref_pic_set_progressive(flow_def)); + UBASE_RETURN(uref_pic_set_progressive(flow_def, true)); upipe_bmd_src->tff = false; upipe_bmd_src->progressive = true; break; @@ -529,9 +529,9 @@ HRESULT DeckLinkCaptureDelegate::VideoInputFrameArrived( uref_clock_set_duration(uref, FrameDuration); if (upipe_bmd_src->progressive) - uref_pic_set_progressive(uref); + uref_pic_set_progressive(uref, true); else if (upipe_bmd_src->tff) - uref_pic_set_tff(uref); + uref_pic_set_tff(uref, true); if (!uqueue_push(&upipe_bmd_src->uqueue, uref)) uref_free(uref); diff --git a/lib/upipe-filters/upipe_audio_bar.c b/lib/upipe-filters/upipe_audio_bar.c index 303cc220d..31f6346a4 100644 --- a/lib/upipe-filters/upipe_audio_bar.c +++ b/lib/upipe-filters/upipe_audio_bar.c @@ -248,7 +248,7 @@ static bool upipe_audiobar_handle(struct upipe *upipe, struct uref *uref, UBASE_FATAL(upipe, uref_pic_flow_add_plane(uref, 2, 1, 1, "u8")) UBASE_FATAL(upipe, uref_pic_flow_add_plane(uref, 2, 1, 1, "v8")) UBASE_FATAL(upipe, uref_pic_flow_add_plane(uref, 1, 1, 1, "a8")) - UBASE_FATAL(upipe, uref_pic_set_progressive(uref)) + UBASE_FATAL(upipe, uref_pic_set_progressive(uref, true)) upipe_audiobar->hsize = upipe_audiobar->vsize = upipe_audiobar->sep_width = upipe_audiobar->pad_width = UINT64_MAX; diff --git a/lib/upipe-filters/upipe_audio_graph.c b/lib/upipe-filters/upipe_audio_graph.c index f0a95dbba..f99b48495 100644 --- a/lib/upipe-filters/upipe_audio_graph.c +++ b/lib/upipe-filters/upipe_audio_graph.c @@ -244,7 +244,7 @@ static bool upipe_agraph_handle(struct upipe *upipe, struct uref *uref, uref_attr_import(uref, upipe_agraph->flow_def_config)) uref_pic_flow_clear_format(uref); UBASE_FATAL(upipe, uref_pic_flow_set_yuv420p(uref)); - UBASE_FATAL(upipe, uref_pic_set_progressive(uref)) + UBASE_FATAL(upipe, uref_pic_set_progressive(uref, true)) upipe_agraph->hsize = upipe_agraph->vsize = upipe_agraph->sep_width = upipe_agraph->pad_width = UINT64_MAX; @@ -371,7 +371,7 @@ static bool upipe_agraph_handle(struct upipe *upipe, struct uref *uref, if (dst[i]) ubuf_pic_plane_unmap(ubuf, chroma[i], 0, 0, -1, -1); - uref_pic_set_progressive(uref); + uref_pic_set_progressive(uref, true); upipe_agraph_output(upipe, uref, upump_p); return true; } diff --git a/lib/upipe-filters/upipe_filter_blend.c b/lib/upipe-filters/upipe_filter_blend.c index 1421c27d7..e71f0c883 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,21 @@ 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 = + ubase_check(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; } @@ -247,7 +270,7 @@ static bool upipe_filter_blend_handle(struct upipe *upipe, struct uref *uref, // Attach new ubuf and output frame uref_attach_ubuf(uref, ubuf_deint); - uref_pic_set_progressive(uref); + uref_pic_set_progressive(uref, true); uref_pic_delete_tff(uref); upipe_filter_blend_output(upipe, uref, upump_p); @@ -327,7 +350,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)) upipe_input(upipe, flow_def_dup, NULL); return UBASE_ERR_NONE; } diff --git a/lib/upipe-filters/upipe_filter_format.c b/lib/upipe-filters/upipe_filter_format.c index df2ff6446..8bde314ff 100644 --- a/lib/upipe-filters/upipe_filter_format.c +++ b/lib/upipe-filters/upipe_filter_format.c @@ -374,8 +374,8 @@ static int upipe_ffmt_check_flow_format(struct upipe *upipe, surface_type_out = ""; bool need_deint = ffmt_mgr->deint_mgr && - !ubase_check(uref_pic_get_progressive(flow_def)) && - ubase_check(uref_pic_get_progressive(flow_def_dup)); + !ubase_check(uref_pic_check_progressive(flow_def)) && + ubase_check(uref_pic_check_progressive(flow_def_dup)); bool need_scale = uref_pic_flow_cmp_hsize(flow_def, flow_def_dup) || uref_pic_flow_cmp_vsize(flow_def, flow_def_dup); diff --git a/lib/upipe-framers/upipe_h264_framer.c b/lib/upipe-framers/upipe_h264_framer.c index 0c9ac0ae3..745baf919 100644 --- a/lib/upipe-framers/upipe_h264_framer.c +++ b/lib/upipe-framers/upipe_h264_framer.c @@ -731,7 +731,7 @@ static bool upipe_h264f_activate_sps(struct upipe *upipe, uint32_t sps_id) vsize = map_height * 16 * 2; ubuf_block_stream_skip_bits(s, 1); /* mb_adaptive_frame_field */ } else { - UBASE_FATAL(upipe, uref_pic_set_progressive(flow_def)) + UBASE_FATAL(upipe, uref_pic_set_progressive(flow_def, true)) vsize = map_height * 16; } ubuf_block_stream_skip_bits(s, 1); /* direct8x8_inference */ @@ -1841,7 +1841,7 @@ static int upipe_h264f_prepare_au(struct upipe *upipe, struct uref *uref) switch (upipe_h264f->pic_struct) { case H264SEI_STRUCT_FRAME: - UBASE_RETURN(uref_pic_set_progressive(uref)) + UBASE_RETURN(uref_pic_set_progressive(uref, true)) duration *= 2; break; case H264SEI_STRUCT_TOP: @@ -1853,7 +1853,7 @@ static int upipe_h264f_prepare_au(struct upipe *upipe, struct uref *uref) case H264SEI_STRUCT_TOP_BOT: UBASE_RETURN(uref_pic_set_tf(uref)) UBASE_RETURN(uref_pic_set_bf(uref)) - UBASE_RETURN(uref_pic_set_tff(uref)) + UBASE_RETURN(uref_pic_set_tff(uref, true)) duration *= 2; break; case H264SEI_STRUCT_BOT_TOP: @@ -1864,7 +1864,7 @@ static int upipe_h264f_prepare_au(struct upipe *upipe, struct uref *uref) case H264SEI_STRUCT_TOP_BOT_TOP: UBASE_RETURN(uref_pic_set_tf(uref)) UBASE_RETURN(uref_pic_set_bf(uref)) - UBASE_RETURN(uref_pic_set_tff(uref)) + UBASE_RETURN(uref_pic_set_tff(uref, true)) duration *= 3; break; case H264SEI_STRUCT_BOT_TOP_BOT: diff --git a/lib/upipe-framers/upipe_h265_framer.c b/lib/upipe-framers/upipe_h265_framer.c index 1a467cda1..b4c71333c 100644 --- a/lib/upipe-framers/upipe_h265_framer.c +++ b/lib/upipe-framers/upipe_h265_framer.c @@ -1225,7 +1225,7 @@ static bool upipe_h265f_activate_sps(struct upipe *upipe, uint32_t sps_id) if (field_seq_flag) frame_rate.den *= 2; else - uref_pic_set_progressive(flow_def); + uref_pic_set_progressive(flow_def, true); urational_simplify(&frame_rate); UBASE_FATAL(upipe, uref_pic_flow_set_fps(flow_def, frame_rate)) @@ -2082,7 +2082,7 @@ static int upipe_h265f_prepare_au(struct upipe *upipe, struct uref *uref) switch (upipe_h265f->pic_struct) { case H265SEI_STRUCT_FRAME: - UBASE_FATAL(upipe, uref_pic_set_progressive(uref)) + UBASE_FATAL(upipe, uref_pic_set_progressive(uref, true)) duration *= 2; break; case H265SEI_STRUCT_TOP: @@ -2098,7 +2098,7 @@ static int upipe_h265f_prepare_au(struct upipe *upipe, struct uref *uref) case H265SEI_STRUCT_TOP_BOT: UBASE_FATAL(upipe, uref_pic_set_tf(uref)) UBASE_FATAL(upipe, uref_pic_set_bf(uref)) - UBASE_FATAL(upipe, uref_pic_set_tff(uref)) + UBASE_FATAL(upipe, uref_pic_set_tff(uref, true)) duration *= 2; break; case H265SEI_STRUCT_BOT_TOP: @@ -2109,7 +2109,7 @@ static int upipe_h265f_prepare_au(struct upipe *upipe, struct uref *uref) case H265SEI_STRUCT_TOP_BOT_TOP: UBASE_FATAL(upipe, uref_pic_set_tf(uref)) UBASE_FATAL(upipe, uref_pic_set_bf(uref)) - UBASE_FATAL(upipe, uref_pic_set_tff(uref)) + UBASE_FATAL(upipe, uref_pic_set_tff(uref, true)) duration *= 3; break; case H265SEI_STRUCT_BOT_TOP_BOT: diff --git a/lib/upipe-framers/upipe_mpgv_framer.c b/lib/upipe-framers/upipe_mpgv_framer.c index 87da35a5d..4e09c4f12 100644 --- a/lib/upipe-framers/upipe_mpgv_framer.c +++ b/lib/upipe-framers/upipe_mpgv_framer.c @@ -456,7 +456,7 @@ static bool upipe_mpgvf_parse_sequence(struct upipe *upipe) UBASE_FATAL(upipe, uref_block_flow_set_max_octetrate(flow_def, max_octetrate)) upipe_mpgvf->progressive_sequence = progressive; if (progressive) - UBASE_FATAL(upipe, uref_pic_set_progressive(flow_def)) + UBASE_FATAL(upipe, uref_pic_set_progressive(flow_def, true)) UBASE_FATAL(upipe, uref_pic_flow_set_macropixel(flow_def, 1)) UBASE_FATAL(upipe, uref_pic_flow_set_planes(flow_def, 0)) UBASE_FATAL(upipe, uref_pic_flow_add_plane(flow_def, 1, 1, 1, "y8")) @@ -862,14 +862,14 @@ static bool upipe_mpgvf_parse_picture(struct upipe *upipe, struct uref *uref, if (structure & MP2VPICX_BOTTOM_FIELD) UBASE_FATAL(upipe, uref_pic_set_bf(uref)) if (tff) - UBASE_FATAL(upipe, uref_pic_set_tff(uref)) + UBASE_FATAL(upipe, uref_pic_set_tff(uref, true)) if (progressive) - UBASE_FATAL(upipe, uref_pic_set_progressive(uref)) + UBASE_FATAL(upipe, uref_pic_set_progressive(uref, true)) } else { upipe_mpgvf->field_number = 0; UBASE_FATAL(upipe, uref_pic_set_tf(uref)) UBASE_FATAL(upipe, uref_pic_set_bf(uref)) - UBASE_FATAL(upipe, uref_pic_set_progressive(uref)) + UBASE_FATAL(upipe, uref_pic_set_progressive(uref, true)) } UBASE_FATAL(upipe, uref_clock_set_duration(uref, *duration_p)) diff --git a/lib/upipe-gl/upipe_glx_sink.c b/lib/upipe-gl/upipe_glx_sink.c index 82e34def0..69df0b7a2 100644 --- a/lib/upipe-gl/upipe_glx_sink.c +++ b/lib/upipe-gl/upipe_glx_sink.c @@ -500,7 +500,7 @@ static int upipe_glx_sink_provide_flow_format(struct upipe *upipe, uref_pic_flow_add_plane(flow_format, 1, 1, 2, "r5g6b5"); else uref_pic_flow_add_plane(flow_format, 1, 1, 3, "r8g8b8"); - uref_pic_set_progressive(flow_format); + uref_pic_set_progressive(flow_format, true); uref_pic_flow_delete_colour_primaries(flow_format); uref_pic_flow_delete_transfer_characteristics(flow_format); uref_pic_flow_delete_matrix_coefficients(flow_format); diff --git a/lib/upipe-modules/upipe_rtp_anc_unpack.c b/lib/upipe-modules/upipe_rtp_anc_unpack.c index 74e947611..b26a86035 100644 --- a/lib/upipe-modules/upipe_rtp_anc_unpack.c +++ b/lib/upipe-modules/upipe_rtp_anc_unpack.c @@ -179,7 +179,7 @@ static bool upipe_rtp_anc_unpack_handle(struct upipe *upipe, struct uref *uref, switch (f) { case RFC_8331_F_PROGRESSIVE: - uref_pic_set_progressive(uref); + uref_pic_set_progressive(uref, true); break; case RFC_8331_F_FIELD_1: uref_pic_set_tf(uref); diff --git a/lib/upipe-modules/upipe_separate_fields.c b/lib/upipe-modules/upipe_separate_fields.c index 383c2a747..d714f810e 100644 --- a/lib/upipe-modules/upipe_separate_fields.c +++ b/lib/upipe-modules/upipe_separate_fields.c @@ -85,7 +85,7 @@ static int upipe_separate_fields_set_flow_def(struct upipe *upipe, ctx->field_duration = UCLOCK_FREQ * fps.den / fps.num; UBASE_RETURN(uref_pic_flow_set_fps(flow_def_dup, fps)); UBASE_RETURN(uref_pic_flow_set_vsize(flow_def_dup, height)); - if (ubase_check(uref_pic_get_progressive(flow_def_dup))) + if (ubase_check(uref_pic_check_progressive(flow_def_dup))) UBASE_RETURN(uref_pic_delete_progressive(flow_def_dup)); upipe_separate_fields_store_flow_def(upipe, flow_def_dup); @@ -152,8 +152,8 @@ static void upipe_separate_fields_input(struct upipe *upipe, struct uref *uref, return; } - bool has_progressive_attr = ubase_check(uref_pic_get_progressive(uref)); - bool has_tff_attr = ubase_check(uref_pic_get_tff(uref)); + bool has_progressive_attr = ubase_check(uref_pic_check_progressive(uref)); + bool has_tff_attr = ubase_check(uref_pic_check_tff(uref)); if (has_progressive_attr) upipe_warn(upipe, "picture marked as progressive, separating fields anyway"); diff --git a/lib/upipe-modules/upipe_video_blank.c b/lib/upipe-modules/upipe_video_blank.c index dc637925c..f021af5ef 100644 --- a/lib/upipe-modules/upipe_video_blank.c +++ b/lib/upipe-modules/upipe_video_blank.c @@ -254,8 +254,8 @@ static bool upipe_vblk_try_output(struct upipe *upipe, uref_attach_ubuf(uref, ubuf); if (upipe_vblk->pic_attr) uref_attr_import(uref, upipe_vblk->pic_attr); - if (ubase_check(uref_pic_get_progressive(upipe_vblk->flow_def))) - uref_pic_set_progressive(uref); + if (ubase_check(uref_pic_check_progressive(upipe_vblk->flow_def))) + uref_pic_set_progressive(uref, true); upipe_vblk_output(upipe, uref, upump_p); return true; diff --git a/lib/upipe-modules/upipe_videocont.c b/lib/upipe-modules/upipe_videocont.c index 2f7fda10d..e469f2cf1 100644 --- a/lib/upipe-modules/upipe_videocont.c +++ b/lib/upipe-modules/upipe_videocont.c @@ -427,8 +427,8 @@ static int upipe_videocont_switch_format(struct upipe *upipe, } else { uref_pic_flow_delete_overscan(out_flow); } - if (likely(ubase_check(uref_pic_get_progressive(in_flow)))) { - uref_pic_set_progressive(out_flow); + if (likely(ubase_check(uref_pic_check_progressive(in_flow)))) { + uref_pic_set_progressive(out_flow, true); } else { uref_pic_delete_progressive(out_flow); } diff --git a/lib/upipe-swscale/upipe_sws.c b/lib/upipe-swscale/upipe_sws.c index c88b79394..60bd0b04f 100644 --- a/lib/upipe-swscale/upipe_sws.c +++ b/lib/upipe-swscale/upipe_sws.c @@ -169,7 +169,7 @@ static bool upipe_sws_handle(struct upipe *upipe, struct uref *uref, return true; } - int progressive = ubase_check(uref_pic_get_progressive(uref)) ? 1 : 0; + int progressive = ubase_check(uref_pic_check_progressive(uref)) ? 1 : 0; if (unlikely(!progressive && input_vsize % 2)) { upipe_warn(upipe, "interlaced picture has odd vertical size"); progressive = 1; diff --git a/lib/upipe-x264/upipe_x264.c b/lib/upipe-x264/upipe_x264.c index fe060ec9f..52d216196 100644 --- a/lib/upipe-x264/upipe_x264.c +++ b/lib/upipe-x264/upipe_x264.c @@ -423,7 +423,7 @@ static bool upipe_x264_open(struct upipe *upipe, int width, int height) params->i_width = width; params->i_height = height; params->b_interlaced = - !ubase_check(uref_pic_get_progressive(upipe_x264->flow_def_input)); + !ubase_check(uref_pic_check_progressive(upipe_x264->flow_def_input)); const char *content; int ret; diff --git a/lib/upipe-x265/upipe_x265.c b/lib/upipe-x265/upipe_x265.c index ddec9b774..167ca92dc 100644 --- a/lib/upipe-x265/upipe_x265.c +++ b/lib/upipe-x265/upipe_x265.c @@ -401,7 +401,7 @@ static void apply_params(struct upipe *upipe, x265_param *params) params->internalCsp = upipe_x265->color_space; params->interlaceMode = - !ubase_check(uref_pic_get_progressive(flow_def)); + !ubase_check(uref_pic_check_progressive(flow_def)); upipe_x265_set_option(upipe, params, "range", ubase_check(uref_pic_flow_get_full_range(flow_def)) ? diff --git a/lib/upipe/udict_inline.c b/lib/upipe/udict_inline.c index 58db72ba8..d7ad37b33 100644 --- a/lib/upipe/udict_inline.c +++ b/lib/upipe/udict_inline.c @@ -1,5 +1,6 @@ /* * Copyright (C) 2012-2017 OpenHeadend S.A.R.L. + * Copyright (C) 2026 EasyTools * * Authors: Christophe Massiot * @@ -79,10 +80,10 @@ static const struct inline_shorthand inline_shorthands[] = { { "p.bpadding", UDICT_TYPE_UNSIGNED }, { "p.sar", UDICT_TYPE_RATIONAL }, { "p.overscan", UDICT_TYPE_BOOL }, - { "p.progressive", UDICT_TYPE_VOID }, + { "p.progressive", UDICT_TYPE_BOOL }, { "p.tf", UDICT_TYPE_VOID }, { "p.bf", UDICT_TYPE_VOID }, - { "p.tff", UDICT_TYPE_VOID }, + { "p.tff", UDICT_TYPE_BOOL }, { "p.afd", UDICT_TYPE_SMALL_UNSIGNED }, { "p.cea_708", UDICT_TYPE_OPAQUE }, { "p.bar_data", UDICT_TYPE_OPAQUE }, diff --git a/tests/upipe_blank_source_test.c b/tests/upipe_blank_source_test.c index 8362b7858..8c8cbe937 100644 --- a/tests/upipe_blank_source_test.c +++ b/tests/upipe_blank_source_test.c @@ -116,7 +116,7 @@ static void test_input(struct upipe *upipe, struct uref *uref, uref_free(flow); struct uref *uref = uref_alloc(uref_mgr); - uref_pic_set_progressive(uref); + uref_pic_set_progressive(uref, true); upipe_input(blksrc, uref, NULL); } diff --git a/tests/upipe_blit_test.c b/tests/upipe_blit_test.c index 683c4bd02..98f83223c 100644 --- a/tests/upipe_blit_test.c +++ b/tests/upipe_blit_test.c @@ -152,7 +152,7 @@ static void setup_sub(struct upipe *sub, struct uref_mgr *uref_mgr, struct uref *uref = uref_pic_alloc(uref_mgr, pic_mgr, SUBSIZE, SUBSIZE); assert(uref != NULL); - uref_pic_set_progressive(uref); + uref_pic_set_progressive(uref, true); fill_in(uref, "y8", val); fill_in(uref, "u8", val); fill_in(uref, "v8", val); @@ -312,7 +312,7 @@ int main(int argc, char **argv) struct uref *uref; uref = uref_pic_alloc(uref_mgr, pic_mgr, BGSIZE, BGSIZE); assert(uref != NULL); - uref_pic_set_progressive(uref); + uref_pic_set_progressive(uref, true); fill_in(uref, "y8", 0); fill_in(uref, "u8", 0); fill_in(uref, "v8", 0); @@ -343,7 +343,7 @@ int main(int argc, char **argv) uref = uref_pic_alloc(uref_mgr, pic_mgr, BGSIZE, BGSIZE); assert(uref != NULL); - uref_pic_set_progressive(uref); + uref_pic_set_progressive(uref, true); fill_in(uref, "y8", 0); fill_in(uref, "u8", 0); fill_in(uref, "v8", 0); diff --git a/tests/upipe_separate_fields_test.c b/tests/upipe_separate_fields_test.c index 6ceb72d82..89545911e 100644 --- a/tests/upipe_separate_fields_test.c +++ b/tests/upipe_separate_fields_test.c @@ -278,7 +278,7 @@ int main(int argc, char **argv) ubase_assert(uref_pic_flow_add_plane(flow, 1, 1, 1, "y8")); ubase_assert(uref_pic_flow_add_plane(flow, 2, 2, 1, "u8")); ubase_assert(uref_pic_flow_add_plane(flow, 2, 2, 1, "v8")); - ubase_assert(uref_pic_set_tff(flow)); + ubase_assert(uref_pic_set_tff(flow, true)); ubase_assert(uref_pic_flow_set_hsize(flow, WIDTH)); ubase_assert(uref_pic_flow_set_vsize(flow, HEIGHT)); ubase_assert(uref_pic_flow_set_fps(flow, fps)); diff --git a/tests/upipe_sws_test.c b/tests/upipe_sws_test.c index 28cfffa52..6af965c80 100644 --- a/tests/upipe_sws_test.c +++ b/tests/upipe_sws_test.c @@ -310,7 +310,7 @@ int main(int argc, char **argv) uref1 = uref_pic_alloc(uref_mgr, ubuf_mgr, SRCSIZE, SRCSIZE); assert(uref1 != NULL); assert(uref1->ubuf != NULL); - ubase_assert(uref_pic_set_progressive(uref1)); + ubase_assert(uref_pic_set_progressive(uref1, true)); /* fill reference picture */ fill_in(uref1, "y8", 1, 1, 1); @@ -323,7 +323,7 @@ int main(int argc, char **argv) uref2 = uref_pic_alloc(uref_mgr, ubuf_mgr, DSTSIZE, DSTSIZE); assert(uref2); assert(uref2->ubuf); - ubase_assert(uref_pic_set_progressive(uref2)); + ubase_assert(uref_pic_set_progressive(uref2, true)); img_convert_ctx = sws_getCachedContext(NULL, SRCSIZE, SRCSIZE, AV_PIX_FMT_YUV420P, diff --git a/tests/upipe_x265_test.c b/tests/upipe_x265_test.c index 49dff409e..bd66d8709 100644 --- a/tests/upipe_x265_test.c +++ b/tests/upipe_x265_test.c @@ -219,7 +219,7 @@ int main(int argc, char **argv) ubase_assert(uref_pic_flow_set_vsize(flow_def, HEIGHT)); struct urational fps = { .num = 25, .den = 1 }; ubase_assert(uref_pic_flow_set_fps(flow_def, fps)); - ubase_assert(uref_pic_set_progressive(flow_def)); + ubase_assert(uref_pic_set_progressive(flow_def, true)); /* x265 pipe */ struct upipe *x265 = upipe_void_alloc(upipe_x265_mgr,