mirror of
https://gitlab.com/mbunkus/mkvtoolnix.git
synced 2024-12-24 11:54:01 +00:00
Proper AAC support by stripping the ADTS headers.
This commit is contained in:
parent
e54e9c3137
commit
ff9dd4e204
@ -1,3 +1,8 @@
|
||||
2003-05-19 Moritz Bunkus <moritz@bunkus.org>
|
||||
|
||||
* ADTS headers are stripped from the AAC streams. This is what I'd
|
||||
call 'proper AAC support'.
|
||||
|
||||
2003-05-18 Moritz Bunkus <moritz@bunkus.org>
|
||||
|
||||
* Better support for DTS streams in general and for DTS-in-WAV in
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: aac_common.cpp,v 1.4 2003/05/19 18:24:52 mosu Exp $
|
||||
\version \$Id: aac_common.cpp,v 1.5 2003/05/19 20:51:12 mosu Exp $
|
||||
\brief helper function for AAC data
|
||||
\author Moritz Bunkus <moritz@bunkus.org>
|
||||
*/
|
||||
@ -159,6 +159,8 @@ static int is_adts_header(unsigned char *buf, int size, int bpos,
|
||||
if (!protection_absent)
|
||||
aac_header->header_bit_size += 16;
|
||||
aac_header->header_byte_size = (aac_header->header_bit_size + 7) / 8;
|
||||
aac_header->data_byte_size = aac_header->bytes -
|
||||
aac_header->header_bit_size / 8;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: aac_common.h,v 1.3 2003/05/18 20:57:07 mosu Exp $
|
||||
\version \$Id: aac_common.h,v 1.4 2003/05/19 20:51:12 mosu Exp $
|
||||
\brief definitions and helper functions for AAC data
|
||||
\author Moritz Bunkus <moritz@bunkus.org>
|
||||
*/
|
||||
@ -28,7 +28,7 @@ typedef struct {
|
||||
int bytes;
|
||||
int id; // 0 = MPEG-4, 1 = MPEG-2
|
||||
int profile;
|
||||
int header_bit_size, header_byte_size;
|
||||
int header_bit_size, header_byte_size, data_byte_size;
|
||||
} aac_header_t;
|
||||
|
||||
int parse_aac_adif_header(unsigned char *buf, int size,
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: matroska.h,v 1.12 2003/05/18 20:57:07 mosu Exp $
|
||||
\version \$Id: matroska.h,v 1.13 2003/05/19 20:51:12 mosu Exp $
|
||||
\brief Definitions for the various Codec IDs
|
||||
\author Moritz Bunkus <moritz@bunkus.org>
|
||||
*/
|
||||
@ -23,8 +23,13 @@
|
||||
|
||||
// see http://cvs.corecodec.org/cgi-bin/cvsweb.cgi/~checkout~/matroska/doc/website/specs/codex.html?rev=HEAD&content-type=text/html
|
||||
|
||||
#define MKV_A_AAC_2MAIN "A_AAC/MPEG2/MAIN"
|
||||
#define MKV_A_AAC_2LC "A_AAC/MPEG2/LC"
|
||||
#define MKV_A_AAC_2SSR "A_AAC/MPEG2/SSR"
|
||||
#define MKV_A_AAC_4MAIN "A_AAC/MPEG4/MAIN"
|
||||
#define MKV_A_AAC_4LC "A_AAC/MPEG4/LC"
|
||||
#define MKV_A_AAC_4SSR "A_AAC/MPEG4/SSR"
|
||||
#define MKV_A_AAC_4LTP "A_AAC/MPEG4/LTP"
|
||||
#define MKV_A_AAC_4SBR "A_AAC/MPEG4/SBR"
|
||||
#define MKV_A_AC3 "A_AC3"
|
||||
#define MKV_A_DTS "A_DTS"
|
||||
|
58
p_aac.cpp
58
p_aac.cpp
@ -13,7 +13,7 @@
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: p_aac.cpp,v 1.3 2003/05/18 20:57:07 mosu Exp $
|
||||
\version \$Id: p_aac.cpp,v 1.4 2003/05/19 20:51:12 mosu Exp $
|
||||
\brief AAC output module
|
||||
\author Moritz Bunkus <moritz@bunkus.org>
|
||||
*/
|
||||
@ -31,8 +31,9 @@
|
||||
using namespace LIBMATROSKA_NAMESPACE;
|
||||
|
||||
aac_packetizer_c::aac_packetizer_c(generic_reader_c *nreader, int nid,
|
||||
int nprofile,
|
||||
unsigned long nsamples_per_sec,
|
||||
int nchannels, int adif, track_info_t *nti)
|
||||
int nchannels, track_info_t *nti)
|
||||
throw (error_c): generic_packetizer_c(nreader, nti) {
|
||||
packetno = 0;
|
||||
bytes_output = 0;
|
||||
@ -41,7 +42,7 @@ aac_packetizer_c::aac_packetizer_c(generic_reader_c *nreader, int nid,
|
||||
samples_per_sec = nsamples_per_sec;
|
||||
channels = nchannels;
|
||||
id = nid;
|
||||
is_adif = adif;
|
||||
profile = nprofile;
|
||||
|
||||
set_track_type(track_audio);
|
||||
duplicate_data_on_add(false);
|
||||
@ -92,8 +93,8 @@ void aac_packetizer_c::remove_aac_packet(int pos, int framesize) {
|
||||
|
||||
unsigned char *aac_packetizer_c::get_aac_packet(unsigned long *header,
|
||||
aac_header_t *aacheader) {
|
||||
int pos;
|
||||
unsigned char *buf;
|
||||
int pos, i, up_shift, down_shift;
|
||||
unsigned char *buf, *src;
|
||||
double pims;
|
||||
|
||||
if (packet_buffer == NULL)
|
||||
@ -125,7 +126,25 @@ unsigned char *aac_packetizer_c::get_aac_packet(unsigned long *header,
|
||||
fprintf(stdout, "aac_packetizer: skipping %d bytes (no valid AAC header "
|
||||
"found). This might make audio/video go out of sync, but this "
|
||||
"stream is damaged.\n", pos);
|
||||
buf = (unsigned char *)safememdup(packet_buffer + pos, aacheader->bytes);
|
||||
if ((aacheader->header_bit_size % 8) == 0)
|
||||
buf = (unsigned char *)safememdup(packet_buffer + pos +
|
||||
aacheader->header_byte_size,
|
||||
aacheader->data_byte_size);
|
||||
else {
|
||||
// Header is not byte aligned, i.e. MPEG-4 ADTS
|
||||
// This code is from mpeg4ip/server/mp4creator/aac.cpp
|
||||
up_shift = aacheader->header_bit_size % 8;
|
||||
down_shift = 8 - up_shift;
|
||||
src = packet_buffer + pos + aacheader->header_bit_size / 8;
|
||||
|
||||
buf = (unsigned char *)safemalloc(aacheader->data_byte_size);
|
||||
|
||||
buf[0] = src[0] << up_shift;
|
||||
for (i = 1; i < aacheader->data_byte_size; i++) {
|
||||
buf[i - 1] |= (src[i] >> down_shift);
|
||||
buf[i] = (src[i] << up_shift);
|
||||
}
|
||||
}
|
||||
|
||||
if (ti->async.displacement > 0) {
|
||||
/*
|
||||
@ -148,10 +167,27 @@ unsigned char *aac_packetizer_c::get_aac_packet(unsigned long *header,
|
||||
}
|
||||
|
||||
void aac_packetizer_c::set_headers() {
|
||||
if (id == 0)
|
||||
set_codec_id(MKV_A_AAC_4LC);
|
||||
else
|
||||
set_codec_id(MKV_A_AAC_2LC);
|
||||
if (id == 0) {
|
||||
if (profile == 0)
|
||||
set_codec_id(MKV_A_AAC_4MAIN);
|
||||
else if (profile == 1)
|
||||
set_codec_id(MKV_A_AAC_4LC);
|
||||
else if (profile == 2)
|
||||
set_codec_id(MKV_A_AAC_4SSR);
|
||||
else if (profile == 3)
|
||||
set_codec_id(MKV_A_AAC_4LTP);
|
||||
else
|
||||
die("aac_packetizer: Unknown AAC MPEG-4 object type...");
|
||||
} else {
|
||||
if (profile == 0)
|
||||
set_codec_id(MKV_A_AAC_2MAIN);
|
||||
else if (profile == 1)
|
||||
set_codec_id(MKV_A_AAC_2LC);
|
||||
else if (profile == 2)
|
||||
set_codec_id(MKV_A_AAC_2SSR);
|
||||
else
|
||||
die("aac_packetizer: Unknown AAC MPEG-2 profile...");
|
||||
}
|
||||
set_audio_sampling_freq((float)samples_per_sec);
|
||||
set_audio_channels(channels);
|
||||
|
||||
@ -174,7 +210,7 @@ int aac_packetizer_c::process(unsigned char *buf, int size,
|
||||
my_timecode = (int64_t)(1000.0 * packetno * 1024 * ti->async.linear /
|
||||
samples_per_sec);
|
||||
|
||||
add_packet(packet, aacheader.bytes, my_timecode,
|
||||
add_packet(packet, aacheader.data_byte_size, my_timecode,
|
||||
(int64_t)(1000.0 * 1024 * ti->async.linear / samples_per_sec));
|
||||
packetno++;
|
||||
}
|
||||
|
8
p_aac.h
8
p_aac.h
@ -13,7 +13,7 @@
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: p_aac.h,v 1.3 2003/05/18 20:57:07 mosu Exp $
|
||||
\version \$Id: p_aac.h,v 1.4 2003/05/19 20:51:12 mosu Exp $
|
||||
\brief class definition for the AAC output module
|
||||
\author Moritz Bunkus <moritz@bunkus.org>
|
||||
*/
|
||||
@ -29,12 +29,12 @@ class aac_packetizer_c: public generic_packetizer_c {
|
||||
private:
|
||||
int64_t bytes_output, packetno;
|
||||
unsigned long samples_per_sec;
|
||||
int channels, buffer_size, id, is_adif;
|
||||
int channels, buffer_size, id, profile;
|
||||
unsigned char *packet_buffer;
|
||||
|
||||
public:
|
||||
aac_packetizer_c(generic_reader_c *nreader, int nid,
|
||||
unsigned long nsamples_per_sec, int nchannels, int adif,
|
||||
aac_packetizer_c(generic_reader_c *nreader, int nid, int nprofile,
|
||||
unsigned long nsamples_per_sec, int nchannels,
|
||||
track_info_t *nti) throw (error_c);
|
||||
virtual ~aac_packetizer_c();
|
||||
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
/*!
|
||||
\file
|
||||
\version \$Id: r_aac.cpp,v 1.3 2003/05/18 20:57:07 mosu Exp $
|
||||
\version \$Id: r_aac.cpp,v 1.4 2003/05/19 20:51:12 mosu Exp $
|
||||
\brief AAC demultiplexer module
|
||||
\author Moritz Bunkus <moritz@bunkus.org>
|
||||
*/
|
||||
@ -77,9 +77,9 @@ aac_reader_c::aac_reader_c(track_info_t *nti) throw (error_c):
|
||||
else
|
||||
adif = 0;
|
||||
bytes_processed = 0;
|
||||
aacpacketizer = new aac_packetizer_c(this, aacheader.id,
|
||||
aacpacketizer = new aac_packetizer_c(this, aacheader.id, aacheader.profile,
|
||||
aacheader.sample_rate,
|
||||
aacheader.channels, adif, ti);
|
||||
aacheader.channels, ti);
|
||||
if (verbose)
|
||||
fprintf(stdout, "Using AAC demultiplexer for %s.\n+-> Using " \
|
||||
"AAC output module for audio stream.\n", ti->fname);
|
||||
|
Loading…
Reference in New Issue
Block a user