mediarecorder.cpp revision 29357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47
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{ 343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setCamera(%p,%p)", camera.get(), proxy.get()); 3589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 3629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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)) { 4029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 463856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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{ 553856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setPreviewSurface(%p)", surface.get()); 5689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 5729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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)) { 6129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 6529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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{ 803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("init"); 8189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 8229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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)) { 8629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 923856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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) { 993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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{ 1103856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVideoSource(%d)", vs); 11189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 11229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 11629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 1203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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)) { 12729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 1353856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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{ 1453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setAudioSource(%d)", as); 14689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 14729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 1513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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) { 15829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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)) { 16229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 1683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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{ 1783856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setOutputFormat(%d)", of); 17989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 18029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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)) { 18429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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 18829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 19429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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{ 2043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVideoEncoder(%d)", ve); 20589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 20629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 21029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 21429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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)) { 21829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 2243856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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{ 2343856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setAudioEncoder(%d)", ae); 23589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 23629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 24029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 24429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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)) { 24829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 2543856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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{ 2643856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setOutputFile(%s)", path); 26589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 26629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 27029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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)) { 27429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 2803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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{ 2903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length); 29189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 29229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 29629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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)) { 30029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 31129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("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) { 3173856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("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 32589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoSize(int width, int height) 32689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 3273856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVideoSize(%d, %d)", width, height); 32889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 32929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("media recorder is not initialized yet"); 33089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 33189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 33329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("setVideoSize called in an invalid state: %d", mCurrentState); 33489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 33589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 33689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!mIsVideoSourceSet) { 33729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Cannot set video size without setting video source first"); 33889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 33989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 34089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 34189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = mMediaRecorder->setVideoSize(width, height); 34289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (OK != ret) { 34329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("setVideoSize failed: %d", ret); 34489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_ERROR; 3458555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project return ret; 34689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 347b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi 34889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 34989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 35089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 351b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// Query a SurfaceMediaSurface through the Mediaserver, over the 352b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// binder interface. This is used by the Filter Framework (MeidaEncoder) 353b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi// to get an <ISurfaceTexture> object to hook up to ANativeWindow. 354b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketisp<ISurfaceTexture> MediaRecorder:: 355b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi querySurfaceMediaSourceFromMediaServer() 356b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi{ 357b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi Mutex::Autolock _l(mLock); 358b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi mSurfaceMediaSource = 359b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi mMediaRecorder->querySurfaceMediaSource(); 360b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi if (mSurfaceMediaSource == NULL) { 36129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("SurfaceMediaSource could not be initialized!"); 362b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi } 363b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi return mSurfaceMediaSource; 364b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi} 365b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi 366b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi 367b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi 36889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setVideoFrameRate(int frames_per_second) 36989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 3703856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setVideoFrameRate(%d)", frames_per_second); 37189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 37229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("media recorder is not initialized yet"); 37389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 37489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 37589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 37629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("setVideoFrameRate called in an invalid state: %d", mCurrentState); 37789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 37889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 37989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!mIsVideoSourceSet) { 38029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Cannot set video frame rate without setting video source first"); 3819747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang return INVALID_OPERATION; 38289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 38389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 38489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = mMediaRecorder->setVideoFrameRate(frames_per_second); 38589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (OK != ret) { 38629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("setVideoFrameRate failed: %d", ret); 38789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_ERROR; 3888555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project return ret; 38989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 39089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 39189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 39289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 393c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Projectstatus_t MediaRecorder::setParameters(const String8& params) { 3943856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameters(%s)", params.string()); 395c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project if(mMediaRecorder == NULL) { 39629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("media recorder is not initialized yet"); 397c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project return INVALID_OPERATION; 398c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project } 399c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project 400e284bac7757ad732d0812eb6133125434ba66d5bJames Dong bool isInvalidState = (mCurrentState & 401e284bac7757ad732d0812eb6133125434ba66d5bJames Dong (MEDIA_RECORDER_PREPARED | 402e284bac7757ad732d0812eb6133125434ba66d5bJames Dong MEDIA_RECORDER_RECORDING | 403e284bac7757ad732d0812eb6133125434ba66d5bJames Dong MEDIA_RECORDER_ERROR)); 404e284bac7757ad732d0812eb6133125434ba66d5bJames Dong if (isInvalidState) { 40529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("setParameters is called in an invalid state: %d", mCurrentState); 406e284bac7757ad732d0812eb6133125434ba66d5bJames Dong return INVALID_OPERATION; 407e284bac7757ad732d0812eb6133125434ba66d5bJames Dong } 408e284bac7757ad732d0812eb6133125434ba66d5bJames Dong 409c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project status_t ret = mMediaRecorder->setParameters(params); 410c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project if (OK != ret) { 41129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("setParameters(%s) failed: %d", params.string(), ret); 4121179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project // Do not change our current state to MEDIA_RECORDER_ERROR, failures 4131179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project // of the only currently supported parameters, "max-duration" and 4141179bc9b0e3d17c984e8f4ad38561c049dd102faThe Android Open Source Project // "max-filesize" are _not_ fatal. 415c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project } 416c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project 417c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project return ret; 418c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project} 419c048cae0367db6fbb4fe1127be5011910713d4adThe Android Open Source Project 42089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::prepare() 42189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 4223856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("prepare"); 42389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 42429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("media recorder is not initialized yet"); 42589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 42689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 42789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!(mCurrentState & MEDIA_RECORDER_DATASOURCE_CONFIGURED)) { 42829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("prepare called in an invalid state: %d", mCurrentState); 42989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 43089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mIsAudioSourceSet != mIsAudioEncoderSet) { 43289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mIsAudioSourceSet) { 43329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("audio source is set, but audio encoder is not set"); 43489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { // must not happen, since setAudioEncoder checks this already 43529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("audio encoder is set, but audio source is not set"); 43689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 43889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 43989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 44089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mIsVideoSourceSet != mIsVideoEncoderSet) { 44189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mIsVideoSourceSet) { 44229357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("video source is set, but video encoder is not set"); 44389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { // must not happen, since setVideoEncoder checks this already 44429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("video encoder is set, but video source is not set"); 44589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 44689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 44789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 44889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 44989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = mMediaRecorder->prepare(); 45089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (OK != ret) { 45129357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("prepare failed: %d", ret); 45289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_ERROR; 4538555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project return ret; 45489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 45589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_PREPARED; 45689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 45789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 45889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 45989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::getMaxAmplitude(int* max) 46089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 4613856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("getMaxAmplitude"); 46289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if(mMediaRecorder == NULL) { 46329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("media recorder is not initialized yet"); 46489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 46589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 46689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mCurrentState & MEDIA_RECORDER_ERROR) { 46729357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("getMaxAmplitude called in an invalid state: %d", mCurrentState); 46889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 46989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 47089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 47189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = mMediaRecorder->getMaxAmplitude(max); 47289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (OK != ret) { 47329357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("getMaxAmplitude failed: %d", ret); 47489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_ERROR; 4758555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project return ret; 47689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 47789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 47889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 47989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 48089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::start() 48189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 4823856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("start"); 48389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mMediaRecorder == NULL) { 48429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("media recorder is not initialized yet"); 48589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 48689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 48789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!(mCurrentState & MEDIA_RECORDER_PREPARED)) { 48829357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("start called in an invalid state: %d", mCurrentState); 48989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 49089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 49189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 49289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = mMediaRecorder->start(); 49389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (OK != ret) { 49429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("start failed: %d", ret); 49589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_ERROR; 4968555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project return ret; 49789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 49889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_RECORDING; 49989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 50089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 50189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 50289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::stop() 50389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("stop"); 50589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mMediaRecorder == NULL) { 50629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("media recorder is not initialized yet"); 50789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 50889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 50989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!(mCurrentState & MEDIA_RECORDER_RECORDING)) { 51029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("stop called in an invalid state: %d", mCurrentState); 51189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 51289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 51389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 51489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = mMediaRecorder->stop(); 51589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (OK != ret) { 51629357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("stop failed: %d", ret); 51789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_ERROR; 5188555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project return ret; 51989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 5209747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang 52165e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project // FIXME: 52265e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project // stop and reset are semantically different. 52365e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project // We treat them the same for now, and will change this in the future. 52465e731f393f704eedab6fbe0af7f8a580c8d4617The Android Open Source Project doCleanUp(); 52589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_IDLE; 52689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 52789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 52889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 52989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Reset should be OK in any state 53089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::reset() 53189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5323856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("reset"); 53389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mMediaRecorder == NULL) { 53429357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("media recorder is not initialized yet"); 53589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 53689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 5379747c5a1f5e51fab72169767972bf55f73711000Jianhong Jiang 53889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project doCleanUp(); 53989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = UNKNOWN_ERROR; 54089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project switch(mCurrentState) { 54189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MEDIA_RECORDER_IDLE: 54289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ret = OK; 54389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 54489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 54589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MEDIA_RECORDER_RECORDING: 54689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MEDIA_RECORDER_DATASOURCE_CONFIGURED: 54789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MEDIA_RECORDER_PREPARED: 54889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MEDIA_RECORDER_ERROR: { 54989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ret = doReset(); 55089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (OK != ret) { 55189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; // No need to continue 55289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 55389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } // Intentional fall through 55489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project case MEDIA_RECORDER_INITIALIZED: 55589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project ret = close(); 55689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 55789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 55889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project default: { 55929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("Unexpected non-existing state: %d", mCurrentState); 56089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project break; 56189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 56289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 56389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 56489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 56589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 56689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::close() 56789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("close"); 56989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (!(mCurrentState & MEDIA_RECORDER_INITIALIZED)) { 57029357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("close called in an invalid state: %d", mCurrentState); 57189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 57289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 57389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = mMediaRecorder->close(); 57489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (OK != ret) { 57529357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("close failed: %d", ret); 57689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_ERROR; 57789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return UNKNOWN_ERROR; 57889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 57989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_IDLE; 58089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 58189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 58289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 58389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 58489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::doReset() 58589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 5863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("doReset"); 58789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project status_t ret = mMediaRecorder->reset(); 58889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (OK != ret) { 58929357bc2c0dd7c43ad3bd0c8e3efa4e6fd9bfd47Steve Block ALOGE("doReset failed: %d", ret); 59089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_ERROR; 5918555d0867c3e8fe6cc5c7ad40af557fe6b92fa72The Android Open Source Project return ret; 59289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } else { 59389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_INITIALIZED; 59489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 59589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return ret; 59689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 59789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 59889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::doCleanUp() 59989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 6003856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("doCleanUp"); 60189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mIsAudioSourceSet = false; 60289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mIsVideoSourceSet = false; 60389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mIsAudioEncoderSet = false; 60489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mIsVideoEncoderSet = false; 60589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mIsOutputFileSet = false; 60689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 60789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 60889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project// Release should be OK in any state 60989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::release() 61089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 6113856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("release"); 61289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mMediaRecorder != NULL) { 61389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mMediaRecorder->release(); 61489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 61589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return INVALID_OPERATION; 61689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 61789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 618b33f3407bab0970a7f9241680723a1140b177c50Pannag SanketiMediaRecorder::MediaRecorder() : mSurfaceMediaSource(NULL) 61989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 6203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("constructor"); 62189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 622dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong const sp<IMediaPlayerService>& service(getMediaPlayerService()); 62389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (service != NULL) { 62489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMediaRecorder = service->createMediaRecorder(getpid()); 62589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 62689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mMediaRecorder != NULL) { 62789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mCurrentState = MEDIA_RECORDER_IDLE; 62889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 629b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi 630b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi 63189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project doCleanUp(); 63289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 63389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 63489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::initCheck() 63589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 63689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return mMediaRecorder != 0 ? NO_ERROR : NO_INIT; 63789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 63889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 63989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source ProjectMediaRecorder::~MediaRecorder() 64089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 6413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("destructor"); 64289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (mMediaRecorder != NULL) { 64389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mMediaRecorder.clear(); 64489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 645b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi 646b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi if (mSurfaceMediaSource != NULL) { 647b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi mSurfaceMediaSource.clear(); 648b33f3407bab0970a7f9241680723a1140b177c50Pannag Sanketi } 64989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 65089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 65189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectstatus_t MediaRecorder::setListener(const sp<MediaRecorderListener>& listener) 65289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 6533856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setListener"); 65489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock _l(mLock); 65589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mListener = listener; 65689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 65789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project return NO_ERROR; 65889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 65989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 66089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Projectvoid MediaRecorder::notify(int msg, int ext1, int ext2) 66189fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project{ 6623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("message received msg=%d, ext1=%d, ext2=%d", msg, ext1, ext2); 66389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 66489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project sp<MediaRecorderListener> listener; 66589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.lock(); 66689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project listener = mListener; 66789fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project mLock.unlock(); 66889fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 66989fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project if (listener != NULL) { 67089fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project Mutex::Autolock _l(mNotifyLock); 6713856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("callback application"); 67289fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project listener->notify(msg, ext1, ext2); 6733856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("back from callback"); 67489fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project } 67589fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project} 67689fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project 677dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dongvoid MediaRecorder::died() 678dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong{ 6793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("died"); 680dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong notify(MEDIA_RECORDER_EVENT_ERROR, MEDIA_ERROR_SERVER_DIED, 0); 681dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong} 682dd172fce75b2a1c3cb3a5d3b3bbb5020b1ae8675James Dong 68389fa4ad53f2f4d57adbc97ae1149fc00c9b6f3c5The Android Open Source Project}; // namespace android 684