MPEG transport streams: Implement support for AAC tracks

This commit is contained in:
Moritz Bunkus 2011-10-22 13:49:51 +02:00
parent 695c85b724
commit ff3f645719
3 changed files with 37 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2011-10-22 Moritz Bunkus <moritz@bunkus.org>
* mkvmerge: enhancement: Added support for reading AAC tracks from
MPEG transport streams.
2011-10-17 Moritz Bunkus <moritz@bunkus.org>
* mkvmerge: bug fix: Relaxed the compatibility checks when

View File

@ -28,6 +28,7 @@
#include "common/mpeg4_p2.h"
#include "common/strings/formatting.h"
#include "input/r_mpeg_ts.h"
#include "output/p_aac.h"
#include "output/p_ac3.h"
#include "output/p_avc.h"
#include "output/p_dts.h"
@ -272,6 +273,21 @@ mpeg_ts_track_c::new_stream_a_mpeg() {
return 0;
}
int
mpeg_ts_track_c::new_stream_a_aac() {
add_pes_payload_to_probe_data();
if (0 > find_aac_header(m_probe_data->get_buffer(), m_probe_data->get_size(), &m_aac_header, false))
return FILE_STATUS_MOREDATA;
mxdebug_if(reader.m_debug_aac, boost::format("first AAC header: %1%\n") % m_aac_header.to_string());
a_channels = m_aac_header.channels;
a_sample_rate = m_aac_header.sample_rate;
return 0;
}
int
mpeg_ts_track_c::new_stream_a_ac3() {
add_pes_payload_to_probe_data();
@ -396,6 +412,7 @@ mpeg_ts_reader_c::mpeg_ts_reader_c(track_info_c &_ti)
, m_dont_use_audio_pts(debugging_requested("mpeg_ts_dont_use_audio_pts") || debugging_requested("mpeg_ts"))
, m_debug_resync(debugging_requested("mpeg_ts_resync") || debugging_requested("mpeg_ts"))
, m_debug_pat_pmt(debugging_requested("mpeg_ts_pat") || debugging_requested("mpeg_ts_pmt") || debugging_requested("mpeg_ts"))
, m_debug_aac(debugging_requested("mpeg_aac") || debugging_requested("mpeg_ts"))
, m_detected_packet_size(0)
{
mm_io_cptr temp_io;
@ -481,6 +498,7 @@ mpeg_ts_reader_c::identify() {
: FOURCC('M', 'P', '1', ' ') == track->fourcc ? "MPEG-1 layer 1"
: FOURCC('M', 'P', '2', ' ') == track->fourcc ? "MPEG-1 layer 2"
: FOURCC('M', 'P', '3', ' ') == track->fourcc ? "MPEG-1 layer 3"
: FOURCC('A', 'A', 'C', ' ') == track->fourcc ? "AAC"
: FOURCC('A', 'C', '3', ' ') == track->fourcc ? "AC3"
: FOURCC('D', 'T', 'S', ' ') == track->fourcc ? "DTS"
: FOURCC('T', 'R', 'H', 'D') == track->fourcc ? "TrueHD"
@ -910,6 +928,8 @@ mpeg_ts_reader_c::probe_packet_complete(mpeg_ts_track_ptr &track,
} else if (track->type == ES_AUDIO_TYPE) {
if (FOURCC('M', 'P', '2', ' ') == track->fourcc)
result = track->new_stream_a_mpeg();
else if (FOURCC('A', 'A', 'C', ' ') == track->fourcc)
result = track->new_stream_a_aac();
else if (FOURCC('A', 'C', '3', ' ') == track->fourcc)
result = track->new_stream_a_ac3();
else if (FOURCC('D', 'T', 'S', ' ') == track->fourcc)
@ -1043,6 +1063,14 @@ mpeg_ts_reader_c::create_packetizer(int64_t id) {
track->ptzr = add_packetizer(new mp3_packetizer_c(this, m_ti, track->a_sample_rate, track->a_channels, (0 != track->a_sample_rate) && (0 != track->a_channels)));
show_packetizer_info(id, PTZR(track->ptzr));
} else if (FOURCC('A', 'A', 'C', ' ') == track->fourcc) {
aac_packetizer_c *aac_packetizer = new aac_packetizer_c(this, m_ti, track->m_aac_header.id, track->m_aac_header.profile, track->m_aac_header.sample_rate, track->m_aac_header.channels, false);
track->ptzr = add_packetizer(aac_packetizer);
if (AAC_PROFILE_SBR == track->m_aac_header.profile)
aac_packetizer->set_audio_output_sampling_freq(track->m_aac_header.sample_rate * 2);
show_packetizer_info(id, aac_packetizer);
} else if (FOURCC('A', 'C', '3', ' ') == track->fourcc) {
track->ptzr = add_packetizer(new ac3_packetizer_c(this, m_ti, track->a_sample_rate, track->a_channels, track->a_bsid));
show_packetizer_info(id, PTZR(track->ptzr));

View File

@ -19,6 +19,7 @@
#include <boost/filesystem.hpp>
#include "common/aac.h"
#include "common/byte_buffer.h"
#include "common/dts.h"
#include "common/mm_io.h"
@ -193,6 +194,7 @@ public:
// audio related parameters
int a_channels, a_sample_rate, a_bits_per_sample, a_bsid;
dts_header_t a_dts_header;
aac_header_t m_aac_header;
bool m_apply_dts_timecode_fix;
@ -243,6 +245,7 @@ public:
int new_stream_v_avc();
int new_stream_v_vc1();
int new_stream_a_mpeg();
int new_stream_a_aac();
int new_stream_a_ac3();
int new_stream_a_dts();
int new_stream_a_truehd();
@ -267,7 +270,7 @@ protected:
std::vector<mpeg_ts_track_ptr> tracks;
std::map<generic_packetizer_c *, mpeg_ts_track_ptr> m_ptzr_to_track_map;
bool m_dont_use_audio_pts, m_debug_resync, m_debug_pat_pmt;
bool m_dont_use_audio_pts, m_debug_resync, m_debug_pat_pmt, m_debug_aac;
int m_detected_packet_size;