1 /* Copyright (c) 2015-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 "QCameraBufferMaps"
31 
32 // System dependencies
33 #include <utils/Errors.h>
34 #include <stdlib.h>
35 #include <string.h>
36 
37 // Camera dependencies
38 #include "QCameraBufferMaps.h"
39 
40 using namespace android;
41 
42 namespace qcamera {
43 
44 /*===========================================================================
45  * FUNCTION   : QCameraBufferMaps
46  *
47  * DESCRIPTION: default constructor of QCameraBufferMaps
48  *
49  * PARAMETERS : None
50  *
51  * RETURN     : None
52  *==========================================================================*/
QCameraBufferMaps()53 QCameraBufferMaps::QCameraBufferMaps()
54 {
55     memset(&mBufMapList, 0, sizeof(mBufMapList));
56 }
57 
58 /*===========================================================================
59  * FUNCTION   : QCameraBufferMaps
60  *
61  * DESCRIPTION: copy constructor of QCameraBufferMaps
62  *
63  * PARAMETERS :
64  *   @pBufferMaps : object to be copied
65  *
66  * RETURN     : None
67  *==========================================================================*/
QCameraBufferMaps(const QCameraBufferMaps & pBufferMaps)68 QCameraBufferMaps::QCameraBufferMaps(const QCameraBufferMaps& pBufferMaps)
69 {
70     memcpy(&mBufMapList, &pBufferMaps.mBufMapList, sizeof(mBufMapList));
71 }
72 
73 /*===========================================================================
74  * FUNCTION   : QCameraBufferMaps
75  *
76  * DESCRIPTION: constructor of QCameraBufferMaps
77  *
78  * PARAMETERS :
79  *   @pBufMapList : list of buffer maps
80  *
81  * RETURN     : None
82  *==========================================================================*/
QCameraBufferMaps(const cam_buf_map_type_list & pBufMapList)83 QCameraBufferMaps::QCameraBufferMaps(const cam_buf_map_type_list& pBufMapList)
84 {
85     memcpy(&mBufMapList, &pBufMapList, sizeof(mBufMapList));
86 }
87 
88 /*===========================================================================
89  * FUNCTION   : QCameraBufferMaps
90  *
91  * DESCRIPTION: constructor of QCameraBufferMaps
92  *
93  * PARAMETERS :
94  *   @pType   : Type of buffer
95  *   @pStreamId : Stream id
96  *   @pFrameIndex : Frame index
97  *   @pPlaneIndex : Plane index
98  *   @pCookie   : Could be job_id to identify mapping job
99  *   @pFd   : Origin file descriptor
100  *   @pSize   : Size of the buffer
101  *
102  * RETURN     : None
103  *==========================================================================*/
QCameraBufferMaps(cam_mapping_buf_type pType,uint32_t pStreamId,uint32_t pFrameIndex,int32_t pPlaneIndex,uint32_t pCookie,int32_t pFd,size_t pSize,void * buffer)104 QCameraBufferMaps::QCameraBufferMaps(cam_mapping_buf_type pType,
105         uint32_t pStreamId,
106         uint32_t pFrameIndex,
107         int32_t pPlaneIndex,
108         uint32_t pCookie,
109         int32_t pFd,
110         size_t pSize,
111         void *buffer)
112 {
113     memset(&mBufMapList, 0, sizeof(mBufMapList));
114     enqueue(pType, pStreamId, pFrameIndex, pPlaneIndex, pCookie, pFd, pSize, buffer);
115 }
116 
117 /*===========================================================================
118  * FUNCTION   : ~QCameraBufferMaps
119  *
120  * DESCRIPTION: destructor of QCameraBufferMaps
121  *
122  * PARAMETERS : None
123  *
124  * RETURN     : None
125  *==========================================================================*/
~QCameraBufferMaps()126 QCameraBufferMaps::~QCameraBufferMaps()
127 {
128 }
129 
130 /*===========================================================================
131  * FUNCTION   : operator=
132  *
133  * DESCRIPTION: assignment operator of QCameraBufferMaps
134  *
135  * PARAMETERS :
136  *   @pBufferMaps : object to be copied
137  *
138  * RETURN     : *this, with updated contents
139  *==========================================================================*/
operator =(const QCameraBufferMaps & pBufferMaps)140 QCameraBufferMaps& QCameraBufferMaps::operator=(const QCameraBufferMaps& pBufferMaps)
141 {
142     if (&pBufferMaps != this) {
143         memcpy(&mBufMapList, &pBufferMaps.mBufMapList, sizeof(mBufMapList));
144     }
145     return *this;
146 }
147 
148 /*===========================================================================
149  * FUNCTION   : enqueue
150  *
151  * DESCRIPTION: Add a buffer map
152  *
153  * PARAMETERS :
154  *   @pType   : Type of buffer
155  *   @pStreamId : Stream id
156  *   @pFrameIndex : Frame index
157  *   @pPlaneIndex : Plane index
158  *   @pCookie   : Could be job_id to identify mapping job
159  *   @pFd   : Origin file descriptor
160  *   @pSize   : Size of the buffer
161  *
162  * RETURN     : int32_t type of status
163  *              NO_ERROR  -- success
164  *              none-zero failure code
165  *==========================================================================*/
enqueue(cam_mapping_buf_type pType,uint32_t pStreamId,uint32_t pFrameIndex,int32_t pPlaneIndex,uint32_t pCookie,int32_t pFd,size_t pSize,void * buffer)166 uint32_t QCameraBufferMaps::enqueue(cam_mapping_buf_type pType,
167         uint32_t pStreamId,
168         uint32_t pFrameIndex,
169         int32_t pPlaneIndex,
170         uint32_t pCookie,
171         int32_t pFd,
172         size_t pSize,
173         void *buffer)
174 {
175     uint32_t pos = mBufMapList.length++;
176     mBufMapList.buf_maps[pos].type = pType;
177     mBufMapList.buf_maps[pos].stream_id = pStreamId;
178     mBufMapList.buf_maps[pos].frame_idx = pFrameIndex;
179     mBufMapList.buf_maps[pos].plane_idx = pPlaneIndex;
180     mBufMapList.buf_maps[pos].cookie = pCookie;
181     mBufMapList.buf_maps[pos].fd = pFd;
182     mBufMapList.buf_maps[pos].size = pSize;
183     mBufMapList.buf_maps[pos].buffer = buffer;
184 
185     return NO_ERROR;
186 }
187 
188 /*===========================================================================
189  * FUNCTION   : getCamBufMapList
190  *
191  * DESCRIPTION: Populate the list
192  *
193  * PARAMETERS :
194  *   @pBufMapList : [output] the list of buffer maps
195  *
196  * RETURN     : int32_t type of status
197  *              NO_ERROR  -- success
198  *              none-zero failure code
199  *==========================================================================*/
getCamBufMapList(cam_buf_map_type_list & pBufMapList) const200 uint32_t QCameraBufferMaps::getCamBufMapList(cam_buf_map_type_list& pBufMapList) const
201 {
202     memcpy(&pBufMapList, &mBufMapList, sizeof(pBufMapList));
203 
204     return NO_ERROR;
205 }
206 
207 /*===========================================================================
208  * FUNCTION   : makeSingletonBufMapList
209  *
210  * DESCRIPTION: Create a buffer map list of a single element
211  *
212  * PARAMETERS :
213  *   @pType   : Type of buffer
214  *   @pStreamId : Stream id
215  *   @pFrameIndex : Frame index
216  *   @pPlaneIndex : Plane index
217  *   @pCookie   : Could be job_id to identify mapping job
218  *   @pFd   : Origin file descriptor
219  *   @pSize   : Size of the buffer
220  *   @pBufMapList : [output] the list of buffer maps
221  *
222  * RETURN     : int32_t type of status
223  *              NO_ERROR  -- success
224  *              none-zero failure code
225  *==========================================================================*/
makeSingletonBufMapList(cam_mapping_buf_type pType,uint32_t pStreamId,uint32_t pFrameIndex,int32_t pPlaneIndex,uint32_t pCookie,int32_t pFd,size_t pSize,cam_buf_map_type_list & pBufMapList,void * buffer)226 uint32_t QCameraBufferMaps::makeSingletonBufMapList(cam_mapping_buf_type pType,
227         uint32_t pStreamId,
228         uint32_t pFrameIndex,
229         int32_t pPlaneIndex,
230         uint32_t pCookie,
231         int32_t pFd,
232         size_t pSize,
233         cam_buf_map_type_list& pBufMapList,
234         void *buffer)
235 {
236     uint32_t rc = NO_ERROR;
237 
238     QCameraBufferMaps bufferMaps(pType,
239             pStreamId,
240             pFrameIndex,
241             pPlaneIndex,
242             pCookie,
243             pFd,
244             pSize,
245             buffer);
246     rc = bufferMaps.getCamBufMapList(pBufMapList);
247 
248     return rc;
249 }
250 
251 }; // namespace qcamera
252