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