|
|
|
@ -139,6 +139,7 @@ private:
|
|
|
|
|
enum Type {
|
|
|
|
|
AVC,
|
|
|
|
|
AAC,
|
|
|
|
|
HEVC,
|
|
|
|
|
OTHER
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -147,7 +148,7 @@ private:
|
|
|
|
|
Type mType;
|
|
|
|
|
bool mIsAudio;
|
|
|
|
|
BlockIterator mBlockIter;
|
|
|
|
|
ssize_t mNALSizeLen; // for type AVC
|
|
|
|
|
ssize_t mNALSizeLen; // for type AVC or HEVC
|
|
|
|
|
|
|
|
|
|
List<MediaBuffer *> mPendingFrames;
|
|
|
|
|
|
|
|
|
@ -243,6 +244,19 @@ MatroskaSource::MatroskaSource(
|
|
|
|
|
} else {
|
|
|
|
|
ALOGE("No mNALSizeLen");
|
|
|
|
|
}
|
|
|
|
|
} else if (!strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_HEVC)) {
|
|
|
|
|
mType = HEVC;
|
|
|
|
|
|
|
|
|
|
uint32_t dummy;
|
|
|
|
|
const uint8_t *hvcc;
|
|
|
|
|
size_t hvccSize;
|
|
|
|
|
if (meta->findData(kKeyHVCC, &dummy, (const void **)&hvcc, &hvccSize)
|
|
|
|
|
&& hvccSize >= 22u) {
|
|
|
|
|
mNALSizeLen = 1 + (hvcc[14+7] & 3);
|
|
|
|
|
ALOGV("mNALSizeLen = %zu", mNALSizeLen);
|
|
|
|
|
} else {
|
|
|
|
|
ALOGE("No mNALSizeLen");
|
|
|
|
|
}
|
|
|
|
|
} else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
|
|
|
|
|
mType = AAC;
|
|
|
|
|
}
|
|
|
|
@ -691,7 +705,7 @@ status_t MatroskaSource::read(
|
|
|
|
|
MediaBuffer *frame = *mPendingFrames.begin();
|
|
|
|
|
mPendingFrames.erase(mPendingFrames.begin());
|
|
|
|
|
|
|
|
|
|
if (mType != AVC || mNALSizeLen == 0) {
|
|
|
|
|
if ((mType != AVC && mType != HEVC) || mNALSizeLen == 0) {
|
|
|
|
|
if (targetSampleTimeUs >= 0ll) {
|
|
|
|
|
frame->meta_data()->setInt64(
|
|
|
|
|
kKeyTargetTime, targetSampleTimeUs);
|
|
|
|
@ -1261,6 +1275,14 @@ void MatroskaExtractor::addTracks() {
|
|
|
|
|
if (!strcmp("V_MPEG4/ISO/AVC", codecID)) {
|
|
|
|
|
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
|
|
|
|
|
meta->setData(kKeyAVCC, 0, codecPrivate, codecPrivateSize);
|
|
|
|
|
} else if (!strcmp("V_MPEGH/ISO/HEVC", codecID)) {
|
|
|
|
|
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_HEVC);
|
|
|
|
|
if (codecPrivateSize > 0) {
|
|
|
|
|
meta->setData(kKeyHVCC, kTypeHVCC, codecPrivate, codecPrivateSize);
|
|
|
|
|
} else {
|
|
|
|
|
ALOGW("HEVC is detected, but does not have configuration.");
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
} else if (!strcmp("V_MPEG4/ISO/ASP", codecID)) {
|
|
|
|
|
if (codecPrivateSize > 0) {
|
|
|
|
|
meta->setCString(
|
|
|
|
|