From b848c91dec0bdda4dba30bb01c278bfb1241534b Mon Sep 17 00:00:00 2001 From: Carlos Bentzen Date: Fri, 7 Feb 2025 17:48:32 +0100 Subject: [PATCH] mpegtsmux: add support for VVC/H.266 video Part-of: --- subprojects/gst-plugins-bad/docs/plugins/gst_plugins_cache.json | 2 +- subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c | 2 ++ subprojects/gst-plugins-bad/gst/mpegtsmux/gstmpegtsmux.c | 2 ++ subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.c | 1 + subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.h | 1 + 5 files changed, 7 insertions(+), 1 deletion(-) diff --git a/subprojects/gst-plugins-bad/docs/plugins/gst_plugins_cache.json b/subprojects/gst-plugins-bad/docs/plugins/gst_plugins_cache.json index 00fad8f81a..982dfc6b8e 100644 --- a/subprojects/gst-plugins-bad/docs/plugins/gst_plugins_cache.json +++ b/subprojects/gst-plugins-bad/docs/plugins/gst_plugins_cache.json @@ -225381,7 +225381,7 @@ "long-name": "MPEG Transport Stream Muxer", "pad-templates": { "sink_%%d": { - "caps": "video/mpeg:\n parsed: true\n mpegversion: { (int)1, (int)2, (int)4 }\n systemstream: false\nvideo/x-dirac:\nimage/x-jpc:\n alignment: frame\nvideo/x-av1:\n stream-format: obu-stream\n alignment: frame\nvideo/x-h264:\n stream-format: byte-stream\n alignment: { (string)au, (string)nal }\nvideo/x-h265:\n stream-format: byte-stream\n alignment: { (string)au, (string)nal }\naudio/mpeg:\n parsed: true\n mpegversion: 1\naudio/mpeg:\n framed: true\n mpegversion: { (int)2, (int)4 }\n stream-format: { (string)adts, (string)raw }\naudio/x-lpcm:\n width: { (int)16, (int)20, (int)24 }\n rate: { (int)48000, (int)96000 }\n channels: [ 1, 8 ]\n dynamic_range: [ 0, 255 ]\n emphasis: { (boolean)false, (boolean)true }\n mute: { (boolean)false, (boolean)true }\naudio/x-ac3:\n framed: true\naudio/x-dts:\n framed: true\naudio/x-opus:\n channels: [ 1, 255 ]\naudio/x-smpte-302m:\nsubpicture/x-dvb:\napplication/x-teletext:\nmeta/x-klv:\n parsed: true\nmeta/x-id3:\n parsed: true\nmeta/x-st-2038:\n alignment: line\nvideo/x-vp9:\nimage/x-jpc:\n alignment: frame\n profile: [ 0, 49151 ]\nimage/x-jxsc:\n alignment: frame\n sampling: { (string)YCbCr-4:2:2, (string)YCbCr-4:4:4 }\n interlace-mode: progressive\nimage/x-jxsc:\n alignment: frame\n sampling: { (string)YCbCr-4:2:2, (string)YCbCr-4:4:4 }\n interlace-mode: fields\n field-order: { (string)top-field-first, (string)bottom-field-first }\n", + "caps": "video/mpeg:\n parsed: true\n mpegversion: { (int)1, (int)2, (int)4 }\n systemstream: false\nvideo/x-dirac:\nimage/x-jpc:\n alignment: frame\nvideo/x-av1:\n stream-format: obu-stream\n alignment: frame\nvideo/x-h264:\n stream-format: byte-stream\n alignment: { (string)au, (string)nal }\nvideo/x-h265:\n stream-format: byte-stream\n alignment: { (string)au, (string)nal }\nvideo/x-h266:\n stream-format: byte-stream\n alignment: { (string)au, (string)nal }\naudio/mpeg:\n parsed: true\n mpegversion: 1\naudio/mpeg:\n framed: true\n mpegversion: { (int)2, (int)4 }\n stream-format: { (string)adts, (string)raw }\naudio/x-lpcm:\n width: { (int)16, (int)20, (int)24 }\n rate: { (int)48000, (int)96000 }\n channels: [ 1, 8 ]\n dynamic_range: [ 0, 255 ]\n emphasis: { (boolean)false, (boolean)true }\n mute: { (boolean)false, (boolean)true }\naudio/x-ac3:\n framed: true\naudio/x-dts:\n framed: true\naudio/x-opus:\n channels: [ 1, 255 ]\naudio/x-smpte-302m:\nsubpicture/x-dvb:\napplication/x-teletext:\nmeta/x-klv:\n parsed: true\nmeta/x-id3:\n parsed: true\nmeta/x-st-2038:\n alignment: line\nvideo/x-vp9:\nimage/x-jpc:\n alignment: frame\n profile: [ 0, 49151 ]\nimage/x-jxsc:\n alignment: frame\n sampling: { (string)YCbCr-4:2:2, (string)YCbCr-4:4:4 }\n interlace-mode: progressive\nimage/x-jxsc:\n alignment: frame\n sampling: { (string)YCbCr-4:2:2, (string)YCbCr-4:4:4 }\n interlace-mode: fields\n field-order: { (string)top-field-first, (string)bottom-field-first }\n", "direction": "sink", "presence": "request", "type": "GstBaseTsMuxPad" diff --git a/subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c b/subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c index 013c2c3b15..610397c539 100644 --- a/subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c +++ b/subprojects/gst-plugins-bad/gst/mpegtsmux/gstbasetsmux.c @@ -628,6 +628,8 @@ gst_base_ts_mux_create_or_update_stream (GstBaseTsMux * mux, st = TSMUX_ST_VIDEO_H264; } else if (strcmp (mt, "video/x-h265") == 0) { st = TSMUX_ST_VIDEO_HEVC; + } else if (strcmp (mt, "video/x-h266") == 0) { + st = TSMUX_ST_VIDEO_VVC; } else if (strcmp (mt, "video/x-vp9") == 0) { if (mux->enable_custom_mappings) { st = TSMUX_ST_PS_VP9; diff --git a/subprojects/gst-plugins-bad/gst/mpegtsmux/gstmpegtsmux.c b/subprojects/gst-plugins-bad/gst/mpegtsmux/gstmpegtsmux.c index 05eb2d4704..73fdc53d2e 100644 --- a/subprojects/gst-plugins-bad/gst/mpegtsmux/gstmpegtsmux.c +++ b/subprojects/gst-plugins-bad/gst/mpegtsmux/gstmpegtsmux.c @@ -108,6 +108,8 @@ static GstStaticPadTemplate gst_mpeg_ts_mux_sink_factory = "alignment=(string){au, nal}; " "video/x-h265,stream-format=(string)byte-stream," "alignment=(string){au, nal}; " + "video/x-h266,stream-format=(string)byte-stream," + "alignment=(string){au, nal}; " "audio/mpeg, " "parsed = (boolean) TRUE, " "mpegversion = (int) 1;" diff --git a/subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.c b/subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.c index 68502daba8..30e0e97be8 100644 --- a/subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.c +++ b/subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.c @@ -137,6 +137,7 @@ tsmux_stream_new (guint16 pid, guint stream_type, guint stream_number) case TSMUX_ST_VIDEO_MPEG4: case TSMUX_ST_VIDEO_H264: case TSMUX_ST_VIDEO_HEVC: + case TSMUX_ST_VIDEO_VVC: if (stream_number > 0xF) { GST_WARNING ("video stream number %d is greater than 0xF. Setting to 0.", diff --git a/subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.h b/subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.h index fb1123a9df..c81c1601f5 100644 --- a/subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.h +++ b/subprojects/gst-plugins-bad/gst/mpegtsmux/tsmux/tsmuxstream.h @@ -123,6 +123,7 @@ enum TsMuxStreamType { TSMUX_ST_VIDEO_HEVC = 0x24, TSMUX_ST_VIDEO_JP2K = 0x21, TSMUX_ST_VIDEO_JPEG_XS = 0x32, + TSMUX_ST_VIDEO_VVC = 0x33, /* private stream types */ TSMUX_ST_PS_AUDIO_AC3 = 0x81,