xref: /aosp_15_r20/external/libvpx/vp9/simple_encode.h (revision fb1b10ab9aebc7c7068eedab379b749d7e3900be)
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