Merge "Extract embedded cover art (aka poster frame) in mp4 files"

This commit is contained in:
James Dong
2011-05-26 12:00:51 -07:00
committed by Android (Google) Code Review
4 changed files with 49 additions and 6 deletions

View File

@@ -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;

View File

@@ -272,7 +272,7 @@ public class MediaMetadataRetriever
/**
* Call this method after setDataSource(). This method finds the optional
* graphic or album art associated associated with the data source. If
* graphic or album/cover art associated associated with the data source. If
* there are more than one pictures, (any) one of them is returned.
*
* @return null if no such graphic is found.

View File

@@ -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;

View File

@@ -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];