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 ALOG_NDEBUG 0
     23 #define ALOG_NIDEBUG 0
     24 #define LOG_TAG "QCameraHWI_Mem"
     25 #include <utils/Log.h>
     26 
     27 #include <utils/Errors.h>
     28 #include <utils/threads.h>
     29 #include <utils/String16.h>
     30 #include <sys/types.h>
     31 #include <sys/stat.h>
     32 #include <unistd.h>
     33 #include <fcntl.h>
     34 #include <cutils/properties.h>
     35 #include <math.h>
     36 #if __ANDROID__
     37 #include <linux/android_pmem.h>
     38 #endif
     39 #include <linux/ioctl.h>
     40 #include <camera/QCameraParameters.h>
     41 #include <media/mediarecorder.h>
     42 #include <gralloc_priv.h>
     43 
     44 #include "QCameraHWI_Mem.h"
     45 
     46 #define CAMERA_HAL_UNUSED(expr) do { (void)(expr); } while (0)
     47 
     48 /* QCameraHardwareInterface class implementation goes here*/
     49 /* following code implement the contol logic of this class*/
     50 
     51 namespace android {
     52 
     53 
     54 static bool register_buf(int size,
     55                          int frame_size,
     56                          int cbcr_offset,
     57                          int yoffset,
     58                          int pmempreviewfd,
     59                          uint32_t offset,
     60                          uint8_t *buf,
     61                          int pmem_type,
     62                          bool vfe_can_write,
     63                          bool register_buffer = true);
     64 
     65 MemPool::MemPool(int buffer_size, int num_buffers,
     66                                          int frame_size,
     67                                          const char *name) :
     68     mBufferSize(buffer_size),
     69     mNumBuffers(num_buffers),
     70     mFrameSize(frame_size),
     71     mBuffers(NULL), mName(name)
     72 {
     73     int page_size_minus_1 = getpagesize() - 1;
     74     mAlignedBufferSize = (buffer_size + page_size_minus_1) & (~page_size_minus_1);
     75 }
     76 
     77 void MemPool::completeInitialization()
     78 {
     79     // If we do not know how big the frame will be, we wait to allocate
     80     // the buffers describing the individual frames until we do know their
     81     // size.
     82 
     83     if (mFrameSize > 0) {
     84         mBuffers = new sp<MemoryBase>[mNumBuffers];
     85         for (int i = 0; i < mNumBuffers; i++) {
     86             mBuffers[i] = new
     87                 MemoryBase(mHeap,
     88                            i * mAlignedBufferSize,
     89                            mFrameSize);
     90         }
     91     }
     92 }
     93 
     94 AshmemPool::AshmemPool(int buffer_size, int num_buffers,
     95                                                int frame_size,
     96                                                const char *name) :
     97     MemPool(buffer_size,
     98                                     num_buffers,
     99                                     frame_size,
    100                                     name)
    101 {
    102     ALOGV("constructing MemPool %s backed by ashmem: "
    103          "%d frames @ %d uint8_ts, "
    104          "buffer size %d",
    105          mName,
    106          num_buffers, frame_size, buffer_size);
    107 
    108     int page_mask = getpagesize() - 1;
    109     int ashmem_size = buffer_size * num_buffers;
    110     ashmem_size += page_mask;
    111     ashmem_size &= ~page_mask;
    112 
    113     mHeap = new MemoryHeapBase(ashmem_size);
    114 
    115     completeInitialization();
    116 }
    117 
    118 static bool register_buf(int size,
    119                          int frame_size,
    120                          int cbcr_offset,
    121                          int yoffset,
    122                          int pmempreviewfd,
    123                          uint32_t offset,
    124                          uint8_t *buf,
    125                          int pmem_type,
    126                          bool vfe_can_write,
    127                          bool register_buffer)
    128 {
    129     return true;
    130 
    131 }
    132 
    133 PmemPool::~PmemPool()
    134 {
    135     ALOGI("%s: %s E", __FUNCTION__, mName);
    136 
    137     ALOGI("%s: %s X", __FUNCTION__, mName);
    138 }
    139 MemPool::~MemPool()
    140 {
    141     ALOGV("destroying MemPool %s", mName);
    142     if (mFrameSize > 0)
    143         delete [] mBuffers;
    144     mHeap.clear();
    145     ALOGV("destroying MemPool %s completed", mName);
    146 }
    147 
    148 
    149 status_t MemPool::dump(int fd, const Vector<String16>& args) const
    150 {
    151     const size_t SIZE = 256;
    152     char buffer[SIZE];
    153     String8 result;
    154     CAMERA_HAL_UNUSED(args);
    155     snprintf(buffer, 255, "QualcommCameraHardware::AshmemPool::dump\n");
    156     result.append(buffer);
    157     if (mName) {
    158         snprintf(buffer, 255, "mem pool name (%s)\n", mName);
    159         result.append(buffer);
    160     }
    161     if (mHeap != 0) {
    162         snprintf(buffer, 255, "heap base(%p), size(%d), flags(%d), device(%s)\n",
    163                  mHeap->getBase(), mHeap->getSize(),
    164                  mHeap->getFlags(), mHeap->getDevice());
    165         result.append(buffer);
    166     }
    167     snprintf(buffer, 255,
    168              "buffer size (%d), number of buffers (%d), frame size(%d)",
    169              mBufferSize, mNumBuffers, mFrameSize);
    170     result.append(buffer);
    171     write(fd, result.string(), result.size());
    172     return NO_ERROR;
    173 }
    174 
    175 };
    176