• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* Copyright (c) 2012-2016, The Linux Foundation. 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 // System dependencies
33 #include "gralloc_priv.h"
34 
35 // Camera dependencies
36 #include "QCamera3StreamMem.h"
37 
38 using namespace android;
39 
40 namespace qcamera {
41 
42 /*===========================================================================
43  * FUNCTION   : QCamera3StreamMem
44  *
45  * DESCRIPTION: default constructor of QCamera3StreamMem
46  *
47  * PARAMETERS : none
48  *
49  * RETURN     : None
50  *==========================================================================*/
QCamera3StreamMem(uint32_t maxHeapBuffer,bool queueHeapBuffers)51 QCamera3StreamMem::QCamera3StreamMem(uint32_t maxHeapBuffer, bool queueHeapBuffers) :
52         mHeapMem(maxHeapBuffer),
53         mGrallocMem(maxHeapBuffer),
54         mMaxHeapBuffers(maxHeapBuffer),
55         mQueueHeapBuffers(queueHeapBuffers)
56 {
57 }
58 
59 /*===========================================================================
60  * FUNCTION   : QCamera3StreamMem
61  *
62  * DESCRIPTION: destructor of QCamera3StreamMem
63  *
64  * PARAMETERS : none
65  *
66  * RETURN     : None
67  *==========================================================================*/
~QCamera3StreamMem()68 QCamera3StreamMem::~QCamera3StreamMem()
69 {
70     clear();
71 }
72 
73 /*===========================================================================
74  * FUNCTION   : getCnt
75  *
76  * DESCRIPTION: query number of buffers allocated/registered
77  *
78  * PARAMETERS : none
79  *
80  * RETURN     : number of buffers allocated
81  *==========================================================================*/
getCnt()82 uint32_t QCamera3StreamMem::getCnt()
83 {
84     Mutex::Autolock lock(mLock);
85 
86     return (mHeapMem.getCnt() + mGrallocMem.getCnt());
87 }
88 
89 /*===========================================================================
90  * FUNCTION   : getRegFlags
91  *
92  * DESCRIPTION: query initial reg flags
93  *
94  * PARAMETERS :
95  *   @regFlags: initial reg flags of the allocated/registered buffers
96  *
97  * RETURN     : int32_t type of status
98  *              NO_ERROR  -- success
99  *              none-zero failure code
100  *==========================================================================*/
getRegFlags(uint8_t * regFlags)101 int QCamera3StreamMem::getRegFlags(uint8_t * regFlags)
102 {
103     // Assume that all buffers allocated can be queued.
104     for (uint32_t i = 0; i < mHeapMem.getCnt(); i ++)
105         regFlags[i] = (mQueueHeapBuffers ? 1 : 0);
106     return NO_ERROR;
107 }
108 
109 /*===========================================================================
110  * FUNCTION   : getFd
111  *
112  * DESCRIPTION: return file descriptor of the indexed buffer
113  *
114  * PARAMETERS :
115  *   @index   : index of the buffer
116  *
117  * RETURN     : file descriptor
118  *==========================================================================*/
getFd(uint32_t index)119 int QCamera3StreamMem::getFd(uint32_t index)
120 {
121     Mutex::Autolock lock(mLock);
122 
123     if (index < mMaxHeapBuffers)
124         return mHeapMem.getFd(index);
125     else
126         return mGrallocMem.getFd(index);
127 }
128 
129 /*===========================================================================
130  * FUNCTION   : getSize
131  *
132  * DESCRIPTION: return buffer size of the indexed buffer
133  *
134  * PARAMETERS :
135  *   @index   : index of the buffer
136  *
137  * RETURN     : buffer size
138  *==========================================================================*/
getSize(uint32_t index)139 ssize_t QCamera3StreamMem::getSize(uint32_t index)
140 {
141     Mutex::Autolock lock(mLock);
142 
143     if (index < mMaxHeapBuffers)
144         return mHeapMem.getSize(index);
145     else
146         return mGrallocMem.getSize(index);
147 }
148 
149 /*===========================================================================
150  * FUNCTION   : invalidateCache
151  *
152  * DESCRIPTION: invalidate the cache of the indexed buffer
153  *
154  * PARAMETERS :
155  *   @index   : index of the buffer
156  *
157  * RETURN     : int32_t type of status
158  *              NO_ERROR  -- success
159  *              none-zero failure code
160  *==========================================================================*/
invalidateCache(uint32_t index)161 int QCamera3StreamMem::invalidateCache(uint32_t index)
162 {
163     Mutex::Autolock lock(mLock);
164 
165     if (index < mMaxHeapBuffers)
166         return mHeapMem.invalidateCache(index);
167     else
168         return mGrallocMem.invalidateCache(index);
169 }
170 
171 /*===========================================================================
172  * FUNCTION   : cleanInvalidateCache
173  *
174  * DESCRIPTION: clean and invalidate the cache of the indexed buffer
175  *
176  * PARAMETERS :
177  *   @index   : index of the buffer
178  *
179  * RETURN     : int32_t type of status
180  *              NO_ERROR  -- success
181  *              none-zero failure code
182  *==========================================================================*/
cleanInvalidateCache(uint32_t index)183 int QCamera3StreamMem::cleanInvalidateCache(uint32_t index)
184 {
185     Mutex::Autolock lock(mLock);
186 
187     if (index < mMaxHeapBuffers)
188         return mHeapMem.cleanInvalidateCache(index);
189     else
190         return mGrallocMem.cleanInvalidateCache(index);
191 }
192 
193 /*===========================================================================
194  * FUNCTION   : cleanCache
195  *
196  * DESCRIPTION: clean the cache of the indexed buffer
197  *
198  * PARAMETERS :
199  *   @index   : index of the buffer
200  *
201  * RETURN     : int32_t type of status
202  *              NO_ERROR  -- success
203  *              none-zero failure code
204  *==========================================================================*/
cleanCache(uint32_t index)205 int QCamera3StreamMem::cleanCache(uint32_t index)
206 {
207     Mutex::Autolock lock(mLock);
208 
209     if (index < mMaxHeapBuffers)
210         return mHeapMem.cleanCache(index);
211     else
212         return mGrallocMem.cleanCache(index);
213 }
214 
215 
216 /*===========================================================================
217  * FUNCTION   : getBufDef
218  *
219  * DESCRIPTION: query detailed buffer information
220  *
221  * PARAMETERS :
222  *   @offset  : [input] frame buffer offset
223  *   @bufDef  : [output] reference to struct to store buffer definition
224  *   @index   : [input] index of the buffer
225  *
226  * RETURN     : int32_t type of status
227  *              NO_ERROR  -- success
228  *              none-zero failure code
229  *==========================================================================*/
getBufDef(const cam_frame_len_offset_t & offset,mm_camera_buf_def_t & bufDef,uint32_t index)230 int32_t QCamera3StreamMem::getBufDef(const cam_frame_len_offset_t &offset,
231         mm_camera_buf_def_t &bufDef, uint32_t index)
232 {
233     int32_t ret = NO_ERROR;
234 
235     if (index < mMaxHeapBuffers)
236         ret = mHeapMem.getBufDef(offset, bufDef, index);
237     else
238         ret = mGrallocMem.getBufDef(offset, bufDef, index);
239 
240     bufDef.mem_info = (void *)this;
241 
242     return ret;
243 }
244 
245 /*===========================================================================
246  * FUNCTION   : getPtr
247  *
248  * DESCRIPTION: return virtual address of the indexed buffer
249  *
250  * PARAMETERS :
251  *   @index   : index of the buffer
252  *
253  * RETURN     : virtual address
254  *==========================================================================*/
getPtr(uint32_t index)255 void* QCamera3StreamMem::getPtr(uint32_t index)
256 {
257     Mutex::Autolock lock(mLock);
258 
259     if (index < mMaxHeapBuffers)
260         return mHeapMem.getPtr(index);
261     else
262         return mGrallocMem.getPtr(index);
263 }
264 
265 /*===========================================================================
266  * FUNCTION   : valid
267  *
268  * DESCRIPTION: return whether there is a valid buffer at the current index
269  *
270  * PARAMETERS :
271  *   @index   : index of the buffer
272  *
273  * RETURN     : true if there is a buffer, false otherwise
274  *==========================================================================*/
valid(uint32_t index)275 bool QCamera3StreamMem::valid(uint32_t index)
276 {
277     Mutex::Autolock lock(mLock);
278 
279     if (index < mMaxHeapBuffers)
280         return (mHeapMem.getSize(index) > 0);
281     else
282         return (mGrallocMem.getSize(index) > 0);
283 }
284 
285 /*===========================================================================
286  * FUNCTION   : registerBuffer
287  *
288  * DESCRIPTION: registers frameworks-allocated gralloc buffer_handle_t
289  *
290  * PARAMETERS :
291  *   @buffers : buffer_handle_t pointer
292  *   @type :    cam_stream_type_t
293  *
294  * RETURN     : int32_t type of status
295  *              NO_ERROR  -- success
296  *              none-zero failure code
297  *==========================================================================*/
registerBuffer(buffer_handle_t * buffer,cam_stream_type_t type)298 int QCamera3StreamMem::registerBuffer(buffer_handle_t *buffer,
299         cam_stream_type_t type)
300 {
301     Mutex::Autolock lock(mLock);
302     return mGrallocMem.registerBuffer(buffer, type);
303 }
304 
305 
306 /*===========================================================================
307  * FUNCTION   : unregisterBuffer
308  *
309  * DESCRIPTION: unregister buffer
310  *
311  * PARAMETERS :
312  *   @idx     : unregister buffer at index 'idx'
313  *
314  * RETURN     : int32_t type of status
315  *              NO_ERROR  -- success
316  *              none-zero failure code
317  *==========================================================================*/
unregisterBuffer(size_t idx)318 int32_t QCamera3StreamMem::unregisterBuffer(size_t idx)
319 {
320     Mutex::Autolock lock(mLock);
321     return mGrallocMem.unregisterBuffer(idx);
322 }
323 
324 /*===========================================================================
325  * FUNCTION   : getMatchBufIndex
326  *
327  * DESCRIPTION: query buffer index by object ptr
328  *
329  * PARAMETERS :
330  *   @opaque  : opaque ptr
331  *
332  * RETURN     : buffer index if match found,
333  *              -1 if failed
334  *==========================================================================*/
getMatchBufIndex(void * object)335 int QCamera3StreamMem::getMatchBufIndex(void *object)
336 {
337     Mutex::Autolock lock(mLock);
338     return mGrallocMem.getMatchBufIndex(object);
339 }
340 
341 /*===========================================================================
342  * FUNCTION   : getBufferHandle
343  *
344  * DESCRIPTION: return framework pointer
345  *
346  * PARAMETERS :
347  *   @index   : index of the buffer
348  *
349  * RETURN     : buffer ptr if match found
350                 NULL if failed
351  *==========================================================================*/
getBufferHandle(uint32_t index)352 void *QCamera3StreamMem::getBufferHandle(uint32_t index)
353 {
354     Mutex::Autolock lock(mLock);
355     return mGrallocMem.getBufferHandle(index);
356 }
357 
358 /*===========================================================================
359  * FUNCTION   : unregisterBuffers
360  *
361  * DESCRIPTION: unregister buffers
362  *
363  * PARAMETERS : none
364  *
365  * RETURN     : none
366  *==========================================================================*/
unregisterBuffers()367 void QCamera3StreamMem::unregisterBuffers()
368 {
369     Mutex::Autolock lock(mLock);
370     mGrallocMem.unregisterBuffers();
371 }
372 
373 
374 /*===========================================================================
375  * FUNCTION   : allocate
376  *
377  * DESCRIPTION: allocate requested number of buffers of certain size
378  *
379  * PARAMETERS :
380  *   @count   : number of buffers to be allocated
381  *   @size    : lenght of the buffer to be allocated
382  *
383  * RETURN     : int32_t type of status
384  *              NO_ERROR  -- success
385  *              none-zero failure code
386  *==========================================================================*/
allocateAll(size_t size)387 int QCamera3StreamMem::allocateAll(size_t size)
388 {
389     Mutex::Autolock lock(mLock);
390     return mHeapMem.allocate(size);
391 }
392 
allocateOne(size_t size)393 int QCamera3StreamMem::allocateOne(size_t size)
394 {
395     Mutex::Autolock lock(mLock);
396     return mHeapMem.allocateOne(size);
397 }
398 
399 /*===========================================================================
400  * FUNCTION   : deallocate
401  *
402  * DESCRIPTION: deallocate heap buffers
403  *
404  * PARAMETERS : none
405  *
406  * RETURN     : none
407  *==========================================================================*/
deallocate()408 void QCamera3StreamMem::deallocate()
409 {
410     Mutex::Autolock lock(mLock);
411     mHeapMem.deallocate();
412 }
413 
414 /*===========================================================================
415  * FUNCTION   : markFrameNumber
416  *
417  * DESCRIPTION: We use this function from the request call path to mark the
418  *              buffers with the frame number they are intended for this info
419  *              is used later when giving out callback & it is duty of PP to
420  *              ensure that data for that particular frameNumber/Request is
421  *              written to this buffer.
422  * PARAMETERS :
423  *   @index   : index of the buffer
424  *   @frame#  : Frame number from the framework
425  *
426  * RETURN     : int32_t type of status
427  *              NO_ERROR  -- success
428  *              none-zero failure code
429  *==========================================================================*/
markFrameNumber(uint32_t index,uint32_t frameNumber)430 int32_t QCamera3StreamMem::markFrameNumber(uint32_t index, uint32_t frameNumber)
431 {
432     Mutex::Autolock lock(mLock);
433     if (index < mMaxHeapBuffers)
434         return mHeapMem.markFrameNumber(index, frameNumber);
435     else
436         return mGrallocMem.markFrameNumber(index, frameNumber);
437 }
438 
439 /*===========================================================================
440  * FUNCTION   : getOldestFrameNumber
441  *
442  * DESCRIPTION: We use this to fetch the frameNumber expected as per FIFO
443  *
444  *
445  * PARAMETERS :
446  *   @index   : index of the buffer
447  *
448  * RETURN     : int32_t frameNumber
449  *              positive/zero  -- success
450  *              negative failure
451  *==========================================================================*/
getOldestFrameNumber(uint32_t & bufIdx)452 int32_t QCamera3StreamMem::getOldestFrameNumber(uint32_t &bufIdx)
453 {
454     Mutex::Autolock lock(mLock);
455     int32_t oldest = INT_MAX;
456     bool empty = true;
457     if (mHeapMem.getCnt()){
458         empty = false;
459         oldest = mHeapMem.getOldestFrameNumber(bufIdx);
460     }
461 
462     if (mGrallocMem.getCnt()) {
463         uint32_t grallocBufIdx;
464         int32_t oldestGrallocFrameNumber = mGrallocMem.getOldestFrameNumber(grallocBufIdx);
465 
466         if (empty || (!empty && (oldestGrallocFrameNumber < oldest))){
467             oldest = oldestGrallocFrameNumber;
468             bufIdx = grallocBufIdx;
469         }
470         empty = false;
471     }
472 
473     if (empty )
474         return -1;
475     else
476         return oldest;
477 }
478 
479 
480 /*===========================================================================
481  * FUNCTION   : getFrameNumber
482  *
483  * DESCRIPTION: We use this to fetch the frameNumber for the request with which
484  *              this buffer was given to HAL
485  *
486  *
487  * PARAMETERS :
488  *   @index   : index of the buffer
489  *
490  * RETURN     : int32_t frameNumber
491  *              positive/zero  -- success
492  *              negative failure
493  *==========================================================================*/
getFrameNumber(uint32_t index)494 int32_t QCamera3StreamMem::getFrameNumber(uint32_t index)
495 {
496     Mutex::Autolock lock(mLock);
497     if (index < mMaxHeapBuffers)
498         return mHeapMem.getFrameNumber(index);
499     else
500         return mGrallocMem.getFrameNumber(index);
501 }
502 
503 /*===========================================================================
504  * FUNCTION   : getGrallocBufferIndex
505  *
506  * DESCRIPTION: We use this to fetch the gralloc buffer index based on frameNumber
507  *
508  * PARAMETERS :
509  *   @frameNumber : frame Number
510  *
511  * RETURN     : int32_t buffer index
512  *              positive/zero  -- success
513  *              negative failure
514  *==========================================================================*/
getGrallocBufferIndex(uint32_t frameNumber)515 int32_t QCamera3StreamMem::getGrallocBufferIndex(uint32_t frameNumber)
516 {
517     Mutex::Autolock lock(mLock);
518     int32_t index = mGrallocMem.getBufferIndex(frameNumber);
519     return index;
520 }
521 
522 /*===========================================================================
523  * FUNCTION   : getHeapBufferIndex
524  *
525  * DESCRIPTION: We use this to fetch the heap buffer index based on frameNumber
526  *
527  * PARAMETERS :
528  *   @frameNumber : frame Number
529  *
530  * RETURN     : int32_t buffer index
531  *              positive/zero  -- success
532  *              negative failure
533  *==========================================================================*/
getHeapBufferIndex(uint32_t frameNumber)534 int32_t QCamera3StreamMem::getHeapBufferIndex(uint32_t frameNumber)
535 {
536     Mutex::Autolock lock(mLock);
537     int32_t index = mHeapMem.getBufferIndex(frameNumber);
538     return index;
539 }
540 
541 
542 /*===========================================================================
543  * FUNCTION   : getBufferIndex
544  *
545  * DESCRIPTION: We use this to fetch the buffer index based on frameNumber
546  *
547  * PARAMETERS :
548  *   @frameNumber : frame Number
549  *
550  * RETURN     : int32_t buffer index
551  *              positive/zero  -- success
552  *              negative failure
553  *==========================================================================*/
getBufferIndex(uint32_t frameNumber)554 int32_t QCamera3StreamMem::getBufferIndex(uint32_t frameNumber)
555 {
556     Mutex::Autolock lock(mLock);
557     int32_t index = mGrallocMem.getBufferIndex(frameNumber);
558 
559     if (index < 0)
560         return mHeapMem.getBufferIndex(frameNumber);
561     else
562         return index;
563 }
564 
565 
566 
567 }; //namespace qcamera
568