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