diff options
author | Aaron Boxer <boxerab@gmail.com> | 2017-07-19 10:14:21 -0400 |
---|---|---|
committer | Sebastian Dröge <sebastian@centricular.com> | 2017-07-21 09:33:31 +0300 |
commit | bbbdc2cd7ed282edabb6715a0b9b72d23676ee0f (patch) | |
tree | db3a202dd0c96cff9b176ecc86cf6cc1db2d2b9c /gst/mpegtsmux/tsmux | |
parent | 3e0db49f5b83e2b4ad4386c11c64a5d391c79256 (diff) | |
download | gstreamer-plugins-bad-bbbdc2cd7ed282edabb6715a0b9b72d23676ee0f.tar.gz |
tsmux/tsdemux: Add support for JPEG2000
Based on patches by Milos Seleceni.
https://bugzilla.gnome.org/show_bug.cgi?id=753323
Diffstat (limited to 'gst/mpegtsmux/tsmux')
-rw-r--r-- | gst/mpegtsmux/tsmux/tsmux.c | 2 | ||||
-rw-r--r-- | gst/mpegtsmux/tsmux/tsmuxstream.c | 75 | ||||
-rw-r--r-- | gst/mpegtsmux/tsmux/tsmuxstream.h | 11 |
3 files changed, 88 insertions, 0 deletions
diff --git a/gst/mpegtsmux/tsmux/tsmux.c b/gst/mpegtsmux/tsmux/tsmux.c index ee2870498..24ae7e2b8 100644 --- a/gst/mpegtsmux/tsmux/tsmux.c +++ b/gst/mpegtsmux/tsmux/tsmux.c @@ -1104,6 +1104,8 @@ tsmux_write_stream_packet (TsMux * mux, TsMuxStream * stream) gst_buffer_unmap (buf, &map); + GST_DEBUG_OBJECT (mux, "Writing PES of size %d", + (int) gst_buffer_get_size (buf)); res = tsmux_packet_out (mux, buf, cur_pcr); /* Reset all dynamic flags */ diff --git a/gst/mpegtsmux/tsmux/tsmuxstream.c b/gst/mpegtsmux/tsmux/tsmuxstream.c index f719d8f3f..4cbd21770 100644 --- a/gst/mpegtsmux/tsmux/tsmuxstream.c +++ b/gst/mpegtsmux/tsmux/tsmuxstream.c @@ -84,6 +84,7 @@ #include <string.h> #include <gst/mpegts/mpegts.h> +#include <gst/base/gstbytewriter.h> #include "tsmuxcommon.h" #include "tsmuxstream.h" @@ -144,6 +145,11 @@ tsmux_stream_new (guint16 pid, TsMuxStreamType stream_type) stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER; stream->is_video_stream = TRUE; break; + case TSMUX_ST_VIDEO_JP2K: + stream->id = 0xBD; + stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER; + stream->is_video_stream = TRUE; + break; case TSMUX_ST_AUDIO_AAC: case TSMUX_ST_AUDIO_MPEG1: case TSMUX_ST_AUDIO_MPEG2: @@ -768,6 +774,75 @@ tsmux_stream_get_es_descrs (TsMuxStream * stream, descriptor = gst_mpegts_descriptor_from_registration ("drac", NULL, 0); g_ptr_array_add (pmt_stream->descriptors, descriptor); break; + case TSMUX_ST_VIDEO_JP2K: + { + /* J2K video descriptor + * descriptor_tag 8 uimsbf + * descriptor_length 8 uimsbf + * profile_and_level 16 uimsbf + * horizontal_size 32 uimsbf + * vertical_size 32 uimsbf + * max_bit_rate 32 uimsbf + * max_buffer_size 32 uimsbf + * DEN_frame_rate 16 uimsbf + * NUM_frame_rate 16 uimsbf + * color_specification 8 bslbf + * still_mode 1 bslbf + * interlace_video 1 bslbf + * reserved 6 bslbf + * private_data_byte 8 bslbf + */ + gint8 still_interlace_reserved = 0x00; + int wr_size = 0; + guint8 *add_info = NULL; + guint8 level = stream->profile_and_level & 0xF; + guint32 max_buffer_size = 0; + GstByteWriter writer; + gst_byte_writer_init_with_size (&writer, 32, FALSE); + + switch (level) { + case 1: + case 2: + case 3: + max_buffer_size = 1250000; + break; + case 4: + max_buffer_size = 2500000; + break; + case 5: + max_buffer_size = 5000000; + break; + case 6: + max_buffer_size = 10000000; + break; + default: + break; + } + + gst_byte_writer_put_uint16_be (&writer, stream->profile_and_level); + gst_byte_writer_put_uint32_be (&writer, stream->horizontal_size); + gst_byte_writer_put_uint32_be (&writer, stream->vertical_size); + gst_byte_writer_put_uint32_be (&writer, max_buffer_size); + gst_byte_writer_put_uint32_be (&writer, stream->max_bitrate); + gst_byte_writer_put_uint16_be (&writer, stream->den); + gst_byte_writer_put_uint16_be (&writer, stream->num); + gst_byte_writer_put_uint8 (&writer, stream->color_spec); + + if (stream->interlace_mode) + still_interlace_reserved |= 0x40; + + gst_byte_writer_put_uint8 (&writer, still_interlace_reserved); + gst_byte_writer_put_uint8 (&writer, 0x00); /* private data byte */ + + wr_size = gst_byte_writer_get_size (&writer); + add_info = gst_byte_writer_reset_and_get_data (&writer); + + descriptor = + gst_mpegts_descriptor_from_custom (GST_MTS_DESC_J2K_VIDEO, add_info, + wr_size); + g_ptr_array_add (pmt_stream->descriptors, descriptor); + } + break; case TSMUX_ST_PS_AUDIO_AC3: { guint8 add_info[6]; diff --git a/gst/mpegtsmux/tsmux/tsmuxstream.h b/gst/mpegtsmux/tsmux/tsmuxstream.h index 2766718ed..8befbe5f4 100644 --- a/gst/mpegtsmux/tsmux/tsmuxstream.h +++ b/gst/mpegtsmux/tsmux/tsmuxstream.h @@ -134,6 +134,7 @@ enum TsMuxStreamType { TSMUX_ST_VIDEO_MPEG4 = 0x10, TSMUX_ST_VIDEO_H264 = 0x1b, TSMUX_ST_VIDEO_HEVC = 0x24, + TSMUX_ST_VIDEO_JP2K = 0x21, /* private stream types */ TSMUX_ST_PS_AUDIO_AC3 = 0x81, @@ -216,6 +217,16 @@ struct TsMuxStream { /* Opus */ gboolean is_opus; guint8 opus_channel_config_code; + /* Jpeg2000 */ + gint32 horizontal_size; + gint32 vertical_size; + gint32 den; + gint32 num; + /* Maximum bitrate box */ + guint32 max_bitrate; + guint16 profile_and_level; + gboolean interlace_mode; + guint8 color_spec; }; /* stream management */ |