Home | History | Annotate | Download | only in src
      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 LOG_NDEBUG 0
     23 #define LOG_NDDEBUG 0
     24 #define LOG_NIDEBUG 0
     25 #define LOG_TAG "QCameraHWI_Still"
     26 #include <utils/Log.h>
     27 #include <utils/threads.h>
     28 #include <fcntl.h>
     29 #include <sys/mman.h>
     30 #include <media/mediarecorder.h>
     31 #include <math.h>
     32 #include "QCameraHAL.h"
     33 #include "QCameraHWI.h"
     34 #include "mm_jpeg_interface.h"
     35 
     36 
     37 /* following code implement the still image capture & encoding logic of this class*/
     38 namespace android {
     39 
     40 QCameraStream_SnapshotMain::
     41 QCameraStream_SnapshotMain(uint32_t CameraHandle,
     42                            uint32_t ChannelId,
     43                            uint32_t Width,
     44                            uint32_t Height,
     45                            uint32_t Format,
     46                            uint8_t NumBuffers,
     47                            mm_camera_vtbl_t *mm_ops,
     48                            mm_camera_img_mode imgmode,
     49                            camera_mode_t mode,
     50                            QCameraHardwareInterface* camCtrl)
     51   :QCameraStream(CameraHandle,
     52                  ChannelId,
     53                  Width,
     54                  Height,
     55                  Format,
     56                  NumBuffers,
     57                  mm_ops,
     58                  imgmode,
     59                  mode,
     60                  camCtrl)
     61 {
     62 }
     63 
     64 QCameraStream_SnapshotMain::~QCameraStream_SnapshotMain()
     65 {
     66     release();
     67 }
     68 
     69 void QCameraStream_SnapshotMain::release()
     70 {
     71     streamOff(0);
     72     deinitStream();
     73 
     74 }
     75 
     76 status_t QCameraStream_SnapshotMain::initStream(uint8_t no_cb_needed, uint8_t stream_on)
     77 {
     78     status_t ret = NO_ERROR;
     79 
     80     if(mHalCamCtrl->isZSLMode()) {
     81         mNumBuffers = mHalCamCtrl->getZSLQueueDepth() + 3;
     82     } else if (mHalCamCtrl->mHdrInfo.hdr_on) {
     83         mNumBuffers = mHalCamCtrl->mHdrInfo.num_frame;
     84     } else {
     85         mNumBuffers = mHalCamCtrl->getNumOfSnapshots();
     86     }
     87     ret = QCameraStream::initStream(no_cb_needed, stream_on);
     88     return ret;;
     89 }
     90 
     91 int QCameraStream_SnapshotMain::getBuf(mm_camera_frame_len_offset *frame_offset_info,
     92                                        uint8_t num_bufs,
     93                                        uint8_t *initial_reg_flag,
     94                                        mm_camera_buf_def_t  *bufs)
     95 {
     96     int ret = MM_CAMERA_OK;
     97     ALOGE("%s : E", __func__);
     98 
     99     if (mNumBuffers < num_bufs) {
    100         mNumBuffers = num_bufs;
    101     }
    102     if ((mNumBuffers == 0) || (mNumBuffers > MM_CAMERA_MAX_NUM_FRAMES)) {
    103         ALOGE("%s: Invalid number of buffers (=%d) requested!",
    104              __func__, mNumBuffers);
    105         return BAD_VALUE;
    106     }
    107 
    108     memset(mSnapshotStreamBuf, 0, sizeof(mSnapshotStreamBuf));
    109     memcpy(&mFrameOffsetInfo, frame_offset_info, sizeof(mFrameOffsetInfo));
    110     ret = mHalCamCtrl->initHeapMem(&mHalCamCtrl->mSnapshotMemory,
    111                                    mNumBuffers,
    112                                    mFrameOffsetInfo.frame_len,
    113                                    MSM_PMEM_MAINIMG,
    114                                    &mFrameOffsetInfo,
    115                                    mSnapshotStreamBuf);
    116 
    117     if(MM_CAMERA_OK == ret) {
    118         for(int i = 0; i < num_bufs; i++) {
    119             bufs[i] = mSnapshotStreamBuf[i];
    120             initial_reg_flag[i] = (TRUE == m_flag_stream_on)? TRUE : FALSE;
    121         }
    122     }
    123 
    124     /* If we have reached here successfully, we have allocated buffer.
    125        Set state machine.*/
    126     ALOGD("%s: X", __func__);
    127     return ret;
    128 
    129 }
    130 
    131 int QCameraStream_SnapshotMain::putBuf(uint8_t num_bufs, mm_camera_buf_def_t *bufs)
    132 {
    133     ALOGE("%s: Release Snapshot main Memory",__func__);
    134     return mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mSnapshotMemory);
    135 }
    136 
    137 int QCameraStream_SnapshotThumbnail::putBuf(uint8_t num_bufs, mm_camera_buf_def_t *bufs)
    138 {
    139      ALOGE("%s: Release Snapshot thumbnail Memory",__func__);
    140      return mHalCamCtrl->releaseHeapMem(&mHalCamCtrl->mThumbnailMemory);
    141 }
    142 
    143 QCameraStream_SnapshotThumbnail::
    144 QCameraStream_SnapshotThumbnail(uint32_t CameraHandle,
    145                                 uint32_t ChannelId,
    146                                 uint32_t Width,
    147                                 uint32_t Height,
    148                                 uint32_t Format,
    149                                 uint8_t NumBuffers,
    150                                 mm_camera_vtbl_t *mm_ops,
    151                                 mm_camera_img_mode imgmode,
    152                                 camera_mode_t mode,
    153                                 QCameraHardwareInterface* camCtrl)
    154   :QCameraStream(CameraHandle,
    155                  ChannelId,
    156                  Width,
    157                  Height,
    158                  Format,
    159                  NumBuffers,
    160                  mm_ops,
    161                  imgmode,
    162                  mode,
    163                  camCtrl)
    164 {
    165 
    166 }
    167 
    168 QCameraStream_SnapshotThumbnail::~QCameraStream_SnapshotThumbnail()
    169 {
    170      release();
    171 }
    172 
    173 void QCameraStream_SnapshotThumbnail::release()
    174 {
    175     streamOff(0);
    176     deinitStream();
    177 }
    178 
    179 status_t QCameraStream_SnapshotThumbnail::initStream(uint8_t no_cb_needed, uint8_t stream_on)
    180 {
    181     status_t ret = NO_ERROR;
    182 
    183     if(mHalCamCtrl->isZSLMode()) {
    184         mNumBuffers = mHalCamCtrl->getZSLQueueDepth() + 3;
    185     } else if (mHalCamCtrl->mHdrInfo.hdr_on) {
    186         mNumBuffers = mHalCamCtrl->mHdrInfo.num_frame;
    187     } else {
    188         mNumBuffers = mHalCamCtrl->getNumOfSnapshots();
    189     }
    190     ret = QCameraStream::initStream(no_cb_needed, stream_on);
    191     return ret;;
    192 }
    193 
    194 status_t QCameraStream_SnapshotThumbnail::getBuf(mm_camera_frame_len_offset *frame_offset_info,
    195                                                  uint8_t num_bufs,
    196                                                  uint8_t *initial_reg_flag,
    197                                                  mm_camera_buf_def_t  *bufs)
    198 {
    199     int ret = MM_CAMERA_OK;
    200 
    201     if (mNumBuffers < num_bufs) {
    202         mNumBuffers = num_bufs;
    203     }
    204     if ((mNumBuffers == 0) || (mNumBuffers > MM_CAMERA_MAX_NUM_FRAMES)) {
    205         ALOGE("%s: Invalid number of buffers (=%d) requested!",
    206              __func__, mNumBuffers);
    207         return BAD_VALUE;
    208     }
    209 
    210     memset(mPostviewStreamBuf, 0, sizeof(mPostviewStreamBuf));
    211     memcpy(&mFrameOffsetInfo, frame_offset_info, sizeof(mFrameOffsetInfo));
    212     ret = mHalCamCtrl->initHeapMem(
    213                          &mHalCamCtrl->mThumbnailMemory,
    214                          mNumBuffers,
    215                          mFrameOffsetInfo.frame_len,
    216                          MSM_PMEM_THUMBNAIL,
    217                          &mFrameOffsetInfo,
    218                          mPostviewStreamBuf);
    219     if(MM_CAMERA_OK == ret) {
    220         for(int i = 0; i < num_bufs; i++) {
    221             bufs[i] = mPostviewStreamBuf[i];
    222             initial_reg_flag[i] = true;
    223         }
    224     }
    225 
    226     return ret;
    227 }
    228 
    229 
    230 }; // namespace android
    231 
    232