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 "./image_dec.h"
13
GetBE32(const uint8_t buf[])14 static WEBP_INLINE uint32_t GetBE32(const uint8_t buf[]) {
15 return ((uint32_t)buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | buf[3];
16 }
17
WebPGuessImageType(const uint8_t * const data,size_t data_size)18 WebPInputFileFormat WebPGuessImageType(const uint8_t* const data,
19 size_t data_size) {
20 WebPInputFileFormat format = WEBP_UNSUPPORTED_FORMAT;
21 if (data != NULL && data_size >= 12) {
22 const uint32_t magic1 = GetBE32(data + 0);
23 const uint32_t magic2 = GetBE32(data + 8);
24 if (magic1 == 0x89504E47U) {
25 format = WEBP_PNG_FORMAT;
26 } else if (magic1 >= 0xFFD8FF00U && magic1 <= 0xFFD8FFFFU) {
27 format = WEBP_JPEG_FORMAT;
28 } else if (magic1 == 0x49492A00 || magic1 == 0x4D4D002A) {
29 format = WEBP_TIFF_FORMAT;
30 } else if (magic1 == 0x52494646 && magic2 == 0x57454250) {
31 format = WEBP_WEBP_FORMAT;
32 } else if (((magic1 >> 24) & 0xff) == 'P') {
33 const int type = (magic1 >> 16) & 0xff;
34 // we only support 'P5 -> P7' for now.
35 if (type >= '5' && type <= '7') format = WEBP_PNM_FORMAT;
36 }
37 }
38 return format;
39 }
40
FailReader(const uint8_t * const data,size_t data_size,struct WebPPicture * const pic,int keep_alpha,struct Metadata * const metadata)41 static int FailReader(const uint8_t* const data, size_t data_size,
42 struct WebPPicture* const pic,
43 int keep_alpha, struct Metadata* const metadata) {
44 (void)data;
45 (void)data_size;
46 (void)pic;
47 (void)keep_alpha;
48 (void)metadata;
49 return 0;
50 }
51
WebPGetImageReader(WebPInputFileFormat format)52 WebPImageReader WebPGetImageReader(WebPInputFileFormat format) {
53 switch (format) {
54 case WEBP_PNG_FORMAT: return ReadPNG;
55 case WEBP_JPEG_FORMAT: return ReadJPEG;
56 case WEBP_TIFF_FORMAT: return ReadTIFF;
57 case WEBP_WEBP_FORMAT: return ReadWebP;
58 case WEBP_PNM_FORMAT: return ReadPNM;
59 default: return FailReader;
60 }
61 }
62
WebPGuessImageReader(const uint8_t * const data,size_t data_size)63 WebPImageReader WebPGuessImageReader(const uint8_t* const data,
64 size_t data_size) {
65 return WebPGetImageReader(WebPGuessImageType(data, data_size));
66 }
67