Loading media/libstagefright/FrameDecoder.cpp +9 −5 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include "include/FrameDecoder.h" #include "include/FrameCaptureLayer.h" #include "include/HevcUtils.h" #include <binder/MemoryBase.h> #include <binder/MemoryHeapBase.h> #include <gui/Surface.h> Loading Loading @@ -456,7 +457,8 @@ VideoFrameDecoder::VideoFrameDecoder( const sp<IMediaSource> &source) : FrameDecoder(componentName, trackMeta, source), mFrame(NULL), mIsAvcOrHevc(false), mIsAvc(false), mIsHevc(false), mSeekMode(MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC), mTargetTimeUs(-1LL), mDefaultSampleDurationUs(0) { Loading @@ -479,8 +481,8 @@ sp<AMessage> VideoFrameDecoder::onGetFormatAndSeekOptions( return NULL; } mIsAvcOrHevc = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC) || !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_HEVC); mIsAvc = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC); mIsHevc = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_HEVC); if (frameTimeUs < 0) { int64_t thumbNailTime = -1ll; Loading Loading @@ -543,8 +545,10 @@ status_t VideoFrameDecoder::onInputReceived( ALOGV("Seeking closest: targetTimeUs=%lld", (long long)mTargetTimeUs); } if (mIsAvcOrHevc && !isSeekingClosest && IsIDR(codecBuffer->data(), codecBuffer->size())) { if (!isSeekingClosest && ((mIsAvc && IsIDR(codecBuffer->data(), codecBuffer->size())) || (mIsHevc && IsIDR( codecBuffer->data(), codecBuffer->size())))) { // Only need to decode one IDR frame, unless we're seeking with CLOSEST // option, in which case we need to actually decode to targetTimeUs. *flags |= MediaCodec::BUFFER_FLAG_EOS; Loading media/libstagefright/HevcUtils.cpp +26 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,10 @@ namespace android { static const uint8_t kHevcNalUnitTypes[5] = { static const uint8_t kHevcNalUnitTypes[8] = { kHevcNalUnitTypeCodedSliceIdr, kHevcNalUnitTypeCodedSliceIdrNoLP, kHevcNalUnitTypeCodedSliceCra, kHevcNalUnitTypeVps, kHevcNalUnitTypeSps, kHevcNalUnitTypePps, Loading Loading @@ -488,4 +491,26 @@ status_t HevcParameterSets::makeHvcc(uint8_t *hvcc, size_t *hvccSize, return OK; } bool HevcParameterSets::IsHevcIDR(const uint8_t *data, size_t size) { bool foundIDR = false; const uint8_t *nalStart; size_t nalSize; while (!foundIDR && getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { if (nalSize == 0) { ALOGE("Encountered zero-length HEVC NAL"); return false; } uint8_t nalType = (nalStart[0] & 0x7E) >> 1; switch(nalType) { case kHevcNalUnitTypeCodedSliceIdr: case kHevcNalUnitTypeCodedSliceIdrNoLP: case kHevcNalUnitTypeCodedSliceCra: foundIDR = true; break; } } return foundIDR; } } // namespace android media/libstagefright/include/FrameDecoder.h +2 −1 Original line number Diff line number Diff line Loading @@ -135,7 +135,8 @@ protected: private: sp<FrameCaptureLayer> mCaptureLayer; VideoFrame *mFrame; bool mIsAvcOrHevc; bool mIsAvc; bool mIsHevc; MediaSource::ReadOptions::SeekMode mSeekMode; int64_t mTargetTimeUs; List<int64_t> mSampleDurations; Loading media/libstagefright/include/HevcUtils.h +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,10 @@ namespace android { enum { kHevcNalUnitTypeCodedSliceIdr = 19, kHevcNalUnitTypeCodedSliceIdrNoLP = 20, kHevcNalUnitTypeCodedSliceCra = 21, kHevcNalUnitTypeVps = 32, kHevcNalUnitTypeSps = 33, kHevcNalUnitTypePps = 34, Loading Loading @@ -92,6 +96,7 @@ public: status_t makeHvcc(uint8_t *hvcc, size_t *hvccSize, size_t nalSizeLength); Info getInfo() const { return mInfo; } static bool IsHevcIDR(const uint8_t *data, size_t size); private: status_t parseVps(const uint8_t* data, size_t size); Loading Loading
media/libstagefright/FrameDecoder.cpp +9 −5 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include "include/FrameDecoder.h" #include "include/FrameCaptureLayer.h" #include "include/HevcUtils.h" #include <binder/MemoryBase.h> #include <binder/MemoryHeapBase.h> #include <gui/Surface.h> Loading Loading @@ -456,7 +457,8 @@ VideoFrameDecoder::VideoFrameDecoder( const sp<IMediaSource> &source) : FrameDecoder(componentName, trackMeta, source), mFrame(NULL), mIsAvcOrHevc(false), mIsAvc(false), mIsHevc(false), mSeekMode(MediaSource::ReadOptions::SEEK_PREVIOUS_SYNC), mTargetTimeUs(-1LL), mDefaultSampleDurationUs(0) { Loading @@ -479,8 +481,8 @@ sp<AMessage> VideoFrameDecoder::onGetFormatAndSeekOptions( return NULL; } mIsAvcOrHevc = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC) || !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_HEVC); mIsAvc = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_AVC); mIsHevc = !strcasecmp(mime, MEDIA_MIMETYPE_VIDEO_HEVC); if (frameTimeUs < 0) { int64_t thumbNailTime = -1ll; Loading Loading @@ -543,8 +545,10 @@ status_t VideoFrameDecoder::onInputReceived( ALOGV("Seeking closest: targetTimeUs=%lld", (long long)mTargetTimeUs); } if (mIsAvcOrHevc && !isSeekingClosest && IsIDR(codecBuffer->data(), codecBuffer->size())) { if (!isSeekingClosest && ((mIsAvc && IsIDR(codecBuffer->data(), codecBuffer->size())) || (mIsHevc && IsIDR( codecBuffer->data(), codecBuffer->size())))) { // Only need to decode one IDR frame, unless we're seeking with CLOSEST // option, in which case we need to actually decode to targetTimeUs. *flags |= MediaCodec::BUFFER_FLAG_EOS; Loading
media/libstagefright/HevcUtils.cpp +26 −1 Original line number Diff line number Diff line Loading @@ -32,7 +32,10 @@ namespace android { static const uint8_t kHevcNalUnitTypes[5] = { static const uint8_t kHevcNalUnitTypes[8] = { kHevcNalUnitTypeCodedSliceIdr, kHevcNalUnitTypeCodedSliceIdrNoLP, kHevcNalUnitTypeCodedSliceCra, kHevcNalUnitTypeVps, kHevcNalUnitTypeSps, kHevcNalUnitTypePps, Loading Loading @@ -488,4 +491,26 @@ status_t HevcParameterSets::makeHvcc(uint8_t *hvcc, size_t *hvccSize, return OK; } bool HevcParameterSets::IsHevcIDR(const uint8_t *data, size_t size) { bool foundIDR = false; const uint8_t *nalStart; size_t nalSize; while (!foundIDR && getNextNALUnit(&data, &size, &nalStart, &nalSize, true) == OK) { if (nalSize == 0) { ALOGE("Encountered zero-length HEVC NAL"); return false; } uint8_t nalType = (nalStart[0] & 0x7E) >> 1; switch(nalType) { case kHevcNalUnitTypeCodedSliceIdr: case kHevcNalUnitTypeCodedSliceIdrNoLP: case kHevcNalUnitTypeCodedSliceCra: foundIDR = true; break; } } return foundIDR; } } // namespace android
media/libstagefright/include/FrameDecoder.h +2 −1 Original line number Diff line number Diff line Loading @@ -135,7 +135,8 @@ protected: private: sp<FrameCaptureLayer> mCaptureLayer; VideoFrame *mFrame; bool mIsAvcOrHevc; bool mIsAvc; bool mIsHevc; MediaSource::ReadOptions::SeekMode mSeekMode; int64_t mTargetTimeUs; List<int64_t> mSampleDurations; Loading
media/libstagefright/include/HevcUtils.h +5 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,10 @@ namespace android { enum { kHevcNalUnitTypeCodedSliceIdr = 19, kHevcNalUnitTypeCodedSliceIdrNoLP = 20, kHevcNalUnitTypeCodedSliceCra = 21, kHevcNalUnitTypeVps = 32, kHevcNalUnitTypeSps = 33, kHevcNalUnitTypePps = 34, Loading Loading @@ -92,6 +96,7 @@ public: status_t makeHvcc(uint8_t *hvcc, size_t *hvccSize, size_t nalSizeLength); Info getInfo() const { return mInfo; } static bool IsHevcIDR(const uint8_t *data, size_t size); private: status_t parseVps(const uint8_t* data, size_t size); Loading