|  | /* | 
|  | * Copyright (c) 2021, Alliance for Open Media. All rights reserved | 
|  | * | 
|  | * This source code is subject to the terms of the BSD 3-Clause Clear License | 
|  | * and the Alliance for Open Media Patent License 1.0. If the BSD 3-Clause Clear | 
|  | * License was not distributed with this source code in the LICENSE file, you | 
|  | * can obtain it at aomedia.org/license/software-license/bsd-3-c-c/.  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 | 
|  | * aomedia.org/license/patent-license/. | 
|  | */ | 
|  |  | 
|  | #ifndef AOM_AOM_SCALE_YV12CONFIG_H_ | 
|  | #define AOM_AOM_SCALE_YV12CONFIG_H_ | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | #include <stdbool.h> | 
|  |  | 
|  | #include "config/aom_config.h" | 
|  |  | 
|  | #include "aom/aom_codec.h" | 
|  | #include "aom/aom_frame_buffer.h" | 
|  | #include "aom/aom_integer.h" | 
|  | #include "aom/internal/aom_image_internal.h" | 
|  |  | 
|  | /*!\cond */ | 
|  |  | 
|  | #define AOM_INTERP_EXTEND 4 | 
|  | #if CONFIG_EXT_RECUR_PARTITIONS | 
|  | #define AOMINNERBORDERINPIXELS \ | 
|  | ALIGN_POWER_OF_TWO(256 + 2 * AOM_INTERP_EXTEND, 5) | 
|  | #define AOM_BORDER_IN_PIXELS \ | 
|  | ALIGN_POWER_OF_TWO(2 * 256 + 2 * AOM_INTERP_EXTEND, 5) | 
|  | #define AOM_ENC_NO_SCALE_BORDER \ | 
|  | ALIGN_POWER_OF_TWO(256 + 2 * AOM_INTERP_EXTEND, 5) | 
|  | #define AOM_DEC_BORDER_IN_PIXELS (256 >> 1) | 
|  | #else | 
|  | #define AOMINNERBORDERINPIXELS (128 + 32) | 
|  | #define AOM_BORDER_IN_PIXELS (2 * 128 + 32) | 
|  | #define AOM_ENC_NO_SCALE_BORDER (128 + 32) | 
|  | #define AOM_DEC_BORDER_IN_PIXELS 64 | 
|  | #endif  // CONFIG_EXT_RECUR_PARTITIONS | 
|  |  | 
|  | #if CONFIG_AV1_ENCODER | 
|  | struct image_pyramid; | 
|  | struct corner_list; | 
|  | #endif  // CONFIG_AV1_ENCODER | 
|  |  | 
|  | /*!\endcond */ | 
|  | /*! | 
|  | * \brief YV12 frame buffer data structure | 
|  | */ | 
|  | typedef struct yv12_buffer_config { | 
|  | /*!\cond */ | 
|  | union { | 
|  | struct { | 
|  | int y_width; | 
|  | int uv_width; | 
|  | }; | 
|  | int widths[2]; | 
|  | }; | 
|  | union { | 
|  | struct { | 
|  | int y_height; | 
|  | int uv_height; | 
|  | }; | 
|  | int heights[2]; | 
|  | }; | 
|  | 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 strides[2]; | 
|  | }; | 
|  | union { | 
|  | struct { | 
|  | uint16_t *y_buffer; | 
|  | uint16_t *u_buffer; | 
|  | uint16_t *v_buffer; | 
|  | }; | 
|  | uint16_t *buffers[3]; | 
|  | }; | 
|  |  | 
|  | // Indicate whether y_buffer, u_buffer, and v_buffer points to the internally | 
|  | // allocated memory or external buffers. | 
|  | int use_external_reference_buffers; | 
|  | // This is needed to store y_buffer, u_buffer, and v_buffer when set reference | 
|  | // uses an external refernece, and restore those buffer pointers after the | 
|  | // external reference frame is no longer used. | 
|  | uint16_t *store_buf_adr[3]; | 
|  |  | 
|  | // Global motion search data | 
|  | #if CONFIG_AV1_ENCODER | 
|  | // 8-bit downsampling pyramid for the Y plane | 
|  | struct image_pyramid *y_pyramid; | 
|  | struct corner_list *corners; | 
|  | #endif  // CONFIG_AV1_ENCODER | 
|  |  | 
|  | 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_primaries_t color_primaries; | 
|  | aom_transfer_characteristics_t transfer_characteristics; | 
|  | aom_matrix_coefficients_t matrix_coefficients; | 
|  | uint8_t monochrome; | 
|  | aom_chroma_sample_position_t chroma_sample_position; | 
|  | aom_color_range_t color_range; | 
|  | int render_width; | 
|  | int render_height; | 
|  |  | 
|  | int corrupted; | 
|  | int flags; | 
|  | aom_metadata_array_t *metadata; | 
|  | /*!\endcond */ | 
|  | } YV12_BUFFER_CONFIG; | 
|  |  | 
|  | /*!\cond */ | 
|  |  | 
|  | // Allocate a frame buffer | 
|  | // | 
|  | // If ybf currently contains an image, all associated memory will be freed and | 
|  | // then reallocated. In contrast, aom_realloc_frame_buffer() will reuse any | 
|  | // existing allocations where possible. So, if ybf is likely to already be | 
|  | // set up, please consider aom_realloc_frame_buffer() instead. | 
|  | // | 
|  | // See aom_realloc_frame_buffer() for the meanings of the arguments, and | 
|  | // available return values. | 
|  | int aom_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, | 
|  | int ss_x, int ss_y, int border, int byte_alignment, | 
|  | bool alloc_pyramid); | 
|  |  | 
|  | // 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. | 
|  | // | 
|  | // If alloc_pyramid is true, then an image pyramid will be allocated | 
|  | // for use in global motion estimation. This is only needed if this frame | 
|  | // buffer will be used to store a source frame or a reference frame in | 
|  | // the encoder. Any other framebuffers (eg, intermediates for filtering, | 
|  | // or any buffer in the decoder) can set alloc_pyramid = false. | 
|  | // | 
|  | // 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, int border, int byte_alignment, | 
|  | aom_codec_frame_buffer_t *fb, | 
|  | aom_get_frame_buffer_cb_fn_t cb, void *cb_priv, | 
|  | bool alloc_pyramid); | 
|  |  | 
|  | int aom_free_frame_buffer(YV12_BUFFER_CONFIG *ybf); | 
|  |  | 
|  | /*!\endcond */ | 
|  | /*!\brief Removes metadata from YUV_BUFFER_CONFIG struct. | 
|  | * | 
|  | * Frees metadata in frame buffer. | 
|  | * Frame buffer metadata pointer will be set to NULL. | 
|  | * | 
|  | * \param[in]    ybf       Frame buffer struct pointer | 
|  | */ | 
|  | void aom_remove_metadata_from_frame_buffer(YV12_BUFFER_CONFIG *ybf); | 
|  |  | 
|  | /*!\brief Copy metadata to YUV_BUFFER_CONFIG struct. | 
|  | * | 
|  | * Copies metadata to frame buffer. | 
|  | * Frame buffer will clear any previous metadata and will reallocate the | 
|  | * metadata array to the new metadata size. Then, it will copy the new metadata | 
|  | * array into it. | 
|  | * If arr metadata pointer points to the same address as current metadata in the | 
|  | * frame buffer, function will do nothing and return 0. | 
|  | * Returns 0 on success or -1 on failure. | 
|  | * | 
|  | * \param[in]    ybf       Frame buffer struct pointer | 
|  | * \param[in]    arr       Metadata array struct pointer | 
|  | */ | 
|  | int aom_copy_metadata_to_frame_buffer(YV12_BUFFER_CONFIG *ybf, | 
|  | const aom_metadata_array_t *arr); | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif | 
|  |  | 
|  | #endif  // AOM_AOM_SCALE_YV12CONFIG_H_ |