From ae614d22fd87feb1857e8041978ab2c38cfaa16e Mon Sep 17 00:00:00 2001 From: Lubin Yin Date: Wed, 29 Jul 2015 12:31:09 +0800 Subject: libstagefright: MPEG4Writer: Add support for HEVC muxing Changes done to enable HEVC muxing - writing HVCC atom - configure HEVC encoder Fix HEVC flag initialization Check for HEVC for single track usecase Change-Id: I1757d0c442e7cc3ef251431f220395131a1eb4ec --- media/libavextensions/stagefright/AVExtensions.h | 38 ++++++++++++++++++++++++ media/libavextensions/stagefright/AVUtils.cpp | 34 +++++++++++++++++++++ 2 files changed, 72 insertions(+) (limited to 'media/libavextensions') diff --git a/media/libavextensions/stagefright/AVExtensions.h b/media/libavextensions/stagefright/AVExtensions.h index ab0f180..3e51463 100644 --- a/media/libavextensions/stagefright/AVExtensions.h +++ b/media/libavextensions/stagefright/AVExtensions.h @@ -38,6 +38,8 @@ namespace android { class AudioParameter; class MetaData; class MediaExtractor; +class MPEG4Writer; +struct ABuffer; struct ACodec; struct ALooper; struct IMediaHTTPConnection; @@ -106,6 +108,42 @@ struct AVUtils { List &/*decodeTimeQueue*/) {} virtual bool useQCHWEncoder(const sp &, AString &) { return false; } + + struct HEVCMuxer { + + virtual bool reassembleHEVCCSD(const AString &mime, sp csd0, sp &meta); + + virtual void writeHEVCFtypBox(MPEG4Writer *writer); + + virtual status_t makeHEVCCodecSpecificData(const uint8_t *data, + size_t size, void** codecSpecificData, + size_t *codecSpecificDataSize); + + virtual const char *getFourCCForMime(const char *mime); + + virtual void writeHvccBox(MPEG4Writer *writer, + void* codecSpecificData, size_t codecSpecificDataSize, + bool useNalLengthFour); + + virtual bool isVideoHEVC(const char* mime); + + virtual void getHEVCCodecSpecificDataFromInputFormatIfPossible( + sp meta, void **codecSpecificData, + size_t *codecSpecificDataSize, bool *gotAllCodecSpecificData); + + protected: + HEVCMuxer() {}; + virtual ~HEVCMuxer() {}; + friend struct AVUtils; + }; + + virtual inline HEVCMuxer& HEVCMuxerUtils() { + return mHEVCMuxer; + } + +private: + HEVCMuxer mHEVCMuxer; + // ----- NO TRESSPASSING BEYOND THIS LINE ------ DECLARE_LOADABLE_SINGLETON(AVUtils); }; diff --git a/media/libavextensions/stagefright/AVUtils.cpp b/media/libavextensions/stagefright/AVUtils.cpp index a683f48..8e7c39d 100644 --- a/media/libavextensions/stagefright/AVUtils.cpp +++ b/media/libavextensions/stagefright/AVUtils.cpp @@ -109,6 +109,40 @@ bool AVUtils::isEnhancedExtension(const char *) { return false; } +bool AVUtils::HEVCMuxer::reassembleHEVCCSD(const AString &/*mime*/, sp /*csd0*/, sp &/*meta*/) { + return false; +} + +void AVUtils::HEVCMuxer::writeHEVCFtypBox(MPEG4Writer * /*writer*/) { + return; +} + +status_t AVUtils::HEVCMuxer::makeHEVCCodecSpecificData(const uint8_t * /*data*/, + size_t /*size*/, void ** /*codecSpecificData*/, + size_t * /*codecSpecificDataSize*/) { + return UNKNOWN_ERROR; +} + +const char *AVUtils::HEVCMuxer::getFourCCForMime(const char * /*mime*/) { + return NULL; +} + +void AVUtils::HEVCMuxer::writeHvccBox(MPEG4Writer * /*writer*/, + void * /*codecSpecificData*/, size_t /*codecSpecificDataSize*/, + bool /*useNalLengthFour*/) { + return; +} + +bool AVUtils::HEVCMuxer::isVideoHEVC(const char * /*mime*/) { + return false; +} + +void AVUtils::HEVCMuxer::getHEVCCodecSpecificDataFromInputFormatIfPossible( + sp /*meta*/, void ** /*codecSpecificData*/, + size_t * /*codecSpecificDataSize*/, bool * /*gotAllCodecSpecificData*/) { + return; +} + // ----- NO TRESSPASSING BEYOND THIS LINE ------ AVUtils::AVUtils() {} -- cgit v1.1