From bd019775a921ae9165e924e4d37bc838a7ef5781 Mon Sep 17 00:00:00 2001 From: Surajit Podder Date: Wed, 22 Jul 2015 18:58:29 +0530 Subject: video: Port AOSP fixes Includes following fixes: f510d0c libstagefright: Disable multi slice mode for video encode ca46843 audio: Fix for failure in CTS MediaRecorderTest cases b4d0490 libstagefright: check the audio source when adding to MPEG4Writer 89c6c3f libstagefright: Allocate cached camera buffers for sw encoders f2c387b libstagefright: Choose target specific media_codecs.xml f3e7122 libstagefright: Implement fallback mechanism to SW decoder Change-Id: I90398b2fead1f4e163935bf1db342e24275f7933 --- include/media/stagefright/ACodec.h | 4 +++- include/media/stagefright/MediaCodecSource.h | 2 +- media/libavextensions/stagefright/AVExtensions.h | 7 ++++++- media/libavextensions/stagefright/AVUtils.cpp | 12 ++++++++++++ media/libmediaplayerservice/StagefrightRecorder.cpp | 2 ++ media/libstagefright/ACodec.cpp | 8 ++++++++ media/libstagefright/MPEG4Writer.cpp | 9 +++++++-- media/libstagefright/MediaCodec.cpp | 1 + media/libstagefright/MediaCodecList.cpp | 3 ++- 9 files changed, 42 insertions(+), 6 deletions(-) diff --git a/include/media/stagefright/ACodec.h b/include/media/stagefright/ACodec.h index 9eaec9b..aaaf2d1 100644 --- a/include/media/stagefright/ACodec.h +++ b/include/media/stagefright/ACodec.h @@ -376,7 +376,7 @@ protected: status_t configureBitrate( int32_t bitrate, OMX_VIDEO_CONTROLRATETYPE bitrateMode); - status_t setupErrorCorrectionParameters(); + virtual status_t setupErrorCorrectionParameters(); status_t initNativeWindow(); @@ -437,6 +437,8 @@ protected: return OK; } + sp createObserver(); + DISALLOW_EVIL_CONSTRUCTORS(ACodec); }; diff --git a/include/media/stagefright/MediaCodecSource.h b/include/media/stagefright/MediaCodecSource.h index 71f58a9..d41d87b 100644 --- a/include/media/stagefright/MediaCodecSource.h +++ b/include/media/stagefright/MediaCodecSource.h @@ -28,7 +28,7 @@ class AMessage; struct AReplyToken; class IGraphicBufferProducer; class IGraphicBufferConsumer; -class MediaCodec; +struct MediaCodec; class MetaData; struct MediaCodecSource : public MediaSource, diff --git a/media/libavextensions/stagefright/AVExtensions.h b/media/libavextensions/stagefright/AVExtensions.h index 3e51463..4d73f59 100644 --- a/media/libavextensions/stagefright/AVExtensions.h +++ b/media/libavextensions/stagefright/AVExtensions.h @@ -32,6 +32,8 @@ #include #include #include +#include +#include namespace android { @@ -141,9 +143,12 @@ struct AVUtils { return mHEVCMuxer; } + virtual bool isAudioMuxFormatSupported(const char *mime); + virtual void cacheCaptureBuffers(sp camera, video_encoder encoder); + virtual const char *getCustomCodecsLocation(); + 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 8e7c39d..5113446 100644 --- a/media/libavextensions/stagefright/AVUtils.cpp +++ b/media/libavextensions/stagefright/AVUtils.cpp @@ -143,6 +143,18 @@ void AVUtils::HEVCMuxer::getHEVCCodecSpecificDataFromInputFormatIfPossible( return; } +bool AVUtils::isAudioMuxFormatSupported(const char *) { + return true; +} + +void AVUtils::cacheCaptureBuffers(sp, video_encoder) { + return; +} + +const char *AVUtils::getCustomCodecsLocation() { + return "/etc/media_codecs.xml"; +} + // ----- NO TRESSPASSING BEYOND THIS LINE ------ AVUtils::AVUtils() {} diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index d64f814..4f3e2ea 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -56,6 +56,7 @@ #include #include "ARTPWriter.h" +#include namespace android { @@ -1476,6 +1477,7 @@ status_t StagefrightRecorder::setupCameraSource( videoSize, mFrameRate, mPreviewSurface); } + AVUtils::get()->cacheCaptureBuffers(mCamera, mVideoEncoder); mCamera.clear(); mCameraProxy.clear(); if (*cameraSource == NULL) { diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp index 9af5f4b..97a0be0 100644 --- a/media/libstagefright/ACodec.cpp +++ b/media/libstagefright/ACodec.cpp @@ -5715,6 +5715,7 @@ bool ACodec::LoadedState::onConfigureComponent( { sp notify = mCodec->mNotify->dup(); notify->setInt32("what", CodecBase::kWhatComponentConfigured); + notify->setString("componentName", mCodec->mComponentName.c_str()); notify->setMessage("input-format", mCodec->mInputFormat); notify->setMessage("output-format", mCodec->mOutputFormat); notify->post(); @@ -6377,6 +6378,13 @@ void ACodec::onSignalEndOfInputStream() { notify->post(); } +sp ACodec::createObserver() { + sp observer = new CodecObserver; + sp notify = new AMessage(kWhatOMXMessageList, this); + observer->setNotificationMessage(notify); + return observer; +} + bool ACodec::ExecutingState::onOMXFrameRendered(int64_t mediaTimeUs, nsecs_t systemNano) { mCodec->onFrameRendered(mediaTimeUs, systemNano); return true; diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index 86ca2a1..dd80b42 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -42,7 +42,7 @@ #include #include "include/ESDS.h" - +#include #ifndef __predict_false #define __predict_false(exp) __builtin_expect((exp) != 0, 0) @@ -508,6 +508,11 @@ status_t MPEG4Writer::addSource(const sp &source) { mIsVideoHEVC = AVUtils::get()->HEVCMuxerUtils().isVideoHEVC(mime); } + if (isAudio && !AVUtils::get()->isAudioMuxFormatSupported(mime)) { + ALOGE("Muxing is not supported for %s", mime); + return ERROR_UNSUPPORTED; + } + // At this point, we know the track to be added is either // video or audio. Thus, we only need to check whether it // is an audio track or not (if it is not, then it must be @@ -595,7 +600,7 @@ int64_t MPEG4Writer::estimateMoovBoxSize(int32_t bitRate) { // If the estimation is wrong, we will pay the price of wasting // some reserved space. This should not happen so often statistically. - static const int32_t factor = mUse32BitOffset? 1: 2; + int32_t factor = mUse32BitOffset? 1: 2; static const int64_t MIN_MOOV_BOX_SIZE = 3 * 1024; // 3 KB static const int64_t MAX_MOOV_BOX_SIZE = (180 * 3000000 * 6LL / 8000); int64_t size = MIN_MOOV_BOX_SIZE; diff --git a/media/libstagefright/MediaCodec.cpp b/media/libstagefright/MediaCodec.cpp index fca8b2c..7f7c7fa 100644 --- a/media/libstagefright/MediaCodec.cpp +++ b/media/libstagefright/MediaCodec.cpp @@ -1178,6 +1178,7 @@ void MediaCodec::onMessageReceived(const sp &msg) { // reset input surface flag mHaveInputSurface = false; + CHECK(msg->findString("componentName", &mComponentName)); CHECK(msg->findMessage("input-format", &mInputFormat)); CHECK(msg->findMessage("output-format", &mOutputFormat)); diff --git a/media/libstagefright/MediaCodecList.cpp b/media/libstagefright/MediaCodecList.cpp index b1dd96f..ff94314 100644 --- a/media/libstagefright/MediaCodecList.cpp +++ b/media/libstagefright/MediaCodecList.cpp @@ -40,6 +40,7 @@ #include #include +#include namespace android { @@ -174,7 +175,7 @@ MediaCodecList::MediaCodecList() : mInitCheck(NO_INIT), mUpdate(false), mGlobalSettings(new AMessage()) { - parseTopLevelXMLFile("/etc/media_codecs.xml"); + parseTopLevelXMLFile(AVUtils::get()->getCustomCodecsLocation()); parseTopLevelXMLFile("/etc/media_codecs_performance.xml", true/* ignore_errors */); parseTopLevelXMLFile(kProfilingResults, true/* ignore_errors */); } -- cgit v1.1