summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/mpeg2ts
diff options
context:
space:
mode:
authorRobert Shih <robertshih@google.com>2015-04-08 09:06:54 -0700
committerRobert Shih <robertshih@google.com>2015-04-16 19:01:15 -0700
commit0852843d304006e3ab333081fddda13b07193de8 (patch)
treef60be26aad988e89bc135a86f6e4ae8853c69a49 /media/libstagefright/mpeg2ts
parent3d66eb4128aebef31bb0fa44c4d53d6122294a26 (diff)
downloadframeworks_av-0852843d304006e3ab333081fddda13b07193de8.zip
frameworks_av-0852843d304006e3ab333081fddda13b07193de8.tar.gz
frameworks_av-0852843d304006e3ab333081fddda13b07193de8.tar.bz2
stagefright: initial timed id3 support in hls
Change-Id: I00a8a786b3f4b74742c34770edd94e937abe20a8
Diffstat (limited to 'media/libstagefright/mpeg2ts')
-rw-r--r--media/libstagefright/mpeg2ts/ATSParser.cpp21
-rw-r--r--media/libstagefright/mpeg2ts/ATSParser.h4
-rw-r--r--media/libstagefright/mpeg2ts/AnotherPacketSource.cpp8
-rw-r--r--media/libstagefright/mpeg2ts/AnotherPacketSource.h1
-rw-r--r--media/libstagefright/mpeg2ts/ESQueue.cpp23
-rw-r--r--media/libstagefright/mpeg2ts/ESQueue.h2
6 files changed, 57 insertions, 2 deletions
diff --git a/media/libstagefright/mpeg2ts/ATSParser.cpp b/media/libstagefright/mpeg2ts/ATSParser.cpp
index 14ae81c..5411821 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.cpp
+++ b/media/libstagefright/mpeg2ts/ATSParser.cpp
@@ -132,6 +132,7 @@ struct ATSParser::Stream : public RefBase {
bool isAudio() const;
bool isVideo() const;
+ bool isMeta() const;
protected:
virtual ~Stream();
@@ -604,6 +605,11 @@ ATSParser::Stream::Stream(
ElementaryStreamQueue::AC3);
break;
+ case STREAMTYPE_METADATA:
+ mQueue = new ElementaryStreamQueue(
+ ElementaryStreamQueue::METADATA);
+ break;
+
default:
break;
}
@@ -722,6 +728,13 @@ bool ATSParser::Stream::isAudio() const {
}
}
+bool ATSParser::Stream::isMeta() const {
+ if (mStreamType == STREAMTYPE_METADATA) {
+ return true;
+ }
+ return false;
+}
+
void ATSParser::Stream::signalDiscontinuity(
DiscontinuityType type, const sp<AMessage> &extra) {
mExpectedContinuityCounter = -1;
@@ -1037,6 +1050,14 @@ sp<MediaSource> ATSParser::Stream::getSource(SourceType type) {
break;
}
+ case META:
+ {
+ if (isMeta()) {
+ return mSource;
+ }
+ break;
+ }
+
default:
break;
}
diff --git a/media/libstagefright/mpeg2ts/ATSParser.h b/media/libstagefright/mpeg2ts/ATSParser.h
index a1405bd..87ab1a0 100644
--- a/media/libstagefright/mpeg2ts/ATSParser.h
+++ b/media/libstagefright/mpeg2ts/ATSParser.h
@@ -74,7 +74,8 @@ struct ATSParser : public RefBase {
enum SourceType {
VIDEO = 0,
AUDIO = 1,
- NUM_SOURCE_TYPES = 2
+ META = 2,
+ NUM_SOURCE_TYPES = 3
};
sp<MediaSource> getSource(SourceType type);
bool hasSource(SourceType type) const;
@@ -90,6 +91,7 @@ struct ATSParser : public RefBase {
STREAMTYPE_MPEG2_AUDIO = 0x04,
STREAMTYPE_MPEG2_AUDIO_ADTS = 0x0f,
STREAMTYPE_MPEG4_VIDEO = 0x10,
+ STREAMTYPE_METADATA = 0x15,
STREAMTYPE_H264 = 0x1b,
// From ATSC A/53 Part 3:2009, 6.7.1
diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
index a4f8739..87ec860 100644
--- a/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
+++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.cpp
@@ -73,7 +73,7 @@ void AnotherPacketSource::setFormat(const sp<MetaData> &meta) {
} else if (!strncasecmp("video/", mime, 6)) {
mIsVideo = true;
} else {
- CHECK(!strncasecmp("text/", mime, 5));
+ CHECK(!strncasecmp("text/", mime, 5) || !strncasecmp("application/", mime, 12));
}
}
@@ -146,6 +146,12 @@ status_t AnotherPacketSource::dequeueAccessUnit(sp<ABuffer> *buffer) {
return mEOSResult;
}
+void AnotherPacketSource::requeueAccessUnit(const sp<ABuffer> &buffer) {
+ // TODO: update corresponding book keeping info.
+ Mutex::Autolock autoLock(mLock);
+ mBuffers.push_front(buffer);
+}
+
status_t AnotherPacketSource::read(
MediaBuffer **out, const ReadOptions *) {
*out = NULL;
diff --git a/media/libstagefright/mpeg2ts/AnotherPacketSource.h b/media/libstagefright/mpeg2ts/AnotherPacketSource.h
index fa7dd6a..08cd92e 100644
--- a/media/libstagefright/mpeg2ts/AnotherPacketSource.h
+++ b/media/libstagefright/mpeg2ts/AnotherPacketSource.h
@@ -67,6 +67,7 @@ struct AnotherPacketSource : public MediaSource {
void signalEOS(status_t result);
status_t dequeueAccessUnit(sp<ABuffer> *buffer);
+ void requeueAccessUnit(const sp<ABuffer> &buffer);
bool isFinished(int64_t duration) const;
diff --git a/media/libstagefright/mpeg2ts/ESQueue.cpp b/media/libstagefright/mpeg2ts/ESQueue.cpp
index 55262ff..f28a1fd 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.cpp
+++ b/media/libstagefright/mpeg2ts/ESQueue.cpp
@@ -415,6 +415,7 @@ status_t ElementaryStreamQueue::appendData(
}
case PCM_AUDIO:
+ case METADATA:
{
break;
}
@@ -499,6 +500,8 @@ sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnit() {
return dequeueAccessUnitMPEG4Video();
case PCM_AUDIO:
return dequeueAccessUnitPCMAudio();
+ case METADATA:
+ return dequeueAccessUnitMetadata();
default:
CHECK_EQ((unsigned)mMode, (unsigned)MPEG_AUDIO);
return dequeueAccessUnitMPEGAudio();
@@ -1292,5 +1295,25 @@ void ElementaryStreamQueue::signalEOS() {
}
}
+sp<ABuffer> ElementaryStreamQueue::dequeueAccessUnitMetadata() {
+ size_t size = mBuffer->size();
+ if (!size) {
+ return NULL;
+ }
+
+ sp<ABuffer> accessUnit = new ABuffer(size);
+ int64_t timeUs = fetchTimestamp(size);
+ accessUnit->meta()->setInt64("timeUs", timeUs);
+
+ memcpy(accessUnit->data(), mBuffer->data(), size);
+ mBuffer->setRange(0, 0);
+
+ if (mFormat == NULL) {
+ mFormat = new MetaData;
+ mFormat->setCString(kKeyMIMEType, MEDIA_MIMETYPE_DATA_METADATA);
+ }
+
+ return accessUnit;
+}
} // namespace android
diff --git a/media/libstagefright/mpeg2ts/ESQueue.h b/media/libstagefright/mpeg2ts/ESQueue.h
index 5425367..e9f96b7 100644
--- a/media/libstagefright/mpeg2ts/ESQueue.h
+++ b/media/libstagefright/mpeg2ts/ESQueue.h
@@ -37,6 +37,7 @@ struct ElementaryStreamQueue {
MPEG_VIDEO,
MPEG4_VIDEO,
PCM_AUDIO,
+ METADATA,
};
enum Flags {
@@ -75,6 +76,7 @@ private:
sp<ABuffer> dequeueAccessUnitMPEGVideo();
sp<ABuffer> dequeueAccessUnitMPEG4Video();
sp<ABuffer> dequeueAccessUnitPCMAudio();
+ sp<ABuffer> dequeueAccessUnitMetadata();
// consume a logical (compressed) access unit of size "size",
// returns its timestamp in us (or -1 if no time information).