Merge "Matroska: HEVC support"

gugelfrei
Treehugger Robot 7 years ago committed by Gerrit Code Review
commit 8bc6203d51

@ -139,6 +139,7 @@ private:
enum Type { enum Type {
AVC, AVC,
AAC, AAC,
HEVC,
OTHER OTHER
}; };
@ -147,7 +148,7 @@ private:
Type mType; Type mType;
bool mIsAudio; bool mIsAudio;
BlockIterator mBlockIter; BlockIterator mBlockIter;
ssize_t mNALSizeLen; // for type AVC ssize_t mNALSizeLen; // for type AVC or HEVC
List<MediaBuffer *> mPendingFrames; List<MediaBuffer *> mPendingFrames;
@ -243,6 +244,19 @@ MatroskaSource::MatroskaSource(
} else { } else {
ALOGE("No mNALSizeLen"); 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)) { } else if (!strcasecmp(mime, MEDIA_MIMETYPE_AUDIO_AAC)) {
mType = AAC; mType = AAC;
} }
@ -691,7 +705,7 @@ status_t MatroskaSource::read(
MediaBuffer *frame = *mPendingFrames.begin(); MediaBuffer *frame = *mPendingFrames.begin();
mPendingFrames.erase(mPendingFrames.begin()); mPendingFrames.erase(mPendingFrames.begin());
if (mType != AVC || mNALSizeLen == 0) { if ((mType != AVC && mType != HEVC) || mNALSizeLen == 0) {
if (targetSampleTimeUs >= 0ll) { if (targetSampleTimeUs >= 0ll) {
frame->meta_data()->setInt64( frame->meta_data()->setInt64(
kKeyTargetTime, targetSampleTimeUs); kKeyTargetTime, targetSampleTimeUs);
@ -1261,6 +1275,14 @@ void MatroskaExtractor::addTracks() {
if (!strcmp("V_MPEG4/ISO/AVC", codecID)) { if (!strcmp("V_MPEG4/ISO/AVC", codecID)) {
meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC); meta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_VIDEO_AVC);
meta->setData(kKeyAVCC, 0, codecPrivate, codecPrivateSize); 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)) { } else if (!strcmp("V_MPEG4/ISO/ASP", codecID)) {
if (codecPrivateSize > 0) { if (codecPrivateSize > 0) {
meta->setCString( meta->setCString(

Loading…
Cancel
Save