mediarecorder.cpp revision b33f3407bab0970a7f9241680723a1140b177c50
189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project/*
289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Copyright (c) 2008 The Android Open Source Project
489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Licensed under the Apache License, Version 2.0 (the "License");
689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** you may not use this file except in compliance with the License.
789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** You may obtain a copy of the License at
889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **     http://www.apache.org/licenses/LICENSE-2.0
1089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project **
1189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** Unless required by applicable law or agreed to in writing, software
1289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** distributed under the License is distributed on an "AS IS" BASIS,
1389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** See the License for the specific language governing permissions and
1589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ** limitations under the License.
1689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project */
1789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
1889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project//#define LOG_NDEBUG 0
1989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#define LOG_TAG "MediaRecorder"
2089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <utils/Log.h>
213cf613507f1e2f7bd932d921a6e222e426fd3be4Mathias Agopian#include <surfaceflinger/Surface.h>
2289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/mediarecorder.h>
237562408b2261d38415453378b6188f74fda99d88Mathias Agopian#include <binder/IServiceManager.h>
24c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project#include <utils/String8.h>
2589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaPlayerService.h>
2689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project#include <media/IMediaRecorder.h>
27dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong#include <media/mediaplayer.h>  // for MEDIA_ERROR_SERVER_DIED
28b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi#include <gui/ISurfaceTexture.h>
2989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectnamespace android {
3189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
324ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Listatus_t MediaRecorder::setCamera(const sp<ICamera>& camera, const sp<ICameraRecordingProxy>& proxy)
3389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
344ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    LOGV("setCamera(%p,%p)", camera.get(), proxy.get());
3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
3689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
3789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
3889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
3989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
4089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setCamera called in an invalid state(%d)", mCurrentState);
4189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
4289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
4389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
444ca2c7c913f8bd4ada13aca56d36045d42d1e00fWu-cheng Li    status_t ret = mMediaRecorder->setCamera(camera, proxy);
4589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
4689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setCamera failed: %d", ret);
4789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
488555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
4989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
5189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
5289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
5389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setPreviewSurface(const sp<Surface>& surface)
5489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
5589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setPreviewSurface(%p)", surface.get());
5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
5789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
5889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
5989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
6189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setPreviewSurface called in an invalid state(%d)", mCurrentState);
6289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
6389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
6589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("try to set preview surface without setting the video source first");
6689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
6789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
6889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
694b79168835965cf0fc41ebe2a367e22b4cb20d08Jamie Gennis    status_t ret = mMediaRecorder->setPreviewSurface(surface);
7089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
7189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setPreviewSurface failed: %d", ret);
7289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
738555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
7489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
7589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
7689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
7789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
7889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::init()
7989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
8089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("init");
8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
8289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
8389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
8489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_IDLE)) {
8689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("init called in an invalid state(%d)", mCurrentState);
8789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
8889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
8989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->init();
9189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
9289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("init failed: %d", ret);
9389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
948555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
9589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
9689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
9789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    ret = mMediaRecorder->setListener(this);
9889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
9989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setListener failed: %d", ret);
10089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1018555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
10289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
10389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_INITIALIZED;
10589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
10689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
10789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
10889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoSource(int vs)
10989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
11089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setVideoSource(%d)", vs);
11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
11289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
11389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
11489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoSourceSet) {
11689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("video source has already been set");
11789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
11889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
11989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_IDLE) {
12089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("Call init() since the media recorder is not initialized yet");
12189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = init();
12289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (OK != ret) {
12389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return ret;
12489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
12589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
12689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
12789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoSource called in an invalid state(%d)", mCurrentState);
12889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
12989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
131b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    // following call is made over the Binder Interface
13289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoSource(vs);
133b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
13489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
13589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setVideoSource failed: %d", ret);
13689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1378555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
13889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
13989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoSourceSet = true;
14089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
14189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
14289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
14389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setAudioSource(int as)
14489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
14589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setAudioSource(%d)", as);
14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
14789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
14889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
14989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_IDLE) {
15189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("Call init() since the media recorder is not initialized yet");
15289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        status_t ret = init();
15389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (OK != ret) {
15489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            return ret;
15589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
15689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
15789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioSourceSet) {
15889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("audio source has already been set");
15989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
16089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
16289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setAudioSource called in an invalid state(%d)", mCurrentState);
16389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
16489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
16589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
16689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setAudioSource(as);
16789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
16889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setAudioSource failed: %d", ret);
16989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1708555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
17189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
17289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioSourceSet = true;
17389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
17489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
17589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
17689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFormat(int of)
17789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
17889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setOutputFormat(%d)", of);
17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
18089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
18189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
18289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
18489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setOutputFormat called in an invalid state: %d", mCurrentState);
18589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
18689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
18759b7dc39ea8332d3418a599e51447d7edb612ac4Andreas Huber    if (mIsVideoSourceSet && of >= OUTPUT_FORMAT_AUDIO_ONLY_START && of != OUTPUT_FORMAT_RTP_AVP && of != OUTPUT_FORMAT_MPEG2TS) { //first non-video output format
18889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("output format (%d) is meant for audio recording only and incompatible with video recording", of);
18989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
19089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
19289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFormat(of);
19389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
19489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setOutputFormat failed: %d", ret);
19589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
1968555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
19789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
19889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_DATASOURCE_CONFIGURED;
19989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
20089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
20189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
20289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoEncoder(int ve)
20389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
20489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setVideoEncoder(%d)", ve);
20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
20689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
20789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
20889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
20989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
21089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("try to set the video encoder without setting the video source first");
21189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
21289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoEncoderSet) {
21489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("video encoder has already been set");
21589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
21689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
21789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
21889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoEncoder called in an invalid state(%d)", mCurrentState);
21989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
22089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
22289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoEncoder(ve);
22389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
22489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setVideoEncoder failed: %d", ret);
22589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2268555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
22789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
22889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoEncoderSet = true;
22989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
23089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
23189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
23289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setAudioEncoder(int ae)
23389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
23489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setAudioEncoder(%d)", ae);
23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
23689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
23789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
23889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
23989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsAudioSourceSet) {
24089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("try to set the audio encoder without setting the audio source first");
24189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
24289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioEncoderSet) {
24489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("audio encoder has already been set");
24589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
24689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
24789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
24889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setAudioEncoder called in an invalid state(%d)", mCurrentState);
24989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
25089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
25289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setAudioEncoder(ae);
25389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
25489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setAudioEncoder failed: %d", ret);
25589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2568555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
25789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
25889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioEncoderSet = true;
25989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
26089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
26189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
26289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFile(const char* path)
26389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
26489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setOutputFile(%s)", path);
26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
26689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
26789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
26889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
26989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsOutputFileSet) {
27089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("output file has already been set");
27189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
27289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
27489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
27589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
27689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
27789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
27889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFile(path);
27989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
28089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setOutputFile failed: %d", ret);
28189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
2828555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
28389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
28489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet = true;
28589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
28689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
28789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
28889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setOutputFile(int fd, int64_t offset, int64_t length)
28989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
29089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length);
29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
29289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
29389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
29489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsOutputFileSet) {
29689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("output file has already been set");
29789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
29889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
29989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
30089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
30189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
30289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
30389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
304f1d985081cff2a6aa2397c5341da8432db753211James Dong    // It appears that if an invalid file descriptor is passed through
305f1d985081cff2a6aa2397c5341da8432db753211James Dong    // binder calls, the server-side of the inter-process function call
306f1d985081cff2a6aa2397c5341da8432db753211James Dong    // is skipped. As a result, the check at the server-side to catch
307f1d985081cff2a6aa2397c5341da8432db753211James Dong    // the invalid file descritpor never gets invoked. This is to workaround
308f1d985081cff2a6aa2397c5341da8432db753211James Dong    // this issue by checking the file descriptor first before passing
309f1d985081cff2a6aa2397c5341da8432db753211James Dong    // it through binder call.
310f1d985081cff2a6aa2397c5341da8432db753211James Dong    if (fd < 0) {
311f1d985081cff2a6aa2397c5341da8432db753211James Dong        LOGE("Invalid file descriptor: %d", fd);
312f1d985081cff2a6aa2397c5341da8432db753211James Dong        return BAD_VALUE;
313f1d985081cff2a6aa2397c5341da8432db753211James Dong    }
314f1d985081cff2a6aa2397c5341da8432db753211James Dong
31589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setOutputFile(fd, offset, length);
31689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
31789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("setOutputFile failed: %d", ret);
31889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3198555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
32089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
32189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet = true;
32289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
32389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
32489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
3255d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatrastatus_t MediaRecorder::setOutputFileAuxiliary(int fd)
3265d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra{
3275d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    LOGV("setOutputFileAuxiliary(%d)", fd);
3285d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    if(mMediaRecorder == NULL) {
3295d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra        LOGE("media recorder is not initialized yet");
3305d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra        return INVALID_OPERATION;
3315d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    }
3325d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    if (mIsAuxiliaryOutputFileSet) {
3335d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra        LOGE("output file has already been set");
3345d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra        return INVALID_OPERATION;
3355d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    }
3365d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
3375d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra        LOGE("setOutputFile called in an invalid state(%d)", mCurrentState);
3385d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra        return INVALID_OPERATION;
3395d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    }
3405d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra
3415d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    status_t ret = mMediaRecorder->setOutputFileAuxiliary(fd);
3425d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    if (OK != ret) {
3435d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra        LOGV("setOutputFileAuxiliary failed: %d", ret);
3445d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra        mCurrentState = MEDIA_RECORDER_ERROR;
3455d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra        return ret;
3465d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    }
3475d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    mIsAuxiliaryOutputFileSet = true;
3485d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    return ret;
3495d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra}
3505d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra
35189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoSize(int width, int height)
35289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
35389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setVideoSize(%d, %d)", width, height);
35489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
35589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
35689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
35789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
35889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
35989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoSize called in an invalid state: %d", mCurrentState);
36089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
36189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
363b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        LOGE("Cannot set video size without setting video source first");
36489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
36589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
36689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
36789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoSize(width, height);
36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoSize failed: %d", ret);
37089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
3718555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
37289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
373b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
37689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
377b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// Query a SurfaceMediaSurface through the Mediaserver, over the
378b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// binder interface. This is used by the Filter Framework (MeidaEncoder)
379b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// to get an <ISurfaceTexture> object to hook up to ANativeWindow.
380b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketisp<ISurfaceTexture> MediaRecorder::
381b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        querySurfaceMediaSourceFromMediaServer()
382b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi{
383b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    Mutex::Autolock _l(mLock);
384b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    mSurfaceMediaSource =
385b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi            mMediaRecorder->querySurfaceMediaSource();
386b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    if (mSurfaceMediaSource == NULL) {
387b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        LOGE("SurfaceMediaSource could not be initialized!");
388b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    }
389b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    return mSurfaceMediaSource;
390b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi}
391b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
392b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
393b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
39489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoFrameRate(int frames_per_second)
39589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
39689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setVideoFrameRate(%d)", frames_per_second);
39789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
39889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
39989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
40089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
40189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
40289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState);
40389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
40489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
40589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!mIsVideoSourceSet) {
406b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        LOGE("Cannot set video frame rate without setting video source first");
4079747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang        return INVALID_OPERATION;
40889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
40989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
41089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->setVideoFrameRate(frames_per_second);
41189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
41289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("setVideoFrameRate failed: %d", ret);
41389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4148555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
41589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
41689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
41789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
41889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
419c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectstatus_t MediaRecorder::setParameters(const String8& params) {
420c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    LOGV("setParameters(%s)", params.string());
421c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    if(mMediaRecorder == NULL) {
422c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        LOGE("media recorder is not initialized yet");
423c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        return INVALID_OPERATION;
424c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
425c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
426e284bac7757ad732d0812eb6133125434ba66d5bJames Dong    bool isInvalidState = (mCurrentState &
427e284bac7757ad732d0812eb6133125434ba66d5bJames Dong                           (MEDIA_RECORDER_PREPARED |
428e284bac7757ad732d0812eb6133125434ba66d5bJames Dong                            MEDIA_RECORDER_RECORDING |
429e284bac7757ad732d0812eb6133125434ba66d5bJames Dong                            MEDIA_RECORDER_ERROR));
430e284bac7757ad732d0812eb6133125434ba66d5bJames Dong    if (isInvalidState) {
431e284bac7757ad732d0812eb6133125434ba66d5bJames Dong        LOGE("setParameters is called in an invalid state: %d", mCurrentState);
432e284bac7757ad732d0812eb6133125434ba66d5bJames Dong        return INVALID_OPERATION;
433e284bac7757ad732d0812eb6133125434ba66d5bJames Dong    }
434e284bac7757ad732d0812eb6133125434ba66d5bJames Dong
435c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    status_t ret = mMediaRecorder->setParameters(params);
436c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    if (OK != ret) {
437c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project        LOGE("setParameters(%s) failed: %d", params.string(), ret);
4381179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project        // Do not change our current state to MEDIA_RECORDER_ERROR, failures
4391179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project        // of the only currently supported parameters, "max-duration" and
4401179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project        // "max-filesize" are _not_ fatal.
441c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    }
442c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
443c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project    return ret;
444c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project}
445c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project
44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::prepare()
44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("prepare");
44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
45189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
45389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) {
45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("prepare called in an invalid state: %d", mCurrentState);
45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsAudioSourceSet != mIsAudioEncoderSet) {
45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mIsAudioSourceSet) {
45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("audio source is set, but audio encoder is not set");
46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {  // must not happen, since setAudioEncoder checks this already
46189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("audio encoder is set, but audio source is not set");
46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
46389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mIsVideoSourceSet != mIsVideoEncoderSet) {
46789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        if (mIsVideoSourceSet) {
46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("video source is set, but video encoder is not set");
46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        } else {  // must not happen, since setVideoEncoder checks this already
47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("video encoder is set, but video source is not set");
47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
47389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
47589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->prepare();
47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("prepare failed: %d", ret);
47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
4798555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_PREPARED;
48289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
48489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::getMaxAmplitude(int* max)
48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("getMaxAmplitude");
48889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if(mMediaRecorder == NULL) {
48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mCurrentState & MEDIA_RECORDER_ERROR) {
49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("getMaxAmplitude called in an invalid state: %d", mCurrentState);
49489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
49689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->getMaxAmplitude(max);
49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("getMaxAmplitude failed: %d", ret);
50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
5018555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
50489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
50689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::start()
50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("start");
50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
51089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_PREPARED)) {
51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("start called in an invalid state: %d", mCurrentState);
51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
51689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
51889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->start();
51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
52089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("start failed: %d", ret);
52189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
5228555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
52389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
52489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_RECORDING;
52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::stop()
52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("stop");
53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
53289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
53489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_RECORDING)) {
53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("stop called in an invalid state: %d", mCurrentState);
53789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
53989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->stop();
54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("stop failed: %d", ret);
54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
5448555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5469747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang
54765e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // FIXME:
54865e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // stop and reset are semantically different.
54965e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    // We treat them the same for now, and will change this in the future.
55065e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project    doCleanUp();
55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mCurrentState = MEDIA_RECORDER_IDLE;
55289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Reset should be OK in any state
55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::reset()
55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("reset");
55989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder == NULL) {
56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("media recorder is not initialized yet");
56189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
5639747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang
56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    doCleanUp();
56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = UNKNOWN_ERROR;
56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    switch(mCurrentState) {
56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_IDLE:
56889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = OK;
56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
57089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_RECORDING:
57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_DATASOURCE_CONFIGURED:
57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_PREPARED:
57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_ERROR: {
57589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = doReset();
57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            if (OK != ret) {
57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project               return ret;  // No need to continue
57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            }
57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }  // Intentional fall through
58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        case MEDIA_RECORDER_INITIALIZED:
58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            ret = close();
58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        default: {
58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            LOGE("Unexpected non-existing state: %d", mCurrentState);
58689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project            break;
58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        }
58889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
58989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
59189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::close()
59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("close");
59589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) {
59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("close called in an invalid state: %d", mCurrentState);
59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return INVALID_OPERATION;
59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->close();
60089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("close failed: %d", ret);
60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return UNKNOWN_ERROR;
60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_IDLE;
60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
60789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
60889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::doReset()
61189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("doReset");
61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    status_t ret = mMediaRecorder->reset();
61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (OK != ret) {
61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGE("doReset failed: %d", ret);
61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_ERROR;
6178555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project        return ret;
61889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    } else {
61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_INITIALIZED;
62089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
62189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return ret;
62289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::doCleanUp()
62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("doCleanUp");
62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioSourceSet  = false;
62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoSourceSet  = false;
62989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsAudioEncoderSet = false;
63089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsVideoEncoderSet = false;
63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mIsOutputFileSet   = false;
6325d6aca5d86e86af3f8f597be573d4563d69ceb85Nipun Kwatra    mIsAuxiliaryOutputFileSet = false;
63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
63489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Release should be OK in any state
63689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::release()
63789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
63889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("release");
63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
64089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        return mMediaRecorder->release();
64189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
64289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return INVALID_OPERATION;
64389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
64489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
645b33f3407bab0970a7f9241680723a1140b177c50Pannag SanketiMediaRecorder::MediaRecorder() : mSurfaceMediaSource(NULL)
64689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
64789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("constructor");
64889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
649dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    const sp<IMediaPlayerService>& service(getMediaPlayerService());
65089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (service != NULL) {
65189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mMediaRecorder = service->createMediaRecorder(getpid());
65289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
65389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mCurrentState = MEDIA_RECORDER_IDLE;
65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
656b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
657b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    doCleanUp();
65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::initCheck()
66289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return mMediaRecorder != 0 ? NO_ERROR : NO_INIT;
66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaRecorder::~MediaRecorder()
66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("destructor");
66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (mMediaRecorder != NULL) {
67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        mMediaRecorder.clear();
67189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
672b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi
673b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    if (mSurfaceMediaSource != NULL) {
674b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi        mSurfaceMediaSource.clear();
675b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi    }
67689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
67789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
67889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setListener(const sp<MediaRecorderListener>& listener)
67989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
68089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("setListener");
68189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    Mutex::Autolock _l(mLock);
68289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mListener = listener;
68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
68489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    return NO_ERROR;
68589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
68689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
68789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::notify(int msg, int ext1, int ext2)
68889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{
68989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    LOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2);
69089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
69189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    sp<MediaRecorderListener> listener;
69289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.lock();
69389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    listener = mListener;
69489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    mLock.unlock();
69589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
69689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    if (listener != NULL) {
69789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        Mutex::Autolock _l(mNotifyLock);
69889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("callback application");
69989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        listener->notify(msg, ext1, ext2);
70089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project        LOGV("back from callback");
70189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project    }
70289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}
70389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project
704dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dongvoid MediaRecorder::died()
705dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong{
706dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    LOGV("died");
707dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong    notify(MEDIA_RECORDER_EVENT_ERROR, MEDIA_ERROR_SERVER_DIED, 0);
708dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong}
709dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong
71089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android
711