Fix coverity issue 76/172676/7
authorJiyong Min <jiyong.min@samsung.com>
Thu, 15 Mar 2018 06:37:37 +0000 (15:37 +0900)
committerJiyong Min <jiyong.min@samsung.com>
Fri, 16 Mar 2018 01:44:34 +0000 (10:44 +0900)
 - remove unused image_codec_type due to coverity issue

Change-Id: I2fa4798cbe93a8ff23c3b684087f8821ae1c6666

magick/include/mm_util_magick.h
magick/mm_util_info.c
magick/mm_util_magick.c
magick/test/mm_util_magick_testsuite.c
packaging/libmm-utility.spec

index 8bb7ef0..9c0f13b 100755 (executable)
@@ -44,18 +44,12 @@ typedef enum {
 } mm_util_magick_rotate_type;
 
 typedef enum {
-       IMG_CODEC_UNKNOWN_TYPE                  = -2,
-       IMG_CODEC_BIG_PROGRESSIVE_JPEG  = -1,
-       IMG_CODEC_NONE                                  = 0,
-       IMG_CODEC_GIF                                           = (1 << 0),
-       IMG_CODEC_PNG                                           = (1 << 1),
-       IMG_CODEC_WBMP                                  = (1 << 2),
-       IMG_CODEC_JPEG                                          = (1 << 3),
-       IMG_CODEC_BMP                                           = (1 << 4),
-       IMG_CODEC_TIF                                           = (1 << 5),
-       IMG_CODEC_AGIF                                          = (1 << 6),
-       IMG_CODEC_PROGRESSIVE_JPEG              = (1 << 7),
-       IMG_CODEC_DRM                                   = (1 << 8),
+       IMG_CODEC_GIF = 0,
+       IMG_CODEC_PNG,
+       IMG_CODEC_WBMP,
+       IMG_CODEC_JPEG,
+       IMG_CODEC_BMP,
+       IMG_CODEC_UNKNOWN_TYPE,
 } mm_util_img_codec_type;
 
 int mm_util_create_handle(mm_util_image_h *handle, const unsigned char *buffer, unsigned int width, unsigned int height, size_t size, mm_util_color_format_e format);
index 8abd671..19377bc 100755 (executable)
 
 #define                FILE_READ_SIZE          4096
 
-typedef struct _stream {
-        FILE *fd;
-        unsigned int buffpos;
-        unsigned int filepos;
-        unsigned int filesize;
-        unsigned int buffend;
-        unsigned int debugpos;
-        unsigned char *buffer;
-} IFEGSTREAMCTRL;
-
 static unsigned char gIfegPNGHeader[] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a };
 static unsigned char gIfegJPEGHeader[] = { 0xFF, 0xD8 };
 static unsigned char gIfegGIFHeader[] = { "GIF" };
