1 /* 2 ** Copyright (c) 2011-2012 The Linux Foundation. All rights reserved. 3 ** 4 ** Not a Contribution, Apache license notifications and license are retained 5 ** for attribution purposes only. 6 ** 7 ** Licensed under the Apache License, Version 2.0 (the "License"); 8 ** you may not use this file except in compliance with the License. 9 ** You may obtain a copy of the License at 10 ** 11 ** http://www.apache.org/licenses/LICENSE-2.0 12 ** 13 ** Unless required by applicable law or agreed to in writing, software 14 ** distributed under the License is distributed on an "AS IS" BASIS, 15 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 16 ** See the License for the specific language governing permissions and 17 ** limitations under the License. 18 */ 19 20 /*#error uncomment this for compiler test!*/ 21 22 #define LOG_TAG "QCameraHWI_Rdi" 23 #include <utils/Log.h> 24 #include <utils/threads.h> 25 #include <fcntl.h> 26 #include <sys/mman.h> 27 #include "QCameraHAL.h" 28 #include "QCameraHWI.h" 29 #include <gralloc_priv.h> 30 #include <genlock.h> 31 32 #define UNLIKELY(exp) __builtin_expect(!!(exp), 0) 33 34 /* QCameraHWI_Raw class implementation goes here*/ 35 /* following code implement the RDI logic of this class*/ 36 37 namespace android { 38 status_t QCameraStream_Rdi::initStream(uint8_t no_cb_needed, uint8_t stream_on) 39 { 40 status_t ret = NO_ERROR; 41 42 ALOGI(" %s : E ", __FUNCTION__); 43 mNumBuffers = PREVIEW_BUFFER_COUNT; 44 if(mHalCamCtrl->isZSLMode()) { 45 if(mNumBuffers < mHalCamCtrl->getZSLQueueDepth() + 3) { 46 mNumBuffers = mHalCamCtrl->getZSLQueueDepth() + 3; 47 } 48 } 49 ret = QCameraStream::initStream(no_cb_needed, stream_on); 50 end: 51 ALOGI(" %s : X ", __FUNCTION__); 52 return ret; 53 } 54 55 int QCameraStream_Rdi::getBuf(mm_camera_frame_len_offset *frame_offset_info, 56 uint8_t num_bufs, 57 uint8_t *initial_reg_flag, 58 mm_camera_buf_def_t *bufs) 59 { 60 int ret = 0; 61 ALOGE("%s:BEGIN",__func__); 62 63 if (num_bufs > mNumBuffers) { 64 mNumBuffers = num_bufs; 65 } 66 if ((mNumBuffers == 0) || (mNumBuffers > MM_CAMERA_MAX_NUM_FRAMES)) { 67 ALOGE("%s: Invalid number of buffers (=%d) requested!", 68 __func__, mNumBuffers); 69 return BAD_VALUE; 70 } 71 72 memset(mRdiBuf, 0, sizeof(mRdiBuf)); 73 memcpy(&mFrameOffsetInfo, frame_offset_info, sizeof(mFrameOffsetInfo)); 74 ret = mHalCamCtrl->initHeapMem(&mHalCamCtrl->mRdiMemory, 75 mNumBuffers, 76 mFrameOffsetInfo.frame_len, 77 MSM_PMEM_MAINIMG, 78 &mFrameOffsetInfo, 79 mRdiBuf); 80 if(MM_CAMERA_OK == ret) { 81 for(int i = 0; i < num_bufs; i++) { 82 bufs[i] = mRdiBuf[i]; 83 initial_reg_flag[i] = true; 84 } 85 } 86 87 ALOGV("%s: X - ret = %d ", __func__, ret); 88 return ret; 89 } 90 91 int QCameraStream_Rdi::putBuf(uint8_t num_bufs, mm_camera_buf_def_t *bufs) 92 { 93 int ret = 0; 94 ALOGE(" %s : E ", __FUNCTION__); 95 ret = mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mRdiMemory); 96 ALOGI(" %s : X ",__FUNCTION__); 97 return ret; 98 } 99 100 void QCameraStream_Rdi::dumpFrameToFile(mm_camera_buf_def_t* newFrame) 101 { 102 char buf[32]; 103 int file_fd; 104 int i; 105 char *ext = "yuv"; 106 int w,h,main_422; 107 static int count = 0; 108 char *name = "rdi"; 109 110 w = mHalCamCtrl->mRdiWidth; 111 h = mHalCamCtrl->mRdiHeight; 112 main_422 = 1; 113 114 if ( newFrame != NULL) { 115 char * str; 116 snprintf(buf, sizeof(buf), "/data/%s_%d.%s", name,count,ext); 117 file_fd = open(buf, O_RDWR | O_CREAT, 0777); 118 if (file_fd < 0) { 119 ALOGE("%s: cannot open file\n", __func__); 120 } else { 121 void* y_off = newFrame->buffer + newFrame->planes[0].data_offset; 122 void* cbcr_off = newFrame->buffer + newFrame->planes[0].length; 123 124 write(file_fd, (const void *)(y_off), newFrame->planes[0].length); 125 write(file_fd, (const void *)(cbcr_off), 126 (newFrame->planes[1].length * newFrame->num_planes)); 127 close(file_fd); 128 } 129 count++; 130 } 131 } 132 133 status_t QCameraStream_Rdi::processRdiFrame( 134 mm_camera_super_buf_t *frame) 135 { 136 ALOGE("%s",__func__); 137 status_t err = NO_ERROR; 138 int msgType = 0; 139 camera_memory_t *data = NULL; 140 141 if(!mActive) { 142 ALOGE("RDI Streaming Stopped. Returning callback"); 143 return NO_ERROR; 144 } 145 146 if(mHalCamCtrl==NULL) { 147 ALOGE("%s: X: HAL control object not set",__func__); 148 /*Call buf done*/ 149 return BAD_VALUE; 150 } 151 152 mHalCamCtrl->dumpFrameToFile(frame->bufs[0], HAL_DUMP_FRM_RDI); 153 154 if (mHalCamCtrl->mDataCb != NULL) { 155 //Sending rdi callback if corresponding Msgs are enabled 156 if(mHalCamCtrl->mMsgEnabled & CAMERA_MSG_PREVIEW_FRAME) { 157 msgType |= CAMERA_MSG_PREVIEW_FRAME; 158 data = mHalCamCtrl->mRdiMemory.camera_memory[frame->bufs[0]->buf_idx]; 159 } else { 160 data = NULL; 161 } 162 163 ALOGD("Message enabled = 0x%x", msgType); 164 if(mActive && msgType) { 165 mHalCamCtrl->mDataCb(msgType, data, 0, NULL, mHalCamCtrl->mCallbackCookie); 166 } 167 ALOGD("end of cb"); 168 } 169 if (MM_CAMERA_OK != p_mm_ops->ops->qbuf(mCameraHandle, mChannelId, 170 frame->bufs[0])) { 171 ALOGE("%s: Failed in Preview Qbuf\n", __func__); 172 err = BAD_VALUE; 173 } 174 mHalCamCtrl->cache_ops((QCameraHalMemInfo_t *)(frame->bufs[0]->mem_info), 175 frame->bufs[0]->buffer, 176 ION_IOC_INV_CACHES); 177 178 return err; 179 } 180 181 182 // --------------------------------------------------------------------------- 183 // QCameraStream_Rdi 184 // --------------------------------------------------------------------------- 185 186 QCameraStream_Rdi:: 187 QCameraStream_Rdi(uint32_t CameraHandle, 188 uint32_t ChannelId, 189 uint32_t Width, 190 uint32_t Height, 191 uint32_t Format, 192 uint8_t NumBuffers, 193 mm_camera_vtbl_t *mm_ops, 194 mm_camera_img_mode imgmode, 195 camera_mode_t mode, 196 QCameraHardwareInterface* camCtrl) 197 : QCameraStream(CameraHandle, 198 ChannelId, 199 Width, 200 Height, 201 Format, 202 NumBuffers, 203 mm_ops, 204 imgmode, 205 mode, 206 camCtrl) 207 { 208 ALOGE("%s: E", __func__); 209 ALOGE("%s: X", __func__); 210 } 211 // --------------------------------------------------------------------------- 212 // QCameraStream_Rdi 213 // --------------------------------------------------------------------------- 214 215 QCameraStream_Rdi::~QCameraStream_Rdi() { 216 ALOGV("%s: E", __func__); 217 release(); 218 ALOGV("%s: X", __func__); 219 220 } 221 // --------------------------------------------------------------------------- 222 // QCameraStream_Rdi 223 // --------------------------------------------------------------------------- 224 void QCameraStream_Rdi::release() { 225 226 ALOGE("%s : BEGIN",__func__); 227 streamOff(0); 228 deinitStream(); 229 ALOGE("%s: END", __func__); 230 } 231 232 // --------------------------------------------------------------------------- 233 // No code beyone this line 234 // --------------------------------------------------------------------------- 235 }; // namespace android 236