[FFmpeg-devel] [PATCH v2] mpegts: Add support for preserving SMPTE 2038 when transcoding MPEG-TS streams

Marton Balint cus at passwd.hu
Sun Mar 26 01:37:03 EET 2023



On Fri, 17 Mar 2023, Devin Heitmueller wrote:

> Add the appropriate descriptors to the MPEG-TS demux and mux to
> ensure that SMPTE 2038 VANC streams are properly preserved
> when using codec copy (including adding the appropriate PMT
> descriptors).
>
> The focus of this patch is TS input to TS output.  A separate
> patch adds support for output of 2038 VANC over decklink SDI.
>
> Thanks to Marton Balint for feedback to preserve ABI compatibility.

Thanks, will split the patch to the codec ID addition part and the 
format part and will apply.

Regards,
Marton

>
> Signed-off-by: Devin Heitmueller <dheitmueller at ltnglobal.com>
> ---
> libavcodec/codec_desc.c | 6 ++++++
> libavcodec/codec_id.h   | 1 +
> libavformat/mpegts.c    | 1 +
> libavformat/mpegtsenc.c | 5 +++++
> libavformat/mux.c       | 6 ++++--
> 5 files changed, 17 insertions(+), 2 deletions(-)
>
> diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c
> index e80ac07700..d912704891 100644
> --- a/libavcodec/codec_desc.c
> +++ b/libavcodec/codec_desc.c
> @@ -3627,6 +3627,12 @@ static const AVCodecDescriptor codec_descriptors[] = {
>         .long_name = NULL_IF_CONFIG_SMALL("binary data"),
>         .mime_types= MT("application/octet-stream"),
>     },
> +    {
> +        .id        = AV_CODEC_ID_SMPTE_2038,
> +        .type      = AVMEDIA_TYPE_DATA,
> +        .name      = "smpte_2038",
> +        .long_name = NULL_IF_CONFIG_SMALL("SMPTE ST 2038 VANC in MPEG-2 TS"),
> +    },
>     {
>         .id        = AV_CODEC_ID_MPEG2TS,
>         .type      = AVMEDIA_TYPE_DATA,
> diff --git a/libavcodec/codec_id.h b/libavcodec/codec_id.h
> index 89a4a0cb89..64df9699f4 100644
> --- a/libavcodec/codec_id.h
> +++ b/libavcodec/codec_id.h
> @@ -582,6 +582,7 @@ enum AVCodecID {
>     AV_CODEC_ID_DVD_NAV,
>     AV_CODEC_ID_TIMED_ID3,
>     AV_CODEC_ID_BIN_DATA,
> +    AV_CODEC_ID_SMPTE_2038,
>
>
>     AV_CODEC_ID_PROBE = 0x19000, ///< codec_id is not known (like AV_CODEC_ID_NONE) but lavf should attempt to identify it
> diff --git a/libavformat/mpegts.c b/libavformat/mpegts.c
> index d97702fcd7..a8fa3c0b28 100644
> --- a/libavformat/mpegts.c
> +++ b/libavformat/mpegts.c
> @@ -866,6 +866,7 @@ static const StreamType REGD_types[] = {
>     { MKTAG('E', 'A', 'C', '3'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_EAC3  },
>     { MKTAG('H', 'E', 'V', 'C'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_HEVC  },
>     { MKTAG('K', 'L', 'V', 'A'), AVMEDIA_TYPE_DATA,  AV_CODEC_ID_SMPTE_KLV },
> +    { MKTAG('V', 'A', 'N', 'C'), AVMEDIA_TYPE_DATA,  AV_CODEC_ID_SMPTE_2038 },
>     { MKTAG('I', 'D', '3', ' '), AVMEDIA_TYPE_DATA,  AV_CODEC_ID_TIMED_ID3 },
>     { MKTAG('V', 'C', '-', '1'), AVMEDIA_TYPE_VIDEO, AV_CODEC_ID_VC1   },
>     { MKTAG('O', 'p', 'u', 's'), AVMEDIA_TYPE_AUDIO, AV_CODEC_ID_OPUS  },
> diff --git a/libavformat/mpegtsenc.c b/libavformat/mpegtsenc.c
> index 3f201cce1d..0b38555362 100644
> --- a/libavformat/mpegtsenc.c
> +++ b/libavformat/mpegtsenc.c
> @@ -422,6 +422,9 @@ static int get_dvb_stream_type(AVFormatContext *s, AVStream *st)
>     case AV_CODEC_ID_TIMED_ID3:
>         stream_type = STREAM_TYPE_METADATA;
>         break;
> +    case AV_CODEC_ID_SMPTE_2038:
> +        stream_type = STREAM_TYPE_PRIVATE_DATA;
> +        break;
>     case AV_CODEC_ID_DVB_SUBTITLE:
>     case AV_CODEC_ID_DVB_TELETEXT:
>     case AV_CODEC_ID_ARIB_CAPTION:
> @@ -804,6 +807,8 @@ static int mpegts_write_pmt(AVFormatContext *s, MpegTSService *service)
>         case AVMEDIA_TYPE_DATA:
>             if (codec_id == AV_CODEC_ID_SMPTE_KLV) {
>                 put_registration_descriptor(&q, MKTAG('K', 'L', 'V', 'A'));
> +            } else if (st->codecpar->codec_id == AV_CODEC_ID_SMPTE_2038) {
> +                put_registration_descriptor(&q, MKTAG('V', 'A', 'N', 'C'));
>             } else if (codec_id == AV_CODEC_ID_TIMED_ID3) {
>                 const char *tag = "ID3 ";
>                 *q++ = METADATA_DESCRIPTOR;
> diff --git a/libavformat/mux.c b/libavformat/mux.c
> index 04de05ec17..0bc9b6b87d 100644
> --- a/libavformat/mux.c
> +++ b/libavformat/mux.c
> @@ -304,7 +304,8 @@ FF_ENABLE_DEPRECATION_WARNINGS
>                 par->codec_tag = av_codec_get_tag(of->p.codec_tag, par->codec_id);
>         }
>
> -        if (par->codec_type != AVMEDIA_TYPE_ATTACHMENT)
> +        if (par->codec_type != AVMEDIA_TYPE_ATTACHMENT &&
> +            par->codec_id != AV_CODEC_ID_SMPTE_2038)
>             si->nb_interleaved_streams++;
>     }
>     si->interleave_packet = of->interleave_packet;
> @@ -942,7 +943,8 @@ int ff_interleave_packet_per_dts(AVFormatContext *s, AVPacket *pkt,
>             ++stream_count;
>         } else if (par->codec_type != AVMEDIA_TYPE_ATTACHMENT &&
>                    par->codec_id != AV_CODEC_ID_VP8 &&
> -                   par->codec_id != AV_CODEC_ID_VP9) {
> +                   par->codec_id != AV_CODEC_ID_VP9 &&
> +                   par->codec_id != AV_CODEC_ID_SMPTE_2038) {
>             ++noninterleaved_count;
>         }
>     }
> -- 
> 2.35.1.655.ga68dfadae5
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
>


More information about the ffmpeg-devel mailing list