1 /* 2 ** Copyright (c) 2012 The Linux Foundation. All rights reserved. 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 /*#error uncomment this for compiler test!*/ 18 19 #define ALOG_NDEBUG 0 20 #define ALOG_NIDEBUG 0 21 #define LOG_TAG "QCameraHWI_Record" 22 #include <utils/Log.h> 23 #include <utils/threads.h> 24 #include <cutils/properties.h> 25 #include <fcntl.h> 26 #include <sys/mman.h> 27 28 #include "QCameraStream.h" 29 30 31 #define LIKELY(exp) __builtin_expect(!!(exp), 1) 32 #define UNLIKELY(exp) __builtin_expect(!!(exp), 0) 33 34 /* QCameraStream_record class implementation goes here*/ 35 /* following code implement the video streaming capture & encoding logic of this class*/ 36 // --------------------------------------------------------------------------- 37 // QCameraStream_record createInstance() 38 // --------------------------------------------------------------------------- 39 namespace android { 40 41 42 QCameraStream* QCameraStream_record::createInstance(int cameraId, 43 camera_mode_t mode) 44 { 45 ALOGV("%s: BEGIN", __func__); 46 QCameraStream* pme = new QCameraStream_record(cameraId, mode); 47 ALOGV("%s: END", __func__); 48 return pme; 49 } 50 51 // --------------------------------------------------------------------------- 52 // QCameraStream_record deleteInstance() 53 // --------------------------------------------------------------------------- 54 void QCameraStream_record::deleteInstance(QCameraStream *ptr) 55 { 56 ALOGV("%s: BEGIN", __func__); 57 if (ptr){ 58 ptr->release(); 59 delete ptr; 60 ptr = NULL; 61 } 62 ALOGV("%s: END", __func__); 63 } 64 65 // --------------------------------------------------------------------------- 66 // QCameraStream_record Constructor 67 // --------------------------------------------------------------------------- 68 QCameraStream_record::QCameraStream_record(int cameraId, 69 camera_mode_t mode) 70 :QCameraStream(cameraId,mode), 71 mDebugFps(false) 72 { 73 mHalCamCtrl = NULL; 74 char value[PROPERTY_VALUE_MAX]; 75 ALOGV("%s: BEGIN", __func__); 76 77 property_get("persist.debug.sf.showfps", value, "0"); 78 mDebugFps = atoi(value); 79 80 ALOGV("%s: END", __func__); 81 } 82 83 // --------------------------------------------------------------------------- 84 // QCameraStream_record Destructor 85 // --------------------------------------------------------------------------- 86 QCameraStream_record::~QCameraStream_record() { 87 ALOGV("%s: BEGIN", __func__); 88 if(mActive) { 89 stop(); 90 } 91 if(mInit) { 92 release(); 93 } 94 mInit = false; 95 mActive = false; 96 ALOGV("%s: END", __func__); 97 98 } 99 100 // --------------------------------------------------------------------------- 101 // QCameraStream_record Callback from mm_camera 102 // --------------------------------------------------------------------------- 103 static void record_notify_cb(mm_camera_ch_data_buf_t *bufs_new, 104 void *user_data) 105 { 106 QCameraStream_record *pme = (QCameraStream_record *)user_data; 107 mm_camera_ch_data_buf_t *bufs_used = 0; 108 ALOGV("%s: BEGIN", __func__); 109 110 /* 111 * Call Function Process Video Data 112 */ 113 pme->processRecordFrame(bufs_new); 114 ALOGV("%s: END", __func__); 115 } 116 117 // --------------------------------------------------------------------------- 118 // QCameraStream_record 119 // --------------------------------------------------------------------------- 120 status_t QCameraStream_record::init() 121 { 122 status_t ret = NO_ERROR; 123 ALOGV("%s: BEGIN", __func__); 124 mInit = true; 125 ALOGV("%s: END", __func__); 126 return ret; 127 } 128 // --------------------------------------------------------------------------- 129 // QCameraStream_record 130 // --------------------------------------------------------------------------- 131 132 status_t QCameraStream_record::start() 133 { 134 status_t ret = NO_ERROR; 135 ALOGE("%s: BEGIN", __func__); 136 137 ret = initEncodeBuffers(); 138 if (NO_ERROR!=ret) { 139 ALOGE("%s ERROR: Buffer Allocation Failed\n",__func__); 140 return ret; 141 } 142 Mutex::Autolock l(&mHalCamCtrl->mRecordLock); 143 mHalCamCtrl->mReleasedRecordingFrame = false; 144 145 mHalCamCtrl->mStartRecording = true; 146 147 ALOGV("%s: END", __func__); 148 return ret; 149 } 150 151 // --------------------------------------------------------------------------- 152 // QCameraStream_record 153 // --------------------------------------------------------------------------- 154 void QCameraStream_record::stop() 155 { 156 status_t ret = NO_ERROR; 157 ALOGE("%s: BEGIN", __func__); 158 mHalCamCtrl->mStartRecording = false; 159 Mutex::Autolock l(&mHalCamCtrl->mRecordLock); 160 { 161 mHalCamCtrl->mRecordFrameLock.lock(); 162 mHalCamCtrl->mReleasedRecordingFrame = true; 163 mHalCamCtrl->mRecordWait.signal(); 164 mHalCamCtrl-> mRecordFrameLock.unlock(); 165 } 166 167 for(int cnt = 0; cnt < mHalCamCtrl->mPreviewMemory.buffer_count; cnt++) { 168 if (mHalCamCtrl->mStoreMetaDataInFrame) { 169 struct encoder_media_buffer_type * packet = 170 (struct encoder_media_buffer_type *) 171 mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]->data; 172 native_handle_delete(const_cast<native_handle_t *>(packet->meta_handle)); 173 mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]->release( 174 mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]); 175 } 176 } 177 ALOGV("%s: END", __func__); 178 179 } 180 // --------------------------------------------------------------------------- 181 // QCameraStream_record 182 // --------------------------------------------------------------------------- 183 void QCameraStream_record::release() 184 { 185 status_t ret = NO_ERROR; 186 ALOGV("%s: BEGIN", __func__); 187 ALOGV("%s: END", __func__); 188 } 189 190 status_t QCameraStream_record::processRecordFrame(void *data) 191 { 192 ALOGE("%s : BEGIN",__func__); 193 ALOGE("%s : END",__func__); 194 return NO_ERROR; 195 } 196 197 //Record Related Functions 198 status_t QCameraStream_record::initEncodeBuffers() 199 { 200 ALOGE("%s : BEGIN",__func__); 201 status_t ret = NO_ERROR; 202 for (int cnt = 0; cnt < mHalCamCtrl->mPreviewMemory.buffer_count; cnt++) { 203 if (mHalCamCtrl->mStoreMetaDataInFrame) { 204 mHalCamCtrl->mRecordingMemory.metadata_memory[cnt] = 205 mHalCamCtrl->mGetMemory(-1, 206 sizeof(struct encoder_media_buffer_type), 1, (void *)this); 207 struct encoder_media_buffer_type * packet = 208 (struct encoder_media_buffer_type *) 209 mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]->data; 210 packet->meta_handle = native_handle_create(1, 3); //1 fd, 1 offset,1 size and 1 data 211 packet->buffer_type = kMetadataBufferTypeCameraSource; 212 native_handle_t * nh = const_cast<native_handle_t *>(packet->meta_handle); 213 nh->data[0] = mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->fd; 214 nh->data[1] = 0; 215 nh->data[2] = mHalCamCtrl->mPreviewMemory.private_buffer_handle[cnt]->size; 216 nh->data[3] = (uint32_t)mHalCamCtrl->mPreviewMemory.camera_memory[cnt]->data; 217 } 218 } 219 ALOGE("%s : END",__func__); 220 return NO_ERROR; 221 } 222 223 void QCameraStream_record::releaseEncodeBuffer() { 224 for(int cnt = 0; cnt < mHalCamCtrl->mPreviewMemory.buffer_count; cnt++) { 225 if (mHalCamCtrl->mStoreMetaDataInFrame) { 226 struct encoder_media_buffer_type * packet = 227 (struct encoder_media_buffer_type *) 228 mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]->data; 229 native_handle_delete(const_cast<native_handle_t *>(packet->meta_handle)); 230 mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]->release( 231 mHalCamCtrl->mRecordingMemory.metadata_memory[cnt]); 232 233 } 234 } 235 } 236 237 void QCameraStream_record::releaseRecordingFrame(const void *opaque) 238 { 239 Mutex::Autolock rLock(&mHalCamCtrl->mRecordFrameLock); 240 mHalCamCtrl->mReleasedRecordingFrame = true; 241 mHalCamCtrl->mRecordWait.signal(); 242 ALOGE("%s, Signaling from-",__func__); 243 } 244 245 void QCameraStream_record::debugShowVideoFPS() const 246 { 247 248 } 249 250 status_t QCameraStream_record::takeLiveSnapshot(){ 251 return true; 252 } 253 254 }//namespace android 255