1 /* 2 ** Copyright (c) 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 ALOG_NDEBUG 0 23 #define ALOG_NIDEBUG 0 24 #define LOG_TAG __FILE__ 25 #include <utils/Log.h> 26 27 #include "QCameraHWI.h" 28 #include "QCameraStream.h" 29 30 /* QCameraStream class implementation goes here*/ 31 /* following code implement the control logic of this class*/ 32 33 namespace android { 34 35 // --------------------------------------------------------------------------- 36 // QCameraStream 37 // --------------------------------------------------------------------------- 38 39 void stream_cb_routine(mm_camera_super_buf_t *bufs, 40 void *userdata) 41 { 42 ALOGD("%s E ", __func__); 43 QCameraStream *p_obj=(QCameraStream*) userdata; 44 ALOGD("DEBUG4:ExtMode:%d,streamid:%d",p_obj->mExtImgMode,bufs->bufs[0]->stream_id); 45 switch(p_obj->mExtImgMode) 46 { 47 case MM_CAMERA_PREVIEW: 48 ALOGD("%s : callback for MM_CAMERA_PREVIEW", __func__); 49 ((QCameraStream_preview *)p_obj)->processPreviewFrame(bufs); 50 break; 51 case MM_CAMERA_VIDEO: 52 ((QCameraStream_record *)p_obj)->processRecordFrame(bufs); 53 break; 54 case MM_CAMERA_RDI: 55 ((QCameraStream_Rdi *)p_obj)->processRdiFrame(bufs); 56 break; 57 case MM_CAMERA_SNAPSHOT_MAIN: 58 break; 59 case MM_CAMERA_SNAPSHOT_THUMBNAIL: 60 break; 61 default: 62 break; 63 64 } 65 ALOGD("%s X ", __func__); 66 } 67 68 void QCameraStream::dataCallback(mm_camera_super_buf_t *bufs) 69 { 70 } 71 72 73 void QCameraStream::setResolution(mm_camera_dimension_t *res) 74 { 75 mWidth = res->width; 76 mHeight = res->height; 77 } 78 bool QCameraStream::isResolutionSame(mm_camera_dimension_t *res) 79 { 80 if (mWidth != res->width || mHeight != res->height) 81 return false; 82 else 83 return true; 84 } 85 void QCameraStream::getResolution(mm_camera_dimension_t *res) 86 { 87 res->width = mWidth; 88 res->height = mHeight; 89 } 90 int32_t QCameraStream::streamOn() 91 { 92 status_t rc = NO_ERROR; 93 ALOGD("%s: mActive = %d, streamid = %d, image_mode = %d",__func__, mActive, mStreamId, mExtImgMode); 94 if(mActive){ 95 ALOGE("%s: Stream:%d is already active", 96 __func__,mStreamId); 97 return rc; 98 } 99 100 if (mInit == true) { 101 /* this is the restart case, for now we need config again */ 102 rc = setFormat(); 103 ALOGD("%s: config_stream, rc = %d", __func__, rc); 104 } 105 rc = p_mm_ops->ops->start_streams(mCameraHandle, 106 mChannelId, 107 1, 108 &mStreamId); 109 if(rc == NO_ERROR) { 110 mActive = true; 111 } 112 ALOGD("%s: X, mActive = %d, mInit = %d, streamid = %d, image_mode = %d", 113 __func__, mActive, mInit, mStreamId, mExtImgMode); 114 return rc; 115 } 116 117 int32_t QCameraStream::streamOff(bool isAsyncCmd) 118 { 119 status_t rc = NO_ERROR; 120 ALOGD("%s: mActive = %d, streamid = %d, image_mode = %d",__func__, mActive, mStreamId, mExtImgMode); 121 if(!mActive) { 122 ALOGE("%s: Stream:%d is not active", 123 __func__,mStreamId); 124 return rc; 125 } 126 mActive = false; 127 128 rc = p_mm_ops->ops->stop_streams(mCameraHandle, 129 mChannelId, 130 1, 131 &mStreamId); 132 133 ALOGD("%s: X, mActive = %d, mInit = %d, streamid = %d, image_mode = %d", 134 __func__, mActive, mInit, mStreamId, mExtImgMode); 135 return rc; 136 } 137 138 /* initialize a streaming channel*/ 139 status_t QCameraStream::initStream(uint8_t no_cb_needed, uint8_t stream_on) 140 { 141 142 int rc = MM_CAMERA_OK; 143 144 /* save local copy */ 145 m_flag_no_cb = no_cb_needed; 146 m_flag_stream_on = stream_on; 147 148 ALOGD("%s: E, mActive = %d, mInit = %d, streamid = %d, image_mode = %d", 149 __func__, mActive, mInit, mStreamId, mExtImgMode); 150 151 if(mInit == true) { 152 ALOGE("%s: alraedy initted, mActive = %d, mInit = %d, streamid = %d, image_mode = %d", 153 __func__, mActive, mInit, mStreamId, mExtImgMode); 154 return rc; 155 } 156 /***********Allocate Stream**************/ 157 mStreamId = p_mm_ops->ops->add_stream(mCameraHandle, 158 mChannelId, 159 no_cb_needed? NULL : stream_cb_routine, 160 no_cb_needed? NULL : (void *)this, 161 mExtImgMode, 162 0/*sensor_idx*/); 163 if (mStreamId == 0) { 164 ALOGE("%s: err in add_stream, mActive = %d, mInit = %d, streamid = %d, image_mode = %d", 165 __func__, mActive, mInit, mStreamId, mExtImgMode); 166 return BAD_VALUE; 167 } 168 169 /***********Config Stream*****************/ 170 rc = setFormat(); 171 if(MM_CAMERA_OK != rc) { 172 ALOGE("%s: err in config_stream, mActive = %d, streamid = %d, image_mode = %d", 173 __func__, mActive, mStreamId, mExtImgMode); 174 p_mm_ops->ops->del_stream(mCameraHandle, 175 mChannelId, 176 mStreamId); 177 return BAD_VALUE; 178 } 179 180 mInit=true; 181 ALOGE("%s: X, mActive = %d, streamid = %d, image_mode = %d", 182 __func__, mActive, mStreamId, mExtImgMode); 183 return NO_ERROR; 184 } 185 186 status_t QCameraStream::deinitStream() 187 { 188 189 int rc = MM_CAMERA_OK; 190 191 ALOGD("%s: E, mActive = %d, mInit = %d, streamid = %d, image_mode = %d",__func__, mActive, mInit, mStreamId, mExtImgMode); 192 193 if(mInit == false) { 194 /* stream has not been initted. nop */ 195 if (mStreamId > 0) { 196 ALOGE("%s: bug. mStreamId = %d, mInit = %d", __func__, mStreamId, mInit); 197 rc = -1; 198 } 199 return rc; 200 } 201 rc= p_mm_ops->ops->del_stream(mCameraHandle,mChannelId, 202 mStreamId); 203 204 ALOGV("%s: X, Stream = %d\n", __func__, mStreamId); 205 mInit = false; 206 mStreamId = 0; 207 ALOGD("%s: X, mActive = %d, mInit = %d, streamid = %d, image_mode = %d", 208 __func__, mActive, mInit, mStreamId, mExtImgMode); 209 return NO_ERROR; 210 } 211 212 status_t QCameraStream::setFormat() 213 { 214 int rc = MM_CAMERA_OK; 215 mm_camera_stream_config_t stream_config; 216 217 ALOGV("%s: E, mActive = %d, streamid = %d, image_mode = %d",__func__, mActive, mStreamId, mExtImgMode); 218 memset(&stream_config, 0, sizeof(mm_camera_stream_config_t)); 219 220 switch(mExtImgMode) 221 { 222 case MM_CAMERA_PREVIEW: 223 /* Get mFormat */ 224 rc = p_mm_ops->ops->get_parm(p_mm_ops->camera_handle, 225 MM_CAMERA_PARM_PREVIEW_FORMAT, 226 &mFormat); 227 if (MM_CAMERA_OK != rc) { 228 ALOGE("%s: error - can't get preview format!", __func__); 229 ALOGD("%s: X", __func__); 230 return rc; 231 } 232 break; 233 case MM_CAMERA_VIDEO: 234 break; 235 case MM_CAMERA_SNAPSHOT_MAIN: 236 stream_config.fmt.rotation = mHalCamCtrl->getJpegRotation(); 237 break; 238 case MM_CAMERA_SNAPSHOT_THUMBNAIL: 239 stream_config.fmt.rotation = mHalCamCtrl->getJpegRotation(); 240 break; 241 case MM_CAMERA_RDI: 242 mWidth = 0; 243 mHeight = 0; 244 mFormat = CAMERA_BAYER_SBGGR10; 245 default: 246 break; 247 } 248 249 stream_config.fmt.fmt = (cam_format_t)mFormat; 250 stream_config.fmt.meta_header = MM_CAMEAR_META_DATA_TYPE_DEF; 251 stream_config.fmt.width = mWidth; 252 stream_config.fmt.height = mHeight; 253 stream_config.num_of_bufs = mNumBuffers; 254 stream_config.need_stream_on = m_flag_stream_on; 255 rc = p_mm_ops->ops->config_stream(mCameraHandle, 256 mChannelId, 257 mStreamId, 258 &stream_config); 259 260 if(mHalCamCtrl->rdiMode != STREAM_IMAGE) { 261 mHalCamCtrl->mRdiWidth = stream_config.fmt.width; 262 mHalCamCtrl->mRdiHeight = stream_config.fmt.height; 263 } 264 265 mWidth = stream_config.fmt.width; 266 mHeight = stream_config.fmt.height; 267 ALOGD("%s: X",__func__); 268 return rc; 269 } 270 271 QCameraStream::QCameraStream (){ 272 mInit = false; 273 mActive = false; 274 /* memset*/ 275 memset(&mCrop, 0, sizeof(mm_camera_rect_t)); 276 m_flag_no_cb = FALSE; 277 m_flag_stream_on = TRUE; 278 } 279 280 QCameraStream::QCameraStream(uint32_t CameraHandle, 281 uint32_t ChannelId, 282 uint32_t Width, 283 uint32_t Height, 284 uint32_t Format, 285 uint8_t NumBuffers, 286 mm_camera_vtbl_t *mm_ops, 287 mm_camera_img_mode imgmode, 288 camera_mode_t mode, 289 QCameraHardwareInterface* camCtrl) 290 : mCameraHandle(CameraHandle), 291 mChannelId(ChannelId), 292 mWidth(Width), 293 mHeight(Height), 294 mFormat(Format), 295 mNumBuffers(NumBuffers), 296 p_mm_ops(mm_ops), 297 mExtImgMode(imgmode), 298 mHalCamCtrl(camCtrl) 299 { 300 mInit = false; 301 mActive = false; 302 303 mStreamId = 0; 304 m_flag_no_cb = FALSE; 305 m_flag_stream_on = TRUE; 306 307 /* memset*/ 308 memset(&mCrop, 0, sizeof(mm_camera_rect_t)); 309 } 310 311 QCameraStream::~QCameraStream () 312 { 313 } 314 315 void QCameraStream::release() { 316 return; 317 } 318 319 int32_t QCameraStream::setCrop() 320 { 321 mm_camera_rect_t v4l2_crop; 322 int32_t rc = 0; 323 memset(&v4l2_crop,0,sizeof(v4l2_crop)); 324 325 if(!mActive) { 326 ALOGE("%s: Stream:%d is not active", __func__, mStreamId); 327 return -1; 328 } 329 330 rc = p_mm_ops->ops->get_stream_parm(mCameraHandle, 331 mChannelId, 332 mStreamId, 333 MM_CAMERA_STREAM_CROP, 334 &v4l2_crop); 335 ALOGI("%s: Crop info received: %d, %d, %d, %d ", 336 __func__, 337 v4l2_crop.left, 338 v4l2_crop.top, 339 v4l2_crop.width, 340 v4l2_crop.height); 341 if (rc == 0) { 342 mCrop.offset_x = v4l2_crop.left; 343 mCrop.offset_y = v4l2_crop.top; 344 mCrop.width = v4l2_crop.width; 345 mCrop.height = v4l2_crop.height; 346 } 347 return rc; 348 } 349 350 }; // namespace android 351