summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJames Dong <jdong@google.com>2011-05-26 12:00:51 -0700
committerAndroid (Google) Code Review <android-gerrit@google.com>2011-05-26 12:00:51 -0700
commita3e73df3b402f1ebdbef7c8a8e3111d852e7bd35 (patch)
tree21beb6a24cbe9dd6d914d183bcef57902f732e96
parent2de4113c10975648ad9d1cffa45847870a0d01b3 (diff)
parent515e855eae78aa495da58356486aaa666cb57fd1 (diff)
downloadframeworks_av-a3e73df3b402f1ebdbef7c8a8e3111d852e7bd35.zip
frameworks_av-a3e73df3b402f1ebdbef7c8a8e3111d852e7bd35.tar.gz
frameworks_av-a3e73df3b402f1ebdbef7c8a8e3111d852e7bd35.tar.bz2
Merge "Extract embedded cover art (aka poster frame) in mp4 files"
-rw-r--r--cmds/stagefright/stagefright.cpp15
-rw-r--r--media/libstagefright/MPEG4Extractor.cpp24
-rw-r--r--media/libstagefright/StagefrightMetadataRetriever.cpp14
3 files changed, 48 insertions, 5 deletions
diff --git a/cmds/stagefright/stagefright.cpp b/cmds/stagefright/stagefright.cpp
index a875c3a..01262fa 100644
--- a/cmds/stagefright/stagefright.cpp
+++ b/cmds/stagefright/stagefright.cpp
@@ -695,12 +695,14 @@ int main(int argc, char **argv) {
for (int k = 0; k < argc; ++k) {
const char *filename = argv[k];
+ bool failed = true;
CHECK_EQ(retriever->setDataSource(filename), (status_t)OK);
sp<IMemory> mem =
retriever->getFrameAtTime(-1,
MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC);
if (mem != NULL) {
+ failed = false;
printf("getFrameAtTime(%s) => OK\n", filename);
VideoFrame *frame = (VideoFrame *)mem->pointer();
@@ -715,16 +717,21 @@ int main(int argc, char **argv) {
"/sdcard/out.jpg", bitmap,
SkImageEncoder::kJPEG_Type,
SkImageEncoder::kDefaultQuality));
- } else {
+ }
+
+ {
mem = retriever->extractAlbumArt();
if (mem != NULL) {
+ failed = false;
printf("extractAlbumArt(%s) => OK\n", filename);
- } else {
- printf("both getFrameAtTime and extractAlbumArt "
- "failed on file '%s'.\n", filename);
}
}
+
+ if (failed) {
+ printf("both getFrameAtTime and extractAlbumArt "
+ "failed on file '%s'.\n", filename);
+ }
}
return 0;
diff --git a/media/libstagefright/MPEG4Extractor.cpp b/media/libstagefright/MPEG4Extractor.cpp
index 98ac044..5fe511f 100644
--- a/media/libstagefright/MPEG4Extractor.cpp
+++ b/media/libstagefright/MPEG4Extractor.cpp
@@ -653,6 +653,7 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
off64_t chunk_data_size = *offset + chunk_size - data_offset;
if (chunk_type != FOURCC('c', 'p', 'r', 't')
+ && chunk_type != FOURCC('c', 'o', 'v', 'r')
&& mPath.size() == 5 && underMetaDataPath(mPath)) {
off64_t stop_offset = *offset + chunk_size;
*offset = data_offset;
@@ -1331,6 +1332,29 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) {
break;
}
+ case FOURCC('c', 'o', 'v', 'r'):
+ {
+ if (mFileMetaData != NULL) {
+ LOGV("chunk_data_size = %lld and data_offset = %lld",
+ chunk_data_size, data_offset);
+ uint8_t *buffer = new uint8_t[chunk_data_size + 1];
+ if (mDataSource->readAt(
+ data_offset, buffer, chunk_data_size) != (ssize_t)chunk_data_size) {
+ delete[] buffer;
+ buffer = NULL;
+
+ return ERROR_IO;
+ }
+ const int kSkipBytesOfDataBox = 16;
+ mFileMetaData->setData(
+ kKeyAlbumArt, MetaData::TYPE_NONE,
+ buffer + kSkipBytesOfDataBox, chunk_data_size - kSkipBytesOfDataBox);
+ }
+
+ *offset += chunk_size;
+ break;
+ }
+
default:
{
*offset += chunk_size;
diff --git a/media/libstagefright/StagefrightMetadataRetriever.cpp b/media/libstagefright/StagefrightMetadataRetriever.cpp
index 4c3dc47..de3957b 100644
--- a/media/libstagefright/StagefrightMetadataRetriever.cpp
+++ b/media/libstagefright/StagefrightMetadataRetriever.cpp
@@ -317,6 +317,17 @@ VideoFrame *StagefrightMetadataRetriever::getFrameAtTime(
return NULL;
}
+ const void *data;
+ uint32_t type;
+ size_t dataSize;
+ if (mExtractor->getMetaData()->findData(kKeyAlbumArt, &type, &data, &dataSize)
+ && mAlbumArt == NULL) {
+ mAlbumArt = new MediaAlbumArt;
+ mAlbumArt->mSize = dataSize;
+ mAlbumArt->mData = new uint8_t[dataSize];
+ memcpy(mAlbumArt->mData, data, dataSize);
+ }
+
VideoFrame *frame =
extractVideoFrameWithCodecFlags(
&mClient, trackMeta, source, OMXCodec::kPreferSoftwareCodecs,
@@ -408,7 +419,8 @@ void StagefrightMetadataRetriever::parseMetaData() {
const void *data;
uint32_t type;
size_t dataSize;
- if (meta->findData(kKeyAlbumArt, &type, &data, &dataSize)) {
+ if (meta->findData(kKeyAlbumArt, &type, &data, &dataSize)
+ && mAlbumArt == NULL) {
mAlbumArt = new MediaAlbumArt;
mAlbumArt->mSize = dataSize;
mAlbumArt->mData = new uint8_t[dataSize];