1 /* Copyright (c) 2012-2015, The Linux Foundataion. All rights reserved.
2  *
3  * Redistribution and use in source and binary forms, with or without
4  * modification, are permitted provided that the following conditions are
5  * met:
6  *     * Redistributions of source code must retain the above copyright
7  *       notice, this list of conditions and the following disclaimer.
8  *     * Redistributions in binary form must reproduce the above
9  *       copyright notice, this list of conditions and the following
10  *       disclaimer in the documentation and/or other materials provided
11  *       with the distribution.
12  *     * Neither the name of The Linux Foundation nor the names of its
13  *       contributors may be used to endorse or promote products derived
14  *       from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
20  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
23  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
24  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
25  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
26  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  */
29 
30 #define LOG_TAG "QCamera3StreamMem"
31 
32 #include <string.h>
33 #include <fcntl.h>
34 #include <sys/mman.h>
35 #include <utils/Log.h>
36 #include <utils/Errors.h>
37 #include <gralloc_priv.h>
38 #include <qdMetaData.h>
39 #include "QCamera3Mem.h"
40 #include "QCamera3HWI.h"
41 
42 extern "C" {
43 #include <mm_camera_interface.h>
44 }
45 
46 using namespace android;
47 
48 namespace qcamera {
49 
50 /*===========================================================================
51  * FUNCTION   : QCamera3StreamMem
52  *
53  * DESCRIPTION: default constructor of QCamera3StreamMem
54  *
55  * PARAMETERS : none
56  *
57  * RETURN     : None
58  *==========================================================================*/
QCamera3StreamMem(uint32_t maxHeapBuffer,bool queueHeapBuffers)59 QCamera3StreamMem::QCamera3StreamMem(uint32_t maxHeapBuffer, bool queueHeapBuffers) :
60         mHeapMem(maxHeapBuffer),
61         mGrallocMem(maxHeapBuffer),
62         mMaxHeapBuffers(maxHeapBuffer),
63         mQueueHeapBuffers(queueHeapBuffers)
64 {
65 }
66 
67 /*===========================================================================
68  * FUNCTION   : QCamera3StreamMem
69  *
70  * DESCRIPTION: destructor of QCamera3StreamMem
71  *
72  * PARAMETERS : none
73  *
74  * RETURN     : None
75  *==========================================================================*/
~QCamera3StreamMem()76 QCamera3StreamMem::~QCamera3StreamMem()
77 {
78     clear();
79 }
80 
81 /*===========================================================================
82  * FUNCTION   : getCnt
83  *
84  * DESCRIPTION: query number of buffers allocated/registered
85  *
86  * PARAMETERS : none
87  *
88  * RETURN     : number of buffers allocated
89  *==========================================================================*/
getCnt()90 uint32_t QCamera3StreamMem::getCnt()
91 {
92     Mutex::Autolock lock(mLock);
93 
94     return (mHeapMem.getCnt() + mGrallocMem.getCnt());
95 }
96 
97 /*===========================================================================
98  * FUNCTION   : getRegFlags
99  *
100  * DESCRIPTION: query initial reg flags
101  *
102  * PARAMETERS :
103  *   @regFlags: initial reg flags of the allocated/registered buffers
104  *
105  * RETURN     : int32_t type of status
106  *              NO_ERROR  -- success
107  *              none-zero failure code
108  *==========================================================================*/
getRegFlags(uint8_t * regFlags)109 int QCamera3StreamMem::getRegFlags(uint8_t * regFlags)
110 {
111     // Assume that all buffers allocated can be queued.
112     for (uint32_t i = 0; i < mHeapMem.getCnt(); i ++)
113         regFlags[i] = (mQueueHeapBuffers ? 1 : 0);
114     return NO_ERROR;
115 }
116 
117 /*===========================================================================
118  * FUNCTION   : getFd
119  *
120  * DESCRIPTION: return file descriptor of the indexed buffer
121  *
122  * PARAMETERS :
123  *   @index   : index of the buffer
124  *
125  * RETURN     : file descriptor
126  *==========================================================================*/
getFd(uint32_t index)127 int QCamera3StreamMem::getFd(uint32_t index)
128 {
129     Mutex::Autolock lock(mLock);
130 
131     if (index < mMaxHeapBuffers)
132         return mHeapMem.getFd(index);
133     else
134         return mGrallocMem.getFd(index);
135 }
136 
137 /*===========================================================================
138  * FUNCTION   : getSize
139  *
140  * DESCRIPTION: return buffer size of the indexed buffer
141  *
142  * PARAMETERS :
143  *   @index   : index of the buffer
144  *
145  * RETURN     : buffer size
146  *==========================================================================*/
getSize(uint32_t index)147 ssize_t QCamera3StreamMem::getSize(uint32_t index)
148 {
149     Mutex::Autolock lock(mLock);
150 
151     if (index < mMaxHeapBuffers)
152         return mHeapMem.getSize(index);
153     else
154         return mGrallocMem.getSize(index);
155 }
156 
157 /*===========================================================================
158  * FUNCTION   : invalidateCache
159  *
160  * DESCRIPTION: invalidate the cache of the indexed buffer
161  *
162  * PARAMETERS :
163  *   @index   : index of the buffer
164  *
165  * RETURN     : int32_t type of status
166  *              NO_ERROR  -- success
167  *              none-zero failure code
168  *==========================================================================*/
invalidateCache(uint32_t index)169 int QCamera3StreamMem::invalidateCache(uint32_t index)
170 {
171     Mutex::Autolock lock(mLock);
172 
173     if (index < mMaxHeapBuffers)
174         return mHeapMem.invalidateCache(index);
175     else
176         return mGrallocMem.invalidateCache(index);
177 }
178 
179 /*===========================================================================
180  * FUNCTION   : cleanInvalidateCache
181  *
182  * DESCRIPTION: clean and invalidate the cache of the indexed buffer
183  *
184  * PARAMETERS :
185  *   @index   : index of the buffer
186  *
187  * RETURN     : int32_t type of status
188  *              NO_ERROR  -- success
189  *              none-zero failure code
190  *==========================================================================*/
cleanInvalidateCache(uint32_t index)191 int QCamera3StreamMem::cleanInvalidateCache(uint32_t index)
192 {
193     Mutex::Autolock lock(mLock);
194 
195     if (index < mMaxHeapBuffers)
196         return mHeapMem.cleanInvalidateCache(index);
197     else
198         return mGrallocMem.cleanInvalidateCache(index);
199 }
200 
201 /*===========================================================================
202  * FUNCTION   : getBufDef
203  *
204  * DESCRIPTION: query detailed buffer information
205  *
206  * PARAMETERS :
207  *   @offset  : [input] frame buffer offset
208  *   @bufDef  : [output] reference to struct to store buffer definition
209  *   @index   : [input] index of the buffer
210  *
211  * RETURN     : int32_t type of status
212  *              NO_ERROR  -- success
213  *              none-zero failure code
214  *==========================================================================*/
getBufDef(const cam_frame_len_offset_t & offset,mm_camera_buf_def_t & bufDef,uint32_t index)215 int32_t QCamera3StreamMem::getBufDef(const cam_frame_len_offset_t &offset,
216         mm_camera_buf_def_t &bufDef, uint32_t index)
217 {
218     int32_t ret = NO_ERROR;
219 
220     if (index < mMaxHeapBuffers)
221         ret = mHeapMem.getBufDef(offset, bufDef, index);
222     else
223         ret = mGrallocMem.getBufDef(offset, bufDef, index);
224 
225     bufDef.mem_info = (void *)this;
226 
227     return ret;
228 }
229 
230 /*===========================================================================
231  * FUNCTION   : getPtr
232  *
233  * DESCRIPTION: return virtual address of the indexed buffer
234  *
235  * PARAMETERS :
236  *   @index   : index of the buffer
237  *
238  * RETURN     : virtual address
239  *==========================================================================*/
getPtr(uint32_t index)240 void* QCamera3StreamMem::getPtr(uint32_t index)
241 {
242     Mutex::Autolock lock(mLock);
243 
244     if (index < mMaxHeapBuffers)
245         return mHeapMem.getPtr(index);
246     else
247         return mGrallocMem.getPtr(index);
248 }
249 
250 /*===========================================================================
251  * FUNCTION   : valid
252  *
253  * DESCRIPTION: return whether there is a valid buffer at the current index
254  *
255  * PARAMETERS :
256  *   @index   : index of the buffer
257  *
258  * RETURN     : true if there is a buffer, false otherwise
259  *==========================================================================*/
valid(uint32_t index)260 bool QCamera3StreamMem::valid(uint32_t index)
261 {
262     Mutex::Autolock lock(mLock);
263 
264     if (index < mMaxHeapBuffers)
265         return (mHeapMem.getSize(index) > 0);
266     else
267         return (mGrallocMem.getSize(index) > 0);
268 }
269 
270 /*===========================================================================
271  * FUNCTION   : registerBuffer
272  *
273  * DESCRIPTION: registers frameworks-allocated gralloc buffer_handle_t
274  *
275  * PARAMETERS :
276  *   @buffers : buffer_handle_t pointer
277  *   @type :    cam_stream_type_t
278  *
279  * RETURN     : int32_t type of status
280  *              NO_ERROR  -- success
281  *              none-zero failure code
282  *==========================================================================*/
registerBuffer(buffer_handle_t * buffer,cam_stream_type_t type)283 int QCamera3StreamMem::registerBuffer(buffer_handle_t *buffer,
284         cam_stream_type_t type)
285 {
286     Mutex::Autolock lock(mLock);
287     return mGrallocMem.registerBuffer(buffer, type);
288 }
289 
290 
291 /*===========================================================================
292  * FUNCTION   : unregisterBuffer
293  *
294  * DESCRIPTION: unregister buffer
295  *
296  * PARAMETERS :
297  *   @idx     : unregister buffer at index 'idx'
298  *
299  * RETURN     : int32_t type of status
300  *              NO_ERROR  -- success
301  *              none-zero failure code
302  *==========================================================================*/
unregisterBuffer(size_t idx)303 int32_t QCamera3StreamMem::unregisterBuffer(size_t idx)
304 {
305     Mutex::Autolock lock(mLock);
306     return mGrallocMem.unregisterBuffer(idx);
307 }
308 
309 /*===========================================================================
310  * FUNCTION   : getMatchBufIndex
311  *
312  * DESCRIPTION: query buffer index by object ptr
313  *
314  * PARAMETERS :
315  *   @opaque  : opaque ptr
316  *
317  * RETURN     : buffer index if match found,
318  *              -1 if failed
319  *==========================================================================*/
getMatchBufIndex(void * object)320 int QCamera3StreamMem::getMatchBufIndex(void *object)
321 {
322     Mutex::Autolock lock(mLock);
323     return mGrallocMem.getMatchBufIndex(object);
324 }
325 
326 /*===========================================================================
327  * FUNCTION   : getBufferHandle
328  *
329  * DESCRIPTION: return framework pointer
330  *
331  * PARAMETERS :
332  *   @index   : index of the buffer
333  *
334  * RETURN     : buffer ptr if match found
335                 NULL if failed
336  *==========================================================================*/
getBufferHandle(uint32_t index)337 void *QCamera3StreamMem::getBufferHandle(uint32_t index)
338 {
339     Mutex::Autolock lock(mLock);
340     return mGrallocMem.getBufferHandle(index);
341 }
342 
343 /*===========================================================================
344  * FUNCTION   : unregisterBuffers
345  *
346  * DESCRIPTION: unregister buffers
347  *
348  * PARAMETERS : none
349  *
350  * RETURN     : none
351  *==========================================================================*/
unregisterBuffers()352 void QCamera3StreamMem::unregisterBuffers()
353 {
354     Mutex::Autolock lock(mLock);
355     mGrallocMem.unregisterBuffers();
356 }
357 
358 
359 /*===========================================================================
360  * FUNCTION   : allocate
361  *
362  * DESCRIPTION: allocate requested number of buffers of certain size
363  *
364  * PARAMETERS :
365  *   @count   : number of buffers to be allocated
366  *   @size    : lenght of the buffer to be allocated
367  *
368  * RETURN     : int32_t type of status
369  *              NO_ERROR  -- success
370  *              none-zero failure code
371  *==========================================================================*/
allocateAll(size_t size)372 int QCamera3StreamMem::allocateAll(size_t size)
373 {
374     Mutex::Autolock lock(mLock);
375     return mHeapMem.allocate(size);
376 }
377 
allocateOne(size_t size)378 int QCamera3StreamMem::allocateOne(size_t size)
379 {
380     Mutex::Autolock lock(mLock);
381     return mHeapMem.allocateOne(size);
382 }
383 
384 /*===========================================================================
385  * FUNCTION   : deallocate
386  *
387  * DESCRIPTION: deallocate heap buffers
388  *
389  * PARAMETERS : none
390  *
391  * RETURN     : none
392  *==========================================================================*/
deallocate()393 void QCamera3StreamMem::deallocate()
394 {
395     Mutex::Autolock lock(mLock);
396     mHeapMem.deallocate();
397 }
398 
399 /*===========================================================================
400  * FUNCTION   : markFrameNumber
401  *
402  * DESCRIPTION: We use this function from the request call path to mark the
403  *              buffers with the frame number they are intended for this info
404  *              is used later when giving out callback & it is duty of PP to
405  *              ensure that data for that particular frameNumber/Request is
406  *              written to this buffer.
407  * PARAMETERS :
408  *   @index   : index of the buffer
409  *   @frame#  : Frame number from the framework
410  *
411  * RETURN     : int32_t type of status
412  *              NO_ERROR  -- success
413  *              none-zero failure code
414  *==========================================================================*/
markFrameNumber(uint32_t index,uint32_t frameNumber)415 int32_t QCamera3StreamMem::markFrameNumber(uint32_t index, uint32_t frameNumber)
416 {
417     Mutex::Autolock lock(mLock);
418     if (index < mMaxHeapBuffers)
419         return mHeapMem.markFrameNumber(index, frameNumber);
420     else
421         return mGrallocMem.markFrameNumber(index, frameNumber);
422 }
423 
424 /*===========================================================================
425  * FUNCTION   : getFrameNumber
426  *
427  * DESCRIPTION: We use this to fetch the frameNumber for the request with which
428  *              this buffer was given to HAL
429  *
430  *
431  * PARAMETERS :
432  *   @index   : index of the buffer
433  *
434  * RETURN     : int32_t frameNumber
435  *              positive/zero  -- success
436  *              negative failure
437  *==========================================================================*/
getFrameNumber(uint32_t index)438 int32_t QCamera3StreamMem::getFrameNumber(uint32_t index)
439 {
440     Mutex::Autolock lock(mLock);
441     if (index < mMaxHeapBuffers)
442         return mHeapMem.getFrameNumber(index);
443     else
444         return mGrallocMem.getFrameNumber(index);
445 }
446 
447 /*===========================================================================
448  * FUNCTION   : getGrallocBufferIndex
449  *
450  * DESCRIPTION: We use this to fetch the gralloc buffer index based on frameNumber
451  *
452  * PARAMETERS :
453  *   @frameNumber : frame Number
454  *
455  * RETURN     : int32_t buffer index
456  *              positive/zero  -- success
457  *              negative failure
458  *==========================================================================*/
getGrallocBufferIndex(uint32_t frameNumber)459 int32_t QCamera3StreamMem::getGrallocBufferIndex(uint32_t frameNumber)
460 {
461     Mutex::Autolock lock(mLock);
462     int32_t index = mGrallocMem.getBufferIndex(frameNumber);
463     return index;
464 }
465 
466 /*===========================================================================
467  * FUNCTION   : getHeapBufferIndex
468  *
469  * DESCRIPTION: We use this to fetch the heap buffer index based on frameNumber
470  *
471  * PARAMETERS :
472  *   @frameNumber : frame Number
473  *
474  * RETURN     : int32_t buffer index
475  *              positive/zero  -- success
476  *              negative failure
477  *==========================================================================*/
getHeapBufferIndex(uint32_t frameNumber)478 int32_t QCamera3StreamMem::getHeapBufferIndex(uint32_t frameNumber)
479 {
480     Mutex::Autolock lock(mLock);
481     int32_t index = mHeapMem.getBufferIndex(frameNumber);
482     return index;
483 }
484 
485 }; //namespace qcamera
486