summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/mpeg2ts/ESQueue.cpp
diff options
context:
space:
mode:
authorWei Jia <wjia@google.com>2014-12-05 16:25:54 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2014-12-05 16:25:54 +0000
commit9d02ca1a4e02ecc65edbe1deaaf06e65d33e9a28 (patch)
tree054375dd16d6b0d0c481901a329b9d5e70e707a2 /media/libstagefright/mpeg2ts/ESQueue.cpp
parentbfe1f3605c532ff2681458fe635beb8c47289205 (diff)
parent4d82c2f0d0361cd0062c3454d557bb1064e92020 (diff)
downloadframeworks_av-9d02ca1a4e02ecc65edbe1deaaf06e65d33e9a28.zip
frameworks_av-9d02ca1a4e02ecc65edbe1deaaf06e65d33e9a28.tar.gz
frameworks_av-9d02ca1a4e02ecc65edbe1deaaf06e65d33e9a28.tar.bz2
am 4d82c2f0: am 848b4c67: am 814cbb4e: Merge "ESQueue: add frame length checking in validation of ADTS header." into lmp-mr1-dev
* commit '4d82c2f0d0361cd0062c3454d557bb1064e92020': ESQueue: add frame length checking in validation of ADTS header.
Diffstat (limited to 'media/libstagefright/mpeg2ts/ESQueue.cpp')
-rw-r--r--media/libstagefright/mpeg2ts/ESQueue.cpp23
1 files changed, 19 insertions, 4 deletions
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp
index b01b0c0..43f1347 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.cpp
+++ b/media/libstagefright/mpeg2ts/ESQueue.cpp
@@ -170,8 +170,9 @@ static bool IsSeeminglyValidAC3Header(const uint8_t *ptr, size_t size) {
return parseAC3SyncFrame(ptr, size, NULL) > 0;
}
-static bool IsSeeminglyValidADTSHeader(const uint8_t *ptr, size_t size) {
- if (size < 3) {
+static bool IsSeeminglyValidADTSHeader(
+ const uint8_t *ptr, size_t size, size_t *frameLength) {
+ if (size < 7) {
// Not enough data to verify header.
return false;
}
@@ -194,6 +195,13 @@ static bool IsSeeminglyValidADTSHeader(const uint8_t *ptr, size_t size) {
return false;
}
+ size_t frameLengthInHeader =
+ ((ptr[3] & 3) << 11) + (ptr[4] << 3) + ((ptr[5] >> 5) & 7);
+ if (frameLengthInHeader > size) {
+ return false;
+ }
+
+ *frameLength = frameLengthInHeader;
return true;
}
@@ -315,8 +323,10 @@ status_t ElementaryStreamQueue::appendData(
}
#else
ssize_t startOffset = -1;
+ size_t frameLength;
for (size_t i = 0; i < size; ++i) {
- if (IsSeeminglyValidADTSHeader(&ptr[i], size - i)) {
+ if (IsSeeminglyValidADTSHeader(
+ &ptr[i], size - i, &frameLength)) {
startOffset = i;
break;
}
@@ -332,8 +342,13 @@ status_t ElementaryStreamQueue::appendData(
startOffset);
}
+ if (frameLength != size - startOffset) {
+ ALOGW("got ADTS AAC frame length %zd instead of %zd",
+ frameLength, size - startOffset);
+ }
+
data = &ptr[startOffset];
- size -= startOffset;
+ size = frameLength;
#endif
break;
}