1 /* 2 ** Copyright 2008, The Android Open Source Project 3 ** 4 ** Licensed under the Apache License, Version 2.0 (the "License"); 5 ** you may not use this file except in compliance with the License. 6 ** You may obtain a copy of the License at 7 ** 8 ** http://www.apache.org/licenses/LICENSE-2.0 9 ** 10 ** Unless required by applicable law or agreed to in writing, software 11 ** distributed under the License is distributed on an "AS IS" BASIS, 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 ** See the License for the specific language governing permissions and 14 ** limitations under the License. 15 */ 16 17 //#define LOG_NDEBUG 0 18 #define LOG_TAG "MediaRecorderService" 19 #include <utils/Log.h> 20 21 #include <sys/types.h> 22 #include <sys/stat.h> 23 #include <dirent.h> 24 #include <unistd.h> 25 #include <string.h> 26 #include <cutils/atomic.h> 27 #include <cutils/properties.h> // for property_get 28 #include <android_runtime/ActivityManager.h> 29 #include <binder/IPCThreadState.h> 30 #include <binder/IServiceManager.h> 31 #include <binder/MemoryHeapBase.h> 32 #include <binder/MemoryBase.h> 33 34 #ifndef NO_OPENCORE 35 #include <media/PVMediaRecorder.h> 36 #endif 37 38 #include <utils/String16.h> 39 40 #include <media/AudioTrack.h> 41 42 #include "MediaRecorderClient.h" 43 #include "MediaPlayerService.h" 44 45 #include "StagefrightRecorder.h" 46 47 namespace android { 48 49 const char* cameraPermission = "android.permission.CAMERA"; 50 const char* recordAudioPermission = "android.permission.RECORD_AUDIO"; 51 52 static bool checkPermission(const char* permissionString) { 53 #ifndef HAVE_ANDROID_OS 54 return true; 55 #endif 56 if (getpid() == IPCThreadState::self()->getCallingPid()) return true; 57 bool ok = checkCallingPermission(String16(permissionString)); 58 if (!ok) LOGE("Request requires %s", permissionString); 59 return ok; 60 } 61 62 status_t MediaRecorderClient::setCamera(const sp<ICamera>& camera) 63 { 64 LOGV("setCamera"); 65 Mutex::Autolock lock(mLock); 66 if (mRecorder == NULL) { 67 LOGE("recorder is not initialized"); 68 return NO_INIT; 69 } 70 return mRecorder->setCamera(camera); 71 } 72 73 status_t MediaRecorderClient::setPreviewSurface(const sp<ISurface>& surface) 74 { 75 LOGV("setPreviewSurface"); 76 Mutex::Autolock lock(mLock); 77 if (mRecorder == NULL) { 78 LOGE("recorder is not initialized"); 79 return NO_INIT; 80 } 81 return mRecorder->setPreviewSurface(surface); 82 } 83 84 status_t MediaRecorderClient::setVideoSource(int vs) 85 { 86 LOGV("setVideoSource(%d)", vs); 87 if (!checkPermission(cameraPermission)) { 88 return PERMISSION_DENIED; 89 } 90 Mutex::Autolock lock(mLock); 91 if (mRecorder == NULL) { 92 LOGE("recorder is not initialized"); 93 return NO_INIT; 94 } 95 return mRecorder->setVideoSource((video_source)vs); 96 } 97 98 status_t MediaRecorderClient::setAudioSource(int as) 99 { 100 LOGV("setAudioSource(%d)", as); 101 if (!checkPermission(recordAudioPermission)) { 102 return PERMISSION_DENIED; 103 } 104 Mutex::Autolock lock(mLock); 105 if (mRecorder == NULL) { 106 LOGE("recorder is not initialized"); 107 return NO_INIT; 108 } 109 return mRecorder->setAudioSource((audio_source)as); 110 } 111 112 status_t MediaRecorderClient::setOutputFormat(int of) 113 { 114 LOGV("setOutputFormat(%d)", of); 115 Mutex::Autolock lock(mLock); 116 if (mRecorder == NULL) { 117 LOGE("recorder is not initialized"); 118 return NO_INIT; 119 } 120 return mRecorder->setOutputFormat((output_format)of); 121 } 122 123 status_t MediaRecorderClient::setVideoEncoder(int ve) 124 { 125 LOGV("setVideoEncoder(%d)", ve); 126 Mutex::Autolock lock(mLock); 127 if (mRecorder == NULL) { 128 LOGE("recorder is not initialized"); 129 return NO_INIT; 130 } 131 return mRecorder->setVideoEncoder((video_encoder)ve); 132 } 133 134 status_t MediaRecorderClient::setAudioEncoder(int ae) 135 { 136 LOGV("setAudioEncoder(%d)", ae); 137 Mutex::Autolock lock(mLock); 138 if (mRecorder == NULL) { 139 LOGE("recorder is not initialized"); 140 return NO_INIT; 141 } 142 return mRecorder->setAudioEncoder((audio_encoder)ae); 143 } 144 145 status_t MediaRecorderClient::setOutputFile(const char* path) 146 { 147 LOGV("setOutputFile(%s)", path); 148 Mutex::Autolock lock(mLock); 149 if (mRecorder == NULL) { 150 LOGE("recorder is not initialized"); 151 return NO_INIT; 152 } 153 return mRecorder->setOutputFile(path); 154 } 155 156 status_t MediaRecorderClient::setOutputFile(int fd, int64_t offset, int64_t length) 157 { 158 LOGV("setOutputFile(%d, %lld, %lld)", fd, offset, length); 159 Mutex::Autolock lock(mLock); 160 if (mRecorder == NULL) { 161 LOGE("recorder is not initialized"); 162 return NO_INIT; 163 } 164 return mRecorder->setOutputFile(fd, offset, length); 165 } 166 167 status_t MediaRecorderClient::setVideoSize(int width, int height) 168 { 169 LOGV("setVideoSize(%dx%d)", width, height); 170 Mutex::Autolock lock(mLock); 171 if (mRecorder == NULL) { 172 LOGE("recorder is not initialized"); 173 return NO_INIT; 174 } 175 return mRecorder->setVideoSize(width, height); 176 } 177 178 status_t MediaRecorderClient::setVideoFrameRate(int frames_per_second) 179 { 180 LOGV("setVideoFrameRate(%d)", frames_per_second); 181 Mutex::Autolock lock(mLock); 182 if (mRecorder == NULL) { 183 LOGE("recorder is not initialized"); 184 return NO_INIT; 185 } 186 return mRecorder->setVideoFrameRate(frames_per_second); 187 } 188 189 status_t MediaRecorderClient::setParameters(const String8& params) { 190 LOGV("setParameters(%s)", params.string()); 191 Mutex::Autolock lock(mLock); 192 if (mRecorder == NULL) { 193 LOGE("recorder is not initialized"); 194 return NO_INIT; 195 } 196 return mRecorder->setParameters(params); 197 } 198 199 status_t MediaRecorderClient::prepare() 200 { 201 LOGV("prepare"); 202 Mutex::Autolock lock(mLock); 203 if (mRecorder == NULL) { 204 LOGE("recorder is not initialized"); 205 return NO_INIT; 206 } 207 return mRecorder->prepare(); 208 } 209 210 211 status_t MediaRecorderClient::getMaxAmplitude(int* max) 212 { 213 LOGV("getMaxAmplitude"); 214 Mutex::Autolock lock(mLock); 215 if (mRecorder == NULL) { 216 LOGE("recorder is not initialized"); 217 return NO_INIT; 218 } 219 return mRecorder->getMaxAmplitude(max); 220 } 221 222 status_t MediaRecorderClient::start() 223 { 224 LOGV("start"); 225 Mutex::Autolock lock(mLock); 226 if (mRecorder == NULL) { 227 LOGE("recorder is not initialized"); 228 return NO_INIT; 229 } 230 return mRecorder->start(); 231 232 } 233 234 status_t MediaRecorderClient::stop() 235 { 236 LOGV("stop"); 237 Mutex::Autolock lock(mLock); 238 if (mRecorder == NULL) { 239 LOGE("recorder is not initialized"); 240 return NO_INIT; 241 } 242 return mRecorder->stop(); 243 } 244 245 status_t MediaRecorderClient::init() 246 { 247 LOGV("init"); 248 Mutex::Autolock lock(mLock); 249 if (mRecorder == NULL) { 250 LOGE("recorder is not initialized"); 251 return NO_INIT; 252 } 253 return mRecorder->init(); 254 } 255 256 status_t MediaRecorderClient::close() 257 { 258 LOGV("close"); 259 Mutex::Autolock lock(mLock); 260 if (mRecorder == NULL) { 261 LOGE("recorder is not initialized"); 262 return NO_INIT; 263 } 264 return mRecorder->close(); 265 } 266 267 268 status_t MediaRecorderClient::reset() 269 { 270 LOGV("reset"); 271 Mutex::Autolock lock(mLock); 272 if (mRecorder == NULL) { 273 LOGE("recorder is not initialized"); 274 return NO_INIT; 275 } 276 return mRecorder->reset(); 277 } 278 279 status_t MediaRecorderClient::release() 280 { 281 LOGV("release"); 282 Mutex::Autolock lock(mLock); 283 if (mRecorder != NULL) { 284 delete mRecorder; 285 mRecorder = NULL; 286 wp<MediaRecorderClient> client(this); 287 mMediaPlayerService->removeMediaRecorderClient(client); 288 } 289 return NO_ERROR; 290 } 291 292 MediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service, pid_t pid) 293 { 294 LOGV("Client constructor"); 295 mPid = pid; 296 297 char value[PROPERTY_VALUE_MAX]; 298 if (!property_get("media.stagefright.enable-record", value, NULL) 299 || !strcmp(value, "1") || !strcasecmp(value, "true")) { 300 mRecorder = new StagefrightRecorder; 301 } else 302 #ifndef NO_OPENCORE 303 { 304 mRecorder = new PVMediaRecorder(); 305 } 306 #else 307 { 308 mRecorder = NULL; 309 } 310 #endif 311 312 mMediaPlayerService = service; 313 } 314 315 MediaRecorderClient::~MediaRecorderClient() 316 { 317 LOGV("Client destructor"); 318 release(); 319 } 320 321 status_t MediaRecorderClient::setListener(const sp<IMediaRecorderClient>& listener) 322 { 323 LOGV("setListener"); 324 Mutex::Autolock lock(mLock); 325 if (mRecorder == NULL) { 326 LOGE("recorder is not initialized"); 327 return NO_INIT; 328 } 329 return mRecorder->setListener(listener); 330 } 331 332 status_t MediaRecorderClient::dump(int fd, const Vector<String16>& args) const { 333 if (mRecorder != NULL) { 334 return mRecorder->dump(fd, args); 335 } 336 return OK; 337 } 338 339 }; // namespace android 340 341