1*fb1b10abSAndroid Build Coastguard Worker /* 2*fb1b10abSAndroid Build Coastguard Worker * Copyright (c) 2019 The WebM project authors. All Rights Reserved. 3*fb1b10abSAndroid Build Coastguard Worker * 4*fb1b10abSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*fb1b10abSAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*fb1b10abSAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*fb1b10abSAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*fb1b10abSAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*fb1b10abSAndroid Build Coastguard Worker */ 10*fb1b10abSAndroid Build Coastguard Worker 11*fb1b10abSAndroid Build Coastguard Worker #ifndef VPX_VP9_SIMPLE_ENCODE_H_ 12*fb1b10abSAndroid Build Coastguard Worker #define VPX_VP9_SIMPLE_ENCODE_H_ 13*fb1b10abSAndroid Build Coastguard Worker 14*fb1b10abSAndroid Build Coastguard Worker #include <cstddef> 15*fb1b10abSAndroid Build Coastguard Worker #include <cstdint> 16*fb1b10abSAndroid Build Coastguard Worker #include <cstdio> 17*fb1b10abSAndroid Build Coastguard Worker #include <memory> 18*fb1b10abSAndroid Build Coastguard Worker #include <vector> 19*fb1b10abSAndroid Build Coastguard Worker 20*fb1b10abSAndroid Build Coastguard Worker namespace vp9 { 21*fb1b10abSAndroid Build Coastguard Worker 22*fb1b10abSAndroid Build Coastguard Worker enum StatusCode { 23*fb1b10abSAndroid Build Coastguard Worker StatusOk = 0, 24*fb1b10abSAndroid Build Coastguard Worker StatusError, 25*fb1b10abSAndroid Build Coastguard Worker }; 26*fb1b10abSAndroid Build Coastguard Worker 27*fb1b10abSAndroid Build Coastguard Worker // TODO(angiebird): Add description for each frame type. 28*fb1b10abSAndroid Build Coastguard Worker enum FrameType { 29*fb1b10abSAndroid Build Coastguard Worker kFrameTypeKey = 0, 30*fb1b10abSAndroid Build Coastguard Worker kFrameTypeInter = 1, 31*fb1b10abSAndroid Build Coastguard Worker kFrameTypeAltRef = 2, 32*fb1b10abSAndroid Build Coastguard Worker kFrameTypeOverlay = 3, 33*fb1b10abSAndroid Build Coastguard Worker kFrameTypeGolden = 4, 34*fb1b10abSAndroid Build Coastguard Worker }; 35*fb1b10abSAndroid Build Coastguard Worker 36*fb1b10abSAndroid Build Coastguard Worker // TODO(angiebird): Add description for each reference frame type. 37*fb1b10abSAndroid Build Coastguard Worker // This enum numbers have to be contiguous and start from zero except 38*fb1b10abSAndroid Build Coastguard Worker // kNoneRefFrame. 39*fb1b10abSAndroid Build Coastguard Worker enum RefFrameType { 40*fb1b10abSAndroid Build Coastguard Worker kRefFrameTypeLast = 0, 41*fb1b10abSAndroid Build Coastguard Worker kRefFrameTypePast = 1, 42*fb1b10abSAndroid Build Coastguard Worker kRefFrameTypeFuture = 2, 43*fb1b10abSAndroid Build Coastguard Worker kRefFrameTypeMax = 3, 44*fb1b10abSAndroid Build Coastguard Worker kRefFrameTypeNone = -1, 45*fb1b10abSAndroid Build Coastguard Worker }; 46*fb1b10abSAndroid Build Coastguard Worker 47*fb1b10abSAndroid Build Coastguard Worker enum VP9_LEVEL { 48*fb1b10abSAndroid Build Coastguard Worker LEVEL_UNKNOWN = 0, 49*fb1b10abSAndroid Build Coastguard Worker LEVEL_AUTO = 1, 50*fb1b10abSAndroid Build Coastguard Worker LEVEL_1 = 10, 51*fb1b10abSAndroid Build Coastguard Worker LEVEL_1_1 = 11, 52*fb1b10abSAndroid Build Coastguard Worker LEVEL_2 = 20, 53*fb1b10abSAndroid Build Coastguard Worker LEVEL_2_1 = 21, 54*fb1b10abSAndroid Build Coastguard Worker LEVEL_3 = 30, 55*fb1b10abSAndroid Build Coastguard Worker LEVEL_3_1 = 31, 56*fb1b10abSAndroid Build Coastguard Worker LEVEL_4 = 40, 57*fb1b10abSAndroid Build Coastguard Worker LEVEL_4_1 = 41, 58*fb1b10abSAndroid Build Coastguard Worker LEVEL_5 = 50, 59*fb1b10abSAndroid Build Coastguard Worker LEVEL_5_1 = 51, 60*fb1b10abSAndroid Build Coastguard Worker LEVEL_5_2 = 52, 61*fb1b10abSAndroid Build Coastguard Worker LEVEL_6 = 60, 62*fb1b10abSAndroid Build Coastguard Worker LEVEL_6_1 = 61, 63*fb1b10abSAndroid Build Coastguard Worker LEVEL_6_2 = 62, 64*fb1b10abSAndroid Build Coastguard Worker LEVEL_MAX = 255 65*fb1b10abSAndroid Build Coastguard Worker }; 66*fb1b10abSAndroid Build Coastguard Worker 67*fb1b10abSAndroid Build Coastguard Worker enum GopMapFlag { 68*fb1b10abSAndroid Build Coastguard Worker kGopMapFlagStart = 69*fb1b10abSAndroid Build Coastguard Worker 1 << 0, // Indicate this location is the start of a group of pictures. 70*fb1b10abSAndroid Build Coastguard Worker kGopMapFlagUseAltRef = 71*fb1b10abSAndroid Build Coastguard Worker 1 << 1, // Indicate this group of pictures will use an alt ref. Only set 72*fb1b10abSAndroid Build Coastguard Worker // this flag when kGopMapFlagStart is set. 73*fb1b10abSAndroid Build Coastguard Worker }; 74*fb1b10abSAndroid Build Coastguard Worker 75*fb1b10abSAndroid Build Coastguard Worker // The frame is split to 4x4 blocks. 76*fb1b10abSAndroid Build Coastguard Worker // This structure contains the information of each 4x4 block. 77*fb1b10abSAndroid Build Coastguard Worker struct PartitionInfo { 78*fb1b10abSAndroid Build Coastguard Worker int row; // row pixel offset of current 4x4 block 79*fb1b10abSAndroid Build Coastguard Worker int column; // column pixel offset of current 4x4 block 80*fb1b10abSAndroid Build Coastguard Worker int row_start; // row pixel offset of the start of the prediction block 81*fb1b10abSAndroid Build Coastguard Worker int column_start; // column pixel offset of the start of the prediction block 82*fb1b10abSAndroid Build Coastguard Worker int width; // prediction block width 83*fb1b10abSAndroid Build Coastguard Worker int height; // prediction block height 84*fb1b10abSAndroid Build Coastguard Worker }; 85*fb1b10abSAndroid Build Coastguard Worker 86*fb1b10abSAndroid Build Coastguard Worker constexpr int kMotionVectorSubPixelPrecision = 8; 87*fb1b10abSAndroid Build Coastguard Worker constexpr int kMotionVectorFullPixelPrecision = 1; 88*fb1b10abSAndroid Build Coastguard Worker 89*fb1b10abSAndroid Build Coastguard Worker // In the first pass. The frame is split to 16x16 blocks. 90*fb1b10abSAndroid Build Coastguard Worker // This structure contains the information of each 16x16 block. 91*fb1b10abSAndroid Build Coastguard Worker // In the second pass. The frame is split to 4x4 blocks. 92*fb1b10abSAndroid Build Coastguard Worker // This structure contains the information of each 4x4 block. 93*fb1b10abSAndroid Build Coastguard Worker struct MotionVectorInfo { 94*fb1b10abSAndroid Build Coastguard Worker // Number of valid motion vectors, always 0 if this block is in the key frame. 95*fb1b10abSAndroid Build Coastguard Worker // For inter frames, it could be 1 or 2. 96*fb1b10abSAndroid Build Coastguard Worker int mv_count; 97*fb1b10abSAndroid Build Coastguard Worker // The reference frame for motion vectors. If the second motion vector does 98*fb1b10abSAndroid Build Coastguard Worker // not exist (mv_count = 1), the reference frame is kNoneRefFrame. 99*fb1b10abSAndroid Build Coastguard Worker // Otherwise, the reference frame is either kRefFrameTypeLast, or 100*fb1b10abSAndroid Build Coastguard Worker // kRefFrameTypePast, or kRefFrameTypeFuture. 101*fb1b10abSAndroid Build Coastguard Worker RefFrameType ref_frame[2]; 102*fb1b10abSAndroid Build Coastguard Worker // The row offset of motion vectors in the unit of pixel. 103*fb1b10abSAndroid Build Coastguard Worker // If the second motion vector does not exist, the value is 0. 104*fb1b10abSAndroid Build Coastguard Worker double mv_row[2]; 105*fb1b10abSAndroid Build Coastguard Worker // The column offset of motion vectors in the unit of pixel. 106*fb1b10abSAndroid Build Coastguard Worker // If the second motion vector does not exist, the value is 0. 107*fb1b10abSAndroid Build Coastguard Worker double mv_column[2]; 108*fb1b10abSAndroid Build Coastguard Worker }; 109*fb1b10abSAndroid Build Coastguard Worker 110*fb1b10abSAndroid Build Coastguard Worker // Accumulated tpl stats of all blocks in one frame. 111*fb1b10abSAndroid Build Coastguard Worker // For each frame, the tpl stats are computed per 32x32 block. 112*fb1b10abSAndroid Build Coastguard Worker struct TplStatsInfo { 113*fb1b10abSAndroid Build Coastguard Worker // Intra complexity: the sum of absolute transform difference (SATD) of 114*fb1b10abSAndroid Build Coastguard Worker // intra predicted residuals. 115*fb1b10abSAndroid Build Coastguard Worker int64_t intra_cost; 116*fb1b10abSAndroid Build Coastguard Worker // Inter complexity: the SATD of inter predicted residuals. 117*fb1b10abSAndroid Build Coastguard Worker int64_t inter_cost; 118*fb1b10abSAndroid Build Coastguard Worker // Motion compensated information flow. It measures how much information 119*fb1b10abSAndroid Build Coastguard Worker // is propagated from the current frame to other frames. 120*fb1b10abSAndroid Build Coastguard Worker int64_t mc_flow; 121*fb1b10abSAndroid Build Coastguard Worker // Motion compensated dependency cost. It equals to its own intra_cost 122*fb1b10abSAndroid Build Coastguard Worker // plus the mc_flow. 123*fb1b10abSAndroid Build Coastguard Worker int64_t mc_dep_cost; 124*fb1b10abSAndroid Build Coastguard Worker // Motion compensated reference cost. 125*fb1b10abSAndroid Build Coastguard Worker int64_t mc_ref_cost; 126*fb1b10abSAndroid Build Coastguard Worker }; 127*fb1b10abSAndroid Build Coastguard Worker 128*fb1b10abSAndroid Build Coastguard Worker struct RefFrameInfo { 129*fb1b10abSAndroid Build Coastguard Worker int coding_indexes[kRefFrameTypeMax]; 130*fb1b10abSAndroid Build Coastguard Worker 131*fb1b10abSAndroid Build Coastguard Worker // Indicate whether the reference frames are available or not. 132*fb1b10abSAndroid Build Coastguard Worker // When the reference frame type is not valid, it means either the to-be-coded 133*fb1b10abSAndroid Build Coastguard Worker // frame is a key frame or the reference frame already appears in other 134*fb1b10abSAndroid Build Coastguard Worker // reference frame type. vp9 always keeps three types of reference frame 135*fb1b10abSAndroid Build Coastguard Worker // available. However, the duplicated reference frames will not be 136*fb1b10abSAndroid Build Coastguard Worker // chosen by the encoder. The priorities of choosing reference frames are 137*fb1b10abSAndroid Build Coastguard Worker // kRefFrameTypeLast > kRefFrameTypePast > kRefFrameTypeFuture. 138*fb1b10abSAndroid Build Coastguard Worker // For example, if kRefFrameTypeLast and kRefFrameTypePast both point to the 139*fb1b10abSAndroid Build Coastguard Worker // same frame, kRefFrameTypePast will be set to invalid. 140*fb1b10abSAndroid Build Coastguard Worker // 1: the ref frame type is available 0: the ref frame type is not available 141*fb1b10abSAndroid Build Coastguard Worker int valid_list[kRefFrameTypeMax]; 142*fb1b10abSAndroid Build Coastguard Worker }; 143*fb1b10abSAndroid Build Coastguard Worker 144*fb1b10abSAndroid Build Coastguard Worker bool operator==(const RefFrameInfo &a, const RefFrameInfo &b); 145*fb1b10abSAndroid Build Coastguard Worker 146*fb1b10abSAndroid Build Coastguard Worker struct EncodeFrameInfo { 147*fb1b10abSAndroid Build Coastguard Worker int show_idx; 148*fb1b10abSAndroid Build Coastguard Worker 149*fb1b10abSAndroid Build Coastguard Worker // Each show or no show frame is assigned with a coding index based on its 150*fb1b10abSAndroid Build Coastguard Worker // coding order (starting from zero) in the coding process of the entire 151*fb1b10abSAndroid Build Coastguard Worker // video. The coding index for each frame is unique. 152*fb1b10abSAndroid Build Coastguard Worker int coding_index; 153*fb1b10abSAndroid Build Coastguard Worker RefFrameInfo ref_frame_info; 154*fb1b10abSAndroid Build Coastguard Worker FrameType frame_type; 155*fb1b10abSAndroid Build Coastguard Worker }; 156*fb1b10abSAndroid Build Coastguard Worker 157*fb1b10abSAndroid Build Coastguard Worker // This structure is a copy of vp9 |nmv_component_counts|. 158*fb1b10abSAndroid Build Coastguard Worker struct NewMotionvectorComponentCounts { 159*fb1b10abSAndroid Build Coastguard Worker std::vector<unsigned int> sign; 160*fb1b10abSAndroid Build Coastguard Worker std::vector<unsigned int> classes; 161*fb1b10abSAndroid Build Coastguard Worker std::vector<unsigned int> class0; 162*fb1b10abSAndroid Build Coastguard Worker std::vector<std::vector<unsigned int>> bits; 163*fb1b10abSAndroid Build Coastguard Worker std::vector<std::vector<unsigned int>> class0_fp; 164*fb1b10abSAndroid Build Coastguard Worker std::vector<unsigned int> fp; 165*fb1b10abSAndroid Build Coastguard Worker std::vector<unsigned int> class0_hp; 166*fb1b10abSAndroid Build Coastguard Worker std::vector<unsigned int> hp; 167*fb1b10abSAndroid Build Coastguard Worker }; 168*fb1b10abSAndroid Build Coastguard Worker 169*fb1b10abSAndroid Build Coastguard Worker // This structure is a copy of vp9 |nmv_context_counts|. 170*fb1b10abSAndroid Build Coastguard Worker struct NewMotionVectorContextCounts { 171*fb1b10abSAndroid Build Coastguard Worker std::vector<unsigned int> joints; 172*fb1b10abSAndroid Build Coastguard Worker std::vector<NewMotionvectorComponentCounts> comps; 173*fb1b10abSAndroid Build Coastguard Worker }; 174*fb1b10abSAndroid Build Coastguard Worker 175*fb1b10abSAndroid Build Coastguard Worker using UintArray2D = std::vector<std::vector<unsigned int>>; 176*fb1b10abSAndroid Build Coastguard Worker using UintArray3D = std::vector<std::vector<std::vector<unsigned int>>>; 177*fb1b10abSAndroid Build Coastguard Worker using UintArray5D = std::vector< 178*fb1b10abSAndroid Build Coastguard Worker std::vector<std::vector<std::vector<std::vector<unsigned int>>>>>; 179*fb1b10abSAndroid Build Coastguard Worker using UintArray6D = std::vector<std::vector< 180*fb1b10abSAndroid Build Coastguard Worker std::vector<std::vector<std::vector<std::vector<unsigned int>>>>>>; 181*fb1b10abSAndroid Build Coastguard Worker 182*fb1b10abSAndroid Build Coastguard Worker // This structure is a copy of vp9 |tx_counts|. 183*fb1b10abSAndroid Build Coastguard Worker struct TransformSizeCounts { 184*fb1b10abSAndroid Build Coastguard Worker // Transform size found in blocks of partition size 32x32. 185*fb1b10abSAndroid Build Coastguard Worker // First dimension: transform size contexts (2). 186*fb1b10abSAndroid Build Coastguard Worker // Second dimension: transform size type (3: 32x32, 16x16, 8x8) 187*fb1b10abSAndroid Build Coastguard Worker UintArray2D p32x32; 188*fb1b10abSAndroid Build Coastguard Worker // Transform size found in blocks of partition size 16x16. 189*fb1b10abSAndroid Build Coastguard Worker // First dimension: transform size contexts (2). 190*fb1b10abSAndroid Build Coastguard Worker // Second dimension: transform size type (2: 16x16, 8x8) 191*fb1b10abSAndroid Build Coastguard Worker UintArray2D p16x16; 192*fb1b10abSAndroid Build Coastguard Worker // Transform size found in blocks of partition size 8x8. 193*fb1b10abSAndroid Build Coastguard Worker // First dimension: transform size contexts (2). 194*fb1b10abSAndroid Build Coastguard Worker // Second dimension: transform size type (1: 8x8) 195*fb1b10abSAndroid Build Coastguard Worker UintArray2D p8x8; 196*fb1b10abSAndroid Build Coastguard Worker // Overall transform size count. 197*fb1b10abSAndroid Build Coastguard Worker std::vector<unsigned int> tx_totals; 198*fb1b10abSAndroid Build Coastguard Worker }; 199*fb1b10abSAndroid Build Coastguard Worker 200*fb1b10abSAndroid Build Coastguard Worker // This structure is a copy of vp9 |FRAME_COUNTS|. 201*fb1b10abSAndroid Build Coastguard Worker struct FrameCounts { 202*fb1b10abSAndroid Build Coastguard Worker // Intra prediction mode for luma plane. First dimension: block size (4). 203*fb1b10abSAndroid Build Coastguard Worker // Second dimension: intra prediction mode (10). 204*fb1b10abSAndroid Build Coastguard Worker UintArray2D y_mode; 205*fb1b10abSAndroid Build Coastguard Worker // Intra prediction mode for chroma plane. First and second dimension: 206*fb1b10abSAndroid Build Coastguard Worker // intra prediction mode (10). 207*fb1b10abSAndroid Build Coastguard Worker UintArray2D uv_mode; 208*fb1b10abSAndroid Build Coastguard Worker // Partition type. First dimension: partition contexts (16). 209*fb1b10abSAndroid Build Coastguard Worker // Second dimension: partition type (4). 210*fb1b10abSAndroid Build Coastguard Worker UintArray2D partition; 211*fb1b10abSAndroid Build Coastguard Worker // Transform coefficient. 212*fb1b10abSAndroid Build Coastguard Worker UintArray6D coef; 213*fb1b10abSAndroid Build Coastguard Worker // End of block (the position of the last non-zero transform coefficient) 214*fb1b10abSAndroid Build Coastguard Worker UintArray5D eob_branch; 215*fb1b10abSAndroid Build Coastguard Worker // Interpolation filter type. First dimension: switchable filter contexts (4). 216*fb1b10abSAndroid Build Coastguard Worker // Second dimension: filter types (3). 217*fb1b10abSAndroid Build Coastguard Worker UintArray2D switchable_interp; 218*fb1b10abSAndroid Build Coastguard Worker // Inter prediction mode (the motion vector type). 219*fb1b10abSAndroid Build Coastguard Worker // First dimension: inter mode contexts (7). 220*fb1b10abSAndroid Build Coastguard Worker // Second dimension: mode type (4). 221*fb1b10abSAndroid Build Coastguard Worker UintArray2D inter_mode; 222*fb1b10abSAndroid Build Coastguard Worker // Block is intra or inter predicted. First dimension: contexts (4). 223*fb1b10abSAndroid Build Coastguard Worker // Second dimension: type (0 for intra, 1 for inter). 224*fb1b10abSAndroid Build Coastguard Worker UintArray2D intra_inter; 225*fb1b10abSAndroid Build Coastguard Worker // Block is compound predicted (predicted from average of two blocks). 226*fb1b10abSAndroid Build Coastguard Worker // First dimension: contexts (5). 227*fb1b10abSAndroid Build Coastguard Worker // Second dimension: type (0 for single, 1 for compound prediction). 228*fb1b10abSAndroid Build Coastguard Worker UintArray2D comp_inter; 229*fb1b10abSAndroid Build Coastguard Worker // Type of the reference frame. Only one reference frame. 230*fb1b10abSAndroid Build Coastguard Worker // First dimension: context (5). Second dimension: context (2). 231*fb1b10abSAndroid Build Coastguard Worker // Third dimension: count (2). 232*fb1b10abSAndroid Build Coastguard Worker UintArray3D single_ref; 233*fb1b10abSAndroid Build Coastguard Worker // Type of the two reference frames. 234*fb1b10abSAndroid Build Coastguard Worker // First dimension: context (5). Second dimension: count (2). 235*fb1b10abSAndroid Build Coastguard Worker UintArray2D comp_ref; 236*fb1b10abSAndroid Build Coastguard Worker // Block skips transform and quantization, uses prediction as reconstruction. 237*fb1b10abSAndroid Build Coastguard Worker // First dimension: contexts (3). Second dimension: type (0 not skip, 1 skip). 238*fb1b10abSAndroid Build Coastguard Worker UintArray2D skip; 239*fb1b10abSAndroid Build Coastguard Worker // Transform size. 240*fb1b10abSAndroid Build Coastguard Worker TransformSizeCounts tx; 241*fb1b10abSAndroid Build Coastguard Worker // New motion vector. 242*fb1b10abSAndroid Build Coastguard Worker NewMotionVectorContextCounts mv; 243*fb1b10abSAndroid Build Coastguard Worker }; 244*fb1b10abSAndroid Build Coastguard Worker 245*fb1b10abSAndroid Build Coastguard Worker struct ImageBuffer { 246*fb1b10abSAndroid Build Coastguard Worker // The image data is stored in raster order, 247*fb1b10abSAndroid Build Coastguard Worker // i.e. image[plane][r][c] = 248*fb1b10abSAndroid Build Coastguard Worker // plane_buffer[plane][r * plane_width[plane] + plane_height[plane]]. 249*fb1b10abSAndroid Build Coastguard Worker std::unique_ptr<unsigned char[]> plane_buffer[3]; 250*fb1b10abSAndroid Build Coastguard Worker int plane_width[3]; 251*fb1b10abSAndroid Build Coastguard Worker int plane_height[3]; 252*fb1b10abSAndroid Build Coastguard Worker }; 253*fb1b10abSAndroid Build Coastguard Worker 254*fb1b10abSAndroid Build Coastguard Worker void output_image_buffer(const ImageBuffer &image_buffer, std::FILE *out_file); 255*fb1b10abSAndroid Build Coastguard Worker 256*fb1b10abSAndroid Build Coastguard Worker struct EncodeFrameResult { 257*fb1b10abSAndroid Build Coastguard Worker int show_idx; 258*fb1b10abSAndroid Build Coastguard Worker FrameType frame_type; 259*fb1b10abSAndroid Build Coastguard Worker int coding_idx; 260*fb1b10abSAndroid Build Coastguard Worker RefFrameInfo ref_frame_info; 261*fb1b10abSAndroid Build Coastguard Worker size_t coding_data_bit_size; 262*fb1b10abSAndroid Build Coastguard Worker size_t coding_data_byte_size; 263*fb1b10abSAndroid Build Coastguard Worker // The EncodeFrame will allocate a buffer, write the coding data into the 264*fb1b10abSAndroid Build Coastguard Worker // buffer and give the ownership of the buffer to coding_data. 265*fb1b10abSAndroid Build Coastguard Worker std::unique_ptr<unsigned char[]> coding_data; 266*fb1b10abSAndroid Build Coastguard Worker size_t max_coding_data_byte_size; 267*fb1b10abSAndroid Build Coastguard Worker double psnr; 268*fb1b10abSAndroid Build Coastguard Worker uint64_t sse; 269*fb1b10abSAndroid Build Coastguard Worker int quantize_index; 270*fb1b10abSAndroid Build Coastguard Worker FrameCounts frame_counts; 271*fb1b10abSAndroid Build Coastguard Worker int num_rows_4x4; // number of row units, in size of 4. 272*fb1b10abSAndroid Build Coastguard Worker int num_cols_4x4; // number of column units, in size of 4. 273*fb1b10abSAndroid Build Coastguard Worker // A vector of the partition information of the frame. 274*fb1b10abSAndroid Build Coastguard Worker // The number of elements is |num_rows_4x4| * |num_cols_4x4|. 275*fb1b10abSAndroid Build Coastguard Worker // The frame is divided 4x4 blocks of |num_rows_4x4| rows and 276*fb1b10abSAndroid Build Coastguard Worker // |num_cols_4x4| columns. 277*fb1b10abSAndroid Build Coastguard Worker // Each 4x4 block contains the current pixel position (|row|, |column|), 278*fb1b10abSAndroid Build Coastguard Worker // the start pixel position of the partition (|row_start|, |column_start|), 279*fb1b10abSAndroid Build Coastguard Worker // and the |width|, |height| of the partition. 280*fb1b10abSAndroid Build Coastguard Worker // The current pixel position can be the same as the start pixel position 281*fb1b10abSAndroid Build Coastguard Worker // if the 4x4 block is the top-left block in the partition. Otherwise, they 282*fb1b10abSAndroid Build Coastguard Worker // are different. 283*fb1b10abSAndroid Build Coastguard Worker // Within the same partition, all 4x4 blocks have the same |row_start|, 284*fb1b10abSAndroid Build Coastguard Worker // |column_start|, |width| and |height|. 285*fb1b10abSAndroid Build Coastguard Worker // For example, if the frame is partitioned to a 32x32 block, 286*fb1b10abSAndroid Build Coastguard Worker // starting at (0, 0). Then, there're 64 4x4 blocks within this partition. 287*fb1b10abSAndroid Build Coastguard Worker // They all have the same |row_start|, |column_start|, |width|, |height|, 288*fb1b10abSAndroid Build Coastguard Worker // which can be used to figure out the start of the current partition and 289*fb1b10abSAndroid Build Coastguard Worker // the start of the next partition block. 290*fb1b10abSAndroid Build Coastguard Worker // Horizontal next: |column_start| + |width|, 291*fb1b10abSAndroid Build Coastguard Worker // Vertical next: |row_start| + |height|. 292*fb1b10abSAndroid Build Coastguard Worker std::vector<PartitionInfo> partition_info; 293*fb1b10abSAndroid Build Coastguard Worker // A vector of the motion vector information of the frame. 294*fb1b10abSAndroid Build Coastguard Worker // The number of elements is |num_rows_4x4| * |num_cols_4x4|. 295*fb1b10abSAndroid Build Coastguard Worker // The frame is divided into 4x4 blocks of |num_rows_4x4| rows and 296*fb1b10abSAndroid Build Coastguard Worker // |num_cols_4x4| columns. 297*fb1b10abSAndroid Build Coastguard Worker // Each 4x4 block contains 0 motion vector if this is an intra predicted 298*fb1b10abSAndroid Build Coastguard Worker // frame (for example, the key frame). If the frame is inter predicted, 299*fb1b10abSAndroid Build Coastguard Worker // each 4x4 block contains either 1 or 2 motion vectors. 300*fb1b10abSAndroid Build Coastguard Worker // Similar to partition info, all 4x4 blocks inside the same partition block 301*fb1b10abSAndroid Build Coastguard Worker // share the same motion vector information. 302*fb1b10abSAndroid Build Coastguard Worker std::vector<MotionVectorInfo> motion_vector_info; 303*fb1b10abSAndroid Build Coastguard Worker // A vector of the tpl stats information. 304*fb1b10abSAndroid Build Coastguard Worker // The tpl stats measure the complexity of a frame, as well as the 305*fb1b10abSAndroid Build Coastguard Worker // information propagated along the motion trajectory between frames, in 306*fb1b10abSAndroid Build Coastguard Worker // the reference frame structure. 307*fb1b10abSAndroid Build Coastguard Worker // The tpl stats could be used as a more accurate spatial and temporal 308*fb1b10abSAndroid Build Coastguard Worker // complexity measure in addition to the first pass stats. 309*fb1b10abSAndroid Build Coastguard Worker // The vector contains tpl stats for all show frames in a GOP. 310*fb1b10abSAndroid Build Coastguard Worker // The tpl stats stored in the vector is according to the encoding order. 311*fb1b10abSAndroid Build Coastguard Worker // For example, suppose there are N show frames for the current GOP. 312*fb1b10abSAndroid Build Coastguard Worker // Then tpl_stats_info[0] stores the information of the first frame to be 313*fb1b10abSAndroid Build Coastguard Worker // encoded for this GOP, i.e., the AltRef frame. 314*fb1b10abSAndroid Build Coastguard Worker std::vector<TplStatsInfo> tpl_stats_info; 315*fb1b10abSAndroid Build Coastguard Worker ImageBuffer coded_frame; 316*fb1b10abSAndroid Build Coastguard Worker 317*fb1b10abSAndroid Build Coastguard Worker // recode_count, q_index_history and rate_history are only available when 318*fb1b10abSAndroid Build Coastguard Worker // EncodeFrameWithTargetFrameBits() is used. 319*fb1b10abSAndroid Build Coastguard Worker int recode_count; 320*fb1b10abSAndroid Build Coastguard Worker std::vector<int> q_index_history; 321*fb1b10abSAndroid Build Coastguard Worker std::vector<int> rate_history; 322*fb1b10abSAndroid Build Coastguard Worker }; 323*fb1b10abSAndroid Build Coastguard Worker 324*fb1b10abSAndroid Build Coastguard Worker struct GroupOfPicture { 325*fb1b10abSAndroid Build Coastguard Worker // This list will be updated internally in StartEncode() and 326*fb1b10abSAndroid Build Coastguard Worker // EncodeFrame()/EncodeFrameWithQuantizeIndex(). 327*fb1b10abSAndroid Build Coastguard Worker // In EncodeFrame()/EncodeFrameWithQuantizeIndex(), the update will only be 328*fb1b10abSAndroid Build Coastguard Worker // triggered when the coded frame is the last one in the previous group of 329*fb1b10abSAndroid Build Coastguard Worker // pictures. 330*fb1b10abSAndroid Build Coastguard Worker std::vector<EncodeFrameInfo> encode_frame_list; 331*fb1b10abSAndroid Build Coastguard Worker 332*fb1b10abSAndroid Build Coastguard Worker // Indicates the index of the next coding frame in encode_frame_list. 333*fb1b10abSAndroid Build Coastguard Worker // In other words, EncodeFrameInfo of the next coding frame can be 334*fb1b10abSAndroid Build Coastguard Worker // obtained with encode_frame_list[next_encode_frame_index]. 335*fb1b10abSAndroid Build Coastguard Worker // Internally, next_encode_frame_index will be set to zero after the last 336*fb1b10abSAndroid Build Coastguard Worker // frame of the group of pictures is coded. Otherwise, next_encode_frame_index 337*fb1b10abSAndroid Build Coastguard Worker // will be increased after each EncodeFrame()/EncodeFrameWithQuantizeIndex() 338*fb1b10abSAndroid Build Coastguard Worker // call. 339*fb1b10abSAndroid Build Coastguard Worker int next_encode_frame_index; 340*fb1b10abSAndroid Build Coastguard Worker 341*fb1b10abSAndroid Build Coastguard Worker // Number of show frames in this group of pictures. 342*fb1b10abSAndroid Build Coastguard Worker int show_frame_count; 343*fb1b10abSAndroid Build Coastguard Worker 344*fb1b10abSAndroid Build Coastguard Worker // The show index/timestamp of the earliest show frame in the group of 345*fb1b10abSAndroid Build Coastguard Worker // pictures. 346*fb1b10abSAndroid Build Coastguard Worker int start_show_index; 347*fb1b10abSAndroid Build Coastguard Worker 348*fb1b10abSAndroid Build Coastguard Worker // The coding index of the first coding frame in the group of pictures. 349*fb1b10abSAndroid Build Coastguard Worker int start_coding_index; 350*fb1b10abSAndroid Build Coastguard Worker 351*fb1b10abSAndroid Build Coastguard Worker // Indicates whether this group of pictures starts with a key frame. 352*fb1b10abSAndroid Build Coastguard Worker int first_is_key_frame; 353*fb1b10abSAndroid Build Coastguard Worker 354*fb1b10abSAndroid Build Coastguard Worker // Indicates whether this group of pictures uses an alt ref. 355*fb1b10abSAndroid Build Coastguard Worker int use_alt_ref; 356*fb1b10abSAndroid Build Coastguard Worker 357*fb1b10abSAndroid Build Coastguard Worker // Indicates whether previous group of pictures used an alt ref. 358*fb1b10abSAndroid Build Coastguard Worker int last_gop_use_alt_ref; 359*fb1b10abSAndroid Build Coastguard Worker }; 360*fb1b10abSAndroid Build Coastguard Worker 361*fb1b10abSAndroid Build Coastguard Worker class SimpleEncode { 362*fb1b10abSAndroid Build Coastguard Worker public: 363*fb1b10abSAndroid Build Coastguard Worker // When outfile_path is set, the encoder will output the bitstream in ivf 364*fb1b10abSAndroid Build Coastguard Worker // format. 365*fb1b10abSAndroid Build Coastguard Worker SimpleEncode(int frame_width, int frame_height, int frame_rate_num, 366*fb1b10abSAndroid Build Coastguard Worker int frame_rate_den, int target_bitrate, int num_frames, 367*fb1b10abSAndroid Build Coastguard Worker int target_level, const char *infile_path, 368*fb1b10abSAndroid Build Coastguard Worker const char *outfile_path = nullptr); 369*fb1b10abSAndroid Build Coastguard Worker ~SimpleEncode(); 370*fb1b10abSAndroid Build Coastguard Worker SimpleEncode(SimpleEncode &) = delete; 371*fb1b10abSAndroid Build Coastguard Worker SimpleEncode &operator=(const SimpleEncode &) = delete; 372*fb1b10abSAndroid Build Coastguard Worker 373*fb1b10abSAndroid Build Coastguard Worker // Adjusts the encoder's coding speed. 374*fb1b10abSAndroid Build Coastguard Worker // If this function is not called, the encoder will use default encode_speed 375*fb1b10abSAndroid Build Coastguard Worker // 0. Call this function before ComputeFirstPassStats() if needed. 376*fb1b10abSAndroid Build Coastguard Worker // The encode_speed is equivalent to --cpu-used of the vpxenc command. 377*fb1b10abSAndroid Build Coastguard Worker // The encode_speed's range should be [0, 9]. 378*fb1b10abSAndroid Build Coastguard Worker // Setting the encode_speed to a higher level will yield faster coding 379*fb1b10abSAndroid Build Coastguard Worker // at the cost of lower compression efficiency. 380*fb1b10abSAndroid Build Coastguard Worker void SetEncodeSpeed(int encode_speed); 381*fb1b10abSAndroid Build Coastguard Worker 382*fb1b10abSAndroid Build Coastguard Worker // Set encoder config 383*fb1b10abSAndroid Build Coastguard Worker // The following configs in VP9EncoderConfig are allowed to change in this 384*fb1b10abSAndroid Build Coastguard Worker // function. See https://ffmpeg.org/ffmpeg-codecs.html#libvpx for each 385*fb1b10abSAndroid Build Coastguard Worker // config's meaning. 386*fb1b10abSAndroid Build Coastguard Worker // Configs in VP9EncoderConfig: Equivalent configs in ffmpeg: 387*fb1b10abSAndroid Build Coastguard Worker // 1 key_freq -g 388*fb1b10abSAndroid Build Coastguard Worker // 2 two_pass_vbrmin_section -minrate * 100LL / bit_rate 389*fb1b10abSAndroid Build Coastguard Worker // 3 two_pass_vbrmax_section -maxrate * 100LL / bit_rate 390*fb1b10abSAndroid Build Coastguard Worker // 4 under_shoot_pct -undershoot-pct 391*fb1b10abSAndroid Build Coastguard Worker // 5 over_shoot_pct -overshoot-pct 392*fb1b10abSAndroid Build Coastguard Worker // 6 max_threads -threads 393*fb1b10abSAndroid Build Coastguard Worker // 7 frame_parallel_decoding_mode -frame-parallel 394*fb1b10abSAndroid Build Coastguard Worker // 8 tile_column -tile-columns 395*fb1b10abSAndroid Build Coastguard Worker // 9 arnr_max_frames -arnr-maxframes 396*fb1b10abSAndroid Build Coastguard Worker // 10 arnr_strength -arnr-strength 397*fb1b10abSAndroid Build Coastguard Worker // 11 lag_in_frames -rc_lookahead 398*fb1b10abSAndroid Build Coastguard Worker // 12 encode_breakout -static-thresh 399*fb1b10abSAndroid Build Coastguard Worker // 13 enable_tpl_model -enable-tpl 400*fb1b10abSAndroid Build Coastguard Worker // 14 enable_auto_arf -auto-alt-ref 401*fb1b10abSAndroid Build Coastguard Worker // 15 rc_mode 402*fb1b10abSAndroid Build Coastguard Worker // Possible Settings: 403*fb1b10abSAndroid Build Coastguard Worker // 0 - Variable Bit Rate (VPX_VBR) -b:v <bit_rate> 404*fb1b10abSAndroid Build Coastguard Worker // 1 - Constant Bit Rate (VPX_CBR) -b:v <bit_rate> -minrate <bit_rate> 405*fb1b10abSAndroid Build Coastguard Worker // -maxrate <bit_rate> 406*fb1b10abSAndroid Build Coastguard Worker // two_pass_vbrmin_section == 100 i.e. bit_rate == minrate == maxrate 407*fb1b10abSAndroid Build Coastguard Worker // two_pass_vbrmax_section == 100 408*fb1b10abSAndroid Build Coastguard Worker // 2 - Constrained Quality (VPX_CQ) -crf <cq_level> -b:v bit_rate 409*fb1b10abSAndroid Build Coastguard Worker // 3 - Constant Quality (VPX_Q) -crf <cq_level> -b:v 0 410*fb1b10abSAndroid Build Coastguard Worker // See https://trac.ffmpeg.org/wiki/Encode/VP9 for more details. 411*fb1b10abSAndroid Build Coastguard Worker // 16 cq_level see rc_mode for details. 412*fb1b10abSAndroid Build Coastguard Worker StatusCode SetEncodeConfig(const char *name, const char *value); 413*fb1b10abSAndroid Build Coastguard Worker 414*fb1b10abSAndroid Build Coastguard Worker // A debug function that dumps configs from VP9EncoderConfig 415*fb1b10abSAndroid Build Coastguard Worker // pass = 1: first pass, pass = 2: second pass 416*fb1b10abSAndroid Build Coastguard Worker // fp: file pointer for dumping config 417*fb1b10abSAndroid Build Coastguard Worker StatusCode DumpEncodeConfigs(int pass, FILE *fp); 418*fb1b10abSAndroid Build Coastguard Worker 419*fb1b10abSAndroid Build Coastguard Worker // Makes encoder compute the first pass stats and store it at 420*fb1b10abSAndroid Build Coastguard Worker // impl_ptr_->first_pass_stats. key_frame_map_ is also computed based on the 421*fb1b10abSAndroid Build Coastguard Worker // first pass stats. 422*fb1b10abSAndroid Build Coastguard Worker void ComputeFirstPassStats(); 423*fb1b10abSAndroid Build Coastguard Worker 424*fb1b10abSAndroid Build Coastguard Worker // Outputs the first pass stats represented by a 2-D vector. 425*fb1b10abSAndroid Build Coastguard Worker // One can use the frame index at first dimension to retrieve the stats for 426*fb1b10abSAndroid Build Coastguard Worker // each video frame. The stats of each video frame is a vector of 25 double 427*fb1b10abSAndroid Build Coastguard Worker // values. For details, please check FIRSTPASS_STATS in vp9_firstpass.h 428*fb1b10abSAndroid Build Coastguard Worker std::vector<std::vector<double>> ObserveFirstPassStats(); 429*fb1b10abSAndroid Build Coastguard Worker 430*fb1b10abSAndroid Build Coastguard Worker // Outputs the first pass motion vectors represented by a 2-D vector. 431*fb1b10abSAndroid Build Coastguard Worker // One can use the frame index at first dimension to retrieve the mvs for 432*fb1b10abSAndroid Build Coastguard Worker // each video frame. The frame is divided into 16x16 blocks. The number of 433*fb1b10abSAndroid Build Coastguard Worker // elements is round_up(|num_rows_4x4| / 4) * round_up(|num_cols_4x4| / 4). 434*fb1b10abSAndroid Build Coastguard Worker std::vector<std::vector<MotionVectorInfo>> ObserveFirstPassMotionVectors(); 435*fb1b10abSAndroid Build Coastguard Worker 436*fb1b10abSAndroid Build Coastguard Worker // Ouputs a copy of key_frame_map_, a binary vector with size equal to the 437*fb1b10abSAndroid Build Coastguard Worker // number of show frames in the video. For each entry in the vector, 1 438*fb1b10abSAndroid Build Coastguard Worker // indicates the position is a key frame and 0 indicates it's not a key frame. 439*fb1b10abSAndroid Build Coastguard Worker // This function should be called after ComputeFirstPassStats() 440*fb1b10abSAndroid Build Coastguard Worker std::vector<int> ObserveKeyFrameMap() const; 441*fb1b10abSAndroid Build Coastguard Worker 442*fb1b10abSAndroid Build Coastguard Worker // Sets group of pictures map for coding the entire video. 443*fb1b10abSAndroid Build Coastguard Worker // Each entry in the gop_map corresponds to a show frame in the video. 444*fb1b10abSAndroid Build Coastguard Worker // Therefore, the size of gop_map should equal to the number of show frames in 445*fb1b10abSAndroid Build Coastguard Worker // the entire video. 446*fb1b10abSAndroid Build Coastguard Worker // If a given entry's kGopMapFlagStart is set, it means this is the start of a 447*fb1b10abSAndroid Build Coastguard Worker // gop. Once kGopMapFlagStart is set, one can set kGopMapFlagUseAltRef to 448*fb1b10abSAndroid Build Coastguard Worker // indicate whether this gop use altref. 449*fb1b10abSAndroid Build Coastguard Worker // If a given entry is zero, it means it's in the middle of a gop. 450*fb1b10abSAndroid Build Coastguard Worker // This function should be called only once after ComputeFirstPassStats(), 451*fb1b10abSAndroid Build Coastguard Worker // before StartEncode(). 452*fb1b10abSAndroid Build Coastguard Worker // This API will check and modify the gop_map to satisfy the following 453*fb1b10abSAndroid Build Coastguard Worker // constraints. 454*fb1b10abSAndroid Build Coastguard Worker // 1) Each key frame position should be at the start of a gop. 455*fb1b10abSAndroid Build Coastguard Worker // 2) The last gop should not use an alt ref. 456*fb1b10abSAndroid Build Coastguard Worker void SetExternalGroupOfPicturesMap(int *gop_map, int gop_map_size); 457*fb1b10abSAndroid Build Coastguard Worker 458*fb1b10abSAndroid Build Coastguard Worker // Observe the group of pictures map set through 459*fb1b10abSAndroid Build Coastguard Worker // SetExternalGroupOfPicturesMap(). This function should be called after 460*fb1b10abSAndroid Build Coastguard Worker // SetExternalGroupOfPicturesMap(). 461*fb1b10abSAndroid Build Coastguard Worker std::vector<int> ObserveExternalGroupOfPicturesMap(); 462*fb1b10abSAndroid Build Coastguard Worker 463*fb1b10abSAndroid Build Coastguard Worker // Initializes the encoder for actual encoding. 464*fb1b10abSAndroid Build Coastguard Worker // This function should be called after ComputeFirstPassStats(). 465*fb1b10abSAndroid Build Coastguard Worker void StartEncode(); 466*fb1b10abSAndroid Build Coastguard Worker 467*fb1b10abSAndroid Build Coastguard Worker // Frees the encoder. 468*fb1b10abSAndroid Build Coastguard Worker // This function should be called after StartEncode() or EncodeFrame(). 469*fb1b10abSAndroid Build Coastguard Worker void EndEncode(); 470*fb1b10abSAndroid Build Coastguard Worker 471*fb1b10abSAndroid Build Coastguard Worker // The key frame group size includes one key frame plus the number of 472*fb1b10abSAndroid Build Coastguard Worker // following inter frames. Note that the key frame group size only counts the 473*fb1b10abSAndroid Build Coastguard Worker // show frames. The number of no show frames like alternate refereces are not 474*fb1b10abSAndroid Build Coastguard Worker // counted. 475*fb1b10abSAndroid Build Coastguard Worker int GetKeyFrameGroupSize() const; 476*fb1b10abSAndroid Build Coastguard Worker 477*fb1b10abSAndroid Build Coastguard Worker // Provides the group of pictures that the next coding frame is in. 478*fb1b10abSAndroid Build Coastguard Worker // Only call this function between StartEncode() and EndEncode() 479*fb1b10abSAndroid Build Coastguard Worker GroupOfPicture ObserveGroupOfPicture() const; 480*fb1b10abSAndroid Build Coastguard Worker 481*fb1b10abSAndroid Build Coastguard Worker // Gets encode_frame_info for the next coding frame. 482*fb1b10abSAndroid Build Coastguard Worker // Only call this function between StartEncode() and EndEncode() 483*fb1b10abSAndroid Build Coastguard Worker EncodeFrameInfo GetNextEncodeFrameInfo() const; 484*fb1b10abSAndroid Build Coastguard Worker 485*fb1b10abSAndroid Build Coastguard Worker // Encodes a frame 486*fb1b10abSAndroid Build Coastguard Worker // This function should be called after StartEncode() and before EndEncode(). 487*fb1b10abSAndroid Build Coastguard Worker void EncodeFrame(EncodeFrameResult *encode_frame_result); 488*fb1b10abSAndroid Build Coastguard Worker 489*fb1b10abSAndroid Build Coastguard Worker // Encodes a frame with a specific quantize index. 490*fb1b10abSAndroid Build Coastguard Worker // This function should be called after StartEncode() and before EndEncode(). 491*fb1b10abSAndroid Build Coastguard Worker void EncodeFrameWithQuantizeIndex(EncodeFrameResult *encode_frame_result, 492*fb1b10abSAndroid Build Coastguard Worker int quantize_index); 493*fb1b10abSAndroid Build Coastguard Worker 494*fb1b10abSAndroid Build Coastguard Worker // Encode a frame with target frame bits usage. 495*fb1b10abSAndroid Build Coastguard Worker // The encoder will find a quantize index to make the actual frame bits usage 496*fb1b10abSAndroid Build Coastguard Worker // match the target. EncodeFrameWithTargetFrameBits() will recode the frame 497*fb1b10abSAndroid Build Coastguard Worker // up to 7 times to find a q_index to make the actual_frame_bits satisfy the 498*fb1b10abSAndroid Build Coastguard Worker // following inequality. |actual_frame_bits - target_frame_bits| * 100 / 499*fb1b10abSAndroid Build Coastguard Worker // target_frame_bits 500*fb1b10abSAndroid Build Coastguard Worker // <= percent_diff. 501*fb1b10abSAndroid Build Coastguard Worker void EncodeFrameWithTargetFrameBits(EncodeFrameResult *encode_frame_result, 502*fb1b10abSAndroid Build Coastguard Worker int target_frame_bits, 503*fb1b10abSAndroid Build Coastguard Worker double percent_diff); 504*fb1b10abSAndroid Build Coastguard Worker 505*fb1b10abSAndroid Build Coastguard Worker // Gets the number of coding frames for the video. The coding frames include 506*fb1b10abSAndroid Build Coastguard Worker // show frame and no show frame. 507*fb1b10abSAndroid Build Coastguard Worker // This function should be called after ComputeFirstPassStats(). 508*fb1b10abSAndroid Build Coastguard Worker int GetCodingFrameNum() const; 509*fb1b10abSAndroid Build Coastguard Worker 510*fb1b10abSAndroid Build Coastguard Worker // Gets the total number of pixels of YUV planes per frame. 511*fb1b10abSAndroid Build Coastguard Worker uint64_t GetFramePixelCount() const; 512*fb1b10abSAndroid Build Coastguard Worker 513*fb1b10abSAndroid Build Coastguard Worker private: 514*fb1b10abSAndroid Build Coastguard Worker // Compute the key frame locations of the video based on first pass stats. 515*fb1b10abSAndroid Build Coastguard Worker // The results are returned as a binary vector with 1s indicating keyframes 516*fb1b10abSAndroid Build Coastguard Worker // and 0s indicating non keyframes. 517*fb1b10abSAndroid Build Coastguard Worker // It has to be called after impl_ptr_->first_pass_stats is computed. 518*fb1b10abSAndroid Build Coastguard Worker std::vector<int> ComputeKeyFrameMap() const; 519*fb1b10abSAndroid Build Coastguard Worker 520*fb1b10abSAndroid Build Coastguard Worker // Updates key_frame_group_size_, reset key_frame_group_index_ and init 521*fb1b10abSAndroid Build Coastguard Worker // ref_frame_info_. 522*fb1b10abSAndroid Build Coastguard Worker void UpdateKeyFrameGroup(int key_frame_show_index); 523*fb1b10abSAndroid Build Coastguard Worker 524*fb1b10abSAndroid Build Coastguard Worker // Update key_frame_group_index_. 525*fb1b10abSAndroid Build Coastguard Worker void PostUpdateKeyFrameGroupIndex(FrameType frame_type); 526*fb1b10abSAndroid Build Coastguard Worker 527*fb1b10abSAndroid Build Coastguard Worker void PostUpdateState(const EncodeFrameResult &encode_frame_result); 528*fb1b10abSAndroid Build Coastguard Worker 529*fb1b10abSAndroid Build Coastguard Worker class EncodeImpl; 530*fb1b10abSAndroid Build Coastguard Worker 531*fb1b10abSAndroid Build Coastguard Worker int frame_width_; // frame width in pixels. 532*fb1b10abSAndroid Build Coastguard Worker int frame_height_; // frame height in pixels. 533*fb1b10abSAndroid Build Coastguard Worker int frame_rate_num_; 534*fb1b10abSAndroid Build Coastguard Worker int frame_rate_den_; 535*fb1b10abSAndroid Build Coastguard Worker int target_bitrate_; 536*fb1b10abSAndroid Build Coastguard Worker int num_frames_; 537*fb1b10abSAndroid Build Coastguard Worker int encode_speed_; 538*fb1b10abSAndroid Build Coastguard Worker int target_level_; 539*fb1b10abSAndroid Build Coastguard Worker 540*fb1b10abSAndroid Build Coastguard Worker std::FILE *in_file_; 541*fb1b10abSAndroid Build Coastguard Worker std::FILE *out_file_; 542*fb1b10abSAndroid Build Coastguard Worker std::unique_ptr<EncodeImpl> impl_ptr_; 543*fb1b10abSAndroid Build Coastguard Worker 544*fb1b10abSAndroid Build Coastguard Worker std::vector<int> key_frame_map_; 545*fb1b10abSAndroid Build Coastguard Worker std::vector<int> gop_map_; 546*fb1b10abSAndroid Build Coastguard Worker GroupOfPicture group_of_picture_; 547*fb1b10abSAndroid Build Coastguard Worker 548*fb1b10abSAndroid Build Coastguard Worker // The key frame group size includes one key frame plus the number of 549*fb1b10abSAndroid Build Coastguard Worker // following inter frames. Note that the key frame group size only counts the 550*fb1b10abSAndroid Build Coastguard Worker // show frames. The number of no show frames like alternate references are not 551*fb1b10abSAndroid Build Coastguard Worker // counted. 552*fb1b10abSAndroid Build Coastguard Worker int key_frame_group_size_; 553*fb1b10abSAndroid Build Coastguard Worker 554*fb1b10abSAndroid Build Coastguard Worker // The index for the to-be-coded show frame in the key frame group. 555*fb1b10abSAndroid Build Coastguard Worker int key_frame_group_index_; 556*fb1b10abSAndroid Build Coastguard Worker 557*fb1b10abSAndroid Build Coastguard Worker // Each show or no show frame is assigned with a coding index based on its 558*fb1b10abSAndroid Build Coastguard Worker // coding order (starting from zero) in the coding process of the entire 559*fb1b10abSAndroid Build Coastguard Worker // video. The coding index of the to-be-coded frame. 560*fb1b10abSAndroid Build Coastguard Worker int frame_coding_index_; 561*fb1b10abSAndroid Build Coastguard Worker 562*fb1b10abSAndroid Build Coastguard Worker // Number of show frames we have coded so far. 563*fb1b10abSAndroid Build Coastguard Worker int show_frame_count_; 564*fb1b10abSAndroid Build Coastguard Worker 565*fb1b10abSAndroid Build Coastguard Worker // TODO(angiebird): Do we need to reset ref_frames_info_ when the next key 566*fb1b10abSAndroid Build Coastguard Worker // frame appears? 567*fb1b10abSAndroid Build Coastguard Worker // Reference frames info of the to-be-coded frame. 568*fb1b10abSAndroid Build Coastguard Worker RefFrameInfo ref_frame_info_; 569*fb1b10abSAndroid Build Coastguard Worker 570*fb1b10abSAndroid Build Coastguard Worker // A 2-D vector of motion vector information of the frame collected 571*fb1b10abSAndroid Build Coastguard Worker // from the first pass. The first dimension is the frame index. 572*fb1b10abSAndroid Build Coastguard Worker // Each frame is divided into 16x16 blocks. The number of elements is 573*fb1b10abSAndroid Build Coastguard Worker // round_up(|num_rows_4x4| / 4) * round_up(|num_cols_4x4| / 4). 574*fb1b10abSAndroid Build Coastguard Worker // Each 16x16 block contains 0 motion vector if this is an intra predicted 575*fb1b10abSAndroid Build Coastguard Worker // frame (for example, the key frame). If the frame is inter predicted, 576*fb1b10abSAndroid Build Coastguard Worker // each 16x16 block contains either 1 or 2 motion vectors. 577*fb1b10abSAndroid Build Coastguard Worker // The first motion vector is always from the LAST_FRAME. 578*fb1b10abSAndroid Build Coastguard Worker // The second motion vector is always from the GOLDEN_FRAME. 579*fb1b10abSAndroid Build Coastguard Worker std::vector<std::vector<MotionVectorInfo>> fp_motion_vector_info_; 580*fb1b10abSAndroid Build Coastguard Worker }; 581*fb1b10abSAndroid Build Coastguard Worker 582*fb1b10abSAndroid Build Coastguard Worker } // namespace vp9 583*fb1b10abSAndroid Build Coastguard Worker 584*fb1b10abSAndroid Build Coastguard Worker #endif // VPX_VP9_SIMPLE_ENCODE_H_ 585