| /* | |
| * 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_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 AOMINNERBORDERINPIXELS 160 | |
| #define AOM_INTERP_EXTEND 4 | |
| #define AOM_BORDER_IN_PIXELS 288 | |
| #define AOM_ENC_NO_SCALE_BORDER 160 | |
| #define AOM_ENC_ALLINTRA_BORDER 64 | |
| #define AOM_DEC_BORDER_IN_PIXELS 64 | |
| #if CONFIG_AV1_ENCODER && !CONFIG_REALTIME_ONLY | |
| struct image_pyramid; | |
| struct corner_list; | |
| #endif // CONFIG_AV1_ENCODER && !CONFIG_REALTIME_ONLY | |
| /*!\endcond */ | |
| /*! | |
| * \brief YV12 frame buffer data structure | |
| */ | |
| typedef struct yv12_buffer_config { | |
| /*!\cond */ | |
| union { | |
| struct { | |
| // The aligned frame width of luma. | |
| // It is aligned to a multiple of 8: | |
| // y_width = (y_crop_width + 7) & ~7 | |
| int y_width; | |
| // The aligned frame width of chroma. | |
| // uv_width = y_width >> subsampling_x | |
| int uv_width; | |
| }; | |
| int widths[2]; | |
| }; | |
| union { | |
| struct { | |
| // The aligned frame height of luma. | |
| // It is aligned to a multiple of 8: | |
| // y_height = (y_crop_height + 7) & ~7 | |
| int y_height; | |
| // The aligned frame height of chroma. | |
| // uv_height = y_height >> subsampling_y | |
| int uv_height; | |
| }; | |
| int heights[2]; | |
| }; | |
| // The frame size en/decoded by AV1 | |
| 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 { | |
| uint8_t *y_buffer; | |
| uint8_t *u_buffer; | |
| uint8_t *v_buffer; | |
| }; | |
| uint8_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. | |
| uint8_t *store_buf_adr[3]; | |
| // Global motion search data | |
| #if CONFIG_AV1_ENCODER && !CONFIG_REALTIME_ONLY | |
| // 8-bit downsampling pyramid for the Y plane | |
| struct image_pyramid *y_pyramid; | |
| struct corner_list *corners; | |
| #endif // CONFIG_AV1_ENCODER && !CONFIG_REALTIME_ONLY | |
| 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 */ | |
| #define YV12_FLAG_HIGHBITDEPTH 8 | |
| // 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 use_highbitdepth, int border, | |
| int byte_alignment, bool alloc_pyramid, | |
| int alloc_y_plane_only); | |
| // 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 use_highbitdepth, | |
| 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 alloc_y_plane_only); | |
| 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); | |
| /*!\brief Calculate the stride required for the image. | |
| * | |
| * Calculates the stride value for an image from aligned width and border. | |
| * Returns the y stride value. | |
| * | |
| * \param[in] aligned_width Aligned width of the image | |
| * \param[in] border Border in pixels | |
| */ | |
| static inline int aom_calc_y_stride(int aligned_width, int border) { | |
| return ((aligned_width + 2 * border) + 31) & ~31; | |
| } | |
| #ifdef __cplusplus | |
| } | |
| #endif | |
| #endif // AOM_AOM_SCALE_YV12CONFIG_H_ |