@@ -55,476 +45,233 @@ static unsigned char gIfegWBMPHeader[] = { 0x00, 0x00 };
 
 void __ImgGetFileAttributes(const char *szPathName, unsigned long *pFileAttr)
 {
-        FILE *f = NULL;
-
-        f = fopen(szPathName, "r");
-        if (f != NULL) {
-                fseek(f, 0, SEEK_END);
-                *pFileAttr = ftell(f);
-                fclose(f);
-        }
-}
-
-static int _CheckBuffer(IFEGSTREAMCTRL *pIfegstreamctrl, unsigned int size)
-{
-        unsigned long fileread;
-
-        if ((size + pIfegstreamctrl->buffpos) > pIfegstreamctrl->buffend) {
-                if (pIfegstreamctrl->filepos == pIfegstreamctrl->filesize)
-                        return MM_UTIL_ERROR_INVALID_OPERATION;
-
-                if (pIfegstreamctrl->buffpos == 0) {
-                        fileread = fread(pIfegstreamctrl->buffer, sizeof(char), FILE_READ_SIZE, pIfegstreamctrl->fd);
-                        if (fileread == 0)
-                                return MM_UTIL_ERROR_INVALID_OPERATION;
-
-                        pIfegstreamctrl->buffend = fileread;
-                        pIfegstreamctrl->filepos += fileread;
-                        pIfegstreamctrl->buffpos = 0;
-                } else {
-
-                        if (size >= 2048 || pIfegstreamctrl->buffend - pIfegstreamctrl->buffpos > FILE_READ_SIZE)
-                                return MM_UTIL_ERROR_INVALID_OPERATION;
-
-                        memcpy(pIfegstreamctrl->buffer, &pIfegstreamctrl->buffer[pIfegstreamctrl->buffpos], pIfegstreamctrl->buffend - pIfegstreamctrl->buffpos);
-                        fileread = fread(&pIfegstreamctrl->buffer[pIfegstreamctrl->buffend - pIfegstreamctrl->buffpos], sizeof(char), pIfegstreamctrl->buffpos, pIfegstreamctrl->fd);
-                        if (fileread == 0)
-                                return MM_UTIL_ERROR_INVALID_OPERATION;
-
-                        pIfegstreamctrl->buffend = pIfegstreamctrl->buffend - pIfegstreamctrl->buffpos + fileread;
-                        pIfegstreamctrl->buffpos = 0;
-                        pIfegstreamctrl->filepos += fileread;
-                }
-                return MM_UTIL_ERROR_NONE;
-        }
-        return MM_UTIL_ERROR_NONE;
+       FILE *f = NULL;
+
+       f = fopen(szPathName, "r");
+       if (f != NULL) {
+               fseek(f, 0, SEEK_END);
+               *pFileAttr = ftell(f);
+               fclose(f);
+       }
 }
 
 static unsigned int _IfegReadUINT(unsigned char *pBuffer)
 {
-        return (((*pBuffer) << 24) | ((*(pBuffer + 1)) << 16) | ((*(pBuffer + 2)) << 8) | (*(pBuffer + 3)));
+       return (((*pBuffer) << 24) | ((*(pBuffer + 1)) << 16) | ((*(pBuffer + 2)) << 8) | (*(pBuffer + 3)));
 }
 
 static int _ImgGetImageInfo(FILE *hFile, unsigned long fileSize, char *fileExt, mm_util_img_codec_type *type, unsigned int *width, unsigned int *height)
 {
-        unsigned int fileleft;
-        unsigned long fileread;
-        unsigned char EncodedDataBuffer[4096];
-
-        unsigned int *pWidth = NULL;
-        unsigned int *pHeight = NULL;
-        int ret = MM_UTIL_ERROR_NONE;
-
-        if (type == NULL || width == NULL || height == NULL) {
-                return MM_UTIL_ERROR_INVALID_PARAMETER;
-        } else {
-                pWidth = width;
-                pHeight = height;
-
-                *type = IMG_CODEC_UNKNOWN_TYPE;
-                *pWidth = 0;
-                *pHeight = 0;
-        }
-
-        memset(EncodedDataBuffer, 0, 4096);
-
-        fileread = fread(EncodedDataBuffer, sizeof(char), 8, hFile);
-        if (fileread < MINIMUM_HEADER_BYTES) {
-                mm_util_warn("IMG_CODEC_UNKNOWN_TYPE");
-                return ret;
-        }
-
-        if (memcmp(EncodedDataBuffer, gIfegJPEGHeader, JPG_HEADER_LENGTH) == 0) {
-                unsigned char header_type[JPG_HEADER_TYPE_LENGTH];
-                unsigned char block_size[JPG_BLOCK_SIZE_LENGTH];
-                unsigned char image_size[JPG_IMAGE_SIZE_LENGTH];
-
-                rewind(hFile);
-
-                unsigned short block_length = EncodedDataBuffer[4] * 256 + EncodedDataBuffer[5];
-                mm_util_debug("block length : %d", block_length);
-                unsigned int i = 4;
-
-                if (fseek(hFile, block_length + 4, SEEK_CUR) < 0) {
-                        mm_util_error("fseek was failed");
-                        return MM_UTIL_ERROR_INVALID_OPERATION;
-                }
-
-                while (i < fileSize) {
-                        i += block_length;
-                        if (i >= fileSize) {
-                                mm_util_warn("Failed to get w / h from jpeg at index [%d]", i);
-                                break;
-                        }
-
-                        memset(header_type, 0, JPG_HEADER_TYPE_LENGTH);
-                        fileread = fread(header_type, sizeof(char), JPG_HEADER_TYPE_LENGTH, hFile);
-
-                        if (header_type[0] != 0xFF) {
-                                mm_util_warn("Failed to get w / h from jpeg at index [%d]", i);
-                                break;
-                        }
-
-                        if (header_type[1] == 0xC0 || header_type[1] == 0xC2) {
-                                memset(image_size, 0, JPG_IMAGE_SIZE_LENGTH);
-                                fileread = fread(image_size, sizeof(char), JPG_IMAGE_SIZE_LENGTH, hFile);
-
-                                *pWidth = image_size[5] * 256 + image_size[6];
-                                *pHeight = image_size[3] * 256 + image_size[4];
-                                break;
-                        } else {
-                                i += 2;
-                                memset(block_size, 0, JPG_BLOCK_SIZE_LENGTH);
-                                fileread = fread(block_size, sizeof(char), JPG_BLOCK_SIZE_LENGTH, hFile);
-                                block_length = block_size[0] * 256 + block_size[1];
-                                mm_util_debug("new block length : %d", block_length);
-
-                                if (fseek(hFile, block_length-JPG_BLOCK_SIZE_LENGTH, SEEK_CUR) < 0) {
+       unsigned long fileread;
+       unsigned char EncodedDataBuffer[4096];
+
+       unsigned int *pWidth = NULL;
+       unsigned int *pHeight = NULL;
+       int ret = MM_UTIL_ERROR_NONE;
+
+       mm_util_retvm_if((type == NULL), MM_UTIL_ERROR_INVALID_PARAMETER, "type is null");
+       mm_util_retvm_if((width == NULL), MM_UTIL_ERROR_INVALID_PARAMETER, "width is null");
+       mm_util_retvm_if((height == NULL), MM_UTIL_ERROR_INVALID_PARAMETER, "height is null");
+
+       pWidth = width;
+       pHeight = height;
+
+       *type = IMG_CODEC_UNKNOWN_TYPE;
+       *pWidth = 0;
+       *pHeight = 0;
+
+       memset(EncodedDataBuffer, 0, 4096);
+
+       fileread = fread(EncodedDataBuffer, sizeof(char), MINIMUM_HEADER_BYTES, hFile);
+       mm_util_retvm_if((fileread < MINIMUM_HEADER_BYTES), ret, "IMG_CODEC_UNKNOWN_TYPE");
+
+       if (memcmp(EncodedDataBuffer, gIfegJPEGHeader, JPG_HEADER_LENGTH) == 0) {
+               unsigned char header_type[JPG_HEADER_TYPE_LENGTH];
+               unsigned char block_size[JPG_BLOCK_SIZE_LENGTH];
+               unsigned char image_size[JPG_IMAGE_SIZE_LENGTH];
+
+               rewind(hFile);
+
+               unsigned short block_length = EncodedDataBuffer[4] * 256 + EncodedDataBuffer[5];
+               mm_util_debug("block length : %d", block_length);
+               unsigned int i = 4;
+
+               if (fseek(hFile, block_length + 4, SEEK_CUR) < 0) {
+                       mm_util_error("fseek was failed");
+                       return MM_UTIL_ERROR_INVALID_OPERATION;
+               }
+
+               while (i < fileSize) {
+                       i += block_length;
+                       if (i >= fileSize) {
+                               mm_util_warn("Failed to get w / h from jpeg at index [%d]", i);
+                       break;
+                       }
+
+                       memset(header_type, 0, JPG_HEADER_TYPE_LENGTH);
+                       fileread = fread(header_type, sizeof(char), JPG_HEADER_TYPE_LENGTH, hFile);
+                       mm_util_retvm_if((fileread < JPG_HEADER_TYPE_LENGTH), ret, "IMG_CODEC_UNKNOWN_TYPE in JPEG");
+
+                       if (header_type[0] != 0xFF) {
+                               mm_util_warn("Failed to get w / h from jpeg at index [%d]", i);
+                               break;
+                       }
+
+                       if (header_type[1] == 0xC0 || header_type[1] == 0xC2) {
+                               memset(image_size, 0, JPG_IMAGE_SIZE_LENGTH);
+                               fileread = fread(image_size, sizeof(char), JPG_IMAGE_SIZE_LENGTH, hFile);
+                               mm_util_retvm_if((fileread < JPG_IMAGE_SIZE_LENGTH), ret, "IMG_CODEC_UNKNOWN_TYPE in JPEG");
+
+                               *pWidth = image_size[5] * 256 + image_size[6];
+                               *pHeight = image_size[3] * 256 + image_size[4];
+                               break;
+                       } else {
+                               i += 2;
+                               memset(block_size, 0, JPG_BLOCK_SIZE_LENGTH);
+                               fileread = fread(block_size, sizeof(char), JPG_BLOCK_SIZE_LENGTH, hFile);
+                               mm_util_retvm_if((fileread < JPG_BLOCK_SIZE_LENGTH), ret, "IMG_CODEC_UNKNOWN_TYPE in JPEG");
+                               block_length = block_size[0] * 256 + block_size[1];
+                               mm_util_debug("new block length : %d", block_length);
+
+                               if (fseek(hFile, block_length-JPG_BLOCK_SIZE_LENGTH, SEEK_CUR) < 0) {
                                         mm_util_error("fseek was failed");
                                         return MM_UTIL_ERROR_INVALID_OPERATION;
-                                }
-                        }
-                }
-                mm_util_debug("IMG_CODEC_JPEG : W[%d] H[%d]", *pWidth, *pHeight);
-                *type = IMG_CODEC_JPEG;
-        }
-        /*********************** PNG *************************/
-        else if (memcmp(EncodedDataBuffer, gIfegPNGHeader, PNG_HEADER_LENGTH) == 0) {
-                unsigned char tmp;
-
-                fileread = fread(EncodedDataBuffer, sizeof(char), 32, hFile);
-                if (fileread < 32) {
-                        mm_util_warn("IMG_CODEC_UNKNOWN_TYPE in PNG");
-                        return ret;
-                }
-                /* Get Image Width */
-                if (pWidth)
-                        *pWidth = _IfegReadUINT((EncodedDataBuffer + 8));
-
-                /* Get Image Height */
-                if (pHeight)
-                        *pHeight = _IfegReadUINT((EncodedDataBuffer + 12));
-
-                /* Read Interlace byte */
-                tmp = *(EncodedDataBuffer + 20);
-                /* If image is interlaced then multiple should be 2 */
-                if (tmp) {
-                        mm_util_debug("Interlaced PNG Image.");
-                }
-                mm_util_debug("IMG_CODEC_PNG");
-                *type = IMG_CODEC_PNG;
-        }
-        /*********************** BMP *************************/
-        else if (memcmp(EncodedDataBuffer, gIfegBMPHeader, BMP_HEADER_LENGTH) == 0) {
-                /* Parse BMP File and get image width and image height */
-                fileread = fread(&EncodedDataBuffer[8], sizeof(char), 18, hFile);
-                if (fileread < 18) {
-                        mm_util_warn("IMG_CODEC_UNKNOWN_TYPE in BMP");
-                        return ret;
-                }
-                if (pWidth) {
-                        *pWidth =
-                                EncodedDataBuffer[18] | (EncodedDataBuffer[19] << 8)
-                                | (EncodedDataBuffer[20] << 16) |
-                                (EncodedDataBuffer[21] << 24);
-                }
-                if (pHeight) {
-                        // add the reference function abs(). may have negative height values in bmp header.
-                        *pHeight = abs(EncodedDataBuffer[22] | (EncodedDataBuffer[23] << 8) | (EncodedDataBuffer[24] << 16) | (EncodedDataBuffer[25] << 24));
-                }
-
-                mm_util_debug("IMG_CODEC_BMP");
-                *type = IMG_CODEC_BMP;
-        }
-        /*********************** GIF *************************/
-        else if (memcmp(EncodedDataBuffer, gIfegGIFHeader, GIF_HEADER_LENGTH) == 0) {
-                unsigned int tablelength = 0;
-                unsigned int imagecount = 0;
-                int finished = 0;
-                unsigned char temp;
-                unsigned int length;
-                IFEGSTREAMCTRL ifegstreamctrl;
-
-                if (13 > fileSize) {
-                        mm_util_warn("IMG_CODEC_UNKNOWN_TYPE in GIF");
-                        return ret;
-                }
-
-                fileread = fread(&EncodedDataBuffer[8], sizeof(char), 5, hFile);
-                if (fileread < 5) {
-                        mm_util_warn("IMG_CODEC_UNKNOWN_TYPE in GIF");
-                        return ret;
-                }
-
-                if (EncodedDataBuffer[0] != 'G' || EncodedDataBuffer[1] != 'I'
-                        || EncodedDataBuffer[2] != 'F' || EncodedDataBuffer[3] < '0'
-                        || EncodedDataBuffer[3] > '9' || EncodedDataBuffer[4] < '0'
-                        || EncodedDataBuffer[4] > '9' || EncodedDataBuffer[5] < 'A'
-                        || EncodedDataBuffer[5] > 'z') {
-                        mm_util_warn("IMG_CODEC_UNKNOWN_TYPE in GIF");
-                        return ret;
-                }
-
-                *pWidth = EncodedDataBuffer[6] | (EncodedDataBuffer[7] << 8);
-                *pHeight = EncodedDataBuffer[8] | (EncodedDataBuffer[9] << 8);
-
-                mm_util_debug("Logical width : %d, Height : %d", *pWidth, *pHeight);
-
-                if ((EncodedDataBuffer[10] & 0x80) != 0) {  /* Global color table */
-                        temp = (EncodedDataBuffer[10] & 0x7) + 1;
-                        tablelength = (1 << temp) * 3;
-
-                        if ((tablelength * sizeof(char)) > sizeof(EncodedDataBuffer)) {
-                                mm_util_warn("_ImgGetInfoStreaming :table length is more than buffer length");
-                                return ret;
-                        }
-
-                        if (13 + tablelength > fileSize) {
-                                mm_util_warn("IMG_CODEC_UNKNOWN_TYPE in GIF");
-                                return ret;
-                        }
-                        /* coverity[ -tainted_data_argument : EncodedDataBuffer ] */
-                        fileread = fread(EncodedDataBuffer, sizeof(char), tablelength, hFile);
-                        if (fileread < tablelength) {
-                                mm_util_warn("IMG_CODEC_UNKNOWN_TYPE in GIF");
-                                return ret;
-                        }
-                }
-
-                fileleft = fileSize - 13 - tablelength;
-
-                ifegstreamctrl.fd = hFile;
-                ifegstreamctrl.filesize = fileleft;
-                ifegstreamctrl.filepos = 0;
-                ifegstreamctrl.buffpos = 0;
-                ifegstreamctrl.buffend = 0;
-                ifegstreamctrl.buffer = EncodedDataBuffer;
-
-                while (!finished) {
-                        if (ifegstreamctrl.buffpos > ifegstreamctrl.buffend)
-                                break;
-                        if (_CheckBuffer(&ifegstreamctrl, 1) != MM_UTIL_ERROR_NONE) {
-                                mm_util_warn("_CheckBuffer was failed");
-                                return ret;
-                        }
-
-                        switch (EncodedDataBuffer[ifegstreamctrl.buffpos++]) {
-
-                        case 0x3b:  /* End of the GIF dataset */
-                                finished = 1;
-                                break;
-
-                        case 0x21:  /* Extension Block */
-                                if (_CheckBuffer(&ifegstreamctrl, 1) != MM_UTIL_ERROR_NONE) {
-                                        mm_util_warn("_CheckBuffer was failed");
-                                        return ret;
-                                }
-
-                                switch (EncodedDataBuffer[ifegstreamctrl.buffpos++]) {
-
-                                case 0xf9:  /* Graphic control extension block */
-                                        if (_CheckBuffer(&ifegstreamctrl, 6) != MM_UTIL_ERROR_NONE) {
-                                                mm_util_warn("_CheckBuffer was failed");
-                                                return ret;
-                                        }
-
-                                        if (4 != EncodedDataBuffer[ifegstreamctrl.buffpos++]) { /* data length : fixed 4 bytes */
-                                                *type = 0;
-                                        }
-                                        ifegstreamctrl.buffpos += 4;
-                                        ifegstreamctrl.buffpos++;       /* block end */
-                                        break;
-
-                                case 0x01:  /* Plain Text block */
-                                case 0xfe:  /* Comment Extension block */
-                                case 0xff:  /* Appliation Extension block */
-                                        if (_CheckBuffer(&ifegstreamctrl, 1) != MM_UTIL_ERROR_NONE) {
-                                                mm_util_warn("_CheckBuffer was failed");
-                                                return ret;
-                                        }
-
-                                        if (ifegstreamctrl.buffpos > sizeof(EncodedDataBuffer)) {
-                                                mm_util_warn("buffer position exceeds buffer max length ");
-                                                return ret;
-                                        }
-
-                                        while ((ifegstreamctrl.buffpos < sizeof(EncodedDataBuffer))
-                                                && ((length = EncodedDataBuffer[ifegstreamctrl.buffpos++]) > 0)) {  /* get the data length */
-                                                if (_CheckBuffer(&ifegstreamctrl, length) != MM_UTIL_ERROR_NONE) {
-                                                        mm_util_warn("_CheckBuffer was failed");
-                                                        return ret;
-                                                }
-
-                                                /* Check integer overflow */
-                                                if (ifegstreamctrl.buffpos > 0xffffffff - length) {
-                                                        mm_util_error("Prevent integer overflow..");
-                                                        return ret;
-                                                }
-
-                                                ifegstreamctrl.buffpos += (length);
-                                                /* File End Check */
-                                        }
-                                        break;
-
-                                default:
-                                        break;
-                                }
-
-                                break;
-
-                        case 0x2c:  /* Start of an image object. Read the image description. */
-
-                                if (_CheckBuffer(&ifegstreamctrl, 9) != MM_UTIL_ERROR_NONE) {
-                                        mm_util_warn("_CheckBuffer was failed");
-                                        return ret;
-                                }
-#if 1
-                                if (imagecount == 0) {
-                                        /* Regard the width/height of the first image block as the size of thumbnails. */
-                                        int img_block_w = 0, img_block_h = 0;
-
-                                        img_block_w = EncodedDataBuffer[ifegstreamctrl.buffpos + 4] |(EncodedDataBuffer[ifegstreamctrl.buffpos + 5] << 8);
-                                        img_block_h = EncodedDataBuffer[ifegstreamctrl.buffpos + 6] |(EncodedDataBuffer[ifegstreamctrl.buffpos + 7] << 8);
-                                        mm_util_debug("Image block width : %d, Height : %d", img_block_w, img_block_h);
-
-                                        *pWidth = img_block_w;
-                                        *pHeight = img_block_h;
-                                }
-#endif
-                                /* Color Resolution */
-                                if ((EncodedDataBuffer[ifegstreamctrl.buffpos + 8] & 0x80) != 0) {  /* Logical color table */
-                                        temp = (EncodedDataBuffer[ifegstreamctrl.buffpos + 8] & 0x7) + 1;
-                                        length = (1 << temp) * 3;
-                                        if (_CheckBuffer(&ifegstreamctrl, length + 9) != MM_UTIL_ERROR_NONE) {
-                                                mm_util_warn("_CheckBuffer was failed");
-                                                return ret;
-                                        }
-
-                                        ifegstreamctrl.buffpos += length;
-                                        /* File End Check */
-                                }
-
-                                ifegstreamctrl.buffpos += 9;
-
-                                if (_CheckBuffer(&ifegstreamctrl, 1) != MM_UTIL_ERROR_NONE) {
-                                        mm_util_warn("_CheckBuffer was failed");
-                                        return ret;
-                                }
-
-                                temp = EncodedDataBuffer[ifegstreamctrl.buffpos++];
-                                if (temp < 2 || 9 < temp) {
-                                        return ret;
-                                }
-
-                                do {
-                                        if (_CheckBuffer(&ifegstreamctrl, 1) != MM_UTIL_ERROR_NONE) {
-                                                mm_util_warn("_CheckBuffer was failed");
-                                                return ret;
-                                        }
-
-                                        length = EncodedDataBuffer[ifegstreamctrl.buffpos++];
-                                        if ((length + ifegstreamctrl.buffpos) > ifegstreamctrl.buffend) {
-                                                length = length + ifegstreamctrl.buffpos - ifegstreamctrl.buffend;
-                                                if (fseek(ifegstreamctrl.fd, length, SEEK_CUR) < 0) {
-                                                        if (imagecount) {
-                                                                mm_util_debug("IMG_CODEC_AGIF");
-                                                                *type = IMG_CODEC_AGIF;
-                                                                return ret;
-                                                        }
-                                                        return MM_UTIL_ERROR_INVALID_OPERATION;
-                                                }
-                                                ifegstreamctrl.filepos += length;
-                                                ifegstreamctrl.buffpos = 0;
-                                                ifegstreamctrl.buffend = 0;
-                                        } else {
-                                                ifegstreamctrl.buffpos += length;
-                                        }
-
-                                        /* File End Check */
-                                } while (length);
-                                if (!imagecount)
-                                        imagecount++;
-                                else {
-                                        mm_util_debug("IMG_CODEC_AGIF");
-                                        *type = IMG_CODEC_AGIF;
-                                        return ret;
-                                }
-                                break;
-
-                        default:
-                                finished = 0;
-                                break;
-
-                        }
-                }
-                mm_util_debug("IMG_CODEC_GIF");
-                *type = IMG_CODEC_GIF;
-        }
-        /*********************** WBMP *************************/
-        else if ((memcmp(EncodedDataBuffer, gIfegWBMPHeader, WBMP_HEADER_LENGTH) == 0) && (strcasecmp(fileExt, "wbmp") == 0)) {
-                /* Parse BMP File and get image width and image height */
-                if (pWidth)
-                        *pWidth = EncodedDataBuffer[2];
-
-                if (pHeight)
-                        *pHeight = EncodedDataBuffer[3];
-
-                mm_util_debug("IMG_CODEC_WBMP W[%d] H[%d]", *pWidth, *pHeight);
-                *type = IMG_CODEC_WBMP;
-        }
-        return ret;
+                               }
+                       }
+               }
+               mm_util_debug("IMG_CODEC_JPEG : W[%d] H[%d]", *pWidth, *pHeight);
+               *type = IMG_CODEC_JPEG;
+       }
+       /*********************** PNG *************************/
+       else if (memcmp(EncodedDataBuffer, gIfegPNGHeader, PNG_HEADER_LENGTH) == 0) {
+               unsigned char tmp;
+
+               fileread = fread(EncodedDataBuffer, sizeof(char), 32, hFile);
+               mm_util_retvm_if((fileread < 32), ret, "IMG_CODEC_UNKNOWN_TYPE in PNG");
+               /* Get Image Width */
+               if (pWidth)
+                       *pWidth = _IfegReadUINT((EncodedDataBuffer + 8));
+
+               /* Get Image Height */
+               if (pHeight)
+                       *pHeight = _IfegReadUINT((EncodedDataBuffer + 12));
+
+               /* Read Interlace byte */
+               tmp = *(EncodedDataBuffer + 20);
+               /* If image is interlaced then multiple should be 2 */
+               if (tmp)
+                       mm_util_debug("Interlaced PNG Image.");
+
+               mm_util_debug("IMG_CODEC_PNG");
+               *type = IMG_CODEC_PNG;
+       }
+       /*********************** BMP *************************/
+       else if (memcmp(EncodedDataBuffer, gIfegBMPHeader, BMP_HEADER_LENGTH) == 0) {
+               /* Parse BMP File and get image width and image height */
+               fileread = fread(&EncodedDataBuffer[8], sizeof(char), 18, hFile);
+               mm_util_retvm_if((fileread < 18), ret, "IMG_CODEC_UNKNOWN_TYPE in BMP");
+               if (pWidth) {
+                       *pWidth =
+                       EncodedDataBuffer[18] | (EncodedDataBuffer[19] << 8)
+                       | (EncodedDataBuffer[20] << 16) |
+                       (EncodedDataBuffer[21] << 24);
+               }
+               if (pHeight) {
+                       // add the reference function abs(). may have negative height values in bmp header.
+                       *pHeight = abs(EncodedDataBuffer[22] | (EncodedDataBuffer[23] << 8) | (EncodedDataBuffer[24] << 16) | (EncodedDataBuffer[25] << 24));
+               }
+
+               mm_util_debug("IMG_CODEC_BMP");
+               *type = IMG_CODEC_BMP;
+       }
+       /*********************** GIF *************************/
+       else if (memcmp(EncodedDataBuffer, gIfegGIFHeader, GIF_HEADER_LENGTH) == 0) {
+               mm_util_retvm_if((MINIMUM_HEADER_BYTES + 4 > fileSize), ret, "IMG_CODEC_UNKNOWN_TYPE in GIF");
+
+               fileread = fread(&EncodedDataBuffer[8], sizeof(char), 4, hFile);
+               mm_util_retvm_if((fileread < 4), ret, "IMG_CODEC_UNKNOWN_TYPE in GIF");
+
+               if (EncodedDataBuffer[0] != 'G' || EncodedDataBuffer[1] != 'I'
+               || EncodedDataBuffer[2] != 'F' || EncodedDataBuffer[3] < '0'
+               || EncodedDataBuffer[3] > '9' || EncodedDataBuffer[4] < '0'
+               || EncodedDataBuffer[4] > '9' || EncodedDataBuffer[5] < 'A'
+               || EncodedDataBuffer[5] > 'z') {
+                       mm_util_warn("IMG_CODEC_UNKNOWN_TYPE in GIF");
+                       return ret;
+               }
+
+               *pWidth = EncodedDataBuffer[6] | (EncodedDataBuffer[7] << 8);
+               *pHeight = EncodedDataBuffer[8] | (EncodedDataBuffer[9] << 8);
+
+               mm_util_debug("Logical width : %d, Height : %d", *pWidth, *pHeight);
+
+               mm_util_debug("IMG_CODEC_GIF");
+               *type = IMG_CODEC_GIF;
+       }
+       /*********************** WBMP *************************/
+       else if ((memcmp(EncodedDataBuffer, gIfegWBMPHeader, WBMP_HEADER_LENGTH) == 0) && (strcasecmp(fileExt, "wbmp") == 0)) {
+               /* Parse BMP File and get image width and image height */
+               if (pWidth)
+                       *pWidth = EncodedDataBuffer[2];
+
+               if (pHeight)
+                       *pHeight = EncodedDataBuffer[3];
+
+               mm_util_debug("IMG_CODEC_WBMP W[%d] H[%d]", *pWidth, *pHeight);
+               *type = IMG_CODEC_WBMP;
+       }
+       return ret;
 }
 
 static int _ImgGetFileExt(const char *path, char *file_ext, int max_len)
 {
-        int i = 0;
+       int i = 0;
 
-        for (i = (int)strlen(path); i >= 0; i--) {
-                if ((path[i] == '.') && (i < (int)strlen(path))) {
-                        strncpy(file_ext, &path[i + 1], max_len);
-                        return MM_UTIL_ERROR_NONE;
-                }
+       for (i = (int)strlen(path); i >= 0; i--) {
+               if ((path[i] == '.') && (i < (int)strlen(path))) {
+                       strncpy(file_ext, &path[i + 1], max_len);
+                       return MM_UTIL_ERROR_NONE;
+               }
 
-                /* meet the dir. no ext */
-                if (path[i] == '/')
-                        return MM_UTIL_ERROR_INVALID_PARAMETER;
-        }
+               /* meet the dir. no ext */
+               if (path[i] == '/')
+                       return MM_UTIL_ERROR_INVALID_PARAMETER;
+       }
 
-        return MM_UTIL_ERROR_INVALID_PARAMETER;
+       return MM_UTIL_ERROR_INVALID_PARAMETER;
 }
 
 int mm_util_extract_image_info(const char *path, mm_util_img_codec_type *type, unsigned int *width, unsigned int *height)
 {
-        FILE *hFile;
-        unsigned long file_size = 0;
-        char file_ext[10] = { 0, };
-        int ret = MM_UTIL_ERROR_NONE;
+       FILE *hFile;
+       unsigned long file_size = 0;
+       char file_ext[10] = { 0, };
+       int ret = MM_UTIL_ERROR_NONE;
 
-        if (path == NULL)
-                return MM_UTIL_ERROR_INVALID_PARAMETER;
+       if (path == NULL)
+               return MM_UTIL_ERROR_INVALID_PARAMETER;
 
-        hFile = fopen(path, "rb");
-        if (hFile == NULL) {
-                mm_util_error("file open error: %s", path);
-                return MM_UTIL_ERROR_INVALID_PARAMETER;
-        }
+       hFile = fopen(path, "rb");
+       if (hFile == NULL) {
+               mm_util_error("file open error: %s", path);
+               return MM_UTIL_ERROR_INVALID_PARAMETER;
+       }
 
-        __ImgGetFileAttributes(path, &file_size);
-        if (file_size == 0) {
-                fclose(hFile);
-                return MM_UTIL_ERROR_INVALID_PARAMETER;
-        }
+       __ImgGetFileAttributes(path, &file_size);
+       if (file_size == 0) {
+               fclose(hFile);
+               return MM_UTIL_ERROR_INVALID_PARAMETER;
+       }
 
-        ret = _ImgGetFileExt(path, file_ext, sizeof(file_ext));
-        if (ret != MM_UTIL_ERROR_NONE) {
-                mm_util_warn("_ImgGetFileExt failed");
-        }
+       ret = _ImgGetFileExt(path, file_ext, sizeof(file_ext));
+       if (ret != MM_UTIL_ERROR_NONE)
+               mm_util_warn("_ImgGetFileExt failed");
 
-        ret = _ImgGetImageInfo(hFile, file_size, file_ext, type, width, height);
+       ret = _ImgGetImageInfo(hFile, file_size, file_ext, type, width, height);
 
-        fseek(hFile, 0, SEEK_SET);
-        fclose(hFile);
+       fseek(hFile, 0, SEEK_SET);
+       fclose(hFile);
 
-        return ret;
+       return ret;
 }
 
