diff options
author | Andreas Huber <andih@google.com> | 2011-09-07 11:05:43 -0700 |
---|---|---|
committer | Andreas Huber <andih@google.com> | 2011-09-07 11:05:43 -0700 |
commit | 089d3e3f14101140ff8baa3cc44f3dd8586ad285 (patch) | |
tree | 40522e2274a9aedff1b301ebe162c3dea9b5bd0c /media | |
parent | 01dba603d7c74756126297b843aca0befed8810c (diff) | |
download | frameworks_base-089d3e3f14101140ff8baa3cc44f3dd8586ad285.zip frameworks_base-089d3e3f14101140ff8baa3cc44f3dd8586ad285.tar.gz frameworks_base-089d3e3f14101140ff8baa3cc44f3dd8586ad285.tar.bz2 |
Apparently keyframe status in audio tracks of .webm/.mkv files is unreliable
fortunately in all our supported audio encodings we can treat every frame as
a keyframe.
Change-Id: I32f21d0077bbae7ef9efe725dd351baf531179e2
related-to-bug: 5263837
Diffstat (limited to 'media')
-rw-r--r-- | media/libstagefright/matroska/MatroskaExtractor.cpp | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/media/libstagefright/matroska/MatroskaExtractor.cpp b/media/libstagefright/matroska/MatroskaExtractor.cpp index 3ef7b71..ffa3356 100644 --- a/media/libstagefright/matroska/MatroskaExtractor.cpp +++ b/media/libstagefright/matroska/MatroskaExtractor.cpp @@ -93,7 +93,7 @@ struct BlockIterator { void advance(); void reset(); - void seek(int64_t seekTimeUs); + void seek(int64_t seekTimeUs, bool seekToKeyFrame); const mkvparser::Block *block() const; int64_t blockTimeUs() const; @@ -137,6 +137,7 @@ private: sp<MatroskaExtractor> mExtractor; size_t mTrackIndex; Type mType; + bool mIsAudio; BlockIterator mBlockIter; size_t mNALSizeLen; // for type AVC @@ -156,6 +157,7 @@ MatroskaSource::MatroskaSource( : mExtractor(extractor), mTrackIndex(index), mType(OTHER), + mIsAudio(false), mBlockIter(mExtractor.get(), mExtractor->mTracks.itemAt(index).mTrackNum), mNALSizeLen(0) { @@ -164,6 +166,8 @@ MatroskaSource::MatroskaSource( const char *mime; CHECK(meta->findCString(kKeyMIMEType, &mime)); + mIsAudio = !strncasecmp("audio/", mime, 6); + if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC)) { mType = AVC; @@ -299,7 +303,7 @@ void BlockIterator::reset() { } while (!eos() && block()->GetTrackNumber() != mTrackNum); } -void BlockIterator::seek(int64_t seekTimeUs) { +void BlockIterator::seek(int64_t seekTimeUs, bool seekToKeyFrame) { Mutex::Autolock autoLock(mExtractor->mLock); mCluster = mExtractor->mSegment->FindCluster(seekTimeUs * 1000ll); @@ -311,8 +315,10 @@ void BlockIterator::seek(int64_t seekTimeUs) { } while (!eos() && block()->GetTrackNumber() != mTrackNum); - while (!eos() && !mBlockEntry->GetBlock()->IsKey()) { - advance_l(); + if (seekToKeyFrame) { + while (!eos() && !mBlockEntry->GetBlock()->IsKey()) { + advance_l(); + } } } @@ -396,7 +402,11 @@ status_t MatroskaSource::read( if (options && options->getSeekTo(&seekTimeUs, &mode) && !mExtractor->isLiveStreaming()) { clearPendingFrames(); - mBlockIter.seek(seekTimeUs); + + // Apparently keyframe indication in audio tracks is unreliable, + // fortunately in all our currently supported audio encodings every + // frame is effectively a keyframe. + mBlockIter.seek(seekTimeUs, !mIsAudio); } again: @@ -537,6 +547,13 @@ MatroskaExtractor::MatroskaExtractor(const sp<DataSource> &source) return; } +#if 0 + const mkvparser::SegmentInfo *info = mSegment->GetInfo(); + LOGI("muxing app: %s, writing app: %s", + info->GetMuxingAppAsUTF8(), + info->GetWritingAppAsUTF8()); +#endif + addTracks(); } |