1 /* 2 * Copyright (c) 2016, Alliance for Open Media. All rights reserved 3 * 4 * This source code is subject to the terms of the BSD 2 Clause License and 5 * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License 6 * was not distributed with this source code in the LICENSE file, you can 7 * obtain it at www.aomedia.org/license/software. If the Alliance for Open 8 * Media Patent License 1.0 was not distributed with this source code in the 9 * PATENTS file, you can obtain it at www.aomedia.org/license/patent. 10 */ 11 12 #ifndef AOM_AOM_SCALE_YV12CONFIG_H_ 13 #define AOM_AOM_SCALE_YV12CONFIG_H_ 14 15 #ifdef __cplusplus 16 extern "C" { 17 #endif 18 19 #include "config/aom_config.h" 20 21 #include "aom/aom_codec.h" 22 #include "aom/aom_frame_buffer.h" 23 #include "aom/aom_integer.h" 24 #include "aom/internal/aom_image_internal.h" 25 26 #define AOMINNERBORDERINPIXELS 160 27 #define AOM_INTERP_EXTEND 4 28 #define AOM_BORDER_IN_PIXELS 288 29 #define AOM_ENC_NO_SCALE_BORDER 160 30 #define AOM_DEC_BORDER_IN_PIXELS 64 31 32 typedef struct yv12_buffer_config { 33 union { 34 struct { 35 int y_width; 36 int uv_width; 37 }; 38 int widths[2]; 39 }; 40 union { 41 struct { 42 int y_height; 43 int uv_height; 44 }; 45 int heights[2]; 46 }; 47 union { 48 struct { 49 int y_crop_width; 50 int uv_crop_width; 51 }; 52 int crop_widths[2]; 53 }; 54 union { 55 struct { 56 int y_crop_height; 57 int uv_crop_height; 58 }; 59 int crop_heights[2]; 60 }; 61 union { 62 struct { 63 int y_stride; 64 int uv_stride; 65 }; 66 int strides[2]; 67 }; 68 union { 69 struct { 70 uint8_t *y_buffer; 71 uint8_t *u_buffer; 72 uint8_t *v_buffer; 73 }; 74 uint8_t *buffers[3]; 75 }; 76 77 // Indicate whether y_buffer, u_buffer, and v_buffer points to the internally 78 // allocated memory or external buffers. 79 int use_external_reference_buffers; 80 // This is needed to store y_buffer, u_buffer, and v_buffer when set reference 81 // uses an external refernece, and restore those buffer pointers after the 82 // external reference frame is no longer used. 83 uint8_t *store_buf_adr[3]; 84 85 // If the frame is stored in a 16-bit buffer, this stores an 8-bit version 86 // for use in global motion detection. It is allocated on-demand. 87 uint8_t *y_buffer_8bit; 88 int buf_8bit_valid; 89 90 uint8_t *buffer_alloc; 91 size_t buffer_alloc_sz; 92 int border; 93 size_t frame_size; 94 int subsampling_x; 95 int subsampling_y; 96 unsigned int bit_depth; 97 aom_color_primaries_t color_primaries; 98 aom_transfer_characteristics_t transfer_characteristics; 99 aom_matrix_coefficients_t matrix_coefficients; 100 uint8_t monochrome; 101 aom_chroma_sample_position_t chroma_sample_position; 102 aom_color_range_t color_range; 103 int render_width; 104 int render_height; 105 106 int corrupted; 107 int flags; 108 aom_metadata_array_t *metadata; 109 } YV12_BUFFER_CONFIG; 110 111 #define YV12_FLAG_HIGHBITDEPTH 8 112 113 int aom_alloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, 114 int ss_x, int ss_y, int use_highbitdepth, int border, 115 int byte_alignment); 116 117 // Updates the yv12 buffer config with the frame buffer. |byte_alignment| must 118 // be a power of 2, from 32 to 1024. 0 sets legacy alignment. If cb is not 119 // NULL, then libaom is using the frame buffer callbacks to handle memory. 120 // If cb is not NULL, libaom will call cb with minimum size in bytes needed 121 // to decode the current frame. If cb is NULL, libaom will allocate memory 122 // internally to decode the current frame. Returns 0 on success. Returns < 0 123 // on failure. 124 int aom_realloc_frame_buffer(YV12_BUFFER_CONFIG *ybf, int width, int height, 125 int ss_x, int ss_y, int use_highbitdepth, 126 int border, int byte_alignment, 127 aom_codec_frame_buffer_t *fb, 128 aom_get_frame_buffer_cb_fn_t cb, void *cb_priv); 129 130 int aom_free_frame_buffer(YV12_BUFFER_CONFIG *ybf); 131 132 /*!\brief Removes metadata from YUV_BUFFER_CONFIG struct. 133 * 134 * Frees metadata in frame buffer. 135 * Frame buffer metadata pointer will be set to NULL. 136 * 137 * \param[in] ybf Frame buffer struct pointer 138 */ 139 void aom_remove_metadata_from_frame_buffer(YV12_BUFFER_CONFIG *ybf); 140 141 /*!\brief Copy metadata to YUV_BUFFER_CONFIG struct. 142 * 143 * Copies metadata in frame buffer. 144 * Frame buffer will clear any previous metadata and will reallocate the 145 * metadata array to the new metadata size. Then, it will copy the new metadata 146 * array into it. 147 * Returns 0 on success or -1 on failure. 148 * 149 * \param[in] ybf Frame buffer struct pointer 150 * \param[in] arr Metadata array struct pointer 151 */ 152 int aom_copy_metadata_to_frame_buffer(YV12_BUFFER_CONFIG *ybf, 153 const aom_metadata_array_t *arr); 154 155 #ifdef __cplusplus 156 } 157 #endif 158 159 #endif // AOM_AOM_SCALE_YV12CONFIG_H_ 160