StagefrightRecorder.h revision 33da402287605e40e189289b11a08b8f5d515818
114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania/* 214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * Copyright (C) 2009 The Android Open Source Project 314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * 414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * Licensed under the Apache License, Version 2.0 (the "License"); 514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * you may not use this file except in compliance with the License. 614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * You may obtain a copy of the License at 714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * 814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * http://www.apache.org/licenses/LICENSE-2.0 914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * 1014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * Unless required by applicable law or agreed to in writing, software 1114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * distributed under the License is distributed on an "AS IS" BASIS, 1214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * See the License for the specific language governing permissions and 1414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania * limitations under the License. 1514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania */ 1614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 1714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#ifndef STAGEFRIGHT_RECORDER_H_ 1814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 1914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#define STAGEFRIGHT_RECORDER_H_ 2014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 2114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#include <media/MediaRecorderBase.h> 2214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#include <camera/CameraParameters.h> 2314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#include <utils/String8.h> 2414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 2514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#include <system/audio.h> 2614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 2714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catanianamespace android { 2814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 2914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniaclass Camera; 3014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniaclass ICameraRecordingProxy; 3114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniaclass CameraSource; 3214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniaclass CameraSourceTimeLapse; 3314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniastruct MediaSource; 3414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniastruct MediaWriter; 3514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniaclass MetaData; 3614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniastruct AudioSource; 3714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniaclass MediaProfiles; 3814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniaclass IGraphicBufferProducer; 3914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniaclass SurfaceMediaSource; 4014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 4114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniastruct StagefrightRecorder : public MediaRecorderBase { 4214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania StagefrightRecorder(); 4314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual ~StagefrightRecorder(); 4414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 4514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t init(); 4614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setAudioSource(audio_source_t as); 4714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setVideoSource(video_source vs); 482d0ac425564ff9882ebaac5267d1a04d4af67d00Bernhard Rosenkränzer virtual status_t setOutputFormat(output_format of); 4914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setAudioEncoder(audio_encoder ae); 5014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setVideoEncoder(video_encoder ve); 5114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setVideoSize(int width, int height); 5214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setVideoFrameRate(int frames_per_second); 5314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy); 5414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setPreviewSurface(const sp<IGraphicBufferProducer>& surface); 5514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setOutputFile(const char *path); 5614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setOutputFile(int fd, int64_t offset, int64_t length); 5714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setParameters(const String8& params); 5814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setListener(const sp<IMediaRecorderClient>& listener); 5914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t setClientName(const String16& clientName); 6014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t prepare(); 6114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t start(); 6214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t pause(); 6314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t stop(); 6414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t close(); 6514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t reset(); 6614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t getMaxAmplitude(int *max); 6714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual status_t dump(int fd, const Vector<String16>& args) const; 6814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // Querying a SurfaceMediaSourcer 6914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania virtual sp<IGraphicBufferProducer> querySurfaceMediaSource() const; 7014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 7114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Cataniaprivate: 7214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<ICamera> mCamera; 7314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<ICameraRecordingProxy> mCameraProxy; 7414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<IGraphicBufferProducer> mPreviewSurface; 7514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<IMediaRecorderClient> mListener; 7614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania String16 mClientName; 7714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania uid_t mClientUid; 7814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<MediaWriter> mWriter; 7914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int mOutputFd; 8014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<AudioSource> mAudioSourceNode; 8114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 8214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania audio_source_t mAudioSource; 8314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania video_source mVideoSource; 8414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania output_format mOutputFormat; 8514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania audio_encoder mAudioEncoder; 8614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania video_encoder mVideoEncoder; 8714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania bool mUse64BitFileOffset; 8814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mVideoWidth, mVideoHeight; 8914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mFrameRate; 9014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mVideoBitRate; 9114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mAudioBitRate; 9214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mAudioChannels; 9314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mSampleRate; 9414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mInterleaveDurationUs; 9514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mIFramesIntervalSec; 9614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mCameraId; 9714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mVideoEncoderProfile; 9814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mVideoEncoderLevel; 9914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mMovieTimeScale; 10014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mVideoTimeScale; 10114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mAudioTimeScale; 10214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int64_t mMaxFileSizeBytes; 10314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int64_t mMaxFileDurationUs; 10414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int64_t mTrackEveryTimeDurationUs; 10514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mRotationDegrees; // Clockwise 10614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mLatitudex10000; 10714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mLongitudex10000; 10814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t mStartTimeOffsetMs; 10914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 11014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania bool mCaptureTimeLapse; 11114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int64_t mTimeBetweenTimeLapseFrameCaptureUs; 11214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<CameraSourceTimeLapse> mCameraSourceTimeLapse; 11314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 11414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 1152db8455d8f4468a637109d31f319ce02d9d743ecAndreas Huber String8 mParams; 1161b86fe063badb5f28c467ade39be0f4008688947Andreas Huber 1171b86fe063badb5f28c467ade39be0f4008688947Andreas Huber bool mIsMetaDataStoredInVideoBuffers; 1181b86fe063badb5f28c467ade39be0f4008688947Andreas Huber MediaProfiles *mEncoderProfiles; 11914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 12014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania bool mStarted; 12114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // Needed when GLFrames are encoded. 12214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // An <IGraphicBufferProducer> pointer 12314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // will be sent to the client side using which the 12414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // frame buffers will be queued and dequeued 12514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<SurfaceMediaSource> mSurfaceMediaSource; 12614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 12714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setupMPEG4Recording( 12814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int outputFd, 12914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t videoWidth, int32_t videoHeight, 13014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t videoBitRate, 13114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t *totalBitRate, 13214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<MediaWriter> *mediaWriter); 13314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania void setupMPEG4MetaData(int64_t startTimeUs, int32_t totalBitRate, 13414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<MetaData> *meta); 13514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t startMPEG4Recording(); 13614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t startAMRRecording(); 13714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t startAACRecording(); 13814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t startRawAudioRecording(); 13929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block status_t startRTPRecording(); 14014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t startMPEG2TSRecording(); 14114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<MediaSource> createAudioSource(); 14214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t checkVideoEncoderCapabilities(); 14314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t checkAudioEncoderCapabilities(); 14414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // Generic MediaSource set-up. Returns the appropriate 14514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // source (CameraSource or SurfaceMediaSource) 14614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // depending on the videosource type 14714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setupMediaSource(sp<MediaSource> *mediaSource); 14814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setupCameraSource(sp<CameraSource> *cameraSource); 14914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // setup the surfacemediasource for the encoder 15014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setupSurfaceMediaSource(); 15114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 15229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block status_t setupAudioEncoder(const sp<MediaWriter>& writer); 15314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setupVideoEncoder( 15414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<MediaSource> cameraSource, 15514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania int32_t videoBitRate, 15614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania sp<MediaSource> *source); 15714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 15814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania // Encoding parameter handling utilities 15914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParameter(const String8 &key, const String8 &value); 16014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamAudioEncodingBitRate(int32_t bitRate); 16129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block status_t setParamAudioNumberOfChannels(int32_t channles); 16214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamAudioSamplingRate(int32_t sampleRate); 16314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamAudioTimeScale(int32_t timeScale); 16414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamTimeLapseEnable(int32_t timeLapseEnable); 16514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamTimeBetweenTimeLapseFrameCapture(int64_t timeUs); 16614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamVideoEncodingBitRate(int32_t bitRate); 1671b86fe063badb5f28c467ade39be0f4008688947Andreas Huber status_t setParamVideoIFramesInterval(int32_t seconds); 16814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamVideoEncoderProfile(int32_t profile); 16914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamVideoEncoderLevel(int32_t level); 17014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamVideoCameraId(int32_t cameraId); 17114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamVideoTimeScale(int32_t timeScale); 17214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamVideoRotation(int32_t degrees); 17314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamTrackTimeStatus(int64_t timeDurationUs); 17414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamInterleaveDuration(int32_t durationUs); 17514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParam64BitFileOffset(bool use64BitFileOffset); 17614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamMaxFileDurationUs(int64_t timeUs); 17714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamMaxFileSizeBytes(int64_t bytes); 17814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamMovieTimeScale(int32_t timeScale); 17914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamGeoDataLongitude(int64_t longitudex10000); 18014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania status_t setParamGeoDataLatitude(int64_t latitudex10000); 181c1dc1cb1d1eaf84e88669f1a5f22579a0d9237c2Steve Block void clipVideoBitRate(); 18214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania void clipVideoFrameRate(); 18314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania void clipVideoFrameWidth(); 18414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania void clipVideoFrameHeight(); 18514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania void clipAudioBitRate(); 18614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania void clipAudioSampleRate(); 18714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania void clipNumberOfAudioChannels(); 18814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania void setDefaultProfileIfNecessary(); 18914d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 19014d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 19114d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania StagefrightRecorder(const StagefrightRecorder &); 19214d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania StagefrightRecorder &operator=(const StagefrightRecorder &); 19314d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania}; 19414d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 19514d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania} // namespace android 19614d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania 19714d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania#endif // STAGEFRIGHT_RECORDER_H_ 19814d2747c7e54037e267bcff78b29e65b2181f0faNicolas Catania