Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit e8b26dce authored by James Dong's avatar James Dong
Browse files

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

Change-Id: Ic9421ee27b9aa3b27df00878b887de20f25d232b
parent 3453b1c5
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -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,17 +717,22 @@ 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 {
                }
            }

            if (failed) {
                printf("both getFrameAtTime and extractAlbumArt "
                    "failed on file '%s'.\n", filename);
            }
        }
        }

        return 0;
    }
+1 −1
Original line number Diff line number Diff line
@@ -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.
+24 −0
Original line number Diff line number Diff line
@@ -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;
+13 −1
Original line number Diff line number Diff line
@@ -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];