aboutsummaryrefslogtreecommitdiff
path: root/src/plugins/Input/aac/aacfile.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/Input/aac/aacfile.cpp')
-rw-r--r--src/plugins/Input/aac/aacfile.cpp41
1 files changed, 30 insertions, 11 deletions
diff --git a/src/plugins/Input/aac/aacfile.cpp b/src/plugins/Input/aac/aacfile.cpp
index 6d1a67f48..2e1cc5dd6 100644
--- a/src/plugins/Input/aac/aacfile.cpp
+++ b/src/plugins/Input/aac/aacfile.cpp
@@ -31,13 +31,14 @@
static int adts_sample_rates[] = {96000,88200,64000,48000,44100,32000,24000,22050,16000,12000,11025,8000,7350,0,0,0};
-AACFile::AACFile(QIODevice *i, bool metaData)
+AACFile::AACFile(QIODevice *i, bool metaData, bool adts)
{
m_isValid = false;
m_length = 0;
m_bitrate = 0;
m_samplerate = 0;
m_input = i;
+ m_offset = 0;
uchar buf[AAC_BUFFER_SIZE];
qint64 buf_at = i->peek((char *) buf, AAC_BUFFER_SIZE);
@@ -55,26 +56,38 @@ AACFile::AACFile(QIODevice *i, bool metaData)
return;
}
memmove (buf, buf + tag_size, buf_at - tag_size);
+ buf_at -= tag_size;
+ m_offset = tag_size;
if (metaData)
parseID3v2(); //parse id3v2 tags
}
- //try to determnate header type;
- if (buf[0] == 0xff && ((buf[1] & 0xf6) == 0xf0))
+
+ int adts_offset = 0;
+
+ while(adts_offset < buf_at - 6)
{
- qDebug("AACFile: ADTS header found");
- if (!i->isSequential())
- parseADTS();
- m_isValid = true;
+ //try to determnate header type;
+ if (buf[adts_offset] == 0xff && ((buf[adts_offset+1] & 0xf6) == 0xf0))
+ {
+ qDebug("AACFile: ADTS header found");
+ if (!i->isSequential() && adts)
+ parseADTS();
+ m_isValid = true;
+ m_offset += adts_offset;
+ return;
+ }
+ adts_offset++;
}
- else if (memcmp(buf, "ADIF", 4) == 0)
+
+ if (memcmp(buf, "ADIF", 4) == 0)
{
qDebug("AACFile: ADIF header found");
int skip_size = (buf[4] & 0x80) ? 9 : 0;
m_bitrate = ((buf[4 + skip_size] & 0x0F)<<19) |
- (buf[5 + skip_size]<<11) |
- (buf[6 + skip_size]<<3) |
- (buf[7 + skip_size] & 0xE0);
+ (buf[5 + skip_size]<<11) |
+ (buf[6 + skip_size]<<3) |
+ (buf[7 + skip_size] & 0xE0);
if (!i->isSequential ())
m_length = (qint64) (((float)i->size()*8.f)/((float)m_bitrate) + 0.5f);
@@ -103,6 +116,11 @@ quint32 AACFile::samplerate()
return m_samplerate;
}
+int AACFile::offset() const
+{
+ return m_offset;
+}
+
bool AACFile::isValid()
{
return m_isValid;
@@ -238,3 +256,4 @@ void ID3v2Tag::read ()
TagLib::ByteVector v(array.data(), array.size());
parse(v);
}
+