summaryrefslogtreecommitdiffstats
path: root/third_party/libwebp/webp/decode_vp8.h
blob: 6ac9fc56af07681a8c03c0aedb958cc7d155fbe3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// Copyright 2010 Google Inc.
//
// This code is licensed under the same terms as WebM:
//  Software License Agreement:  http://www.webmproject.org/license/software/
//  Additional IP Rights Grant:  http://www.webmproject.org/license/additional/
// -----------------------------------------------------------------------------
//
//  Low-level API for VP8 decoder
//
// Author: Skal (pascal.massimino@gmail.com)

#ifndef WEBP_DECODE_WEBP_DECODE_VP8_H_
#define WEBP_DECODE_WEBP_DECODE_VP8_H_

#include "decode.h"

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif

//-----------------------------------------------------------------------------
// Lower-level API
//
// Thes functions provide fine-grained control of the decoding process.
// The call flow should resemble:
//
//   VP8Io io;
//   VP8InitIo(&io);
//   io.data = data;
//   io.data_size = size;
//   /* customize io's functions (setup()/put()/teardown()) if needed. */
//
//   VP8Decoder* dec = VP8New();
//   bool ok = VP8Decode(dec);
//   if (!ok) printf("Error: %s\n", VP8StatusMessage(dec));
//   VP8Delete(dec);
//   return ok;

// Input / Output
typedef struct VP8Io VP8Io;
struct VP8Io {
  // set by VP8GetHeaders()
  int width, height;       // picture dimensions, in pixels

  // set before calling put()
  int mb_x, mb_y;            // position of the current sample (in pixels)
  int mb_w, mb_h;            // size of the current sample (usually 16x16)
  const uint8_t *y, *u, *v;  // samples to copy
  int y_stride;              // stride for luma
  int uv_stride;             // stride for chroma

  void* opaque;              // user data

  // called when fresh samples are available (1 block of 16x16 pixels)
  void (*put)(const VP8Io* io);

  // called just before starting to decode the blocks
  void (*setup)(const VP8Io* io);

  // called just after block decoding is finished
  void (*teardown)(const VP8Io* io);

  // Input buffer.
   uint32_t data_size;
  const uint8_t* data;
};

// Main decoding object. This is an opaque structure.
typedef struct VP8Decoder VP8Decoder;

// Create a new decoder object.
VP8Decoder* VP8New();

// Can be called to make sure 'io' is initialized properly.
void VP8InitIo(VP8Io* const io);

// Start decoding a new picture. Returns true if ok.
int VP8GetHeaders(VP8Decoder* const dec, VP8Io* const io);

// Decode a picture. Will call VP8GetHeaders() if it wasn't done already.
int VP8Decode(VP8Decoder* const dec, VP8Io* const io);

// Return current status of the decoder:
//  0 = OK
//  1 = OUT_OF_MEMORY
//  2 = INVALID_PARAM
//  3 = BITSTREAM_ERROR
//  4 = UNSUPPORTED_FEATURE
int VP8Status(VP8Decoder* const dec);

// return readable string corresponding to the last status.
const char* VP8StatusMessage(VP8Decoder* const dec);

// Resets the decoder in its initial state, reclaiming memory.
// Not a mandatory call between calls to VP8Decode().
void VP8Clear(VP8Decoder* const dec);

// Destroy the decoder object.
void VP8Delete(VP8Decoder* const dec);

//-----------------------------------------------------------------------------

#if defined(__cplusplus) || defined(c_plusplus)
}    // extern "C"
#endif

#endif  // WEBP_DECODE_WEBP_DECODE_VP8_H_