| OLD | NEW |
| 1 // Copyright 2010 Google Inc. All Rights Reserved. | 1 // Copyright 2010 Google Inc. All Rights Reserved. |
| 2 // | 2 // |
| 3 // Use of this source code is governed by a BSD-style license | 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 | 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 | 5 // tree. An additional intellectual property rights grant can be found |
| 6 // in the file PATENTS. All contributing project authors may | 6 // in the file PATENTS. All contributing project authors may |
| 7 // be found in the AUTHORS file in the root of the source tree. | 7 // be found in the AUTHORS file in the root of the source tree. |
| 8 // ----------------------------------------------------------------------------- | 8 // ----------------------------------------------------------------------------- |
| 9 // | 9 // |
| 10 // Main decoding functions for WebP images. | 10 // Main decoding functions for WebP images. |
| 11 // | 11 // |
| 12 // Author: Skal (pascal.massimino@gmail.com) | 12 // Author: Skal (pascal.massimino@gmail.com) |
| 13 | 13 |
| 14 #ifndef WEBP_WEBP_DECODE_H_ | 14 #ifndef WEBP_WEBP_DECODE_H_ |
| 15 #define WEBP_WEBP_DECODE_H_ | 15 #define WEBP_WEBP_DECODE_H_ |
| 16 | 16 |
| 17 #include "./types.h" | 17 #include "./types.h" |
| 18 | 18 |
| 19 #ifdef __cplusplus | 19 #ifdef __cplusplus |
| 20 extern "C" { | 20 extern "C" { |
| 21 #endif | 21 #endif |
| 22 | 22 |
| 23 #define WEBP_DECODER_ABI_VERSION 0x0203 // MAJOR(8b) + MINOR(8b) | 23 #define WEBP_DECODER_ABI_VERSION 0x0208 // MAJOR(8b) + MINOR(8b) |
| 24 | 24 |
| 25 // Note: forward declaring enumerations is not allowed in (strict) C and C++, | 25 // Note: forward declaring enumerations is not allowed in (strict) C and C++, |
| 26 // the types are left here for reference. | 26 // the types are left here for reference. |
| 27 // typedef enum VP8StatusCode VP8StatusCode; | 27 // typedef enum VP8StatusCode VP8StatusCode; |
| 28 // typedef enum WEBP_CSP_MODE WEBP_CSP_MODE; | 28 // typedef enum WEBP_CSP_MODE WEBP_CSP_MODE; |
| 29 typedef struct WebPRGBABuffer WebPRGBABuffer; | 29 typedef struct WebPRGBABuffer WebPRGBABuffer; |
| 30 typedef struct WebPYUVABuffer WebPYUVABuffer; | 30 typedef struct WebPYUVABuffer WebPYUVABuffer; |
| 31 typedef struct WebPDecBuffer WebPDecBuffer; | 31 typedef struct WebPDecBuffer WebPDecBuffer; |
| 32 typedef struct WebPIDecoder WebPIDecoder; | 32 typedef struct WebPIDecoder WebPIDecoder; |
| 33 typedef struct WebPBitstreamFeatures WebPBitstreamFeatures; | 33 typedef struct WebPBitstreamFeatures WebPBitstreamFeatures; |
| 34 typedef struct WebPDecoderOptions WebPDecoderOptions; | 34 typedef struct WebPDecoderOptions WebPDecoderOptions; |
| 35 typedef struct WebPDecoderConfig WebPDecoderConfig; | 35 typedef struct WebPDecoderConfig WebPDecoderConfig; |
| 36 | 36 |
| 37 // Return the decoder's version number, packed in hexadecimal using 8bits for | 37 // Return the decoder's version number, packed in hexadecimal using 8bits for |
| 38 // each of major/minor/revision. E.g: v2.5.7 is 0x020507. | 38 // each of major/minor/revision. E.g: v2.5.7 is 0x020507. |
| 39 WEBP_EXTERN(int) WebPGetDecoderVersion(void); | 39 WEBP_EXTERN(int) WebPGetDecoderVersion(void); |
| 40 | 40 |
| 41 // Retrieve basic header information: width, height. | 41 // Retrieve basic header information: width, height. |
| 42 // This function will also validate the header and return 0 in | 42 // This function will also validate the header and return 0 in |
| 43 // case of formatting error. | 43 // case of formatting error. |
| 44 // Pointers 'width' and 'height' can be passed NULL if deemed irrelevant. | 44 // Pointers 'width' and 'height' can be passed NULL if deemed irrelevant. |
| 45 WEBP_EXTERN(int) WebPGetInfo(const uint8_t* data, size_t data_size, | 45 WEBP_EXTERN(int) WebPGetInfo(const uint8_t* data, size_t data_size, |
| 46 int* width, int* height); | 46 int* width, int* height); |
| 47 | 47 |
| 48 // Decodes WebP images pointed to by 'data' and returns RGBA samples, along | 48 // Decodes WebP images pointed to by 'data' and returns RGBA samples, along |
| 49 // with the dimensions in *width and *height. The ordering of samples in | 49 // with the dimensions in *width and *height. The ordering of samples in |
| 50 // memory is R, G, B, A, R, G, B, A... in scan order (endian-independent). | 50 // memory is R, G, B, A, R, G, B, A... in scan order (endian-independent). |
| 51 // The returned pointer should be deleted calling free(). | 51 // The returned pointer should be deleted calling WebPFree(). |
| 52 // Returns NULL in case of error. | 52 // Returns NULL in case of error. |
| 53 WEBP_EXTERN(uint8_t*) WebPDecodeRGBA(const uint8_t* data, size_t data_size, | 53 WEBP_EXTERN(uint8_t*) WebPDecodeRGBA(const uint8_t* data, size_t data_size, |
| 54 int* width, int* height); | 54 int* width, int* height); |
| 55 | 55 |
| 56 // Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data. | 56 // Same as WebPDecodeRGBA, but returning A, R, G, B, A, R, G, B... ordered data. |
| 57 WEBP_EXTERN(uint8_t*) WebPDecodeARGB(const uint8_t* data, size_t data_size, | 57 WEBP_EXTERN(uint8_t*) WebPDecodeARGB(const uint8_t* data, size_t data_size, |
| 58 int* width, int* height); | 58 int* width, int* height); |
| 59 | 59 |
| 60 // Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data. | 60 // Same as WebPDecodeRGBA, but returning B, G, R, A, B, G, R, A... ordered data. |
| 61 WEBP_EXTERN(uint8_t*) WebPDecodeBGRA(const uint8_t* data, size_t data_size, | 61 WEBP_EXTERN(uint8_t*) WebPDecodeBGRA(const uint8_t* data, size_t data_size, |
| 62 int* width, int* height); | 62 int* width, int* height); |
| 63 | 63 |
| 64 // Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data. | 64 // Same as WebPDecodeRGBA, but returning R, G, B, R, G, B... ordered data. |
| 65 // If the bitstream contains transparency, it is ignored. | 65 // If the bitstream contains transparency, it is ignored. |
| 66 WEBP_EXTERN(uint8_t*) WebPDecodeRGB(const uint8_t* data, size_t data_size, | 66 WEBP_EXTERN(uint8_t*) WebPDecodeRGB(const uint8_t* data, size_t data_size, |
| 67 int* width, int* height); | 67 int* width, int* height); |
| 68 | 68 |
| 69 // Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data. | 69 // Same as WebPDecodeRGB, but returning B, G, R, B, G, R... ordered data. |
| 70 WEBP_EXTERN(uint8_t*) WebPDecodeBGR(const uint8_t* data, size_t data_size, | 70 WEBP_EXTERN(uint8_t*) WebPDecodeBGR(const uint8_t* data, size_t data_size, |
| 71 int* width, int* height); | 71 int* width, int* height); |
| 72 | 72 |
| 73 | 73 |
| 74 // Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer | 74 // Decode WebP images pointed to by 'data' to Y'UV format(*). The pointer |
| 75 // returned is the Y samples buffer. Upon return, *u and *v will point to | 75 // returned is the Y samples buffer. Upon return, *u and *v will point to |
| 76 // the U and V chroma data. These U and V buffers need NOT be free()'d, | 76 // the U and V chroma data. These U and V buffers need NOT be passed to |
| 77 // unlike the returned Y luma one. The dimension of the U and V planes | 77 // WebPFree(), unlike the returned Y luma one. The dimension of the U and V |
| 78 // are both (*width + 1) / 2 and (*height + 1)/ 2. | 78 // planes are both (*width + 1) / 2 and (*height + 1)/ 2. |
| 79 // Upon return, the Y buffer has a stride returned as '*stride', while U and V | 79 // Upon return, the Y buffer has a stride returned as '*stride', while U and V |
| 80 // have a common stride returned as '*uv_stride'. | 80 // have a common stride returned as '*uv_stride'. |
| 81 // Return NULL in case of error. | 81 // Return NULL in case of error. |
| 82 // (*) Also named Y'CbCr. See: http://en.wikipedia.org/wiki/YCbCr | 82 // (*) Also named Y'CbCr. See: http://en.wikipedia.org/wiki/YCbCr |
| 83 WEBP_EXTERN(uint8_t*) WebPDecodeYUV(const uint8_t* data, size_t data_size, | 83 WEBP_EXTERN(uint8_t*) WebPDecodeYUV(const uint8_t* data, size_t data_size, |
| 84 int* width, int* height, | 84 int* width, int* height, |
| 85 uint8_t** u, uint8_t** v, | 85 uint8_t** u, uint8_t** v, |
| 86 int* stride, int* uv_stride); | 86 int* stride, int* uv_stride); |
| 87 | 87 |
| 88 // Releases memory returned by the WebPDecode*() functions above. |
| 89 WEBP_EXTERN(void) WebPFree(void* ptr); |
| 90 |
| 88 // These five functions are variants of the above ones, that decode the image | 91 // These five functions are variants of the above ones, that decode the image |
| 89 // directly into a pre-allocated buffer 'output_buffer'. The maximum storage | 92 // directly into a pre-allocated buffer 'output_buffer'. The maximum storage |
| 90 // available in this buffer is indicated by 'output_buffer_size'. If this | 93 // available in this buffer is indicated by 'output_buffer_size'. If this |
| 91 // storage is not sufficient (or an error occurred), NULL is returned. | 94 // storage is not sufficient (or an error occurred), NULL is returned. |
| 92 // Otherwise, output_buffer is returned, for convenience. | 95 // Otherwise, output_buffer is returned, for convenience. |
| 93 // The parameter 'output_stride' specifies the distance (in bytes) | 96 // The parameter 'output_stride' specifies the distance (in bytes) |
| 94 // between scanlines. Hence, output_buffer_size is expected to be at least | 97 // between scanlines. Hence, output_buffer_size is expected to be at least |
| 95 // output_stride x picture-height. | 98 // output_stride x picture-height. |
| 96 WEBP_EXTERN(uint8_t*) WebPDecodeRGBAInto( | 99 WEBP_EXTERN(uint8_t*) WebPDecodeRGBAInto( |
| 97 const uint8_t* data, size_t data_size, | 100 const uint8_t* data, size_t data_size, |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 */ | 402 */ |
| 400 | 403 |
| 401 // Features gathered from the bitstream | 404 // Features gathered from the bitstream |
| 402 struct WebPBitstreamFeatures { | 405 struct WebPBitstreamFeatures { |
| 403 int width; // Width in pixels, as read from the bitstream. | 406 int width; // Width in pixels, as read from the bitstream. |
| 404 int height; // Height in pixels, as read from the bitstream. | 407 int height; // Height in pixels, as read from the bitstream. |
| 405 int has_alpha; // True if the bitstream contains an alpha channel. | 408 int has_alpha; // True if the bitstream contains an alpha channel. |
| 406 int has_animation; // True if the bitstream is an animation. | 409 int has_animation; // True if the bitstream is an animation. |
| 407 int format; // 0 = undefined (/mixed), 1 = lossy, 2 = lossless | 410 int format; // 0 = undefined (/mixed), 1 = lossy, 2 = lossless |
| 408 | 411 |
| 409 // Unused for now: | 412 uint32_t pad[5]; // padding for later use |
| 410 int no_incremental_decoding; // if true, using incremental decoding is not | |
| 411 // recommended. | |
| 412 int rotate; // TODO(later) | |
| 413 int uv_sampling; // should be 0 for now. TODO(later) | |
| 414 uint32_t pad[2]; // padding for later use | |
| 415 }; | 413 }; |
| 416 | 414 |
| 417 // Internal, version-checked, entry point | 415 // Internal, version-checked, entry point |
| 418 WEBP_EXTERN(VP8StatusCode) WebPGetFeaturesInternal( | 416 WEBP_EXTERN(VP8StatusCode) WebPGetFeaturesInternal( |
| 419 const uint8_t*, size_t, WebPBitstreamFeatures*, int); | 417 const uint8_t*, size_t, WebPBitstreamFeatures*, int); |
| 420 | 418 |
| 421 // Retrieve features from the bitstream. The *features structure is filled | 419 // Retrieve features from the bitstream. The *features structure is filled |
| 422 // with information gathered from the bitstream. | 420 // with information gathered from the bitstream. |
| 423 // Returns VP8_STATUS_OK when the features are successfully retrieved. Returns | 421 // Returns VP8_STATUS_OK when the features are successfully retrieved. Returns |
| 424 // VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the | 422 // VP8_STATUS_NOT_ENOUGH_DATA when more data is needed to retrieve the |
| (...skipping 10 matching lines...) Expand all Loading... |
| 435 int bypass_filtering; // if true, skip the in-loop filtering | 433 int bypass_filtering; // if true, skip the in-loop filtering |
| 436 int no_fancy_upsampling; // if true, use faster pointwise upsampler | 434 int no_fancy_upsampling; // if true, use faster pointwise upsampler |
| 437 int use_cropping; // if true, cropping is applied _first_ | 435 int use_cropping; // if true, cropping is applied _first_ |
| 438 int crop_left, crop_top; // top-left position for cropping. | 436 int crop_left, crop_top; // top-left position for cropping. |
| 439 // Will be snapped to even values. | 437 // Will be snapped to even values. |
| 440 int crop_width, crop_height; // dimension of the cropping area | 438 int crop_width, crop_height; // dimension of the cropping area |
| 441 int use_scaling; // if true, scaling is applied _afterward_ | 439 int use_scaling; // if true, scaling is applied _afterward_ |
| 442 int scaled_width, scaled_height; // final resolution | 440 int scaled_width, scaled_height; // final resolution |
| 443 int use_threads; // if true, use multi-threaded decoding | 441 int use_threads; // if true, use multi-threaded decoding |
| 444 int dithering_strength; // dithering strength (0=Off, 100=full) | 442 int dithering_strength; // dithering strength (0=Off, 100=full) |
| 445 #if WEBP_DECODER_ABI_VERSION > 0x0203 | |
| 446 int flip; // flip output vertically | 443 int flip; // flip output vertically |
| 447 #endif | |
| 448 #if WEBP_DECODER_ABI_VERSION > 0x0204 | |
| 449 int alpha_dithering_strength; // alpha dithering strength in [0..100] | 444 int alpha_dithering_strength; // alpha dithering strength in [0..100] |
| 450 #endif | |
| 451 | 445 |
| 452 // Unused for now: | |
| 453 int force_rotation; // forced rotation (to be applied _last_) | |
| 454 int no_enhancement; // if true, discard enhancement layer | |
| 455 #if WEBP_DECODER_ABI_VERSION < 0x0203 | |
| 456 uint32_t pad[5]; // padding for later use | 446 uint32_t pad[5]; // padding for later use |
| 457 #elif WEBP_DECODER_ABI_VERSION < 0x0204 | |
| 458 uint32_t pad[4]; // padding for later use | |
| 459 #else | |
| 460 uint32_t pad[3]; // padding for later use | |
| 461 #endif | |
| 462 }; | 447 }; |
| 463 | 448 |
| 464 // Main object storing the configuration for advanced decoding. | 449 // Main object storing the configuration for advanced decoding. |
| 465 struct WebPDecoderConfig { | 450 struct WebPDecoderConfig { |
| 466 WebPBitstreamFeatures input; // Immutable bitstream features (optional) | 451 WebPBitstreamFeatures input; // Immutable bitstream features (optional) |
| 467 WebPDecBuffer output; // Output buffer (can point to external mem) | 452 WebPDecBuffer output; // Output buffer (can point to external mem) |
| 468 WebPDecoderOptions options; // Decoding options | 453 WebPDecoderOptions options; // Decoding options |
| 469 }; | 454 }; |
| 470 | 455 |
| 471 // Internal, version-checked, entry point | 456 // Internal, version-checked, entry point |
| (...skipping 22 matching lines...) Expand all Loading... |
| 494 // 'config' into account. Returns decoding status (which should be VP8_STATUS_OK | 479 // 'config' into account. Returns decoding status (which should be VP8_STATUS_OK |
| 495 // if the decoding was successful). | 480 // if the decoding was successful). |
| 496 WEBP_EXTERN(VP8StatusCode) WebPDecode(const uint8_t* data, size_t data_size, | 481 WEBP_EXTERN(VP8StatusCode) WebPDecode(const uint8_t* data, size_t data_size, |
| 497 WebPDecoderConfig* config); | 482 WebPDecoderConfig* config); |
| 498 | 483 |
| 499 #ifdef __cplusplus | 484 #ifdef __cplusplus |
| 500 } // extern "C" | 485 } // extern "C" |
| 501 #endif | 486 #endif |
| 502 | 487 |
| 503 #endif /* WEBP_WEBP_DECODE_H_ */ | 488 #endif /* WEBP_WEBP_DECODE_H_ */ |
| OLD | NEW |