| 1 | // Copyright 2011 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 | // Internal header: WebP decoding parameters and custom IO on buffer | 
|---|
| 11 | // | 
|---|
| 12 | // Author: somnath@google.com (Somnath Banerjee) | 
|---|
| 13 |  | 
|---|
| 14 | #ifndef WEBP_DEC_WEBPI_H_ | 
|---|
| 15 | #define WEBP_DEC_WEBPI_H_ | 
|---|
| 16 |  | 
|---|
| 17 | #ifdef __cplusplus | 
|---|
| 18 | extern "C"{ | 
|---|
| 19 | #endif | 
|---|
| 20 |  | 
|---|
| 21 | #include "../utils/rescaler_utils.h" | 
|---|
| 22 | #include "./vp8_dec.h" | 
|---|
| 23 |  | 
|---|
| 24 | //------------------------------------------------------------------------------ | 
|---|
| 25 | // WebPDecParams: Decoding output parameters. Transient internal object. | 
|---|
| 26 |  | 
|---|
| 27 | typedef struct WebPDecParams WebPDecParams; | 
|---|
| 28 | typedef int (*OutputFunc)(const VP8Io* const io, WebPDecParams* const p); | 
|---|
| 29 | typedef int (*OutputAlphaFunc)(const VP8Io* const io, WebPDecParams* const p, | 
|---|
| 30 | int expected_num_out_lines); | 
|---|
| 31 | typedef int (*OutputRowFunc)(WebPDecParams* const p, int y_pos, | 
|---|
| 32 | int max_out_lines); | 
|---|
| 33 |  | 
|---|
| 34 | struct WebPDecParams { | 
|---|
| 35 | WebPDecBuffer* output;             // output buffer. | 
|---|
| 36 | uint8_t* tmp_y, *tmp_u, *tmp_v;    // cache for the fancy upsampler | 
|---|
| 37 | // or used for tmp rescaling | 
|---|
| 38 |  | 
|---|
| 39 | int last_y;                 // coordinate of the line that was last output | 
|---|
| 40 | const WebPDecoderOptions* options;  // if not NULL, use alt decoding features | 
|---|
| 41 |  | 
|---|
| 42 | WebPRescaler* scaler_y, *scaler_u, *scaler_v, *scaler_a;  // rescalers | 
|---|
| 43 | void* memory;                  // overall scratch memory for the output work. | 
|---|
| 44 |  | 
|---|
| 45 | OutputFunc emit;               // output RGB or YUV samples | 
|---|
| 46 | OutputAlphaFunc emit_alpha;    // output alpha channel | 
|---|
| 47 | OutputRowFunc emit_alpha_row;  // output one line of rescaled alpha values | 
|---|
| 48 | }; | 
|---|
| 49 |  | 
|---|
| 50 | // Should be called first, before any use of the WebPDecParams object. | 
|---|
| 51 | void WebPResetDecParams(WebPDecParams* const params); | 
|---|
| 52 |  | 
|---|
| 53 | //------------------------------------------------------------------------------ | 
|---|
| 54 | // Header parsing helpers | 
|---|
| 55 |  | 
|---|
| 56 | // Structure storing a description of the RIFF headers. | 
|---|
| 57 | typedef struct { | 
|---|
| 58 | const uint8_t* data;         // input buffer | 
|---|
| 59 | size_t data_size;            // input buffer size | 
|---|
| 60 | int have_all_data;           // true if all data is known to be available | 
|---|
| 61 | size_t offset;               // offset to main data chunk (VP8 or VP8L) | 
|---|
| 62 | const uint8_t* alpha_data;   // points to alpha chunk (if present) | 
|---|
| 63 | size_t alpha_data_size;      // alpha chunk size | 
|---|
| 64 | size_t compressed_size;      // VP8/VP8L compressed data size | 
|---|
| 65 | size_t riff_size;            // size of the riff payload (or 0 if absent) | 
|---|
| 66 | int is_lossless;             // true if a VP8L chunk is present | 
|---|
| 67 | } ; | 
|---|
| 68 |  | 
|---|
| 69 | // Skips over all valid chunks prior to the first VP8/VP8L frame header. | 
|---|
| 70 | // Returns: VP8_STATUS_OK, VP8_STATUS_BITSTREAM_ERROR (invalid header/chunk), | 
|---|
| 71 | // VP8_STATUS_NOT_ENOUGH_DATA (partial input) or VP8_STATUS_UNSUPPORTED_FEATURE | 
|---|
| 72 | // in the case of non-decodable features (animation for instance). | 
|---|
| 73 | // In 'headers', compressed_size, offset, alpha_data, alpha_size, and lossless | 
|---|
| 74 | // fields are updated appropriately upon success. | 
|---|
| 75 | VP8StatusCode (WebPHeaderStructure* const ); | 
|---|
| 76 |  | 
|---|
| 77 | //------------------------------------------------------------------------------ | 
|---|
| 78 | // Misc utils | 
|---|
| 79 |  | 
|---|
| 80 | // Initializes VP8Io with custom setup, io and teardown functions. The default | 
|---|
| 81 | // hooks will use the supplied 'params' as io->opaque handle. | 
|---|
| 82 | void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io); | 
|---|
| 83 |  | 
|---|
| 84 | // Setup crop_xxx fields, mb_w and mb_h in io. 'src_colorspace' refers | 
|---|
| 85 | // to the *compressed* format, not the output one. | 
|---|
| 86 | int WebPIoInitFromOptions(const WebPDecoderOptions* const options, | 
|---|
| 87 | VP8Io* const io, WEBP_CSP_MODE src_colorspace); | 
|---|
| 88 |  | 
|---|
| 89 | //------------------------------------------------------------------------------ | 
|---|
| 90 | // Internal functions regarding WebPDecBuffer memory (in buffer.c). | 
|---|
| 91 | // Don't really need to be externally visible for now. | 
|---|
| 92 |  | 
|---|
| 93 | // Prepare 'buffer' with the requested initial dimensions width/height. | 
|---|
| 94 | // If no external storage is supplied, initializes buffer by allocating output | 
|---|
| 95 | // memory and setting up the stride information. Validate the parameters. Return | 
|---|
| 96 | // an error code in case of problem (no memory, or invalid stride / size / | 
|---|
| 97 | // dimension / etc.). If *options is not NULL, also verify that the options' | 
|---|
| 98 | // parameters are valid and apply them to the width/height dimensions of the | 
|---|
| 99 | // output buffer. This takes cropping / scaling / rotation into account. | 
|---|
| 100 | // Also incorporates the options->flip flag to flip the buffer parameters if | 
|---|
| 101 | // needed. | 
|---|
| 102 | VP8StatusCode WebPAllocateDecBuffer(int width, int height, | 
|---|
| 103 | const WebPDecoderOptions* const options, | 
|---|
| 104 | WebPDecBuffer* const buffer); | 
|---|
| 105 |  | 
|---|
| 106 | // Flip buffer vertically by negating the various strides. | 
|---|
| 107 | VP8StatusCode WebPFlipBuffer(WebPDecBuffer* const buffer); | 
|---|
| 108 |  | 
|---|
| 109 | // Copy 'src' into 'dst' buffer, making sure 'dst' is not marked as owner of the | 
|---|
| 110 | // memory (still held by 'src'). No pixels are copied. | 
|---|
| 111 | void WebPCopyDecBuffer(const WebPDecBuffer* const src, | 
|---|
| 112 | WebPDecBuffer* const dst); | 
|---|
| 113 |  | 
|---|
| 114 | // Copy and transfer ownership from src to dst (beware of parameter order!) | 
|---|
| 115 | void WebPGrabDecBuffer(WebPDecBuffer* const src, WebPDecBuffer* const dst); | 
|---|
| 116 |  | 
|---|
| 117 | // Copy pixels from 'src' into a *preallocated* 'dst' buffer. Returns | 
|---|
| 118 | // VP8_STATUS_INVALID_PARAM if the 'dst' is not set up correctly for the copy. | 
|---|
| 119 | VP8StatusCode WebPCopyDecBufferPixels(const WebPDecBuffer* const src, | 
|---|
| 120 | WebPDecBuffer* const dst); | 
|---|
| 121 |  | 
|---|
| 122 | // Returns true if decoding will be slow with the current configuration | 
|---|
| 123 | // and bitstream features. | 
|---|
| 124 | int WebPAvoidSlowMemory(const WebPDecBuffer* const output, | 
|---|
| 125 | const WebPBitstreamFeatures* const features); | 
|---|
| 126 |  | 
|---|
| 127 | //------------------------------------------------------------------------------ | 
|---|
| 128 |  | 
|---|
| 129 | #ifdef __cplusplus | 
|---|
| 130 | }    // extern "C" | 
|---|
| 131 | #endif | 
|---|
| 132 |  | 
|---|
| 133 | #endif  /* WEBP_DEC_WEBPI_H_ */ | 
|---|
| 134 |  | 
|---|