mediarecorder.h revision c048cae0367db6fbb4fe1127be5011910713d4ad
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Copyright (C) 2008 The Android Open Source Project
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License");
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** you may not use this file except in compliance with the License.
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** You may obtain a copy of the License at
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **     http://www.apache.org/licenses/LICENSE-2.0
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS,
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** See the License for the specific language governing permissions and
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#ifndef ANDROID_MEDIARECORDER_H
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define ANDROID_MEDIARECORDER_H
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayerClient.h>
2389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass Surface;
2789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass IMediaRecorder;
2889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass ICamera;
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projecttypedef void (*media_completion_f)(status_t status, void *cookie);
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/* Do not change these values without updating their counterparts
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * in java/android/android/media/MediaRecorder.java!
3489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum audio_source {
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    AUDIO_SOURCE_DEFAULT = 0,
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    AUDIO_SOURCE_MIC = 1,
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum video_source {
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    VIDEO_SOURCE_DEFAULT = 0,
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    VIDEO_SOURCE_CAMERA = 1,
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
4489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//Please update java/android/android/media/MediaRecorder.java if the following is updated.
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum output_format {
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    OUTPUT_FORMAT_DEFAULT = 0,
4889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    OUTPUT_FORMAT_THREE_GPP,
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    OUTPUT_FORMAT_MPEG_4,
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    OUTPUT_FORMAT_RAW_AMR,
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    OUTPUT_FORMAT_LIST_END // must be last - used to validate format type
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum audio_encoder {
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    AUDIO_ENCODER_DEFAULT = 0,
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    AUDIO_ENCODER_AMR_NB = 1,
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum video_encoder {
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    VIDEO_ENCODER_DEFAULT = 0,
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    VIDEO_ENCODER_H263 = 1,
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    VIDEO_ENCODER_H264 = 2,
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    VIDEO_ENCODER_MPEG_4_SP = 3,
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Maximum frames per second is 24
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define MEDIA_RECORDER_MAX_FRAME_RATE         24
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
6989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * The state machine of the media_recorder uses a set of different state names.
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * The mapping between the media_recorder and the pvauthorengine is shown below:
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *
7389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *    mediarecorder                        pvauthorengine
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project * ----------------------------------------------------------------
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *    MEDIA_RECORDER_ERROR                 ERROR
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *    MEDIA_RECORDER_IDLE                  IDLE
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *    MEDIA_RECORDER_INITIALIZED           OPENED
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *    MEDIA_RECORDER_DATASOURCE_CONFIGURED
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *    MEDIA_RECORDER_PREPARED              INITIALIZED
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project *    MEDIA_RECORDER_RECORDING             RECORDING
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectenum media_recorder_states {
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MEDIA_RECORDER_ERROR                 =      0,
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MEDIA_RECORDER_IDLE                  = 1 << 0,
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MEDIA_RECORDER_INITIALIZED           = 1 << 1,
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MEDIA_RECORDER_DATASOURCE_CONFIGURED = 1 << 2,
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MEDIA_RECORDER_PREPARED              = 1 << 3,
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MEDIA_RECORDER_RECORDING             = 1 << 4,
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// The "msg" code passed to the listener in notify.
92c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectenum media_recorder_event_type {
93c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    MEDIA_RECORDER_EVENT_ERROR                    = 1,
94c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    MEDIA_RECORDER_EVENT_INFO                     = 2
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
97c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectenum media_recorder_error_type {
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MEDIA_RECORDER_ERROR_UNKNOWN                  = 1
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
101c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project// The codes are distributed as follow:
102c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project//   0xx: Reserved
103c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project//   8xx: General info/warning
104c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project//
105c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectenum media_recorder_info_type {
106c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    MEDIA_RECORDER_INFO_UNKNOWN                   = 1,
107c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    MEDIA_RECORDER_INFO_MAX_DURATION_REACHED      = 800
108c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project};
109c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ----------------------------------------------------------------------------
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// ref-counted object for callbacks
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaRecorderListener: virtual public RefBase
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    virtual void notify(int msg, int ext1, int ext2) = 0;
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectclass MediaRecorder : public BnMediaPlayerClient
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectpublic:
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    MediaRecorder();
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ~MediaRecorder();
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    initCheck();
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setCamera(const sp<ICamera>& camera);
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setPreviewSurface(const sp<Surface>& surface);
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setVideoSource(int vs);
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setAudioSource(int as);
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setOutputFormat(int of);
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setVideoEncoder(int ve);
13189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setAudioEncoder(int ae);
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setOutputFile(const char* path);
13389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setOutputFile(int fd, int64_t offset, int64_t length);
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setVideoSize(int width, int height);
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setVideoFrameRate(int frames_per_second);
136c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    status_t    setParameters(const String8& params);
13789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    setListener(const sp<MediaRecorderListener>& listener);
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    prepare();
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    getMaxAmplitude(int* max);
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    start();
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    stop();
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    reset();
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    init();
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    close();
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t    release();
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void        notify(int msg, int ext1, int ext2);
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectprivate:
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    void                    doCleanUp();
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t                doReset();
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<IMediaRecorder>          mMediaRecorder;
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<MediaRecorderListener>   mListener;
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    media_recorder_states       mCurrentState;
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool                        mIsAudioSourceSet;
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool                        mIsVideoSourceSet;
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool                        mIsAudioEncoderSet;
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool                        mIsVideoEncoderSet;
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    bool                        mIsOutputFileSet;
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex                       mLock;
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex                       mNotifyLock;
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project};  // namespace android
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#endif // ANDROID_MEDIARECORDER_H
167