diff options
| author | Jean-Michel Trivi <jmtrivi@google.com> | 2011-08-30 09:06:36 -0700 | 
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-08-30 09:06:36 -0700 | 
| commit | 1619f3d3428e9d502dc477d31e0681fe1cd12b89 (patch) | |
| tree | 61b0a9c48624ecad9b03a2512ac484f1c660a8d8 /media | |
| parent | 13e6dfbd77a6e2c2832cbfe6dc66f3db8716538b (diff) | |
| parent | bf4c48bc678c8f531f39f0b48755967d844ad581 (diff) | |
| download | frameworks_av-1619f3d3428e9d502dc477d31e0681fe1cd12b89.zip frameworks_av-1619f3d3428e9d502dc477d31e0681fe1cd12b89.tar.gz frameworks_av-1619f3d3428e9d502dc477d31e0681fe1cd12b89.tar.bz2  | |
Merge "Bug 5156756 Fix AAC ADTS header size computation"
Diffstat (limited to 'media')
| -rw-r--r-- | media/libstagefright/AACExtractor.cpp | 33 | 
1 files changed, 24 insertions, 9 deletions
diff --git a/media/libstagefright/AACExtractor.cpp b/media/libstagefright/AACExtractor.cpp index a5a6b64..52b1200 100644 --- a/media/libstagefright/AACExtractor.cpp +++ b/media/libstagefright/AACExtractor.cpp @@ -33,8 +33,6 @@  namespace android { -#define ADTS_HEADER_LENGTH 7 -  class AACSource : public MediaSource {  public:      AACSource(const sp<DataSource> &source, @@ -88,7 +86,16 @@ uint32_t get_sample_rate(const uint8_t sf_index)      return 0;  } -static size_t getFrameSize(const sp<DataSource> &source, off64_t offset) { +// Returns the frame length in bytes as described in an ADTS header starting at the given offset, +//     or 0 if the size can't be read due to an error in the header or a read failure. +// The returned value is the AAC frame size with the ADTS header length (regardless of +//     the presence of the CRC). +// If headerSize is non-NULL, it will be used to return the size of the header of this ADTS frame. +static size_t getAdtsFrameLength(const sp<DataSource> &source, off64_t offset, size_t* headerSize) { + +    const size_t kAdtsHeaderLengthNoCrc = 7; +    const size_t kAdtsHeaderLengthWithCrc = 9; +      size_t frameSize = 0;      uint8_t syncword[2]; @@ -111,7 +118,15 @@ static size_t getFrameSize(const sp<DataSource> &source, off64_t offset) {      }      frameSize = (header[0] & 0x3) << 11 | header[1] << 3 | header[2] >> 5; -    frameSize += ADTS_HEADER_LENGTH + protectionAbsent ? 0 : 2; + +    // protectionAbsent is 0 if there is CRC +    size_t headSize = protectionAbsent ? kAdtsHeaderLengthNoCrc : kAdtsHeaderLengthWithCrc; +    if (headSize > frameSize) { +        return 0; +    } +    if (headerSize != NULL) { +        *headerSize = headSize; +    }      return frameSize;  } @@ -148,7 +163,7 @@ AACExtractor::AACExtractor(const sp<DataSource> &source)      if (mDataSource->getSize(&streamSize) == OK) {           while (offset < streamSize) { -            if ((frameSize = getFrameSize(source, offset)) == 0) { +            if ((frameSize = getAdtsFrameLength(source, offset, NULL)) == 0) {                  return;              } @@ -268,8 +283,8 @@ status_t AACSource::read(          }      } -    size_t frameSize, frameSizeWithoutHeader; -    if ((frameSize = getFrameSize(mDataSource, mOffset)) == 0) { +    size_t frameSize, frameSizeWithoutHeader, headerSize; +    if ((frameSize = getAdtsFrameLength(mDataSource, mOffset, &headerSize)) == 0) {          return ERROR_END_OF_STREAM;      } @@ -279,8 +294,8 @@ status_t AACSource::read(          return err;      } -    frameSizeWithoutHeader = frameSize - ADTS_HEADER_LENGTH; -    if (mDataSource->readAt(mOffset + ADTS_HEADER_LENGTH, buffer->data(), +    frameSizeWithoutHeader = frameSize - headerSize; +    if (mDataSource->readAt(mOffset + headerSize, buffer->data(),                  frameSizeWithoutHeader) != (ssize_t)frameSizeWithoutHeader) {          buffer->release();          buffer = NULL;  | 
