image_dec.c (2811B)
1 // Copyright 2016 Google Inc. All Rights Reserved. 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the COPYING file in the root of the source 5 // tree. An additional intellectual property rights grant can be found 6 // in the file PATENTS. All contributing project authors may 7 // be found in the AUTHORS file in the root of the source tree. 8 // ----------------------------------------------------------------------------- 9 // 10 // Generic image-type guessing. 11 12 #include <stddef.h> 13 14 #include "./image_dec.h" 15 #include "./metadata.h" 16 #include "webp/encode.h" 17 #include "webp/types.h" 18 19 const char* WebPGetEnabledInputFileFormats(void) { 20 return "WebP" 21 #ifdef WEBP_HAVE_JPEG 22 ", JPEG" 23 #endif 24 #ifdef WEBP_HAVE_PNG 25 ", PNG" 26 #endif 27 ", PNM (PGM, PPM, PAM)" 28 #ifdef WEBP_HAVE_TIFF 29 ", TIFF" 30 #endif 31 #ifdef HAVE_WINCODEC_H 32 ", Windows Imaging Component (WIC)" 33 #endif 34 ""; 35 } 36 37 static WEBP_INLINE uint32_t GetBE32(const uint8_t buf[]) { 38 return ((uint32_t)buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3]; 39 } 40 41 WebPInputFileFormat WebPGuessImageType(const uint8_t* const data, 42 size_t data_size) { 43 WebPInputFileFormat format = WEBP_UNSUPPORTED_FORMAT; 44 if (data != NULL && data_size >= 12) { 45 const uint32_t magic1 = GetBE32(data + 0); 46 const uint32_t magic2 = GetBE32(data + 8); 47 if (magic1 == 0x89504E47U) { 48 format = WEBP_PNG_FORMAT; 49 } else if (magic1 >= 0xFFD8FF00U && magic1 <= 0xFFD8FFFFU) { 50 format = WEBP_JPEG_FORMAT; 51 } else if (magic1 == 0x49492A00 || magic1 == 0x4D4D002A) { 52 format = WEBP_TIFF_FORMAT; 53 } else if (magic1 == 0x52494646 && magic2 == 0x57454250) { 54 format = WEBP_WEBP_FORMAT; 55 } else if (((magic1 >> 24) & 0xff) == 'P') { 56 const int type = (magic1 >> 16) & 0xff; 57 // we only support 'P5 -> P7' for now. 58 if (type >= '5' && type <= '7') format = WEBP_PNM_FORMAT; 59 } 60 } 61 return format; 62 } 63 64 static int FailReader(const uint8_t* const data, size_t data_size, 65 struct WebPPicture* const pic, 66 int keep_alpha, struct Metadata* const metadata) { 67 (void)data; 68 (void)data_size; 69 (void)pic; 70 (void)keep_alpha; 71 (void)metadata; 72 return 0; 73 } 74 75 WebPImageReader WebPGetImageReader(WebPInputFileFormat format) { 76 switch (format) { 77 case WEBP_PNG_FORMAT: return ReadPNG; 78 case WEBP_JPEG_FORMAT: return ReadJPEG; 79 case WEBP_TIFF_FORMAT: return ReadTIFF; 80 case WEBP_WEBP_FORMAT: return ReadWebP; 81 case WEBP_PNM_FORMAT: return ReadPNM; 82 default: return FailReader; 83 } 84 } 85 86 WebPImageReader WebPGuessImageReader(const uint8_t* const data, 87 size_t data_size) { 88 return WebPGetImageReader(WebPGuessImageType(data, data_size)); 89 }