diff options
author | James Dong <jdong@google.com> | 2011-05-25 15:02:50 -0700 |
---|---|---|
committer | James Dong <jdong@google.com> | 2011-05-26 11:31:16 -0700 |
commit | 515e855eae78aa495da58356486aaa666cb57fd1 (patch) | |
tree | 904870c8a34af1239be1118e10f0da1d9540261d | |
parent | 8d91237333c60c4a6839358109265e8847df23f3 (diff) | |
download | frameworks_av-515e855eae78aa495da58356486aaa666cb57fd1.zip frameworks_av-515e855eae78aa495da58356486aaa666cb57fd1.tar.gz frameworks_av-515e855eae78aa495da58356486aaa666cb57fd1.tar.bz2 |
Extract embedded cover art (aka poster frame) in mp4 files
Change-Id: Ic9421ee27b9aa3b27df00878b887de20f25d232b
-rw-r--r-- | cmds/stagefright/stagefright.cpp | 15 | ||||
-rw-r--r-- | media/libstagefright/MPEG4Extractor.cpp | 24 | ||||
-rw-r--r-- | media/libstagefright/StagefrightMetadataRetriever.cpp | 14 |
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]; |