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