mpegtsmux: Changed caps to meta/x-id3, parsed=true. Added application format enum

This commit is contained in:
jadarve 2024-05-16 11:01:55 -05:00
parent b06f2e781d
commit 4109281bd3
8 changed files with 79 additions and 41 deletions

View file

@ -1284,7 +1284,8 @@ gst_mpegts_descriptor_from_metadata (const GstMpegtsMetadataDescriptor *
gst_byte_writer_put_uint16_be (&writer,
metadata_descriptor->metadata_application_format);
if (metadata_descriptor->metadata_application_format == 0xFFFF) {
if (metadata_descriptor->metadata_application_format ==
GST_MPEGTS_METADATA_APPLICATION_FORMAT_IDENTIFIER_FIELD) {
gst_byte_writer_put_uint32_be (&writer, metadata_descriptor->metadata_format_identifier); // metadata_application_format_identifier
}
@ -1340,7 +1341,8 @@ gst_mpegts_descriptor_parse_metadata (const GstMpegtsDescriptor * descriptor,
res->metadata_application_format = GST_READ_UINT16_BE (data);
data += 2;
if (res->metadata_application_format == 0xFFFF) {
if (res->metadata_application_format ==
GST_MPEGTS_METADATA_APPLICATION_FORMAT_IDENTIFIER_FIELD) {
// skip over metadata_application_format_identifier if it is provided
data += 4;
}
@ -1516,7 +1518,8 @@ gst_mpegts_descriptor_from_metadata_pointer (const
gst_byte_writer_put_uint16_be (&writer,
metadata_pointer_descriptor->metadata_application_format);
if (metadata_pointer_descriptor->metadata_application_format == 0xFFFF) {
if (metadata_pointer_descriptor->metadata_application_format ==
GST_MPEGTS_METADATA_APPLICATION_FORMAT_IDENTIFIER_FIELD) {
gst_byte_writer_put_uint32_be (&writer, metadata_pointer_descriptor->metadata_format_identifier); // metadata_application_format_identifier
}

View file

@ -429,6 +429,43 @@ typedef enum
GST_MPEGTS_METADATA_FORMAT_IDENTIFIER_FIELD = 0xff
} GstMpegtsMetadataFormat;
/**
* GstMepgtsMetadataApplicationFormat:
*
* metadata_application_format valid values. See ISO/IEC 13818-1:2023(E) Table 2-84.
*
* Since: 1.25
*/
typedef enum
{
/**
* GST_METADATA_APPLICATION_FORMAT_ISAN:
*
* ISO 15706-1 (ISAN) encoded in its binary form
*
* Since: 1.25
*/
GST_MPEGTS_METADATA_APPLICATION_FORMAT_ISAN = 0x0010,
/**
* GST_METADATA_APPLICATION_FORMAT_VSAN:
*
* ISO 15706-2 (V-ISAN) encoded in its binary form
*
* Since: 1.25
*/
GST_MPEGTS_METADATA_APPLICATION_FORMAT_VSAN = 0x0011,
/**
* GST_METADATA_APPLICATION_FORMAT_IDENTIFIER_FIELD:
*
* Defined by the metadata_application_format_identifier field
*
* Since: 1.25
*/
GST_MPEGTS_METADATA_APPLICATION_FORMAT_IDENTIFIER_FIELD = 0xffff,
} GstMepgtsMetadataApplicationFormat;
/* MPEG-TS Metadata Descriptor (0x26) */
typedef struct _GstMpegtsMetadataDescriptor GstMpegtsMetadataDescriptor;
@ -452,7 +489,7 @@ metadata_service_id to identify the metadata service to which the metadata descr
*/
struct _GstMpegtsMetadataDescriptor
{
guint16 metadata_application_format;
GstMepgtsMetadataApplicationFormat metadata_application_format;
GstMpegtsMetadataFormat metadata_format;
guint32 metadata_format_identifier;
guint8 metadata_service_id;
@ -588,7 +625,7 @@ typedef struct _GstMpegtsMetadataPointerDescriptor
*/
struct _GstMpegtsMetadataPointerDescriptor
{
guint16 metadata_application_format;
GstMepgtsMetadataApplicationFormat metadata_application_format;
GstMpegtsMetadataFormat metadata_format;
guint32 metadata_format_identifier;
guint8 metadata_service_id;

View file

@ -239,5 +239,6 @@
#define DRF_ID_OPUS 0x4f707573
#define DRF_ID_EAC3 0x45414333 /* defined in A/52 Annex G */
#define DRF_ID_AC4 0x41432D34 /* defined in ETSI TS 103 190-2 Annex D */
#define DRF_ID_ID3 0x49443320
#endif /* __GST_MPEG_DESC_H__ */

View file

@ -674,7 +674,7 @@ gst_base_ts_mux_create_or_update_stream (GstBaseTsMux * mux,
ts_pad->prepare_func = gst_base_ts_mux_prepare_opus;
} else if (strcmp (mt, "meta/x-klv") == 0) {
st = TSMUX_ST_PS_KLV;
} else if (strcmp (mt, "application/x-metadata") == 0) {
} else if (strcmp (mt, "meta/x-id3") == 0) {
st = TSMUX_ST_PES_METADATA;
} else if (strcmp (mt, "image/x-jpc") == 0) {
/*
@ -828,10 +828,6 @@ gst_base_ts_mux_create_or_update_stream (GstBaseTsMux * mux,
gst_structure_get_int (s, "width", &ts_pad->stream->horizontal_size);
gst_structure_get_int (s, "height", &ts_pad->stream->vertical_size);
// metadata caps
gst_structure_get_uint (s, "metadata-format-identifier",
&ts_pad->stream->metadata_format_identifier);
ts_pad->stream->color_spec = color_spec;
ts_pad->stream->max_bitrate = max_rate;
ts_pad->stream->profile_and_level = profile | main_level;

View file

@ -125,7 +125,7 @@ static GstStaticPadTemplate gst_mpeg_ts_mux_sink_factory =
"audio/x-opus, "
"channels = (int) [1, 255];"
"subpicture/x-dvb; application/x-teletext; meta/x-klv, parsed=true;"
"application/x-metadata;"
"meta/x-id3, parsed=true;"
"image/x-jpc, alignment = (string) frame, profile = (int)[0, 49151];"));
static GstStaticPadTemplate gst_mpeg_ts_mux_src_factory =

View file

@ -67,8 +67,9 @@
#include <string.h>
#include <gst/mpegts/mpegts.h>
#include <gst/base/gstbytewriter.h>
#include <gst/mpegts/mpegts.h>
#include <gst/mpegtsdemux/gstmpegdesc.h>
#include "tsmux.h"
#include "tsmuxstream.h"
@ -1858,14 +1859,13 @@ tsmux_write_pmt (TsMux * mux, TsMuxProgram * program)
for (i = 0; i < program->streams->len; i++) {
TsMuxStream *stream = g_ptr_array_index (program->streams, i);
if (stream->is_application_metadata == TRUE) {
// metadata_descriptor_pointer
if (stream->is_id3_metadata == TRUE) {
GstMpegtsMetadataPointerDescriptor metadata_pointer_descriptor;
metadata_pointer_descriptor.metadata_application_format = 0xFFFF;
metadata_pointer_descriptor.metadata_application_format =
GST_MPEGTS_METADATA_APPLICATION_FORMAT_IDENTIFIER_FIELD;
metadata_pointer_descriptor.metadata_format =
GST_MPEGTS_METADATA_FORMAT_IDENTIFIER_FIELD;
metadata_pointer_descriptor.metadata_format_identifier =
stream->metadata_format_identifier;
metadata_pointer_descriptor.metadata_format_identifier = DRF_ID_ID3;
metadata_pointer_descriptor.metadata_service_id = 0;
metadata_pointer_descriptor.program_number = program->pgm_number;

View file

@ -67,8 +67,9 @@
#include <string.h>
#include <gst/mpegts/mpegts.h>
#include <gst/base/gstbytewriter.h>
#include <gst/mpegts/mpegts.h>
#include <gst/mpegtsdemux/gstmpegdesc.h>
#include "tsmuxcommon.h"
#include "tsmuxstream.h"
@ -223,8 +224,7 @@ tsmux_stream_new (guint16 pid, guint stream_type, guint stream_number)
stream->id = 0xBD; // private stream
stream->stream_type = TSMUX_ST_PES_METADATA;
stream->is_meta = TRUE;
stream->is_application_metadata = TRUE;
stream->metadata_format_identifier = 0;
stream->is_id3_metadata = TRUE;
stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER |
TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT;
break;
@ -928,29 +928,31 @@ tsmux_stream_default_get_es_descrs (TsMuxStream * stream,
break;
case TSMUX_ST_PES_METADATA:
// metadata_descriptor
GstMpegtsMetadataDescriptor metadata_descriptor;
if (stream->is_id3_metadata) {
// metadata_descriptor
GstMpegtsMetadataDescriptor metadata_descriptor;
metadata_descriptor.metadata_application_format = 0xFFFF;
metadata_descriptor.metadata_format =
GST_MPEGTS_METADATA_FORMAT_IDENTIFIER_FIELD;
metadata_descriptor.metadata_format_identifier =
stream->metadata_format_identifier;
metadata_descriptor.metadata_service_id = 0;
metadata_descriptor.decoder_config_flags = 0x00;
metadata_descriptor.dsm_cc_flag = FALSE;
metadata_descriptor.metadata_application_format =
GST_MPEGTS_METADATA_APPLICATION_FORMAT_IDENTIFIER_FIELD;
metadata_descriptor.metadata_format =
GST_MPEGTS_METADATA_FORMAT_IDENTIFIER_FIELD;
metadata_descriptor.metadata_format_identifier = DRF_ID_ID3;
metadata_descriptor.metadata_service_id = 0;
metadata_descriptor.decoder_config_flags = 0x00;
metadata_descriptor.dsm_cc_flag = FALSE;
descriptor = gst_mpegts_descriptor_from_metadata (&metadata_descriptor);
g_ptr_array_add (pmt_stream->descriptors, descriptor);
descriptor = gst_mpegts_descriptor_from_metadata (&metadata_descriptor);
g_ptr_array_add (pmt_stream->descriptors, descriptor);
// registration_descriptor
guint32 format_identifier = 0;
GST_WRITE_UINT32_BE (&format_identifier,
metadata_descriptor.metadata_format_identifier);
// registration_descriptor
guint32 format_identifier = 0;
GST_WRITE_UINT32_BE (&format_identifier,
metadata_descriptor.metadata_format_identifier);
descriptor = gst_mpegts_descriptor_from_registration ((const char *)
&format_identifier, NULL, 0);
g_ptr_array_add (pmt_stream->descriptors, descriptor);
descriptor = gst_mpegts_descriptor_from_registration ((const char *)
&format_identifier, NULL, 0);
g_ptr_array_add (pmt_stream->descriptors, descriptor);
}
break;
case TSMUX_ST_PS_DVB_SUBPICTURE:

View file

@ -228,8 +228,7 @@ struct TsMuxStream {
gboolean interlace_mode;
guint8 color_spec;
gboolean is_application_metadata;
guint32 metadata_format_identifier;
gboolean is_id3_metadata;
};
/* stream management */