|  | /* | 
|  | * Copyright (c) 2016, Alliance for Open Media. All rights reserved | 
|  | * | 
|  | * This source code is subject to the terms of the BSD 2 Clause License and | 
|  | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License | 
|  | * was not distributed with this source code in the LICENSE file, you can | 
|  | * obtain it at www.aomedia.org/license/software. If the Alliance for Open | 
|  | * Media Patent License 1.0 was not distributed with this source code in the | 
|  | * PATENTS file, you can obtain it at www.aomedia.org/license/patent. | 
|  | */ | 
|  |  | 
|  | #ifndef AOM_SCALE_YV12CONFIG_H_ | 
|  | #define AOM_SCALE_YV12CONFIG_H_ | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | #include "./aom_config.h" | 
|  | #include "aom/aom_codec.h" | 
|  | #include "aom/aom_frame_buffer.h" | 
|  | #include "aom/aom_integer.h" | 
|  |  | 
|  | #if CONFIG_EXT_PARTITION | 
|  | #define AOMINNERBORDERINPIXELS 160 | 
|  | #else | 
|  | #define AOMINNERBORDERINPIXELS 96 | 
|  | #endif  // CONFIG_EXT_PARTITION | 
|  | #define AOM_INTERP_EXTEND 4 | 
|  |  | 
|  | // TODO(jingning): Use unified inter predictor for encoder and | 
|  | // decoder during the development process. Revisit the frame border | 
|  | // to improve the decoder performance. | 
|  | #if CONFIG_EXT_PARTITION | 
|  | #define AOM_BORDER_IN_PIXELS 288 | 
|  | #else | 
|  | #define AOM_BORDER_IN_PIXELS 160 | 
|  | #endif  // CONFIG_EXT_PARTITION | 
|  |  | 
|  | typedef struct yv12_buffer_config { | 
|  | union { | 
|  | struct { | 
|  | int y_width; | 
|  | int uv_width; | 
|  | int alpha_width; | 
|  | }; | 
|  | int widths[3]; | 
|  | }; | 
|  | union { | 
|  | struct { | 
|  | int y_height; | 
|  | int uv_height; | 
|  | int alpha_height; | 
|  | }; | 
|  | int heights[3]; | 
|  | }; | 
|  | union { | 
|  | struct { | 
|  | int y_crop_width; | 
|  | int uv_crop_width; | 
|  | }; | 
|  | int crop_widths[2]; | 
|  | }; | 
|  | union { | 
|  | struct { | 
|  | int y_crop_height; | 
|  | int uv_crop_height; | 
|  | }; | 
|  | int crop_heights[2]; | 
|  | }; | 
|  | union { | 
|  | struct { | 
|  | int y_stride; | 
|  | int uv_stride; | 
|  | int alpha_stride; | 
|  | }; | 
|  | int strides[3]; | 
|  | }; | 
|  | union { | 
|  | struct { | 
|  | uint8_t *y_buffer; | 
|  | uint8_t *u_buffer; | 
|  | uint8_t *v_buffer; | 
|  | uint8_t *alpha_buffer; | 
|  | }; | 
|  | uint8_t *buffers[4]; | 
|  | }; | 
|  |  | 
|  | #if CONFIG_HIGHBITDEPTH | 
|  | // If the frame is stored in a 16-bit buffer, this stores an 8-bit version | 
|  | // for use in global motion detection. It is allocated on-demand. | 
|  | uint8_t *y_buffer_8bit; | 
|  | int buf_8bit_valid; | 
|  | #endif | 
|  |  | 
|  | uint8_t *buffer_alloc; | 
|  | size_t buffer_alloc_sz; | 
|  | int border; | 
|  | size_t frame_size; | 
|  | int subsampling_x; | 
|  | int subsampling_y; | 
|  | unsigned int bit_depth; | 
|  | aom_color_space_t color_space; | 
|  | aom_transfer_function_t transfer_function; | 
|  | aom_chroma_sample_position_t chroma_sample_position; | 
|  | aom_color_range_t color_range; | 
|  | int render_width; | 
|  | int render_height; | 
|  |  | 
|  | int corrupted; | 
|  | int flags; | 
|  | } YV12_BUFFER_CONFIG; | 
|  |  | 
|  | #define YV12_FLAG_HIGHBITDEPTH 8 | 
|  |  | 
|  | int aom_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, | 
|  | int ss_x, int ss_y, | 
|  | #if CONFIG_HIGHBITDEPTH | 
|  | int use_highbitdepth, | 
|  | #endif | 
|  | int border, int byte_alignment); | 
|  |  | 
|  | // Updates the yv12 buffer config with the frame buffer. |byte_alignment| must | 
|  | // be a power of 2, from 32 to 1024. 0 sets legacy alignment. If cb is not | 
|  | // NULL, then libaom is using the frame buffer callbacks to handle memory. | 
|  | // If cb is not NULL, libaom will call cb with minimum size in bytes needed | 
|  | // to decode the current frame. If cb is NULL, libaom will allocate memory | 
|  | // internally to decode the current frame. Returns 0 on success. Returns < 0 | 
|  | // on failure. | 
|  | int aom_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, | 
|  | int ss_x, int ss_y, | 
|  | #if CONFIG_HIGHBITDEPTH | 
|  | int use_highbitdepth, | 
|  | #endif | 
|  | int border, int byte_alignment, | 
|  | aom_codec_frame_buffer_t *fb, | 
|  | aom_get_frame_buffer_cb_fn_t cb, void *cb_priv); | 
|  | int aom_free_frame_buffer(YV12_BUFFER_CONFIG *ybf); | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #endif  // AOM_SCALE_YV12CONFIG_H_ |