index 3009c0e..1b19241 100755 (executable)
@@ -284,8 +284,8 @@ static int __mm_util_write_image_to_file(ImageInfo *image_info, Image *image, co
 
        GetExceptionInfo(&exception);
 
-       image->filename[MaxTextExtent-1] = '\0';
        strncpy(image->filename, out_path, sizeof(image->filename));
+       image->filename[MaxTextExtent-1] = '\0';
 
        AddDefinition(image_info, "jpeg", "dct-method", "FASTEST", &exception);
        AddDefinition(image_info, "jpeg", "optimize-coding", "FALSE", &exception);
index 21c7145..dfd0aae 100755 (executable)
@@ -139,6 +139,9 @@ static int __get_buffer_for_test(mm_util_color_format_e req_format, unsigned cha
        ret = mm_util_get_image(dst_handle, buffer, width, height, size, format);
        if (ret != MM_UTIL_ERROR_NONE) {
                printf("Fail mm_util_get_image [%d]\n", ret);
+               ret = mm_util_destroy_handle(dst_handle);
+               if (ret != MM_UTIL_ERROR_NONE)
+                       printf("Fail mm_util_destroy_handle [%d]\n", ret);
                MM_UTIL_SAFE_FREE(*buffer);
                return ret;
        }
index f8a10db..f302848 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       libmm-utility
 Summary:    Multimedia Framework Utility Library
-Version:    0.1.20
+Version:    0.1.21
 Release:    0
 Group:      System/Libraries
 License:    Apache-2.0