From 9953765019ae2243e98e8e74eee327c9893b93d1 Mon Sep 17 00:00:00 2001 From: Surajit Podder Date: Tue, 21 Jul 2015 15:29:39 +0530 Subject: video: Modify classes to support camcorder pause/resume * Modify MediaRecorder, CameraSource, AudioSource to be extendable. * Add hooks to instantiate extended implementations to implement pause/resume. Change-Id: I847263fc69e4f613c5ea60fb6809c7da176d3a8d --- include/media/mediarecorder.h | 8 +++---- include/media/stagefright/AudioSource.h | 6 +++-- include/media/stagefright/CameraSource.h | 4 +++- media/libavextensions/common/AVExtensionsCommon.h | 2 -- media/libavextensions/common/ExtensionsLoader.hpp | 2 ++ media/libavextensions/media/AVMediaExtensions.h | 3 +++ media/libavextensions/media/AVMediaUtils.cpp | 5 ++++ media/libavextensions/stagefright/AVExtensions.h | 25 +++++++++++++++++++ media/libavextensions/stagefright/AVFactory.cpp | 28 ++++++++++++++++++++++ .../libmediaplayerservice/StagefrightRecorder.cpp | 15 ++++++------ media/libmediaplayerservice/StagefrightRecorder.h | 6 ++--- media/libstagefright/MPEG4Writer.cpp | 6 +++-- media/libstagefright/MediaCodecSource.cpp | 5 +++- 13 files changed, 92 insertions(+), 23 deletions(-) diff --git a/include/media/mediarecorder.h b/include/media/mediarecorder.h index b74f888..6ace36d 100644 --- a/include/media/mediarecorder.h +++ b/include/media/mediarecorder.h @@ -236,13 +236,13 @@ public: status_t setOutputFile(int fd, int64_t offset, int64_t length); status_t setVideoSize(int width, int height); status_t setVideoFrameRate(int frames_per_second); - status_t setParameters(const String8& params); + virtual status_t setParameters(const String8& params); status_t setListener(const sp& listener); status_t setClientName(const String16& clientName); status_t prepare(); status_t getMaxAmplitude(int* max); - status_t start(); - status_t stop(); + virtual status_t start(); + virtual status_t stop(); status_t reset(); status_t init(); status_t close(); @@ -251,7 +251,7 @@ public: status_t setInputSurface(const sp& surface); sp querySurfaceMediaSourceFromMediaServer(); -private: +protected: void doCleanUp(); status_t doReset(); diff --git a/include/media/stagefright/AudioSource.h b/include/media/stagefright/AudioSource.h index ed523d8..9750bcd 100644 --- a/include/media/stagefright/AudioSource.h +++ b/include/media/stagefright/AudioSource.h @@ -46,6 +46,8 @@ struct AudioSource : public MediaSource, public MediaBufferObserver { virtual status_t stop() { return reset(); } virtual sp getFormat(); + virtual status_t pause() { return ERROR_UNSUPPORTED; } + // Returns the maximum amplitude since last call. int16_t getMaxAmplitude(); @@ -58,7 +60,7 @@ struct AudioSource : public MediaSource, public MediaBufferObserver { protected: virtual ~AudioSource(); -private: +protected: enum { //calculated for max duration 80 msec with 48K sampling rate. kMaxBufferSize = 30720, @@ -102,7 +104,7 @@ private: int32_t startFrame, int32_t rampDurationFrames, uint8_t *data, size_t bytes); - void queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs); + virtual void queueInputBuffer_l(MediaBuffer *buffer, int64_t timeUs); void releaseQueuedFrames_l(); void waitOutstandingEncodingFrames_l(); virtual status_t reset(); diff --git a/include/media/stagefright/CameraSource.h b/include/media/stagefright/CameraSource.h index 069e897..527ee15 100644 --- a/include/media/stagefright/CameraSource.h +++ b/include/media/stagefright/CameraSource.h @@ -92,6 +92,8 @@ public: virtual status_t read( MediaBuffer **buffer, const ReadOptions *options = NULL); + virtual status_t pause() { return ERROR_UNSUPPORTED; } + /** * Check whether a CameraSource object is properly initialized. * Must call this method before stop(). @@ -189,7 +191,7 @@ protected: void releaseCamera(); -private: +protected: friend struct CameraSourceListener; Mutex mLock; diff --git a/media/libavextensions/common/AVExtensionsCommon.h b/media/libavextensions/common/AVExtensionsCommon.h index 52a247a..c39872e 100644 --- a/media/libavextensions/common/AVExtensionsCommon.h +++ b/media/libavextensions/common/AVExtensionsCommon.h @@ -31,8 +31,6 @@ namespace android { -static const char * CUSTOMIZATION_LIB_NAME = "libavenhancements.so"; - typedef void *(*createFunction_t)(void); template diff --git a/media/libavextensions/common/ExtensionsLoader.hpp b/media/libavextensions/common/ExtensionsLoader.hpp index b23b868..e03979c 100644 --- a/media/libavextensions/common/ExtensionsLoader.hpp +++ b/media/libavextensions/common/ExtensionsLoader.hpp @@ -31,6 +31,8 @@ namespace android { +static const char * CUSTOMIZATION_LIB_NAME = "libavenhancements.so"; + /* * Create strongly-typed objects of type T * If the customization library exists and does contain a "named" constructor, diff --git a/media/libavextensions/media/AVMediaExtensions.h b/media/libavextensions/media/AVMediaExtensions.h index 4dc3d95..ea5245c 100644 --- a/media/libavextensions/media/AVMediaExtensions.h +++ b/media/libavextensions/media/AVMediaExtensions.h @@ -36,6 +36,7 @@ namespace android { +class MediaRecorder; /* * Common delegate to the classes in libstagefright */ @@ -57,6 +58,8 @@ struct AVMediaUtils { virtual size_t AudioTrackGetOffloadFrameCount(size_t frameCount) { return frameCount; } + + virtual sp createMediaRecorder(const String16& opPackageName); // ----- NO TRESSPASSING BEYOND THIS LINE ------ DECLARE_LOADABLE_SINGLETON(AVMediaUtils); }; diff --git a/media/libavextensions/media/AVMediaUtils.cpp b/media/libavextensions/media/AVMediaUtils.cpp index 7c21414..0f9e9eb 100644 --- a/media/libavextensions/media/AVMediaUtils.cpp +++ b/media/libavextensions/media/AVMediaUtils.cpp @@ -40,6 +40,7 @@ #include #include +#include #include "common/ExtensionsLoader.hpp" #include "media/AVMediaExtensions.h" @@ -53,6 +54,10 @@ AVMediaUtils::AVMediaUtils() { AVMediaUtils::~AVMediaUtils() { } +sp AVMediaUtils::createMediaRecorder(const String16& opPackageName) { + return new MediaRecorder(opPackageName); +} + //static AVMediaUtils *AVMediaUtils::sInst = ExtensionsLoader::createInstance("createExtendedMediaUtils"); diff --git a/media/libavextensions/stagefright/AVExtensions.h b/media/libavextensions/stagefright/AVExtensions.h index 4d73f59..e75499f 100644 --- a/media/libavextensions/stagefright/AVExtensions.h +++ b/media/libavextensions/stagefright/AVExtensions.h @@ -46,10 +46,18 @@ struct ACodec; struct ALooper; struct IMediaHTTPConnection; struct MediaCodec; +struct MediaSource; struct MediaHTTP; struct NuCachedSource2; class CameraParameters; class MediaBuffer; +struct AudioSource; +class CameraSource; +class ICamera; +class ICameraRecordingProxy; +class String16; +class IGraphicBufferProducer; +struct Size; /* * Factory to create objects of base-classes in libstagefright @@ -69,6 +77,23 @@ struct AVFactory { virtual MediaHTTP* createMediaHTTP( const sp &conn); + virtual AudioSource* createAudioSource( + audio_source_t inputSource, + const String16 &opPackageName, + uint32_t sampleRate, + uint32_t channels, + uint32_t outSampleRate = 0); + + virtual CameraSource *CreateFromCamera( + const sp &camera, + const sp &proxy, + int32_t cameraId, + const String16& clientName, + uid_t clientUid, + Size videoSize, + int32_t frameRate, + const sp& surface, + bool storeMetaDataInVideoBuffers = true); // ----- NO TRESSPASSING BEYOND THIS LINE ------ DECLARE_LOADABLE_SINGLETON(AVFactory); }; diff --git a/media/libavextensions/stagefright/AVFactory.cpp b/media/libavextensions/stagefright/AVFactory.cpp index fe00f45..19977e9 100644 --- a/media/libavextensions/stagefright/AVFactory.cpp +++ b/media/libavextensions/stagefright/AVFactory.cpp @@ -41,6 +41,9 @@ #include #include #include +#include +#include +#include #include "common/ExtensionsLoader.hpp" #include "stagefright/AVExtensions.h" @@ -75,6 +78,31 @@ MediaHTTP* AVFactory::createMediaHTTP( return new MediaHTTP(conn); } +AudioSource* AVFactory::createAudioSource( + audio_source_t inputSource, + const String16 &opPackageName, + uint32_t sampleRate, + uint32_t channels, + uint32_t outSampleRate) { + return new AudioSource(inputSource, opPackageName, sampleRate, + channels, outSampleRate); +} + +CameraSource* AVFactory::CreateFromCamera( + const sp &camera, + const sp &proxy, + int32_t cameraId, + const String16& clientName, + uid_t clientUid, + Size videoSize, + int32_t frameRate, + const sp& surface, + bool storeMetaDataInVideoBuffers) { + return CameraSource::CreateFromCamera(camera, proxy, cameraId, + clientName, clientUid, videoSize, frameRate, surface, + storeMetaDataInVideoBuffers); +} + // ----- NO TRESSPASSING BEYOND THIS LINE ------ AVFactory::AVFactory() { } diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index 4f3e2ea..136e6cf 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -939,13 +939,12 @@ sp StagefrightRecorder::createAudioSource() { } } - sp audioSource = - new AudioSource( - mAudioSource, - mOpPackageName, - sourceSampleRate, - mAudioChannels, - mSampleRate); + sp audioSource = AVFactory::get()->createAudioSource( + mAudioSource, + mOpPackageName, + sourceSampleRate, + mAudioChannels, + mSampleRate); status_t err = audioSource->initCheck(); @@ -1472,7 +1471,7 @@ status_t StagefrightRecorder::setupCameraSource( mTimeBetweenCaptureUs); *cameraSource = mCameraSourceTimeLapse; } else { - *cameraSource = CameraSource::CreateFromCamera( + *cameraSource = AVFactory::get()->CreateFromCamera( mCamera, mCameraProxy, mCameraId, mClientName, mClientUid, videoSize, mFrameRate, mPreviewSurface); diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h index 6b9bc92..d2ff62d 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.h +++ b/media/libmediaplayerservice/StagefrightRecorder.h @@ -140,7 +140,7 @@ protected: status_t setupRawAudioRecording(); status_t setupRTPRecording(); status_t setupMPEG2TSRecording(); - sp createAudioSource(); + virtual sp createAudioSource(); virtual status_t checkVideoEncoderCapabilities(); status_t checkAudioEncoderCapabilities(); // Generic MediaSource set-up. Returns the appropriate @@ -149,13 +149,13 @@ protected: status_t setupMediaSource(sp *mediaSource); status_t setupCameraSource(sp *cameraSource); status_t setupAudioEncoder(const sp& writer); - status_t setupVideoEncoder(sp cameraSource, sp *source); + virtual status_t setupVideoEncoder(sp cameraSource, sp *source); virtual void setupCustomVideoEncoderParams(sp /*cameraSource*/, sp &/*format*/) {} virtual bool setCustomVideoEncoderMime(const video_encoder videoEncoder, sp format); // Encoding parameter handling utilities - status_t setParameter(const String8 &key, const String8 &value); + virtual status_t setParameter(const String8 &key, const String8 &value); status_t setParamAudioEncodingBitRate(int32_t bitRate); status_t setParamAudioNumberOfChannels(int32_t channles); status_t setParamAudioSamplingRate(int32_t sampleRate); diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp index dd80b42..94f40b4 100644 --- a/media/libstagefright/MPEG4Writer.cpp +++ b/media/libstagefright/MPEG4Writer.cpp @@ -697,8 +697,6 @@ status_t MPEG4Writer::start(MetaData *param) { mIsRealTimeRecording = isRealTimeRecording; } - mStartTimestampUs = -1; - if (mStarted) { if (mPaused) { mPaused = false; @@ -707,6 +705,8 @@ status_t MPEG4Writer::start(MetaData *param) { return OK; } + mStartTimestampUs = -1; + if (!param || !param->findInt32(kKeyTimeScale, &mTimeScale)) { mTimeScale = 1000; @@ -2331,6 +2331,7 @@ status_t MPEG4Writer::Track::threadEntry() { previousPausedDurationUs = mStartTimestampUs; } +#if 0 if (mResumed) { int64_t durExcludingEarlierPausesUs = timestampUs - previousPausedDurationUs; if (WARN_UNLESS(durExcludingEarlierPausesUs >= 0ll, "for %s track", trackName)) { @@ -2347,6 +2348,7 @@ status_t MPEG4Writer::Track::threadEntry() { previousPausedDurationUs += pausedDurationUs - lastDurationUs; mResumed = false; } +#endif timestampUs -= previousPausedDurationUs; if (WARN_UNLESS(timestampUs >= 0ll, "for %s track", trackName)) { diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp index ac25683..dbd9cb0 100644 --- a/media/libstagefright/MediaCodecSource.cpp +++ b/media/libstagefright/MediaCodecSource.cpp @@ -645,6 +645,9 @@ status_t MediaCodecSource::onStart(MetaData *params) { resume(); } else { CHECK(mPuller != NULL); + if (mIsVideo) { + mEncoder->requestIDRFrame(); + } mPuller->resume(); } return OK; @@ -864,7 +867,7 @@ void MediaCodecSource::onMessageReceived(const sp &msg) { } case kWhatPause: { - if (mFlags && FLAG_USE_SURFACE_INPUT) { + if (mFlags & FLAG_USE_SURFACE_INPUT) { suspend(); } else { CHECK(mPuller != NULL); -- cgit v1.1