From ac037b068419ff47461945bba933807a9db45663 Mon Sep 17 00:00:00 2001 From: Arnaud de Turckheim Date: Tue, 26 Nov 2024 12:03:13 +0100 Subject: [PATCH] upipe_ts_mux: add s302m audio support --- lib/upipe-ts/upipe_ts_mux.c | 15 +++++++++++++-- lib/upipe-ts/upipe_ts_psi_generator.c | 7 +++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lib/upipe-ts/upipe_ts_mux.c b/lib/upipe-ts/upipe_ts_mux.c index 4de96d5ac..dd214cb21 100644 --- a/lib/upipe-ts/upipe_ts_mux.c +++ b/lib/upipe-ts/upipe_ts_mux.c @@ -119,6 +119,8 @@ #define BS_ADTS_12 12804 /** ADTS buffer size for <= 48 channels */ #define BS_ADTS_48 51216 +/** s302m buffer size (SMPTE 302m) */ +#define BS_S302M 65024 /** Teletext buffer size */ #define BS_TELX 1504 /** DVB subtitles buffer size (ETSI EN 300 743 5.) */ @@ -1175,7 +1177,8 @@ static int upipe_ts_mux_input_set_flow_def(struct upipe *upipe, } else if (!ubase_ncmp(sub_def, ".ac3.") || !ubase_ncmp(sub_def, ".eac3.") || !ubase_ncmp(sub_def, ".dts.") || - !ubase_ncmp(sub_def, ".opus.")) { + !ubase_ncmp(sub_def, ".opus.") || + !ubase_ncmp(sub_def, ".s302m.")) { UBASE_FATAL(upipe, uref_ts_flow_set_pes_id( flow_def_dup, PES_STREAM_ID_PRIVATE_1)); } @@ -1275,6 +1278,7 @@ static int upipe_ts_mux_input_set_flow_def(struct upipe *upipe, } else if (strstr(def, ".sound.") != NULL) { uint64_t pes_min_duration = upipe_ts_mux->pes_min_duration; + uint64_t tb_rate = TB_RATE_AUDIO; buffer_size = BS_ADTS_2; if (!ubase_ncmp(def, "block.mp2.") || !ubase_ncmp(def, "block.mp3.") || @@ -1302,9 +1306,16 @@ static int upipe_ts_mux_input_set_flow_def(struct upipe *upipe, pes_min_duration = 0; } else if (!ubase_ncmp(def, "block.dts.")) { pes_min_duration = 0; + } else if (!ubase_ncmp(def, "block.s302m.")) { + buffer_size = BS_S302M; + pes_min_duration = 0; + uint64_t max_octetrate = octetrate; + uref_block_flow_get_max_octetrate(flow_def, &max_octetrate); + /* SMPTE s302m-2007 7.6 */ + tb_rate = max_octetrate * 6 / 5; } - UBASE_FATAL(upipe, uref_ts_flow_set_tb_rate(flow_def_dup, TB_RATE_AUDIO)); + UBASE_FATAL(upipe, uref_ts_flow_set_tb_rate(flow_def_dup, tb_rate)); if (!ubase_check(uref_ts_flow_get_pes_min_duration(flow_def_dup, &pes_min_duration))) UBASE_FATAL(upipe, uref_ts_flow_set_pes_min_duration(flow_def_dup, diff --git a/lib/upipe-ts/upipe_ts_psi_generator.c b/lib/upipe-ts/upipe_ts_psi_generator.c index 280198f57..586904530 100644 --- a/lib/upipe-ts/upipe_ts_psi_generator.c +++ b/lib/upipe-ts/upipe_ts_psi_generator.c @@ -377,6 +377,9 @@ static int upipe_ts_psig_flow_check_inner(struct upipe *upipe, default: break; } + else if (!ubase_ncmp(sub_def, ".s302m.")) { + *descriptors_size_p += DESC05_HEADER_SIZE; + } else if (ubase_ncmp(sub_def, ".mp2.") && ubase_ncmp(sub_def, ".mp3.")) { upipe_warn_va(upipe, "unknown flow definition \"%s\"", raw_def); @@ -882,6 +885,10 @@ static int upipe_ts_psig_flow_build_inner(struct upipe *upipe, uint8_t *es, default: break; } + } else if (!ubase_ncmp(sub_def, ".s302m.")) { + desc = descs_get_desc(descs, k++); + desc05_init(desc); + desc05_set_identifier(desc, (const uint8_t *)"BSSD"); } } else if (strstr(raw_def, ".metadata.")) { if (!ubase_ncmp(sub_def, ".id3.")) {