summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/StagefrightMetadataRetriever.cpp
diff options
context:
space:
mode:
authorAndreas Huber <andih@google.com>2010-01-14 14:15:33 -0800
committerAndreas Huber <andih@google.com>2010-01-14 14:15:33 -0800
commit4e202e779a8495091ab189fd88fc295a3e619c61 (patch)
tree7b5ae99834e8a45bbad855c9ab961aa4154b3be2 /media/libstagefright/StagefrightMetadataRetriever.cpp
parent7be6407f2ad7f2b0782d195d9f792072c084d6f5 (diff)
downloadframeworks_av-4e202e779a8495091ab189fd88fc295a3e619c61.zip
frameworks_av-4e202e779a8495091ab189fd88fc295a3e619c61.tar.gz
frameworks_av-4e202e779a8495091ab189fd88fc295a3e619c61.tar.bz2
Squashed commit of the following:
commit cb11364feefc200f10af6a01f776803acba2792a Author: Andreas Huber <andih@google.com> Date: Thu Jan 14 14:05:36 2010 -0800 Even if the decoder didn't extract the thumbnail at the specified time, accept it for now. commit a54c0244b305caf11e67db49b7d3d8dba5f77751 Author: Andreas Huber <andih@google.com> Date: Thu Jan 14 11:37:15 2010 -0800 Add some checks to make sure we extract the correct thumbnail frame, also revert to the hardware decoders for thumnbail extraction if the software decoders failed.
Diffstat (limited to 'media/libstagefright/StagefrightMetadataRetriever.cpp')
-rw-r--r--media/libstagefright/StagefrightMetadataRetriever.cpp112
1 files changed, 71 insertions, 41 deletions
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index c7877a9..020887c 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -107,48 +107,14 @@ status_t StagefrightMetadataRetriever::setDataSource(
return OK;
}
-VideoFrame *StagefrightMetadataRetriever::captureFrame() {
- LOGV("captureFrame");
-
- if (mExtractor.get() == NULL) {
- LOGV("no extractor.");
- return NULL;
- }
-
- size_t n = mExtractor->countTracks();
- size_t i;
- for (i = 0; i < n; ++i) {
- sp<MetaData> meta = mExtractor->getTrackMetaData(i);
-
- const char *mime;
- CHECK(meta->findCString(kKeyMIMEType, &mime));
-
- if (!strncasecmp(mime, "video/", 6)) {
- break;
- }
- }
-
- if (i == n) {
- LOGV("no video track found.");
- return NULL;
- }
-
- sp<MetaData> trackMeta = mExtractor->getTrackMetaData(
- i, MediaExtractor::kIncludeExtensiveMetaData);
-
- sp<MediaSource> source = mExtractor->getTrack(i);
-
- if (source.get() == NULL) {
- LOGV("unable to instantiate video track.");
- return NULL;
- }
-
- sp<MetaData> meta = source->getFormat();
-
+static VideoFrame *extractVideoFrameWithCodecFlags(
+ OMXClient *client,
+ const sp<MetaData> &trackMeta,
+ const sp<MediaSource> &source, uint32_t flags) {
sp<MediaSource> decoder =
OMXCodec::Create(
- mClient.interface(), meta, false, source,
- NULL, OMXCodec::kPreferSoftwareCodecs);
+ client->interface(), source->getFormat(), false, source,
+ NULL, flags);
if (decoder.get() == NULL) {
LOGV("unable to instantiate video decoder.");
@@ -165,6 +131,8 @@ VideoFrame *StagefrightMetadataRetriever::captureFrame() {
int64_t thumbNailTime;
if (trackMeta->findInt64(kKeyThumbnailTime, &thumbNailTime)) {
options.setSeekTo(thumbNailTime);
+ } else {
+ thumbNailTime = -1;
}
MediaBuffer *buffer = NULL;
@@ -190,7 +158,19 @@ VideoFrame *StagefrightMetadataRetriever::captureFrame() {
LOGV("successfully decoded video frame.");
- meta = decoder->getFormat();
+ int64_t timeUs;
+ CHECK(buffer->meta_data()->findInt64(kKeyTime, &timeUs));
+ if (thumbNailTime >= 0) {
+ if (timeUs != thumbNailTime) {
+ const char *mime;
+ CHECK(trackMeta->findCString(kKeyMIMEType, &mime));
+
+ LOGV("thumbNailTime = %lld us, timeUs = %lld us, mime = %s",
+ thumbNailTime, timeUs, mime);
+ }
+ }
+
+ sp<MetaData> meta = decoder->getFormat();
int32_t width, height;
CHECK(meta->findInt32(kKeyWidth, &width));
@@ -225,6 +205,56 @@ VideoFrame *StagefrightMetadataRetriever::captureFrame() {
return frame;
}
+VideoFrame *StagefrightMetadataRetriever::captureFrame() {
+ LOGV("captureFrame");
+
+ if (mExtractor.get() == NULL) {
+ LOGV("no extractor.");
+ return NULL;
+ }
+
+ size_t n = mExtractor->countTracks();
+ size_t i;
+ for (i = 0; i < n; ++i) {
+ sp<MetaData> meta = mExtractor->getTrackMetaData(i);
+
+ const char *mime;
+ CHECK(meta->findCString(kKeyMIMEType, &mime));
+
+ if (!strncasecmp(mime, "video/", 6)) {
+ break;
+ }
+ }
+
+ if (i == n) {
+ LOGV("no video track found.");
+ return NULL;
+ }
+
+ sp<MetaData> trackMeta = mExtractor->getTrackMetaData(
+ i, MediaExtractor::kIncludeExtensiveMetaData);
+
+ sp<MediaSource> source = mExtractor->getTrack(i);
+
+ if (source.get() == NULL) {
+ LOGV("unable to instantiate video track.");
+ return NULL;
+ }
+
+ VideoFrame *frame =
+ extractVideoFrameWithCodecFlags(
+ &mClient, trackMeta, source, OMXCodec::kPreferSoftwareCodecs);
+
+ if (frame == NULL) {
+ LOGV("Software decoder failed to extract thumbnail, "
+ "trying hardware decoder.");
+
+ frame = extractVideoFrameWithCodecFlags(&mClient, trackMeta, source, 0);
+ }
+
+ return frame;
+}
+
MediaAlbumArt *StagefrightMetadataRetriever::extractAlbumArt() {
LOGV("extractAlbumArt (extractor: %s)", mExtractor.get() != NULL ? "YES" : "NO");