Loading media/libmedia/include/media/mediametadataretriever.h +3 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,9 @@ enum { METADATA_KEY_VIDEO_FRAME_COUNT = 32, METADATA_KEY_EXIF_OFFSET = 33, METADATA_KEY_EXIF_LENGTH = 34, METADATA_KEY_COLOR_STANDARD = 35, METADATA_KEY_COLOR_TRANSFER = 36, METADATA_KEY_COLOR_RANGE = 37, // Add more here... }; Loading media/libstagefright/StagefrightMetadataRetriever.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ #include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MediaExtractorFactory.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/Utils.h> #include <media/CharacterEncodingDetector.h> namespace android { Loading Loading @@ -403,6 +404,25 @@ const char *StagefrightMetadataRetriever::extractMetadata(int keyCode) { return mMetaData.valueAt(index).string(); } void StagefrightMetadataRetriever::parseColorAspects(const sp<MetaData>& meta) { sp<AMessage> format = new AMessage(); if (convertMetaDataToMessage(meta, &format) != OK) { return; } int32_t standard, transfer, range; if (format->findInt32("color-standard", &standard) && format->findInt32("color-transfer", &transfer) && format->findInt32("color-range", &range)) { ALOGV("found color aspects : standard=%d, transfer=%d, range=%d", standard, transfer, range); mMetaData.add(METADATA_KEY_COLOR_STANDARD, String8::format("%d", standard)); mMetaData.add(METADATA_KEY_COLOR_TRANSFER, String8::format("%d", transfer)); mMetaData.add(METADATA_KEY_COLOR_RANGE, String8::format("%d", range)); } } void StagefrightMetadataRetriever::parseMetaData() { sp<MetaData> meta = mExtractor->getMetaData(); Loading Loading @@ -542,6 +562,8 @@ void StagefrightMetadataRetriever::parseMetaData() { if (!trackMeta->findInt32(kKeyFrameCount, &videoFrameCount)) { videoFrameCount = 0; } parseColorAspects(trackMeta); } else if (!strncasecmp("image/", mime, 6)) { int32_t isPrimary; if (trackMeta->findInt32( Loading media/libstagefright/Utils.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -1014,6 +1014,56 @@ status_t convertMetaDataToMessage( msg->setInt32("android._is-hdr", (info & hvcc.kInfoIsHdr) != 0); } uint32_t isoPrimaries, isoTransfer, isoMatrix, isoRange; if (hvcc.findParam32(kColourPrimaries, &isoPrimaries) && hvcc.findParam32(kTransferCharacteristics, &isoTransfer) && hvcc.findParam32(kMatrixCoeffs, &isoMatrix) && hvcc.findParam32(kVideoFullRangeFlag, &isoRange)) { ALOGV("found iso color aspects : primaris=%d, transfer=%d, matrix=%d, range=%d", isoPrimaries, isoTransfer, isoMatrix, isoRange); ColorAspects aspects; ColorUtils::convertIsoColorAspectsToCodecAspects( isoPrimaries, isoTransfer, isoMatrix, isoRange, aspects); if (aspects.mPrimaries == ColorAspects::PrimariesUnspecified) { int32_t primaries; if (meta->findInt32(kKeyColorPrimaries, &primaries)) { ALOGV("unspecified primaries found, replaced to %d", primaries); aspects.mPrimaries = static_cast<ColorAspects::Primaries>(primaries); } } if (aspects.mTransfer == ColorAspects::TransferUnspecified) { int32_t transferFunction; if (meta->findInt32(kKeyTransferFunction, &transferFunction)) { ALOGV("unspecified transfer found, replaced to %d", transferFunction); aspects.mTransfer = static_cast<ColorAspects::Transfer>(transferFunction); } } if (aspects.mMatrixCoeffs == ColorAspects::MatrixUnspecified) { int32_t colorMatrix; if (meta->findInt32(kKeyColorMatrix, &colorMatrix)) { ALOGV("unspecified matrix found, replaced to %d", colorMatrix); aspects.mMatrixCoeffs = static_cast<ColorAspects::MatrixCoeffs>(colorMatrix); } } if (aspects.mRange == ColorAspects::RangeUnspecified) { int32_t range; if (meta->findInt32(kKeyColorRange, &range)) { ALOGV("unspecified range found, replaced to %d", range); aspects.mRange = static_cast<ColorAspects::Range>(range); } } int32_t standard, transfer, range; if (ColorUtils::convertCodecColorAspectsToPlatformAspects( aspects, &range, &standard, &transfer) == OK) { msg->setInt32("color-standard", standard); msg->setInt32("color-transfer", transfer); msg->setInt32("color-range", range); } } parseHevcProfileLevelFromHvcc((const uint8_t *)data, dataSize, msg); } else if (meta->findData(kKeyESDS, &type, &data, &size)) { ESDS esds((const char *)data, size); Loading media/libstagefright/include/StagefrightMetadataRetriever.h +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ private: sp<ImageDecoder> mImageDecoder; int mLastImageIndex; void parseMetaData(); void parseColorAspects(const sp<MetaData>& meta); // Delete album art and clear metadata. void clearMetadata(); Loading Loading
media/libmedia/include/media/mediametadataretriever.h +3 −0 Original line number Diff line number Diff line Loading @@ -68,6 +68,9 @@ enum { METADATA_KEY_VIDEO_FRAME_COUNT = 32, METADATA_KEY_EXIF_OFFSET = 33, METADATA_KEY_EXIF_LENGTH = 34, METADATA_KEY_COLOR_STANDARD = 35, METADATA_KEY_COLOR_TRANSFER = 36, METADATA_KEY_COLOR_RANGE = 37, // Add more here... }; Loading
media/libstagefright/StagefrightMetadataRetriever.cpp +22 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ #include <media/stagefright/MediaExtractor.h> #include <media/stagefright/MediaExtractorFactory.h> #include <media/stagefright/MetaData.h> #include <media/stagefright/Utils.h> #include <media/CharacterEncodingDetector.h> namespace android { Loading Loading @@ -403,6 +404,25 @@ const char *StagefrightMetadataRetriever::extractMetadata(int keyCode) { return mMetaData.valueAt(index).string(); } void StagefrightMetadataRetriever::parseColorAspects(const sp<MetaData>& meta) { sp<AMessage> format = new AMessage(); if (convertMetaDataToMessage(meta, &format) != OK) { return; } int32_t standard, transfer, range; if (format->findInt32("color-standard", &standard) && format->findInt32("color-transfer", &transfer) && format->findInt32("color-range", &range)) { ALOGV("found color aspects : standard=%d, transfer=%d, range=%d", standard, transfer, range); mMetaData.add(METADATA_KEY_COLOR_STANDARD, String8::format("%d", standard)); mMetaData.add(METADATA_KEY_COLOR_TRANSFER, String8::format("%d", transfer)); mMetaData.add(METADATA_KEY_COLOR_RANGE, String8::format("%d", range)); } } void StagefrightMetadataRetriever::parseMetaData() { sp<MetaData> meta = mExtractor->getMetaData(); Loading Loading @@ -542,6 +562,8 @@ void StagefrightMetadataRetriever::parseMetaData() { if (!trackMeta->findInt32(kKeyFrameCount, &videoFrameCount)) { videoFrameCount = 0; } parseColorAspects(trackMeta); } else if (!strncasecmp("image/", mime, 6)) { int32_t isPrimary; if (trackMeta->findInt32( Loading
media/libstagefright/Utils.cpp +50 −0 Original line number Diff line number Diff line Loading @@ -1014,6 +1014,56 @@ status_t convertMetaDataToMessage( msg->setInt32("android._is-hdr", (info & hvcc.kInfoIsHdr) != 0); } uint32_t isoPrimaries, isoTransfer, isoMatrix, isoRange; if (hvcc.findParam32(kColourPrimaries, &isoPrimaries) && hvcc.findParam32(kTransferCharacteristics, &isoTransfer) && hvcc.findParam32(kMatrixCoeffs, &isoMatrix) && hvcc.findParam32(kVideoFullRangeFlag, &isoRange)) { ALOGV("found iso color aspects : primaris=%d, transfer=%d, matrix=%d, range=%d", isoPrimaries, isoTransfer, isoMatrix, isoRange); ColorAspects aspects; ColorUtils::convertIsoColorAspectsToCodecAspects( isoPrimaries, isoTransfer, isoMatrix, isoRange, aspects); if (aspects.mPrimaries == ColorAspects::PrimariesUnspecified) { int32_t primaries; if (meta->findInt32(kKeyColorPrimaries, &primaries)) { ALOGV("unspecified primaries found, replaced to %d", primaries); aspects.mPrimaries = static_cast<ColorAspects::Primaries>(primaries); } } if (aspects.mTransfer == ColorAspects::TransferUnspecified) { int32_t transferFunction; if (meta->findInt32(kKeyTransferFunction, &transferFunction)) { ALOGV("unspecified transfer found, replaced to %d", transferFunction); aspects.mTransfer = static_cast<ColorAspects::Transfer>(transferFunction); } } if (aspects.mMatrixCoeffs == ColorAspects::MatrixUnspecified) { int32_t colorMatrix; if (meta->findInt32(kKeyColorMatrix, &colorMatrix)) { ALOGV("unspecified matrix found, replaced to %d", colorMatrix); aspects.mMatrixCoeffs = static_cast<ColorAspects::MatrixCoeffs>(colorMatrix); } } if (aspects.mRange == ColorAspects::RangeUnspecified) { int32_t range; if (meta->findInt32(kKeyColorRange, &range)) { ALOGV("unspecified range found, replaced to %d", range); aspects.mRange = static_cast<ColorAspects::Range>(range); } } int32_t standard, transfer, range; if (ColorUtils::convertCodecColorAspectsToPlatformAspects( aspects, &range, &standard, &transfer) == OK) { msg->setInt32("color-standard", standard); msg->setInt32("color-transfer", transfer); msg->setInt32("color-range", range); } } parseHevcProfileLevelFromHvcc((const uint8_t *)data, dataSize, msg); } else if (meta->findData(kKeyESDS, &type, &data, &size)) { ESDS esds((const char *)data, size); Loading
media/libstagefright/include/StagefrightMetadataRetriever.h +1 −0 Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ private: sp<ImageDecoder> mImageDecoder; int mLastImageIndex; void parseMetaData(); void parseColorAspects(const sp<MetaData>& meta); // Delete album art and clear metadata. void clearMetadata(); Loading