mpegtsmux: Cleanup TsMuxStream fields

Instead of using plenty of case-specific booleans:
* Store type as GstStreamType
* Store unique stream type

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7476>
This commit is contained in:
Edward Hervey 2024-08-29 12:16:16 +02:00 committed by GStreamer Marge Bot
parent 595983df9f
commit 2024287a39
5 changed files with 31 additions and 35 deletions

View file

@ -299,10 +299,11 @@ gst_atsc_mux_create_new_stream (guint16 new_pid, TsMuxStreamType stream_type,
if (stream_type == ATSCMUX_ST_PS_AUDIO_EAC3) { if (stream_type == ATSCMUX_ST_PS_AUDIO_EAC3) {
ret->id = 0xBD; ret->id = 0xBD;
ret->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER; ret->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
ret->is_audio = TRUE; ret->gst_stream_type = GST_STREAM_TYPE_AUDIO;
} else if (stream_type == TSMUX_ST_PS_AUDIO_AC3) { } else if (stream_type == TSMUX_ST_PS_AUDIO_AC3) {
ret->id = 0xBD; ret->id = 0xBD;
ret->id_extended = 0; ret->id_extended = 0;
ret->gst_stream_type = GST_STREAM_TYPE_AUDIO;
} }
tsmux_stream_set_get_es_descriptors_func (ret, tsmux_stream_set_get_es_descriptors_func (ret,

View file

@ -1413,7 +1413,8 @@ gst_base_ts_mux_aggregate_buffer (GstBaseTsMux * mux,
buf = tmp; buf = tmp;
} }
if (mux->force_key_unit_event != NULL && best->stream->is_video_stream) { if (mux->force_key_unit_event != NULL
&& best->stream->gst_stream_type == GST_STREAM_TYPE_VIDEO) {
GstEvent *event; GstEvent *event;
g_mutex_unlock (&mux->lock); g_mutex_unlock (&mux->lock);
@ -1494,12 +1495,13 @@ gst_base_ts_mux_aggregate_buffer (GstBaseTsMux * mux,
pts = dts; pts = dts;
} }
if (best->stream->is_video_stream) { if (best->stream->gst_stream_type == GST_STREAM_TYPE_VIDEO) {
delta = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT); delta = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT);
header = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_HEADER); header = GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_HEADER);
} }
if (best->stream->is_meta && gst_buffer_get_size (buf) > (G_MAXUINT16 - 3)) { if (best->stream->internal_stream_type == TSMUX_ST_PS_KLV &&
gst_buffer_get_size (buf) > (G_MAXUINT16 - 3)) {
GST_WARNING_OBJECT (mux, "KLV meta unit too big, splitting not supported"); GST_WARNING_OBJECT (mux, "KLV meta unit too big, splitting not supported");
gst_buffer_unref (buf); gst_buffer_unref (buf);

View file

@ -1859,7 +1859,7 @@ tsmux_write_pmt (TsMux * mux, TsMuxProgram * program)
for (i = 0; i < program->streams->len; i++) { for (i = 0; i < program->streams->len; i++) {
TsMuxStream *stream = g_ptr_array_index (program->streams, i); TsMuxStream *stream = g_ptr_array_index (program->streams, i);
if (stream->is_id3_metadata == TRUE) { if (stream->internal_stream_type == TSMUX_ST_PS_ID3) {
GstMpegtsMetadataPointerDescriptor metadata_pointer_descriptor; GstMpegtsMetadataPointerDescriptor metadata_pointer_descriptor;
metadata_pointer_descriptor.metadata_application_format = metadata_pointer_descriptor.metadata_application_format =
GST_MPEGTS_METADATA_APPLICATION_FORMAT_IDENTIFIER_FIELD; GST_MPEGTS_METADATA_APPLICATION_FORMAT_IDENTIFIER_FIELD;

View file

@ -124,6 +124,7 @@ tsmux_stream_new (guint16 pid, guint stream_type, guint stream_number)
stream->state = TSMUX_STREAM_STATE_HEADER; stream->state = TSMUX_STREAM_STATE_HEADER;
stream->pi.pid = pid; stream->pi.pid = pid;
stream->stream_type = stream_type; stream->stream_type = stream_type;
stream->internal_stream_type = stream_type;
stream->pes_payload_size = 0; stream->pes_payload_size = 0;
stream->cur_pes_payload_size = 0; stream->cur_pes_payload_size = 0;
@ -144,13 +145,13 @@ tsmux_stream_new (guint16 pid, guint stream_type, guint stream_number)
} }
stream->id = 0xE0 | stream_number; stream->id = 0xE0 | stream_number;
stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER; stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
stream->is_video_stream = TRUE; stream->gst_stream_type = GST_STREAM_TYPE_VIDEO;
supports_user_specified_stream_number = TRUE; supports_user_specified_stream_number = TRUE;
break; break;
case TSMUX_ST_VIDEO_JP2K: case TSMUX_ST_VIDEO_JP2K:
stream->id = 0xBD; stream->id = 0xBD;
stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER; stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
stream->is_video_stream = TRUE; stream->gst_stream_type = GST_STREAM_TYPE_VIDEO;
break; break;
case TSMUX_ST_AUDIO_AAC: case TSMUX_ST_AUDIO_AAC:
case TSMUX_ST_AUDIO_MPEG1: case TSMUX_ST_AUDIO_MPEG1:
@ -161,7 +162,7 @@ tsmux_stream_new (guint16 pid, guint stream_type, guint stream_number)
stream_number); stream_number);
stream_number = 0; stream_number = 0;
} }
stream->is_audio = TRUE; stream->gst_stream_type = GST_STREAM_TYPE_AUDIO;
stream->id = 0xC0 | stream_number; stream->id = 0xC0 | stream_number;
stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER; stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
supports_user_specified_stream_number = TRUE; supports_user_specified_stream_number = TRUE;
@ -175,18 +176,18 @@ tsmux_stream_new (guint16 pid, guint stream_type, guint stream_number)
switch (stream_type) { switch (stream_type) {
case TSMUX_ST_VIDEO_DIRAC: case TSMUX_ST_VIDEO_DIRAC:
stream->id_extended = 0x60; stream->id_extended = 0x60;
stream->is_video_stream = TRUE; stream->gst_stream_type = GST_STREAM_TYPE_VIDEO;
break; break;
case TSMUX_ST_PS_AUDIO_LPCM: case TSMUX_ST_PS_AUDIO_LPCM:
stream->is_audio = TRUE; stream->gst_stream_type = GST_STREAM_TYPE_AUDIO;
stream->id_extended = 0x80; stream->id_extended = 0x80;
break; break;
case TSMUX_ST_PS_AUDIO_AC3: case TSMUX_ST_PS_AUDIO_AC3:
stream->is_audio = TRUE; stream->gst_stream_type = GST_STREAM_TYPE_AUDIO;
stream->id_extended = 0x71; stream->id_extended = 0x71;
break; break;
case TSMUX_ST_PS_AUDIO_DTS: case TSMUX_ST_PS_AUDIO_DTS:
stream->is_audio = TRUE; stream->gst_stream_type = GST_STREAM_TYPE_AUDIO;
stream->id_extended = 0x82; stream->id_extended = 0x82;
break; break;
default: default:
@ -214,7 +215,6 @@ tsmux_stream_new (guint16 pid, guint stream_type, guint stream_number)
/* FIXME: assign sequential extended IDs? */ /* FIXME: assign sequential extended IDs? */
stream->id = 0xBD; stream->id = 0xBD;
stream->stream_type = TSMUX_ST_PRIVATE_DATA; stream->stream_type = TSMUX_ST_PRIVATE_DATA;
stream->is_meta = TRUE;
stream->pi.flags |= stream->pi.flags |=
TSMUX_PACKET_FLAG_PES_FULL_HEADER | TSMUX_PACKET_FLAG_PES_FULL_HEADER |
TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT; TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT;
@ -222,17 +222,14 @@ tsmux_stream_new (guint16 pid, guint stream_type, guint stream_number)
case TSMUX_ST_PS_ID3: case TSMUX_ST_PS_ID3:
stream->id = 0xBD; // private stream stream->id = 0xBD; // private stream
stream->stream_type = TSMUX_ST_PES_METADATA; stream->stream_type = TSMUX_ST_PES_METADATA;
stream->is_meta = TRUE;
stream->is_id3_metadata = TRUE;
stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER | stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER |
TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT; TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT;
break; break;
case TSMUX_ST_PS_OPUS: case TSMUX_ST_PS_OPUS:
/* FIXME: assign sequential extended IDs? */ /* FIXME: assign sequential extended IDs? */
stream->id = 0xBD; stream->id = 0xBD;
stream->is_audio = TRUE; stream->gst_stream_type = GST_STREAM_TYPE_AUDIO;
stream->stream_type = TSMUX_ST_PRIVATE_DATA; stream->stream_type = TSMUX_ST_PRIVATE_DATA;
stream->is_opus = TRUE;
stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER; stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
break; break;
default: default:
@ -494,7 +491,7 @@ tsmux_stream_initialize_pes_packet (TsMuxStream * stream)
} }
} }
if (stream->is_video_stream) { if (stream->gst_stream_type == GST_STREAM_TYPE_VIDEO) {
guint8 hdr_len; guint8 hdr_len;
hdr_len = tsmux_stream_pes_header_length (stream); hdr_len = tsmux_stream_pes_header_length (stream);
@ -504,10 +501,8 @@ tsmux_stream_initialize_pes_packet (TsMuxStream * stream)
stream->cur_pes_payload_size = 0; stream->cur_pes_payload_size = 0;
} }
// stream_type specific flags // stream_type specific flags
switch (stream->stream_type) { if (stream->stream_type == TSMUX_ST_PES_METADATA) {
case TSMUX_ST_PES_METADATA: stream->pi.flags |= TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT;
stream->pi.flags |= TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT;
break;
} }
return TRUE; return TRUE;
@ -796,7 +791,8 @@ tsmux_stream_default_get_es_descrs (TsMuxStream * stream,
g_return_if_fail (stream != NULL); g_return_if_fail (stream != NULL);
g_return_if_fail (pmt_stream != NULL); g_return_if_fail (pmt_stream != NULL);
if (stream->is_audio && stream->language[0] != '\0') { if (stream->gst_stream_type == GST_STREAM_TYPE_AUDIO
&& stream->language[0] != '\0') {
descriptor = gst_mpegts_descriptor_from_iso_639_language (stream->language); descriptor = gst_mpegts_descriptor_from_iso_639_language (stream->language);
g_ptr_array_add (pmt_stream->descriptors, descriptor); g_ptr_array_add (pmt_stream->descriptors, descriptor);
descriptor = NULL; descriptor = NULL;
@ -928,7 +924,7 @@ tsmux_stream_default_get_es_descrs (TsMuxStream * stream,
case TSMUX_ST_PES_METADATA: case TSMUX_ST_PES_METADATA:
if (stream->is_id3_metadata) { if (stream->internal_stream_type == TSMUX_ST_PS_ID3) {
// metadata_descriptor // metadata_descriptor
GstMpegtsMetadataDescriptor metadata_descriptor; GstMpegtsMetadataDescriptor metadata_descriptor;
@ -972,7 +968,7 @@ tsmux_stream_default_get_es_descrs (TsMuxStream * stream,
g_ptr_array_add (pmt_stream->descriptors, descriptor); g_ptr_array_add (pmt_stream->descriptors, descriptor);
break; break;
} }
if (stream->is_opus) { if (stream->internal_stream_type == TSMUX_ST_PS_OPUS) {
descriptor = gst_mpegts_descriptor_from_registration ("Opus", NULL, 0); descriptor = gst_mpegts_descriptor_from_registration ("Opus", NULL, 0);
g_ptr_array_add (pmt_stream->descriptors, descriptor); g_ptr_array_add (pmt_stream->descriptors, descriptor);
@ -983,7 +979,7 @@ tsmux_stream_default_get_es_descrs (TsMuxStream * stream,
g_ptr_array_add (pmt_stream->descriptors, descriptor); g_ptr_array_add (pmt_stream->descriptors, descriptor);
} }
if (stream->is_meta) { if (stream->internal_stream_type == TSMUX_ST_PS_KLV) {
descriptor = gst_mpegts_descriptor_from_registration ("KLVA", NULL, 0); descriptor = gst_mpegts_descriptor_from_registration ("KLVA", NULL, 0);
GST_DEBUG ("adding KLVA registration descriptor"); GST_DEBUG ("adding KLVA registration descriptor");
g_ptr_array_add (pmt_stream->descriptors, descriptor); g_ptr_array_add (pmt_stream->descriptors, descriptor);

View file

@ -147,7 +147,12 @@ enum TsMuxStreamState {
struct TsMuxStream { struct TsMuxStream {
TsMuxStreamState state; TsMuxStreamState state;
TsMuxPacketInfo pi; TsMuxPacketInfo pi;
guint stream_type; /* Stream type to be used in PES/PSI */
TsMuxStreamType stream_type;
/* internal stream identifier (used for private section/pes) */
TsMuxStreamType internal_stream_type;
/* Nature of the stream (audio, video, ..) */
GstStreamType gst_stream_type;
/* stream_id (13818-1) */ /* stream_id (13818-1) */
guint8 id; guint8 id;
@ -159,8 +164,6 @@ struct TsMuxStream {
/* requested index in the PMT */ /* requested index in the PMT */
gint pmt_index; gint pmt_index;
gboolean is_video_stream;
/* data available for writing out /* data available for writing out
* and total sum of sizes */ * and total sum of sizes */
GList *buffers; GList *buffers;
@ -210,11 +213,7 @@ struct TsMuxStream {
gboolean is_dvb_sub; gboolean is_dvb_sub;
gchar language[4]; gchar language[4];
gboolean is_meta;
gboolean is_audio;
/* Opus */ /* Opus */
gboolean is_opus;
guint8 opus_channel_config[1 + 2 + 1 + 1 + 255]; guint8 opus_channel_config[1 + 2 + 1 + 1 + 255];
gsize opus_channel_config_len; gsize opus_channel_config_len;
@ -228,8 +227,6 @@ struct TsMuxStream {
guint16 profile_and_level; guint16 profile_and_level;
gboolean interlace_mode; gboolean interlace_mode;
guint8 color_spec; guint8 color_spec;
gboolean is_id3_metadata;
}; };
/* stream management */ /* stream management */