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