1/*
2 *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 *
4 *  Use of this source code is governed by a BSD-style license
5 *  that can be found in the LICENSE file in the root of the source
6 *  tree. An additional intellectual property rights grant can be found
7 *  in the file PATENTS.  All contributing project authors may
8 *  be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef VPX_SCALE_YV12CONFIG_H_
12#define VPX_SCALE_YV12CONFIG_H_
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#include "./vpx_config.h"
19#include "vpx/vpx_codec.h"
20#include "vpx/vpx_frame_buffer.h"
21#include "vpx/vpx_integer.h"
22
23#define VP8BORDERINPIXELS           32
24#define VP9INNERBORDERINPIXELS      96
25#define VP9_INTERP_EXTEND           4
26#define VP9_ENC_BORDER_IN_PIXELS    160
27#define VP9_DEC_BORDER_IN_PIXELS    32
28
29typedef struct yv12_buffer_config {
30  int   y_width;
31  int   y_height;
32  int   y_crop_width;
33  int   y_crop_height;
34  int   y_stride;
35
36  int   uv_width;
37  int   uv_height;
38  int   uv_crop_width;
39  int   uv_crop_height;
40  int   uv_stride;
41
42  int   alpha_width;
43  int   alpha_height;
44  int   alpha_stride;
45
46  uint8_t *y_buffer;
47  uint8_t *u_buffer;
48  uint8_t *v_buffer;
49  uint8_t *alpha_buffer;
50
51  uint8_t *buffer_alloc;
52  int buffer_alloc_sz;
53  int border;
54  int frame_size;
55  int subsampling_x;
56  int subsampling_y;
57  unsigned int bit_depth;
58  vpx_color_space_t color_space;
59  vpx_color_range_t color_range;
60  int render_width;
61  int render_height;
62
63  int corrupted;
64  int flags;
65} YV12_BUFFER_CONFIG;
66
67#define YV12_FLAG_HIGHBITDEPTH 8
68
69int vp8_yv12_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf,
70                                int width, int height, int border);
71int vp8_yv12_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf,
72                                  int width, int height, int border);
73int vp8_yv12_de_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf);
74
75int vpx_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf,
76                           int width, int height, int ss_x, int ss_y,
77#if CONFIG_VP9_HIGHBITDEPTH
78                           int use_highbitdepth,
79#endif
80                           int border, int byte_alignment);
81
82// Updates the yv12 buffer config with the frame buffer. |byte_alignment| must
83// be a power of 2, from 32 to 1024. 0 sets legacy alignment. If cb is not
84// NULL, then libvpx is using the frame buffer callbacks to handle memory.
85// If cb is not NULL, libvpx will call cb with minimum size in bytes needed
86// to decode the current frame. If cb is NULL, libvpx will allocate memory
87// internally to decode the current frame. Returns 0 on success. Returns < 0
88// on failure.
89int vpx_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf,
90                             int width, int height, int ss_x, int ss_y,
91#if CONFIG_VP9_HIGHBITDEPTH
92                             int use_highbitdepth,
93#endif
94                             int border,
95                             int byte_alignment,
96                             vpx_codec_frame_buffer_t *fb,
97                             vpx_get_frame_buffer_cb_fn_t cb,
98                             void *cb_priv);
99int vpx_free_frame_buffer(YV12_BUFFER_CONFIG *ybf);
100
101#ifdef __cplusplus
102}
103#endif
104
105#endif  // VPX_SCALE_YV12CONFIG_H_
106