diff options
author | Chong Zhang <chz@google.com> | 2015-05-01 12:36:13 -0700 |
---|---|---|
committer | Chong Zhang <chz@google.com> | 2015-05-01 19:18:49 -0700 |
commit | e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049 (patch) | |
tree | 8060421e6bb2732c1b84d0810f5e83a57a7d25ea /media/libmediaplayerservice | |
parent | d291c222357303b9611cab89d0c3b047584ef377 (diff) | |
download | frameworks_av-e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049.zip frameworks_av-e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049.tar.gz frameworks_av-e2a2dfcbf0c9d6bb7139263ecf0d8e53b4ca1049.tar.bz2 |
MediaRecorder: implement persistent input surface APIs
Bug: 19127604
Bug: 19489395
Change-Id: I7dd8015a8fe029f9867fcdb52322629c77eff50b
Diffstat (limited to 'media/libmediaplayerservice')
4 files changed, 23 insertions, 2 deletions
diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp index 40e9d1c..ed442e3 100644 --- a/media/libmediaplayerservice/MediaRecorderClient.cpp +++ b/media/libmediaplayerservice/MediaRecorderClient.cpp @@ -55,6 +55,16 @@ static bool checkPermission(const char* permissionString) { return ok; } +status_t MediaRecorderClient::usePersistentSurface(const sp<IGraphicBufferConsumer>& surface) +{ + ALOGV("usePersistentSurface"); + Mutex::Autolock lock(mLock); + if (mRecorder == NULL) { + ALOGE("recorder is not initialized"); + return NO_INIT; + } + return mRecorder->usePersistentSurface(surface); +} sp<IGraphicBufferProducer> MediaRecorderClient::querySurfaceMediaSource() { diff --git a/media/libmediaplayerservice/MediaRecorderClient.h b/media/libmediaplayerservice/MediaRecorderClient.h index e03ec3f..7ac88cb 100644 --- a/media/libmediaplayerservice/MediaRecorderClient.h +++ b/media/libmediaplayerservice/MediaRecorderClient.h @@ -55,6 +55,7 @@ public: virtual status_t close(); virtual status_t release(); virtual status_t dump(int fd, const Vector<String16>& args); + virtual status_t usePersistentSurface(const sp<IGraphicBufferConsumer>& surface); virtual sp<IGraphicBufferProducer> querySurfaceMediaSource(); private: diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp index aa19a25..509a592 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.cpp +++ b/media/libmediaplayerservice/StagefrightRecorder.cpp @@ -243,6 +243,13 @@ status_t StagefrightRecorder::setPreviewSurface(const sp<IGraphicBufferProducer> return OK; } +status_t StagefrightRecorder::usePersistentSurface( + const sp<IGraphicBufferConsumer>& surface) { + mPersistentSurface = surface; + + return OK; +} + status_t StagefrightRecorder::setOutputFile(int fd, int64_t offset, int64_t length) { ALOGV("setOutputFile: %d, %lld, %lld", fd, offset, length); // These don't make any sense, do they? @@ -1560,8 +1567,8 @@ status_t StagefrightRecorder::setupVideoEncoder( flags |= MediaCodecSource::FLAG_USE_SURFACE_INPUT; } - sp<MediaCodecSource> encoder = - MediaCodecSource::Create(mLooper, format, cameraSource, flags); + sp<MediaCodecSource> encoder = MediaCodecSource::Create( + mLooper, format, cameraSource, mPersistentSurface, flags); if (encoder == NULL) { ALOGE("Failed to create video encoder"); // When the encoder fails to be created, we need diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h index 1425f59..1a7b720 100644 --- a/media/libmediaplayerservice/StagefrightRecorder.h +++ b/media/libmediaplayerservice/StagefrightRecorder.h @@ -35,6 +35,7 @@ struct MediaWriter; class MetaData; struct AudioSource; class MediaProfiles; +class IGraphicBufferConsumer; class IGraphicBufferProducer; class SurfaceMediaSource; struct ALooper; @@ -53,6 +54,7 @@ struct StagefrightRecorder : public MediaRecorderBase { virtual status_t setVideoFrameRate(int frames_per_second); virtual status_t setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy); virtual status_t setPreviewSurface(const sp<IGraphicBufferProducer>& surface); + virtual status_t usePersistentSurface(const sp<IGraphicBufferConsumer>& surface); virtual status_t setOutputFile(int fd, int64_t offset, int64_t length); virtual status_t setParameters(const String8& params); virtual status_t setListener(const sp<IMediaRecorderClient>& listener); @@ -72,6 +74,7 @@ private: sp<ICamera> mCamera; sp<ICameraRecordingProxy> mCameraProxy; sp<IGraphicBufferProducer> mPreviewSurface; + sp<IGraphicBufferConsumer> mPersistentSurface; sp<IMediaRecorderClient> mListener; String16 mClientName; uid_t mClientUid; |