• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *     * Redistributions of source code must retain the above copyright
8  *       notice, this list of conditions and the following disclaimer.
9  *     * Redistributions in binary form must reproduce the above
10  *       copyright notice, this list of conditions and the following
11  *       disclaimer in the documentation and/or other materials provided
12  *       with the distribution.
13  *     * Neither the name of The Linux Foundation nor the names of its
14  *       contributors may be used to endorse or promote products derived
15  *       from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include <errno.h>
31 #include <string.h>
32 #include <sys/mman.h>
33 #include <cutils/log.h>
34 #include <gralloc_priv.h>
35 #define __STDC_FORMAT_MACROS 1
36 #include <inttypes.h>
37 #include "qdMetaData.h"
38 
setMetaData(private_handle_t * handle,DispParamType paramType,void * param)39 int setMetaData(private_handle_t *handle, DispParamType paramType,
40                                                     void *param) {
41     if (!handle) {
42         ALOGE("%s: Private handle is null!", __func__);
43         return -1;
44     }
45     if (handle->fd_metadata == -1) {
46         ALOGE("%s: Bad fd for extra data!", __func__);
47         return -1;
48     }
49     if (!param) {
50         ALOGE("%s: input param is null!", __func__);
51         return -1;
52     }
53     unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
54     void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
55         handle->fd_metadata, 0);
56     if (base == reinterpret_cast<void*>(MAP_FAILED)) {
57         ALOGE("%s: mmap() failed: error is %s!", __func__, strerror(errno));
58         return -1;
59     }
60     MetaData_t *data = reinterpret_cast <MetaData_t *>(base);
61     data->operation |= paramType;
62     switch (paramType) {
63         case PP_PARAM_INTERLACED:
64             data->interlaced = *((int32_t *)param);
65             break;
66         case UPDATE_BUFFER_GEOMETRY:
67             data->bufferDim = *((BufferDim_t *)param);
68             break;
69         case UPDATE_REFRESH_RATE:
70             data->refreshrate = *((float *)param);
71             break;
72         case UPDATE_COLOR_SPACE:
73             data->colorSpace = *((ColorSpace_t *)param);
74             break;
75         case MAP_SECURE_BUFFER:
76             data->mapSecureBuffer = *((int32_t *)param);
77             break;
78         case S3D_FORMAT:
79             data->s3dFormat = *((uint32_t *)param);
80             break;
81         case LINEAR_FORMAT:
82             data->linearFormat = *((uint32_t *)param);
83             break;
84         case SET_IGC:
85             data->igc = *((IGC_t *)param);
86             break;
87         case SET_SINGLE_BUFFER_MODE:
88             data->isSingleBufferMode = *((uint32_t *)param);
89             break;
90         case SET_VT_TIMESTAMP:
91             data->vtTimeStamp = *((uint64_t *)param);
92             break;
93         default:
94             ALOGE("Unknown paramType %d", paramType);
95             break;
96     }
97     if(munmap(base, size))
98         ALOGE("%s: failed to unmap ptr %p, err %d", __func__, (void*)base,
99                                                                         errno);
100     return 0;
101 }
102 
getMetaData(private_handle_t * handle,DispFetchParamType paramType,void * param)103 int getMetaData(private_handle_t *handle, DispFetchParamType paramType,
104                                                     void *param) {
105     if (!handle) {
106         ALOGE("%s: Private handle is null!", __func__);
107         return -1;
108     }
109     if (handle->fd_metadata == -1) {
110         ALOGE("%s: Bad fd for extra data!", __func__);
111         return -1;
112     }
113     if (!param) {
114         ALOGE("%s: input param is null!", __func__);
115         return -1;
116     }
117     unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
118     void *base = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
119         handle->fd_metadata, 0);
120     if (base == reinterpret_cast<void*>(MAP_FAILED)) {
121         ALOGE("%s: mmap() failed: error is %s!", __func__, strerror(errno));
122         return -1;
123     }
124 
125     MetaData_t *data = reinterpret_cast <MetaData_t *>(base);
126     data->operation |= paramType;
127     switch (paramType) {
128         case GET_PP_PARAM_INTERLACED:
129             *((int32_t *)param) = data->interlaced;
130             break;
131         case GET_BUFFER_GEOMETRY:
132             *((BufferDim_t *)param) = data->bufferDim;
133             break;
134         case GET_REFRESH_RATE:
135             *((float *)param) = data->refreshrate;
136             break;
137         case GET_COLOR_SPACE:
138             *((ColorSpace_t *)param) = data->colorSpace;
139             break;
140         case GET_MAP_SECURE_BUFFER:
141             *((int32_t *)param) = data->mapSecureBuffer;
142             break;
143         case GET_S3D_FORMAT:
144             *((uint32_t *)param) = data->s3dFormat;
145             break;
146         case GET_LINEAR_FORMAT:
147             *((uint32_t *)param) = data->linearFormat;
148             break;
149         case GET_IGC:
150             *((IGC_t *)param) = data->igc;
151             break;
152         case GET_SINGLE_BUFFER_MODE:
153             *((uint32_t *)param) = data->isSingleBufferMode ;
154             break;
155         case GET_VT_TIMESTAMP:
156             *((uint64_t *)param) = data->vtTimeStamp;
157             break;
158         default:
159             ALOGE("Unknown paramType %d", paramType);
160             break;
161     }
162     if(munmap(base, size))
163         ALOGE("%s: failed to unmap ptr %p, err %d", __func__, (void*)base,
164                                                                         errno);
165     return 0;
166 }
167 
copyMetaData(struct private_handle_t * src,struct private_handle_t * dst)168 int copyMetaData(struct private_handle_t *src, struct private_handle_t *dst) {
169     if (!src || !dst) {
170         ALOGE("%s: Private handle is null!", __func__);
171         return -1;
172     }
173     if (src->fd_metadata == -1) {
174         ALOGE("%s: Bad fd for src extra data!", __func__);
175         return -1;
176     }
177     if (dst->fd_metadata == -1) {
178         ALOGE("%s: Bad fd for dst extra data!", __func__);
179         return -1;
180     }
181 
182     unsigned long size = ROUND_UP_PAGESIZE(sizeof(MetaData_t));
183 
184     void *base_src = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
185         src->fd_metadata, 0);
186     if (base_src == reinterpret_cast<void*>(MAP_FAILED)) {
187         ALOGE("%s: src mmap() failed: error is %s!", __func__, strerror(errno));
188         return -1;
189     }
190 
191     void *base_dst = mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED,
192         dst->fd_metadata, 0);
193     if (base_dst == reinterpret_cast<void*>(MAP_FAILED)) {
194         ALOGE("%s: dst mmap() failed: error is %s!", __func__, strerror(errno));
195         return -1;
196     }
197 
198     memcpy(base_dst, base_src, size);
199 
200     if(munmap(base_src, size))
201         ALOGE("%s: failed to unmap src ptr %p, err %d", __func__, (void*)base_src,
202                                                                         errno);
203     if(munmap(base_dst, size))
204         ALOGE("%s: failed to unmap src ptr %p, err %d", __func__, (void*)base_dst,
205                                                                         errno);
206     return 0;
207 }
208