1bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/* 2bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** Copyright (c) 2011-2012 Code Aurora Forum. All rights reserved. 3bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** 4bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** Licensed under the Apache License, Version 2.0 (the "License"); 5bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** you may not use this file except in compliance with the License. 6bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** You may obtain a copy of the License at 7bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** 8bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** http://www.apache.org/licenses/LICENSE-2.0 9bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** 10bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** Unless required by applicable law or agreed to in writing, software 11bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** distributed under the License is distributed on an "AS IS" BASIS, 12bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** See the License for the specific language governing permissions and 14bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani** limitations under the License. 15bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani*/ 16bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 17bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/*#error uncomment this for compiler test!*/ 18bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 19bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani//#define ALOG_NDEBUG 0 20bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#define ALOG_NIDEBUG 0 21fece04335ca331d76bf84f75d8818f1b24916f4eAjay Dudani#define LOG_TAG "QCameraHWI_Mem" 22bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <utils/Log.h> 23bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 24bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <utils/Errors.h> 25bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <utils/threads.h> 26bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani//#include <binder/MemoryHeapPmem.h> 27bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <utils/String16.h> 28bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <sys/types.h> 29bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <sys/stat.h> 30bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <unistd.h> 31bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <fcntl.h> 32bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <cutils/properties.h> 33bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <math.h> 34bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#if HAVE_ANDROID_OS 35bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <linux/android_pmem.h> 36bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif 37bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <linux/ioctl.h> 38bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include "QCameraParameters.h" 39bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <media/mediarecorder.h> 40bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include <gralloc_priv.h> 41bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 42bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#include "QCameraHWI_Mem.h" 43bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 44bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#define CAMERA_HAL_UNUSED(expr) do { (void)(expr); } while (0) 45bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 46bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/* QCameraHardwareInterface class implementation goes here*/ 47bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani/* following code implement the contol logic of this class*/ 48bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 49bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudaninamespace android { 50bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 51bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 52bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatic bool register_buf(int size, 53bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int frame_size, 54bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int cbcr_offset, 55bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int yoffset, 56bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int pmempreviewfd, 57bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani uint32_t offset, 58bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani uint8_t *buf, 59bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int pmem_type, 60bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani bool vfe_can_write, 61bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani bool register_buffer = true); 62bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 63bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#if 0 64bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniMMCameraDL::MMCameraDL(){ 65bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("MMCameraDL: E"); 66bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani libmmcamera = NULL; 67bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#if DLOPEN_LIBMMCAMERA 68bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani libmmcamera = ::dlopen("liboemcamera.so", RTLD_NOW); 69bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif 70bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("Open MM camera DL libeomcamera loaded at %p ", libmmcamera); 71bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("MMCameraDL: X"); 72bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 73bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 74bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanivoid * MMCameraDL::pointer(){ 75bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani return libmmcamera; 76bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 77bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 78bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniMMCameraDL::~MMCameraDL(){ 79bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("~MMCameraDL: E"); 80bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani LINK_mm_camera_destroy(); 81bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if (libmmcamera != NULL) { 82bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ::dlclose(libmmcamera); 83bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("closed MM Camera DL "); 84bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 85bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani libmmcamera = NULL; 86bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("~MMCameraDL: X"); 87bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 88bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 89bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 90bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudaniwp<MMCameraDL> MMCameraDL::instance; 91bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniMutex MMCameraDL::singletonLock; 92bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 93bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 94bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanisp<MMCameraDL> MMCameraDL::getInstance(){ 95bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani Mutex::Autolock instanceLock(singletonLock); 96bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani sp<MMCameraDL> mmCamera = instance.promote(); 97bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if(mmCamera == NULL){ 98bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mmCamera = new MMCameraDL(); 99bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani instance = mmCamera; 100bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 101bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani return mmCamera; 102bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 103bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif 104bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 105bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniMemPool::MemPool(int buffer_size, int num_buffers, 106bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int frame_size, 107bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani const char *name) : 108bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mBufferSize(buffer_size), 109bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mNumBuffers(num_buffers), 110bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mFrameSize(frame_size), 111bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mBuffers(NULL), mName(name) 112bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{ 113bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int page_size_minus_1 = getpagesize() - 1; 114bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mAlignedBufferSize = (buffer_size + page_size_minus_1) & (~page_size_minus_1); 115bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 116bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 117bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanivoid MemPool::completeInitialization() 118bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{ 119bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // If we do not know how big the frame will be, we wait to allocate 120bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // the buffers describing the individual frames until we do know their 121bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // size. 122bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 123bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if (mFrameSize > 0) { 124bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mBuffers = new sp<MemoryBase>[mNumBuffers]; 125bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani for (int i = 0; i < mNumBuffers; i++) { 126bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mBuffers[i] = new 127bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani MemoryBase(mHeap, 128bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani i * mAlignedBufferSize, 129bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mFrameSize); 130bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 131bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 132bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 133bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 134bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniAshmemPool::AshmemPool(int buffer_size, int num_buffers, 135bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int frame_size, 136bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani const char *name) : 137bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani MemPool(buffer_size, 138bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani num_buffers, 139bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani frame_size, 140bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani name) 141bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{ 142bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("constructing MemPool %s backed by ashmem: " 143bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani "%d frames @ %d uint8_ts, " 144bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani "buffer size %d", 145bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mName, 146bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani num_buffers, frame_size, buffer_size); 147bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 148bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int page_mask = getpagesize() - 1; 149bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int ashmem_size = buffer_size * num_buffers; 150bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ashmem_size += page_mask; 151bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ashmem_size &= ~page_mask; 152bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 153bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mHeap = new MemoryHeapBase(ashmem_size); 154bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 155bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani completeInitialization(); 156bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 157bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 158bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatic bool register_buf(int size, 159bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int frame_size, 160bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int cbcr_offset, 161bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int yoffset, 162bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int pmempreviewfd, 163bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani uint32_t offset, 164bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani uint8_t *buf, 165bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int pmem_type, 166bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani bool vfe_can_write, 167bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani bool register_buffer) 168bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{ 169bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani /*TODO*/ 170bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani /* 171bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani struct msm_pmem_info pmemBuf; 172bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani CAMERA_HAL_UNUSED(frame_size); 173bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 174bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.type = pmem_type; 175bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.fd = pmempreviewfd; 176bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.offset = offset; 177bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.len = size; 178bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.vaddr = buf; 179bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.y_off = yoffset; 180bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.cbcr_off = cbcr_offset; 181bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 182bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.active = vfe_can_write; 183bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 184bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("register_buf: reg = %d buffer = %p", 185bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani !register_buffer, buf); 186bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if(native_start_ops(register_buffer ? CAMERA_OPS_REGISTER_BUFFER : 187bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani CAMERA_OPS_UNREGISTER_BUFFER ,(void *)&pmemBuf) < 0) { 188bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGE("register_buf: MSM_CAM_IOCTL_(UN)REGISTER_PMEM error %s", 189bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani strerror(errno)); 190bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani return false; 191bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani }*/ 192bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 193bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani return true; 194bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 195bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 196bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 197bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#if 0 198bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanibool register_record_buffers(bool register_buffer) { 199bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGI("%s: (%d) E", __FUNCTION__, register_buffer); 200bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani struct msm_pmem_info pmemBuf; 201bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 202bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani for (int cnt = 0; cnt < VIDEO_BUFFER_COUNT; ++cnt) { 203bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.type = MSM_PMEM_VIDEO; 204bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.fd = mRecordHeap->mHeap->getHeapID(); 205bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.offset = mRecordHeap->mAlignedBufferSize * cnt; 206bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.len = mRecordHeap->mBufferSize; 207bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.vaddr = (uint8_t *)mRecordHeap->mHeap->base() + mRecordHeap->mAlignedBufferSize * cnt; 208bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.y_off = 0; 209bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.cbcr_off = recordframes[0].cbcr_off; 210bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if(register_buffer == true) { 211bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.active = (cnt<ACTIVE_VIDEO_BUFFERS); 212bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if( (mVpeEnabled) && (cnt == kRecordBufferCount-1)) { 213bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.type = MSM_PMEM_VIDEO_VPE; 214bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.active = 1; 215bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 216bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } else { 217bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemBuf.active = false; 218bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 219bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 220bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("register_buf: reg = %d buffer = %p", !register_buffer, 221bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani (void *)pmemBuf.vaddr); 222bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if(native_start_ops(register_buffer ? CAMERA_OPS_REGISTER_BUFFER : 223bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani CAMERA_OPS_UNREGISTER_BUFFER ,(void *)&pmemBuf) < 0) { 224bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGE("register_buf: MSM_CAM_IOCTL_(UN)REGISTER_PMEM error %s", 225bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani strerror(errno)); 226bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani return false; 227bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 228bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 229bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani return true; 230bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 231bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif 232bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#if 0 233bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniPmemPool::PmemPool(const char *pmem_pool, 234bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int flags, 235bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int pmem_type, 236bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int buffer_size, int num_buffers, 237bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int frame_size, int cbcr_offset, 238bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int yOffset, const char *name) : 239bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani MemPool(buffer_size,num_buffers,frame_size,name), 240bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mPmemType(pmem_type), 241bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mCbCrOffset(cbcr_offset), 242bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani myOffset(yOffset) 243bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{ 244bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGI("constructing MemPool %s backed by pmem pool %s: " 245bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani "%d frames @ %d bytes, buffer size %d", 246bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mName, 247bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmem_pool, num_buffers, frame_size, 248bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani buffer_size); 249bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 250bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //mMMCameraDLRef = MMCameraDL::getInstance(); 251bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 252bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 253bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // Make a new mmap'ed heap that can be shared across processes. 254bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // mAlignedBufferSize is already in 4k aligned. (do we need total size necessary to be in power of 2??) 255bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mAlignedSize = mAlignedBufferSize * num_buffers; 256bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 257bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani sp<MemoryHeapBase> masterHeap = 258bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani new MemoryHeapBase(pmem_pool, mAlignedSize, flags); 259bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 260bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if (masterHeap->getHeapID() < 0) { 261bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGE("failed to construct master heap for pmem pool %s", pmem_pool); 262bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani masterHeap.clear(); 263bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani return; 264bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 265bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 266bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani sp<MemoryHeapPmem> pmemHeap = new MemoryHeapPmem(masterHeap, flags); 267bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if (pmemHeap->getHeapID() >= 0) { 268bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemHeap->slap(); 269bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani masterHeap.clear(); 270bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mHeap = pmemHeap; 271bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmemHeap.clear(); 272bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 273bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mFd = mHeap->getHeapID(); 274bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if (::ioctl(mFd, PMEM_GET_SIZE, &mSize)) { 275bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGE("pmem pool %s ioctl(PMEM_GET_SIZE) error %s (%d)", 276bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmem_pool, 277bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ::strerror(errno), errno); 278bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mHeap.clear(); 279bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani return; 280bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 281bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 282bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGE("pmem pool %s ioctl(fd = %d, PMEM_GET_SIZE) is %ld", 283bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmem_pool, 284bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mFd, 285bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mSize.len); 286bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGE("mBufferSize=%d, mAlignedBufferSize=%d\n", mBufferSize, mAlignedBufferSize); 287bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 288bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#if 0 289bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // Unregister preview buffers with the camera drivers. Allow the VFE to write 290bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // to all preview buffers except for the last one. 291bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // Only Register the preview, snapshot and thumbnail buffers with the kernel. 292bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if( (strcmp("postview", mName) != 0) ){ 293bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int num_buf = num_buffers; 294bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if(!strcmp("preview", mName)) num_buf = kPreviewBufferCount; 295bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGD("num_buffers = %d", num_buf); 296bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani for (int cnt = 0; cnt < num_buf; ++cnt) { 297bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int active = 1; 298bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if(pmem_type == MSM_PMEM_VIDEO){ 299bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani active = (cnt<ACTIVE_VIDEO_BUFFERS); 300bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //When VPE is enabled, set the last record 301bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //buffer as active and pmem type as PMEM_VIDEO_VPE 302bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //as this is a requirement from VPE operation. 303bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //No need to set this pmem type to VIDEO_VPE while unregistering, 304bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //because as per camera stack design: "the VPE AXI is also configured 305bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //when VFE is configured for VIDEO, which is as part of preview 306bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //initialization/start. So during this VPE AXI config camera stack 307bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //will lookup the PMEM_VIDEO_VPE buffer and give it as o/p of VPE and 308bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani //change it's type to PMEM_VIDEO". 309bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if( (mVpeEnabled) && (cnt == kRecordBufferCount-1)) { 310bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani active = 1; 311bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmem_type = MSM_PMEM_VIDEO_VPE; 312bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 313bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV(" pmempool creating video buffers : active %d ", active); 314bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 315bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani else if (pmem_type == MSM_PMEM_PREVIEW){ 316bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani active = (cnt < ACTIVE_PREVIEW_BUFFERS); 317bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 318bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani else if ((pmem_type == MSM_PMEM_MAINIMG) 319bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani || (pmem_type == MSM_PMEM_THUMBNAIL)){ 320bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani active = (cnt < ACTIVE_ZSL_BUFFERS); 321bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 322bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani register_buf(mBufferSize, 323bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mFrameSize, mCbCrOffset, myOffset, 324bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mHeap->getHeapID(), 325bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mAlignedBufferSize * cnt, 326bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani (uint8_t *)mHeap->base() + mAlignedBufferSize * cnt, 327bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmem_type, 328bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani active); 329bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 330bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 331bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif 332bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani completeInitialization(); 333bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 334bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani else ALOGE("pmem pool %s error: could not create master heap!", 335bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani pmem_pool); 336bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGI("%s: (%s) X ", __FUNCTION__, mName); 337bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 338bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif 339bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 340bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniPmemPool::~PmemPool() 341bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{ 342135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim ALOGV("%s: %s E", __FUNCTION__, mName); 343bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#if 0 344bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if (mHeap != NULL) { 345bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // Unregister preview buffers with the camera drivers. 346bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // Only Unregister the preview, snapshot and thumbnail 347bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani // buffers with the kernel. 348bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if( (strcmp("postview", mName) != 0) ){ 349bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani int num_buffers = mNumBuffers; 350bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if(!strcmp("preview", mName)) num_buffers = PREVIEW_BUFFER_COUNT; 351bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani for (int cnt = 0; cnt < num_buffers; ++cnt) { 352bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani register_buf(mBufferSize, 353bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mFrameSize, 354bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mCbCrOffset, 355bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani myOffset, 356bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mHeap->getHeapID(), 357bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mAlignedBufferSize * cnt, 358bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani (uint8_t *)mHeap->base() + mAlignedBufferSize * cnt, 359bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mPmemType, 360bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani false, 361bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani false /* unregister */); 362bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 363bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 364bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 365bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mMMCameraDLRef.clear(); 366bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani#endif 367135e2a761459f56ff1313375ee5f189de3d557d3taeyol.kim ALOGV("%s: %s X", __FUNCTION__, mName); 368bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 369bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay DudaniMemPool::~MemPool() 370bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{ 371bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("destroying MemPool %s", mName); 372bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if (mFrameSize > 0) 373bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani delete [] mBuffers; 374bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mHeap.clear(); 375bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani ALOGV("destroying MemPool %s completed", mName); 376bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 377bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 378bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 379bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudanistatus_t MemPool::dump(int fd, const Vector<String16>& args) const 380bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani{ 381bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani const size_t SIZE = 256; 382bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani char buffer[SIZE]; 383bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani String8 result; 384bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani CAMERA_HAL_UNUSED(args); 385bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani snprintf(buffer, 255, "QualcommCameraHardware::AshmemPool::dump\n"); 386bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani result.append(buffer); 387bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if (mName) { 388bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani snprintf(buffer, 255, "mem pool name (%s)\n", mName); 389bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani result.append(buffer); 390bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 391bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani if (mHeap != 0) { 392bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani snprintf(buffer, 255, "heap base(%p), size(%d), flags(%d), device(%s)\n", 393bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mHeap->getBase(), mHeap->getSize(), 394bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mHeap->getFlags(), mHeap->getDevice()); 395bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani result.append(buffer); 396bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani } 397bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani snprintf(buffer, 255, 398bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani "buffer size (%d), number of buffers (%d), frame size(%d)", 399bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani mBufferSize, mNumBuffers, mFrameSize); 400bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani result.append(buffer); 401bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani write(fd, result.string(), result.size()); 402bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani return NO_ERROR; 403bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani} 404bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani 405bf1bd919afd1e5e15eaeda79f8b5f83abc1ecb7aAjay Dudani}; 406