1// Copyright 2011 Google Inc.
2//
3// This code is licensed under the same terms as WebM:
4//  Software License Agreement:  http://www.webmproject.org/license/software/
5//  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
6// -----------------------------------------------------------------------------
7//
8// Internal header: WebP decoding parameters and custom IO on buffer
9//
10// Author: somnath@google.com (Somnath Banerjee)
11
12#ifndef WEBP_DEC_WEBPI_H
13#define WEBP_DEC_WEBPI_H
14
15#if defined(__cplusplus) || defined(c_plusplus)
16extern "C" {
17#endif
18
19#include "webp/decode_vp8.h"
20
21//------------------------------------------------------------------------------
22// WebPDecParams: Decoding output parameters. Transcient internal object.
23
24typedef struct WebPDecParams WebPDecParams;
25typedef int (*OutputFunc)(const VP8Io* const io, WebPDecParams* const p);
26
27// Structure use for on-the-fly rescaling
28typedef struct {
29  int x_expand;               // true if we're expanding in the x direction
30  int fy_scale, fx_scale;     // fixed-point scaling factor
31  int64_t fxy_scale;          // ''
32  // we need hpel-precise add/sub increments, for the downsampled U/V planes.
33  int y_accum;                // vertical accumulator
34  int y_add, y_sub;           // vertical increments (add ~= src, sub ~= dst)
35  int x_add, x_sub;           // horizontal increments (add ~= src, sub ~= dst)
36  int src_width, src_height;  // source dimensions
37  int dst_width, dst_height;  // destination dimensions
38  uint8_t* dst;
39  int dst_stride;
40  int32_t* irow, *frow;       // work buffer
41} WebPRescaler;
42
43struct WebPDecParams {
44  WebPDecBuffer* output;             // output buffer.
45  uint8_t* tmp_y, *tmp_u, *tmp_v;    // cache for the fancy upsampler
46                                     // or used for tmp rescaling
47
48  int last_y;                 // coordinate of the line that was last output
49  const WebPDecoderOptions* options;  // if not NULL, use alt decoding features
50  // rescalers
51  WebPRescaler scaler_y, scaler_u, scaler_v, scaler_a;
52  void* memory;               // overall scratch memory for the output work.
53  OutputFunc emit;            // output RGB or YUV samples
54  OutputFunc emit_alpha;      // output alpha channel
55};
56
57// Should be called first, before any use of the WebPDecParams object.
58void WebPResetDecParams(WebPDecParams* const params);
59
60//------------------------------------------------------------------------------
61// Upsampler function to overwrite fancy upsampler.
62
63typedef void (*WebPUpsampleLinePairFunc)(
64  const uint8_t* top_y, const uint8_t* bottom_y,
65  const uint8_t* top_u, const uint8_t* top_v,
66  const uint8_t* cur_u, const uint8_t* cur_v,
67  uint8_t* top_dst, uint8_t* bottom_dst, int len);
68
69// Upsampler functions to be used to convert YUV to RGB(A) modes
70extern WebPUpsampleLinePairFunc WebPUpsamplers[MODE_LAST];
71extern WebPUpsampleLinePairFunc WebPUpsamplersKeepAlpha[MODE_LAST];
72
73// Initializes SSE2 version of the fancy upsamplers.
74void WebPInitUpsamplersSSE2(void);
75
76//------------------------------------------------------------------------------
77// Misc utils
78
79// If a RIFF container is detected, validate it and skip over it. Returns
80// VP8 bit-stream size if RIFF header is valid else returns 0
81uint32_t WebPCheckRIFFHeader(const uint8_t** data_ptr,
82                             uint32_t* data_size_ptr);
83
84// Initializes VP8Io with custom setup, io and teardown functions. The default
85// hooks will use the supplied 'params' as io->opaque handle.
86void WebPInitCustomIo(WebPDecParams* const params, VP8Io* const io);
87
88//------------------------------------------------------------------------------
89// Internal functions regarding WebPDecBuffer memory (in buffer.c).
90// Don't really need to be externally visible for now.
91
92// Prepare 'buffer' with the requested initial dimensions width/height.
93// If no external storage is supplied, initializes buffer by allocating output
94// memory and setting up the stride information. Validate the parameters. Return
95// an error code in case of problem (no memory, or invalid stride / size /
96// dimension / etc.). If *options is not NULL, also verify that the options'
97// parameters are valid and apply them to the width/height dimensions of the
98// output buffer. This takes cropping / scaling / rotation into account.
99VP8StatusCode WebPAllocateDecBuffer(int width, int height,
100                                    const WebPDecoderOptions* const options,
101                                    WebPDecBuffer* const buffer);
102
103// Copy 'src' into 'dst' buffer, making sure 'dst' is not marked as owner of the
104// memory (still held by 'src').
105void WebPCopyDecBuffer(const WebPDecBuffer* const src,
106                       WebPDecBuffer* const dst);
107
108// Copy and transfer ownership from src to dst (beware of parameter order!)
109void WebPGrabDecBuffer(WebPDecBuffer* const src, WebPDecBuffer* const dst);
110
111//------------------------------------------------------------------------------
112
113#if defined(__cplusplus) || defined(c_plusplus)
114}    // extern "C"
115#endif
116
117#endif  // WEBP_DEC_WEBPI_H
118