111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/* Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. 211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Redistribution and use in source and binary forms, with or without 411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * modification, are permitted provided that the following conditions are 511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * met: 611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions of source code must retain the above copyright 711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * notice, this list of conditions and the following disclaimer. 811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Redistributions in binary form must reproduce the above 911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * copyright notice, this list of conditions and the following 1011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * disclaimer in the documentation and/or other materials provided 1111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * with the distribution. 1211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * * Neither the name of The Linux Foundation nor the names of its 1311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * contributors may be used to endorse or promote products derived 1411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * from this software without specific prior written permission. 1511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 1611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED 1711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT 1911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS 2011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN 2611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 2811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev */ 2911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "mm_jpeg_dbg.h" 3111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include "mm_jpeg.h" 3211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#include <errno.h> 3311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define LOWER(a) ((a) & 0xFFFF) 3611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define UPPER(a) (((a)>>16) & 0xFFFF) 3711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev#define CHANGE_ENDIAN_16(a) ((0x00FF & ((a)>>8)) | (0xFF00 & ((a)<<8))) 3811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 3911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 4011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev/** addExifEntry: 4111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 4211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Arguments: 4311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @exif_info : Exif info struct 4411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @p_session: job session 4511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @tagid : exif tag ID 4611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @type : data type 4711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @count : number of data in uint of its type 4811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * @data : input data ptr 4911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 5011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Retrun : int32_t type of status 5111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 0 -- success 5211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * none-zero failure code 5311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 5411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Description: 5511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * Function to add an entry to exif data 5611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev * 5711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev **/ 5811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint32_t addExifEntry(QOMX_EXIF_INFO *p_exif_info, exif_tag_id_t tagid, 5911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev exif_tag_type_t type, uint32_t count, void *data) 6011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 6111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t rc = 0; 6211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t numOfEntries = p_exif_info->numOfEntries; 6311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev QEXIF_INFO_DATA *p_info_data = p_exif_info->exif_data; 6411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if(numOfEntries >= MAX_EXIF_TABLE_ENTRIES) { 6511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: Number of entries exceeded limit", __func__); 6611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return -1; 6711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 6811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 6911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_id = tagid; 7011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.type = type; 7111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.count = count; 7211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.copy = 1; 7311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev switch (type) { 7411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_BYTE: { 7511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (count > 1) { 7611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint8_t *values = (uint8_t *)malloc(count); 7711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (values == NULL) { 7811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: No memory for byte array", __func__); 7911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = -1; 8011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 8111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memcpy(values, data, count); 8211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._bytes = values; 8311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 8411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 8511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._byte = *(uint8_t *)data; 8611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 8711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 8811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 8911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_ASCII: { 9011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev char *str = NULL; 9111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev str = (char *)malloc(count + 1); 9211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (str == NULL) { 9311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: No memory for ascii string", __func__); 9411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = -1; 9511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 9611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memset(str, 0, count + 1); 9711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memcpy(str, data, count); 9811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._ascii = str; 9911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 10011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 10111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 10211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_SHORT: { 10311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (count > 1) { 10411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint16_t *values = (uint16_t *)malloc(count * sizeof(uint16_t)); 10511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (values == NULL) { 10611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: No memory for short array", __func__); 10711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = -1; 10811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 10911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memcpy(values, data, count * sizeof(uint16_t)); 11011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._shorts = values; 11111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 11211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 11311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._short = *(uint16_t *)data; 11411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 11511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 11611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 11711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_LONG: { 11811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (count > 1) { 11911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t *values = (uint32_t *)malloc(count * sizeof(uint32_t)); 12011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (values == NULL) { 12111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: No memory for long array", __func__); 12211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = -1; 12311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 12411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memcpy(values, data, count * sizeof(uint32_t)); 12511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._longs = values; 12611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 12711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 12811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._long = *(uint32_t *)data; 12911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 13011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 13111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 13211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_RATIONAL: { 13311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (count > 1) { 13411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rat_t *values = (rat_t *)malloc(count * sizeof(rat_t)); 13511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (values == NULL) { 13611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: No memory for rational array", __func__); 13711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = -1; 13811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 13911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memcpy(values, data, count * sizeof(rat_t)); 14011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._rats = values; 14111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 14211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 14311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._rat = *(rat_t *)data; 14411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 14511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 14611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 14711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_UNDEFINED: { 14811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint8_t *values = (uint8_t *)malloc(count); 14911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (values == NULL) { 15011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: No memory for undefined array", __func__); 15111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = -1; 15211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 15311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memcpy(values, data, count); 15411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._undefined = values; 15511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 15611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 15711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 15811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_SLONG: { 15911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (count > 1) { 16011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev int32_t *values = (int32_t *)malloc(count * sizeof(int32_t)); 16111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (values == NULL) { 16211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: No memory for signed long array", __func__); 16311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = -1; 16411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 16511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memcpy(values, data, count * sizeof(int32_t)); 16611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._slongs = values; 16711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 16811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 16911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._slong = *(int32_t *)data; 17011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 17111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 17211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 17311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_SRATIONAL: { 17411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (count > 1) { 17511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev srat_t *values = (srat_t *)malloc(count * sizeof(srat_t)); 17611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (values == NULL) { 17711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev ALOGE("%s: No memory for signed rational array", __func__); 17811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev rc = -1; 17911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 18011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev memcpy(values, data, count * sizeof(srat_t)); 18111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._srats = values; 18211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 18311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } else { 18411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_info_data[numOfEntries].tag_entry.data._srat = *(srat_t *)data; 18511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 18611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 18711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 18811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 18911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 19011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev // Increase number of entries 19111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->numOfEntries++; 19211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return rc; 19311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 19411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 19511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 19611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchevint32_t releaseExifEntry(QOMX_EXIF_INFO *p_exif_info) 19711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev{ 19811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev uint32_t i = 0; 19911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev for (i = 0; i < p_exif_info->numOfEntries; i++) { 20011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev switch (p_exif_info->exif_data[i].tag_entry.type) { 20111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_BYTE: { 20211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (p_exif_info->exif_data[i].tag_entry.count > 1 && 20311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._bytes != NULL) { 20411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev free(p_exif_info->exif_data[i].tag_entry.data._bytes); 20511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._bytes = NULL; 20611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 20711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 20811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 20911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_ASCII: { 21011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (p_exif_info->exif_data[i].tag_entry.data._ascii != NULL) { 21111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev free(p_exif_info->exif_data[i].tag_entry.data._ascii); 21211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._ascii = NULL; 21311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 21411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 21511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 21611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_SHORT: { 21711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (p_exif_info->exif_data[i].tag_entry.count > 1 && 21811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._shorts != NULL) { 21911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev free(p_exif_info->exif_data[i].tag_entry.data._shorts); 22011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._shorts = NULL; 22111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 22211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 22311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 22411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_LONG: { 22511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (p_exif_info->exif_data[i].tag_entry.count > 1 && 22611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._longs != NULL) { 22711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev free(p_exif_info->exif_data[i].tag_entry.data._longs); 22811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._longs = NULL; 22911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 23011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 23111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 23211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_RATIONAL: { 23311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (p_exif_info->exif_data[i].tag_entry.count > 1 && 23411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._rats != NULL) { 23511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev free(p_exif_info->exif_data[i].tag_entry.data._rats); 23611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._rats = NULL; 23711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 23811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 23911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 24011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_UNDEFINED: { 24111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (p_exif_info->exif_data[i].tag_entry.data._undefined != NULL) { 24211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev free(p_exif_info->exif_data[i].tag_entry.data._undefined); 24311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._undefined = NULL; 24411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 24511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 24611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 24711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_SLONG: { 24811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (p_exif_info->exif_data[i].tag_entry.count > 1 && 24911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._slongs != NULL) { 25011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev free(p_exif_info->exif_data[i].tag_entry.data._slongs); 25111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._slongs = NULL; 25211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 25311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 25411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 25511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev case EXIF_SRATIONAL: { 25611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev if (p_exif_info->exif_data[i].tag_entry.count > 1 && 25711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._srats != NULL) { 25811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev free(p_exif_info->exif_data[i].tag_entry.data._srats); 25911a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev p_exif_info->exif_data[i].tag_entry.data._srats = NULL; 26011a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 26111a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 26211a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev break; 26311a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } 26411a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 26511a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev } /*end of switch*/ 26611a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev 26711a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev return 0; 26811a4b5c79df5f832d512e0da94d596380c319dbcIliyan Malchev} 269