Loading media/extractors/mp4/MPEG4Extractor.cpp +38 −0 Original line number Diff line number Diff line Loading @@ -2236,7 +2236,29 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { *offset += chunk_size; break; } case FOURCC("av1C"): { auto buffer = heapbuffer<uint8_t>(chunk_data_size); if (buffer.get() == NULL) { ALOGE("b/28471206"); return NO_MEMORY; } if (mDataSource->readAt( data_offset, buffer.get(), chunk_data_size) < chunk_data_size) { return ERROR_IO; } if (mLastTrack == NULL) return ERROR_MALFORMED; AMediaFormat_setBuffer(mLastTrack->meta, AMEDIAFORMAT_KEY_CSD_0, buffer.get(), chunk_data_size); *offset += chunk_size; break; } case FOURCC("d263"): { *offset += chunk_size; Loading Loading @@ -3972,6 +3994,18 @@ MediaTrackHelper *MPEG4Extractor::getTrack(size_t index) { if (!strcasecmp(mime, MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC)) { itemTable = mItemTable; } } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AV1)) { void *data; size_t size; if (!AMediaFormat_getBuffer(track->meta, AMEDIAFORMAT_KEY_CSD_0, &data, &size)) { return NULL; } const uint8_t *ptr = (const uint8_t *)data; if (size < 5 || ptr[0] != 0x81) { // configurationVersion == 1 return NULL; } } if (track->has_elst and !strncasecmp("video/", mime, 6) and track->elst_media_time > 0) { Loading Loading @@ -4005,6 +4039,10 @@ status_t MPEG4Extractor::verifyTrack(Track *track) { if (!AMediaFormat_getBuffer(track->meta, AMEDIAFORMAT_KEY_CSD_HEVC, &data, &size)) { return ERROR_MALFORMED; } } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AV1)) { if (!AMediaFormat_getBuffer(track->meta, AMEDIAFORMAT_KEY_CSD_0, &data, &size)) { return ERROR_MALFORMED; } } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4) || !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG2) || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { Loading media/libstagefright/Utils.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -1187,6 +1187,16 @@ status_t convertMetaDataToMessage( } parseHevcProfileLevelFromHvcc((const uint8_t *)data, dataSize, msg); } else if (meta->findData(kKeyAV1C, &type, &data, &size)) { sp<ABuffer> buffer = new (std::nothrow) ABuffer(size); if (buffer.get() == NULL || buffer->base() == NULL) { return NO_MEMORY; } memcpy(buffer->data(), data, size); buffer->meta()->setInt32("csd", true); buffer->meta()->setInt64("timeUs", 0); msg->setBuffer("csd-0", buffer); } else if (meta->findData(kKeyESDS, &type, &data, &size)) { ESDS esds((const char *)data, size); if (esds.InitCheck() != (status_t)OK) { Loading Loading @@ -1746,6 +1756,8 @@ void convertMessageToMetaData(const sp<AMessage> &msg, sp<MetaData> &meta) { std::vector<uint8_t> hvcc(csd0size + 1024); size_t outsize = reassembleHVCC(csd0, hvcc.data(), hvcc.size(), 4); meta->setData(kKeyHVCC, kTypeHVCC, hvcc.data(), outsize); } else if (mime == MEDIA_MIMETYPE_VIDEO_AV1) { meta->setData(kKeyAV1C, 0, csd0->data(), csd0->size()); } else if (mime == MEDIA_MIMETYPE_VIDEO_VP9) { meta->setData(kKeyVp9CodecPrivate, 0, csd0->data(), csd0->size()); } else if (mime == MEDIA_MIMETYPE_AUDIO_OPUS) { Loading media/libstagefright/include/media/stagefright/MetaDataBase.h +2 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ enum { kKeyAACProfile = 'aacp', // int32_t kKeyAVCC = 'avcc', // raw data kKeyHVCC = 'hvcc', // raw data kKeyAV1C = 'av1c', // raw data kKeyThumbnailHVCC = 'thvc', // raw data kKeyD263 = 'd263', // raw data kKeyVorbisInfo = 'vinf', // raw data Loading Loading @@ -236,6 +237,7 @@ enum { kTypeESDS = 'esds', kTypeAVCC = 'avcc', kTypeHVCC = 'hvcc', kTypeAV1C = 'av1c', kTypeD263 = 'd263', }; Loading Loading
media/extractors/mp4/MPEG4Extractor.cpp +38 −0 Original line number Diff line number Diff line Loading @@ -2236,7 +2236,29 @@ status_t MPEG4Extractor::parseChunk(off64_t *offset, int depth) { *offset += chunk_size; break; } case FOURCC("av1C"): { auto buffer = heapbuffer<uint8_t>(chunk_data_size); if (buffer.get() == NULL) { ALOGE("b/28471206"); return NO_MEMORY; } if (mDataSource->readAt( data_offset, buffer.get(), chunk_data_size) < chunk_data_size) { return ERROR_IO; } if (mLastTrack == NULL) return ERROR_MALFORMED; AMediaFormat_setBuffer(mLastTrack->meta, AMEDIAFORMAT_KEY_CSD_0, buffer.get(), chunk_data_size); *offset += chunk_size; break; } case FOURCC("d263"): { *offset += chunk_size; Loading Loading @@ -3972,6 +3994,18 @@ MediaTrackHelper *MPEG4Extractor::getTrack(size_t index) { if (!strcasecmp(mime, MEDIA_MIMETYPE_IMAGE_ANDROID_HEIC)) { itemTable = mItemTable; } } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AV1)) { void *data; size_t size; if (!AMediaFormat_getBuffer(track->meta, AMEDIAFORMAT_KEY_CSD_0, &data, &size)) { return NULL; } const uint8_t *ptr = (const uint8_t *)data; if (size < 5 || ptr[0] != 0x81) { // configurationVersion == 1 return NULL; } } if (track->has_elst and !strncasecmp("video/", mime, 6) and track->elst_media_time > 0) { Loading Loading @@ -4005,6 +4039,10 @@ status_t MPEG4Extractor::verifyTrack(Track *track) { if (!AMediaFormat_getBuffer(track->meta, AMEDIAFORMAT_KEY_CSD_HEVC, &data, &size)) { return ERROR_MALFORMED; } } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AV1)) { if (!AMediaFormat_getBuffer(track->meta, AMEDIAFORMAT_KEY_CSD_0, &data, &size)) { return ERROR_MALFORMED; } } else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG4) || !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_MPEG2) || !strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) { Loading
media/libstagefright/Utils.cpp +12 −0 Original line number Diff line number Diff line Loading @@ -1187,6 +1187,16 @@ status_t convertMetaDataToMessage( } parseHevcProfileLevelFromHvcc((const uint8_t *)data, dataSize, msg); } else if (meta->findData(kKeyAV1C, &type, &data, &size)) { sp<ABuffer> buffer = new (std::nothrow) ABuffer(size); if (buffer.get() == NULL || buffer->base() == NULL) { return NO_MEMORY; } memcpy(buffer->data(), data, size); buffer->meta()->setInt32("csd", true); buffer->meta()->setInt64("timeUs", 0); msg->setBuffer("csd-0", buffer); } else if (meta->findData(kKeyESDS, &type, &data, &size)) { ESDS esds((const char *)data, size); if (esds.InitCheck() != (status_t)OK) { Loading Loading @@ -1746,6 +1756,8 @@ void convertMessageToMetaData(const sp<AMessage> &msg, sp<MetaData> &meta) { std::vector<uint8_t> hvcc(csd0size + 1024); size_t outsize = reassembleHVCC(csd0, hvcc.data(), hvcc.size(), 4); meta->setData(kKeyHVCC, kTypeHVCC, hvcc.data(), outsize); } else if (mime == MEDIA_MIMETYPE_VIDEO_AV1) { meta->setData(kKeyAV1C, 0, csd0->data(), csd0->size()); } else if (mime == MEDIA_MIMETYPE_VIDEO_VP9) { meta->setData(kKeyVp9CodecPrivate, 0, csd0->data(), csd0->size()); } else if (mime == MEDIA_MIMETYPE_AUDIO_OPUS) { Loading
media/libstagefright/include/media/stagefright/MetaDataBase.h +2 −0 Original line number Diff line number Diff line Loading @@ -59,6 +59,7 @@ enum { kKeyAACProfile = 'aacp', // int32_t kKeyAVCC = 'avcc', // raw data kKeyHVCC = 'hvcc', // raw data kKeyAV1C = 'av1c', // raw data kKeyThumbnailHVCC = 'thvc', // raw data kKeyD263 = 'd263', // raw data kKeyVorbisInfo = 'vinf', // raw data Loading Loading @@ -236,6 +237,7 @@ enum { kTypeESDS = 'esds', kTypeAVCC = 'avcc', kTypeHVCC = 'hvcc', kTypeAV1C = 'av1c', kTypeD263 = 'd263', }; Loading