mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
gst/mpegtsmux/: Improve muxing of AC3/h264 streams a bit. Fixes bug #550613.
Original commit message from CVS: Patch by: vanista <vanista at gmail dot com> * gst/mpegtsmux/mpegtsmux.c: (mpegtsmux_create_stream): * gst/mpegtsmux/tsmux/tsmux.c: (tsmux_write_pmt): * gst/mpegtsmux/tsmux/tsmuxstream.c: (tsmux_stream_new), (tsmux_stream_write_pes_header), (tsmux_stream_get_es_descrs): * gst/mpegtsmux/tsmux/tsmuxstream.h: Improve muxing of AC3/h264 streams a bit. Fixes bug #550613.
This commit is contained in:
parent
caa8349067
commit
751555b5c3
5 changed files with 188 additions and 6 deletions
11
ChangeLog
11
ChangeLog
|
@ -1,3 +1,14 @@
|
|||
2009-01-05 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||
|
||||
Patch by: vanista <vanista at gmail dot com>
|
||||
|
||||
* gst/mpegtsmux/mpegtsmux.c: (mpegtsmux_create_stream):
|
||||
* gst/mpegtsmux/tsmux/tsmux.c: (tsmux_write_pmt):
|
||||
* gst/mpegtsmux/tsmux/tsmuxstream.c: (tsmux_stream_new),
|
||||
(tsmux_stream_write_pes_header), (tsmux_stream_get_es_descrs):
|
||||
* gst/mpegtsmux/tsmux/tsmuxstream.h:
|
||||
Improve muxing of AC3/h264 streams a bit. Fixes bug #550613.
|
||||
|
||||
2009-01-05 Sebastian Dröge <sebastian.droege@collabora.co.uk>
|
||||
|
||||
* gst/mxf/mxfdemux.c:
|
||||
|
|
|
@ -399,6 +399,10 @@ mpegtsmux_create_stream (MpegTsMux * mux, MpegTsPadData * ts_data, GstPad * pad)
|
|||
}
|
||||
|
||||
if (ts_data->stream != NULL) {
|
||||
gst_structure_get_int (s, "rate", &ts_data->stream->audio_sampling);
|
||||
gst_structure_get_int (s, "channels", &ts_data->stream->audio_channels);
|
||||
gst_structure_get_int (s, "bitrate", &ts_data->stream->audio_bitrate);
|
||||
|
||||
tsmux_stream_set_buffer_release_func (ts_data->stream, release_buffer_cb);
|
||||
tsmux_program_add_stream (mux->program, ts_data->stream);
|
||||
|
||||
|
|
|
@ -1000,9 +1000,14 @@ tsmux_write_pmt (TsMux * mux, TsMuxProgram * program)
|
|||
else
|
||||
tsmux_put16 (&pos, 0xE000 | tsmux_stream_get_pid (program->pcr_stream));
|
||||
|
||||
/* FIXME: Write program descriptors if needed, for now write a
|
||||
* length of 0 */
|
||||
tsmux_put16 (&pos, 0xF000);
|
||||
/* 4 bits reserved, 12 bits program_info_length, descriptor : HDMV */
|
||||
tsmux_put16 (&pos, 0xF00C);
|
||||
tsmux_put16 (&pos, 0x0504);
|
||||
tsmux_put16 (&pos, 0x4844);
|
||||
tsmux_put16 (&pos, 0x4D56);
|
||||
tsmux_put16 (&pos, 0x8804);
|
||||
tsmux_put16 (&pos, 0x0FFF);
|
||||
tsmux_put16 (&pos, 0xFCFC);
|
||||
|
||||
/* Write out the entries */
|
||||
for (i = 0; i < program->nb_streams; i++) {
|
||||
|
|
|
@ -157,7 +157,7 @@ tsmux_stream_new (guint16 pid, TsMuxStreamType stream_type)
|
|||
stream->id_extended = 0x80;
|
||||
break;
|
||||
case TSMUX_ST_PS_AUDIO_AC3:
|
||||
stream->id_extended = 0x81;
|
||||
stream->id_extended = 0x71;
|
||||
break;
|
||||
case TSMUX_ST_PS_AUDIO_DTS:
|
||||
stream->id_extended = 0x82;
|
||||
|
@ -559,7 +559,7 @@ tsmux_stream_write_pes_header (TsMuxStream * stream, guint8 * data)
|
|||
ext_len = 1; /* Only writing 1 byte into the extended fields */
|
||||
*data++ = 0x80 | ext_len;
|
||||
/* Write the extended streamID */
|
||||
*data++ = 0x80 | stream->id_extended;
|
||||
*data++ = stream->id_extended;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -631,9 +631,28 @@ tsmux_stream_get_es_descrs (TsMuxStream * stream, guint8 * buf, guint16 * len)
|
|||
* PMT ES_info field */
|
||||
pos = buf;
|
||||
|
||||
/* tag (registration_descriptor), length, format_identifier */
|
||||
switch (stream->stream_type) {
|
||||
case TSMUX_ST_AUDIO_AAC:
|
||||
/* FIXME */
|
||||
break;
|
||||
case TSMUX_ST_VIDEO_MPEG4:
|
||||
/* FIXME */
|
||||
break;
|
||||
case TSMUX_ST_VIDEO_H264:
|
||||
*pos++ = 0x05;
|
||||
*pos++ = 8;
|
||||
*pos++ = 0x48; /* 'H' */
|
||||
*pos++ = 0x44; /* 'D' */
|
||||
*pos++ = 0x4D; /* 'M' */
|
||||
*pos++ = 0x56; /* 'V' */
|
||||
/* FIXME : Not sure about this additional_identification_info */
|
||||
*pos++ = 0xFF;
|
||||
*pos++ = 0x1B;
|
||||
*pos++ = 0x44;
|
||||
*pos++ = 0x3F;
|
||||
break;
|
||||
case TSMUX_ST_VIDEO_DIRAC:
|
||||
/* tag (registration_descriptor), length, format_identifier */
|
||||
*pos++ = 0x05;
|
||||
*pos++ = 4;
|
||||
*pos++ = 0x64; /* 'd' */
|
||||
|
@ -641,6 +660,145 @@ tsmux_stream_get_es_descrs (TsMuxStream * stream, guint8 * buf, guint16 * len)
|
|||
*pos++ = 0x61; /* 'a' */
|
||||
*pos++ = 0x63; /* 'c' */
|
||||
break;
|
||||
case TSMUX_ST_PS_AUDIO_AC3:
|
||||
{
|
||||
*pos++ = 0x05;
|
||||
*pos++ = 4;
|
||||
*pos++ = 0x41; /* 'A' */
|
||||
*pos++ = 0x43; /* 'C' */
|
||||
*pos++ = 0x2D; /* '-' */
|
||||
*pos++ = 0x33; /* '3' */
|
||||
|
||||
/* audio_stream_descriptor () | ATSC A/52-2001 Annex A
|
||||
*
|
||||
* descriptor_tag 8 uimsbf
|
||||
* descriptor_length 8 uimsbf
|
||||
* sample_rate_code 3 bslbf
|
||||
* bsid 5 bslbf
|
||||
* bit_rate_code 6 bslbf
|
||||
* surround_mode 2 bslbf
|
||||
* bsmod 3 bslbf
|
||||
* num_channels 4 bslbf
|
||||
* full_svc 1 bslbf
|
||||
* langcod 8 bslbf
|
||||
* [...]
|
||||
*/
|
||||
*pos++ = 0x81;
|
||||
*pos++ = 0x04;
|
||||
|
||||
/* 3 bits sample_rate_code, 5 bits hardcoded bsid (default ver 8) */
|
||||
switch (stream->audio_sampling) {
|
||||
case 48000:
|
||||
*pos++ = 0x08;
|
||||
break;
|
||||
case 44100:
|
||||
*pos++ = 0x28;
|
||||
break;
|
||||
case 32000:
|
||||
*pos++ = 0x48;
|
||||
break;
|
||||
default:
|
||||
*pos++ = 0xE8;
|
||||
break; /* 48, 44.1 or 32 Khz */
|
||||
}
|
||||
|
||||
/* 1 bit bit_rate_limit, 5 bits bit_rate_code, 2 bits suround_mode */
|
||||
switch (stream->audio_bitrate) {
|
||||
case 32:
|
||||
*pos++ = 0x00 << 2;
|
||||
break;
|
||||
case 40:
|
||||
*pos++ = 0x01 << 2;
|
||||
break;
|
||||
case 48:
|
||||
*pos++ = 0x02 << 2;
|
||||
break;
|
||||
case 56:
|
||||
*pos++ = 0x03 << 2;
|
||||
break;
|
||||
case 64:
|
||||
*pos++ = 0x04 << 2;
|
||||
break;
|
||||
case 80:
|
||||
*pos++ = 0x05 << 2;
|
||||
break;
|
||||
case 96:
|
||||
*pos++ = 0x06 << 2;
|
||||
break;
|
||||
case 112:
|
||||
*pos++ = 0x07 << 2;
|
||||
break;
|
||||
case 128:
|
||||
*pos++ = 0x08 << 2;
|
||||
break;
|
||||
case 160:
|
||||
*pos++ = 0x09 << 2;
|
||||
break;
|
||||
case 192:
|
||||
*pos++ = 0x0A << 2;
|
||||
break;
|
||||
case 224:
|
||||
*pos++ = 0x0B << 2;
|
||||
break;
|
||||
case 256:
|
||||
*pos++ = 0x0C << 2;
|
||||
break;
|
||||
case 320:
|
||||
*pos++ = 0x0D << 2;
|
||||
break;
|
||||
case 384:
|
||||
*pos++ = 0x0E << 2;
|
||||
break;
|
||||
case 448:
|
||||
*pos++ = 0x0F << 2;
|
||||
break;
|
||||
case 512:
|
||||
*pos++ = 0x10 << 2;
|
||||
break;
|
||||
case 576:
|
||||
*pos++ = 0x11 << 2;
|
||||
break;
|
||||
case 640:
|
||||
*pos++ = 0x12 << 2;
|
||||
break;
|
||||
default:
|
||||
*pos++ = 0x32 << 2;
|
||||
break; /* 640 Kb/s upper limit */
|
||||
}
|
||||
|
||||
/* 3 bits bsmod, 4 bits num_channels, 1 bit full_svc */
|
||||
switch (stream->audio_channels) {
|
||||
case 1:
|
||||
*pos++ = 0x01 << 1;
|
||||
break; /* 1/0 */
|
||||
case 2:
|
||||
*pos++ = 0x02 << 1;
|
||||
break; /* 2/0 */
|
||||
case 3:
|
||||
*pos++ = 0x0A << 1;
|
||||
break; /* <= 3 */
|
||||
case 4:
|
||||
*pos++ = 0x0B << 1;
|
||||
break; /* <= 4 */
|
||||
case 5:
|
||||
*pos++ = 0x0C << 1;
|
||||
break; /* <= 5 */
|
||||
case 6:
|
||||
default:
|
||||
*pos++ = 0x0D << 1;
|
||||
break; /* <= 6 */
|
||||
}
|
||||
|
||||
*pos++ = 0x00;
|
||||
|
||||
break;
|
||||
}
|
||||
case TSMUX_ST_PS_AUDIO_DTS:
|
||||
/* FIXME */
|
||||
break;
|
||||
case TSMUX_ST_PS_AUDIO_LPCM:
|
||||
/* FIXME */
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -183,6 +183,10 @@ struct TsMuxStream {
|
|||
|
||||
gint pcr_ref;
|
||||
gint64 last_pcr;
|
||||
|
||||
gint audio_sampling;
|
||||
gint audio_channels;
|
||||
gint audio_bitrate;
|
||||
};
|
||||
|
||||
/* stream management */
|
||||
|
|
Loading…
Reference in a new issue