1 /* Copyright (c) 2012-2013, 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 #include "mm_jpeg_dbg.h" 31 #include "mm_jpeg.h" 32 #include <errno.h> 33 34 35 #define LOWER(a) ((a) & 0xFFFF) 36 #define UPPER(a) (((a)>>16) & 0xFFFF) 37 #define CHANGE_ENDIAN_16(a) ((0x00FF & ((a)>>8)) | (0xFF00 & ((a)<<8))) 38 39 40 /** addExifEntry: 41 * 42 * Arguments: 43 * @exif_info : Exif info struct 44 * @p_session: job session 45 * @tagid : exif tag ID 46 * @type : data type 47 * @count : number of data in uint of its type 48 * @data : input data ptr 49 * 50 * Retrun : int32_t type of status 51 * 0 -- success 52 * none-zero failure code 53 * 54 * Description: 55 * Function to add an entry to exif data 56 * 57 **/ 58 int32_t addExifEntry(QOMX_EXIF_INFO *p_exif_info, exif_tag_id_t tagid, 59 exif_tag_type_t type, uint32_t count, void *data) 60 { 61 int32_t rc = 0; 62 int32_t numOfEntries = p_exif_info->numOfEntries; 63 QEXIF_INFO_DATA *p_info_data = p_exif_info->exif_data; 64 if(numOfEntries >= MAX_EXIF_TABLE_ENTRIES) { 65 ALOGE("%s: Number of entries exceeded limit", __func__); 66 return -1; 67 } 68 69 p_info_data[numOfEntries].tag_id = tagid; 70 p_info_data[numOfEntries].tag_entry.type = type; 71 p_info_data[numOfEntries].tag_entry.count = count; 72 p_info_data[numOfEntries].tag_entry.copy = 1; 73 switch (type) { 74 case EXIF_BYTE: { 75 if (count > 1) { 76 uint8_t *values = (uint8_t *)malloc(count); 77 if (values == NULL) { 78 ALOGE("%s: No memory for byte array", __func__); 79 rc = -1; 80 } else { 81 memcpy(values, data, count); 82 p_info_data[numOfEntries].tag_entry.data._bytes = values; 83 } 84 } else { 85 p_info_data[numOfEntries].tag_entry.data._byte = *(uint8_t *)data; 86 } 87 } 88 break; 89 case EXIF_ASCII: { 90 char *str = NULL; 91 str = (char *)malloc(count + 1); 92 if (str == NULL) { 93 ALOGE("%s: No memory for ascii string", __func__); 94 rc = -1; 95 } else { 96 memset(str, 0, count + 1); 97 memcpy(str, data, count); 98 p_info_data[numOfEntries].tag_entry.data._ascii = str; 99 } 100 } 101 break; 102 case EXIF_SHORT: { 103 if (count > 1) { 104 uint16_t *values = (uint16_t *)malloc(count * sizeof(uint16_t)); 105 if (values == NULL) { 106 ALOGE("%s: No memory for short array", __func__); 107 rc = -1; 108 } else { 109 memcpy(values, data, count * sizeof(uint16_t)); 110 p_info_data[numOfEntries].tag_entry.data._shorts = values; 111 } 112 } else { 113 p_info_data[numOfEntries].tag_entry.data._short = *(uint16_t *)data; 114 } 115 } 116 break; 117 case EXIF_LONG: { 118 if (count > 1) { 119 uint32_t *values = (uint32_t *)malloc(count * sizeof(uint32_t)); 120 if (values == NULL) { 121 ALOGE("%s: No memory for long array", __func__); 122 rc = -1; 123 } else { 124 memcpy(values, data, count * sizeof(uint32_t)); 125 p_info_data[numOfEntries].tag_entry.data._longs = values; 126 } 127 } else { 128 p_info_data[numOfEntries].tag_entry.data._long = *(uint32_t *)data; 129 } 130 } 131 break; 132 case EXIF_RATIONAL: { 133 if (count > 1) { 134 rat_t *values = (rat_t *)malloc(count * sizeof(rat_t)); 135 if (values == NULL) { 136 ALOGE("%s: No memory for rational array", __func__); 137 rc = -1; 138 } else { 139 memcpy(values, data, count * sizeof(rat_t)); 140 p_info_data[numOfEntries].tag_entry.data._rats = values; 141 } 142 } else { 143 p_info_data[numOfEntries].tag_entry.data._rat = *(rat_t *)data; 144 } 145 } 146 break; 147 case EXIF_UNDEFINED: { 148 uint8_t *values = (uint8_t *)malloc(count); 149 if (values == NULL) { 150 ALOGE("%s: No memory for undefined array", __func__); 151 rc = -1; 152 } else { 153 memcpy(values, data, count); 154 p_info_data[numOfEntries].tag_entry.data._undefined = values; 155 } 156 } 157 break; 158 case EXIF_SLONG: { 159 if (count > 1) { 160 int32_t *values = (int32_t *)malloc(count * sizeof(int32_t)); 161 if (values == NULL) { 162 ALOGE("%s: No memory for signed long array", __func__); 163 rc = -1; 164 } else { 165 memcpy(values, data, count * sizeof(int32_t)); 166 p_info_data[numOfEntries].tag_entry.data._slongs = values; 167 } 168 } else { 169 p_info_data[numOfEntries].tag_entry.data._slong = *(int32_t *)data; 170 } 171 } 172 break; 173 case EXIF_SRATIONAL: { 174 if (count > 1) { 175 srat_t *values = (srat_t *)malloc(count * sizeof(srat_t)); 176 if (values == NULL) { 177 ALOGE("%s: No memory for signed rational array", __func__); 178 rc = -1; 179 } else { 180 memcpy(values, data, count * sizeof(srat_t)); 181 p_info_data[numOfEntries].tag_entry.data._srats = values; 182 } 183 } else { 184 p_info_data[numOfEntries].tag_entry.data._srat = *(srat_t *)data; 185 } 186 } 187 break; 188 } 189 190 // Increase number of entries 191 p_exif_info->numOfEntries++; 192 return rc; 193 } 194 195 196 int32_t releaseExifEntry(QOMX_EXIF_INFO *p_exif_info) 197 { 198 uint32_t i = 0; 199 for (i = 0; i < p_exif_info->numOfEntries; i++) { 200 switch (p_exif_info->exif_data[i].tag_entry.type) { 201 case EXIF_BYTE: { 202 if (p_exif_info->exif_data[i].tag_entry.count > 1 && 203 p_exif_info->exif_data[i].tag_entry.data._bytes != NULL) { 204 free(p_exif_info->exif_data[i].tag_entry.data._bytes); 205 p_exif_info->exif_data[i].tag_entry.data._bytes = NULL; 206 } 207 } 208 break; 209 case EXIF_ASCII: { 210 if (p_exif_info->exif_data[i].tag_entry.data._ascii != NULL) { 211 free(p_exif_info->exif_data[i].tag_entry.data._ascii); 212 p_exif_info->exif_data[i].tag_entry.data._ascii = NULL; 213 } 214 } 215 break; 216 case EXIF_SHORT: { 217 if (p_exif_info->exif_data[i].tag_entry.count > 1 && 218 p_exif_info->exif_data[i].tag_entry.data._shorts != NULL) { 219 free(p_exif_info->exif_data[i].tag_entry.data._shorts); 220 p_exif_info->exif_data[i].tag_entry.data._shorts = NULL; 221 } 222 } 223 break; 224 case EXIF_LONG: { 225 if (p_exif_info->exif_data[i].tag_entry.count > 1 && 226 p_exif_info->exif_data[i].tag_entry.data._longs != NULL) { 227 free(p_exif_info->exif_data[i].tag_entry.data._longs); 228 p_exif_info->exif_data[i].tag_entry.data._longs = NULL; 229 } 230 } 231 break; 232 case EXIF_RATIONAL: { 233 if (p_exif_info->exif_data[i].tag_entry.count > 1 && 234 p_exif_info->exif_data[i].tag_entry.data._rats != NULL) { 235 free(p_exif_info->exif_data[i].tag_entry.data._rats); 236 p_exif_info->exif_data[i].tag_entry.data._rats = NULL; 237 } 238 } 239 break; 240 case EXIF_UNDEFINED: { 241 if (p_exif_info->exif_data[i].tag_entry.data._undefined != NULL) { 242 free(p_exif_info->exif_data[i].tag_entry.data._undefined); 243 p_exif_info->exif_data[i].tag_entry.data._undefined = NULL; 244 } 245 } 246 break; 247 case EXIF_SLONG: { 248 if (p_exif_info->exif_data[i].tag_entry.count > 1 && 249 p_exif_info->exif_data[i].tag_entry.data._slongs != NULL) { 250 free(p_exif_info->exif_data[i].tag_entry.data._slongs); 251 p_exif_info->exif_data[i].tag_entry.data._slongs = NULL; 252 } 253 } 254 break; 255 case EXIF_SRATIONAL: { 256 if (p_exif_info->exif_data[i].tag_entry.count > 1 && 257 p_exif_info->exif_data[i].tag_entry.data._srats != NULL) { 258 free(p_exif_info->exif_data[i].tag_entry.data._srats); 259 p_exif_info->exif_data[i].tag_entry.data._srats = NULL; 260 } 261 } 262 break; 263 } 264 265 } /*end of switch*/ 266 267 return 0; 268 } 269