summaryrefslogtreecommitdiffstats
path: root/cmds/stagefright
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2011-06-23 10:12:12 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-06-23 10:12:12 -0700
commit46dd1e8633c12eeb85c283df11d6d992fb2c7594 (patch)
tree58c3f0dc099ad2eff07a6c667b8be89c23a22b33 /cmds/stagefright
parent22192eaa6f8ee8ec6ed0737d01fe27cd6bd4d916 (diff)
parentfed045821d5eae63b34549cb44b7d26602f5c543 (diff)
downloadframeworks_av-46dd1e8633c12eeb85c283df11d6d992fb2c7594.zip
frameworks_av-46dd1e8633c12eeb85c283df11d6d992fb2c7594.tar.gz
frameworks_av-46dd1e8633c12eeb85c283df11d6d992fb2c7594.tar.bz2
Merge "Reconstruct sync frame indication for content served by the MPEG2TSExtractor"
Diffstat (limited to 'cmds/stagefright')
-rw-r--r--cmds/stagefright/stagefright.cpp47
1 files changed, 38 insertions, 9 deletions
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index ca77185..d7b1e71 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -388,13 +388,15 @@ private:
sp<MediaSource> mSource;
StreamType mStreamType;
+ bool mSawFirstIDRFrame;
DISALLOW_EVIL_CONSTRUCTORS(DetectSyncSource);
};
DetectSyncSource::DetectSyncSource(const sp<MediaSource> &source)
: mSource(source),
- mStreamType(OTHER) {
+ mStreamType(OTHER),
+ mSawFirstIDRFrame(false) {
const char *mime;
CHECK(mSource->getFormat()->findCString(kKeyMIMEType, &mime));
@@ -410,6 +412,8 @@ DetectSyncSource::DetectSyncSource(const sp<MediaSource> &source)
}
status_t DetectSyncSource::start(MetaData *params) {
+ mSawFirstIDRFrame = false;
+
return mSource->start(params);
}
@@ -439,16 +443,30 @@ static bool isIDRFrame(MediaBuffer *buffer) {
status_t DetectSyncSource::read(
MediaBuffer **buffer, const ReadOptions *options) {
- status_t err = mSource->read(buffer, options);
+ for (;;) {
+ status_t err = mSource->read(buffer, options);
- if (err != OK) {
- return err;
- }
+ if (err != OK) {
+ return err;
+ }
- if (mStreamType == AVC && isIDRFrame(*buffer)) {
- (*buffer)->meta_data()->setInt32(kKeyIsSyncFrame, true);
- } else {
- (*buffer)->meta_data()->setInt32(kKeyIsSyncFrame, true);
+ if (mStreamType == AVC) {
+ bool isIDR = isIDRFrame(*buffer);
+ (*buffer)->meta_data()->setInt32(kKeyIsSyncFrame, isIDR);
+ if (isIDR) {
+ mSawFirstIDRFrame = true;
+ }
+ } else {
+ (*buffer)->meta_data()->setInt32(kKeyIsSyncFrame, true);
+ }
+
+ if (mStreamType != AVC || mSawFirstIDRFrame) {
+ break;
+ }
+
+ // Ignore everything up to the first IDR frame.
+ (*buffer)->release();
+ *buffer = NULL;
}
return OK;
@@ -945,6 +963,17 @@ int main(int argc, char **argv) {
fprintf(stderr, "could not create extractor.\n");
return -1;
}
+
+ sp<MetaData> meta = extractor->getMetaData();
+
+ if (meta != NULL) {
+ const char *mime;
+ CHECK(meta->findCString(kKeyMIMEType, &mime));
+
+ if (!strcasecmp(mime, MEDIA_MIMETYPE_CONTAINER_MPEG2TS)) {
+ syncInfoPresent = false;
+ }
+ }
}
size_t numTracks = extractor->countTracks();