summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobert Shih <robertshih@google.com>2014-09-02 16:51:37 -0700
committerRobert Shih <robertshih@google.com>2014-09-15 16:51:33 -0700
commit666c96d37203fd91ec319b8b499442696f70fd53 (patch)
tree4e3b3b44c47a5b216b02d535a1dc884f78926dc3
parentb72726bad6c9253c26c82fea76bdf99e18b8ba6d (diff)
downloadframeworks_av-666c96d37203fd91ec319b8b499442696f70fd53.zip
frameworks_av-666c96d37203fd91ec319b8b499442696f70fd53.tar.gz
frameworks_av-666c96d37203fd91ec319b8b499442696f70fd53.tar.bz2
ESQueue: do not merge aac packets
Bug: 17310061 Change-Id: Ie0fb0702b0af1c4094415190fdfdf132d5fcd511
-rw-r--r--media/libstagefright/mpeg2ts/ESQueue.cpp46
-rw-r--r--media/libstagefright/mpeg2ts/ESQueue.h1
2 files changed, 46 insertions, 1 deletions
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp
index 3c8f03e..ef1cd3d 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.cpp
+++ b/media/libstagefright/mpeg2ts/ESQueue.cpp
@@ -604,6 +604,8 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() {
// having to interpolate.
// The final AAC frame may well extend into the next RangeInfo but
// that's ok.
+ // TODO: the logic commented above is skipped because codec cannot take
+ // arbitrary sized input buffers;
size_t offset = 0;
while (offset < info.mLength) {
if (offset + 7 > mBuffer->size()) {
@@ -668,9 +670,12 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitAAC() {
size_t headerSize = protection_absent ? 7 : 9;
offset += aac_frame_length;
+ // TODO: move back to concatenation when codec can support arbitrary input buffers.
+ // For now only queue a single buffer
+ break;
}
- int64_t timeUs = fetchTimestamp(offset);
+ int64_t timeUs = fetchTimestampAAC(offset);
sp<ABuffer> accessUnit = new ABuffer(offset);
memcpy(accessUnit->data(), mBuffer->data(), offset);
@@ -717,6 +722,45 @@ int64_t ElementaryStreamQueue::fetchTimestamp(size_t size) {
return timeUs;
}
+// TODO: avoid interpolating timestamps once codec supports arbitrary sized input buffers
+int64_t ElementaryStreamQueue::fetchTimestampAAC(size_t size) {
+ int64_t timeUs = -1;
+ bool first = true;
+
+ size_t samplesize = size;
+ while (size > 0) {
+ CHECK(!mRangeInfos.empty());
+
+ RangeInfo *info = &*mRangeInfos.begin();
+
+ if (first) {
+ timeUs = info->mTimestampUs;
+ first = false;
+ }
+
+ if (info->mLength > size) {
+ int32_t sampleRate;
+ CHECK(mFormat->findInt32(kKeySampleRate, &sampleRate));
+ info->mLength -= size;
+ size_t numSamples = 1024 * size / samplesize;
+ info->mTimestampUs += numSamples * 1000000ll / sampleRate;
+ size = 0;
+ } else {
+ size -= info->mLength;
+
+ mRangeInfos.erase(mRangeInfos.begin());
+ info = NULL;
+ }
+
+ }
+
+ if (timeUs == 0ll) {
+ ALOGV("Returning 0 timestamp");
+ }
+
+ return timeUs;
+}
+
struct NALPosition {
size_t nalOffset;
size_t nalSize;
diff --git a/media/libstagefright/mpeg2ts/ESQueue.h b/media/libstagefright/mpeg2ts/ESQueue.h
index a2cca77..7c81ff0 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.h
+++ b/media/libstagefright/mpeg2ts/ESQueue.h
@@ -77,6 +77,7 @@ private:
// consume a logical (compressed) access unit of size "size",
// returns its timestamp in us (or -1 if no time information).
int64_t fetchTimestamp(size_t size);
+ int64_t fetchTimestampAAC(size_t size);
DISALLOW_EVIL_CONSTRUCTORS(ElementaryStreamQueue);
};