summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/mpeg2ts
diff options
context:
space:
mode:
authorRobert Shih <robertshih@google.com>2014-09-16 01:12:02 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2014-09-16 01:12:02 +0000
commit9299a6873a4b909357e031361055a888843619da (patch)
treeac4f1f9598dee0c4720a9288755ee699f43f15c8 /media/libstagefright/mpeg2ts
parentdb8556baf10baefd286f7654c822fd0b648e71ef (diff)
parent666c96d37203fd91ec319b8b499442696f70fd53 (diff)
downloadframeworks_av-9299a6873a4b909357e031361055a888843619da.zip
frameworks_av-9299a6873a4b909357e031361055a888843619da.tar.gz
frameworks_av-9299a6873a4b909357e031361055a888843619da.tar.bz2
Merge "ESQueue: do not merge aac packets" into lmp-dev
Diffstat (limited to 'media/libstagefright/mpeg2ts')
-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);
};