1 /*
2 * Copyright(c) 2019 Intel Corporation
3 * SPDX - License - Identifier: BSD - 2 - Clause - Patent
4 */
5 
6 #ifndef EbEncodeContext_h
7 #define EbEncodeContext_h
8 
9 #include <stdio.h>
10 
11 #include "EbDefinitions.h"
12 #include "EbThreads.h"
13 #include "EbSvtVp9Enc.h"
14 #include "EbPictureDecisionReorderQueue.h"
15 #include "EbPictureDecisionQueue.h"
16 #include "EbPictureManagerQueue.h"
17 #include "EbPacketizationReorderQueue.h"
18 #include "EbInitialRateControlReorderQueue.h"
19 #include "EbPictureManagerReorderQueue.h"
20 
21 #include "EbPredictionStructure.h"
22 #include "EbRateControlTables.h"
23 
24 // *Note - the queues are small for testing purposes.  They should be increased when they are done.
25 #define PRE_ASSIGNMENT_MAX_DEPTH                    128     // should be large enough to hold an entire prediction period
26 #define INPUT_QUEUE_MAX_DEPTH                       5000
27 #define REFERENCE_QUEUE_MAX_DEPTH                   5000
28 #define PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH   5000
29 
30 #define PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH            2048
31 #define INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH        2048
32 #define PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH             2048
33 #define HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH   10000 //2048 AMIR to be changed
34 #define PACKETIZATION_REORDER_QUEUE_MAX_DEPTH               2048
35 
36 // RC Groups: They should be a power of 2, so we can replace % by &.
37 // Instead of using x % y, we use x && (y-1)
38 #define PARALLEL_GOP_MAX_NUMBER                         256
39 #define RC_GROUP_IN_GOP_MAX_NUMBER                      512
40 #define PICTURE_IN_RC_GROUP_MAX_NUMBER                  64
41 
42 typedef struct EncodeContext
43 {
44     // Callback Functions
45     EbCallback                        *app_callback_ptr;
46 
47     // Port Active
48     EB_BOOL                            recon_port_active;
49 
50     EbHandle                           total_number_of_recon_frame_mutex;
51     uint64_t                           total_number_of_recon_frames;
52 
53     // Output Buffer Fifos
54     EbFifo                            *stream_output_fifo_ptr;
55     EbFifo                            *recon_output_fifo_ptr;
56     // Picture Buffer Fifos
57     EbFifo                            *input_picture_pool_fifo_ptr;
58     EbFifo                            *reference_picture_pool_fifo_ptr;
59     EbFifo                            *pa_reference_picture_pool_fifo_ptr;
60 
61     // Picture Decision Reorder Queue
62     PictureDecisionReorderEntry      **picture_decision_reorder_queue;
63     uint32_t                           picture_decision_reorder_queue_head_index;
64 
65     // Picture Manager Reorder Queue
66     PictureManagerReorderEntry        **picture_manager_reorder_queue;
67     uint32_t                            picture_manager_reorder_queue_head_index;
68 
69     // Picture Manager Pre-Assignment Buffer
70     uint32_t                            pre_assignment_buffer_intra_count;
71     uint32_t                            pre_assignment_buffer_idr_count;
72     uint32_t                            pre_assignment_buffer_scene_change_count;
73     uint32_t                            pre_assignment_buffer_scene_change_index;
74     uint32_t                            pre_assignment_buffer_eos_flag;
75     uint64_t                            decode_base_number;
76 
77     EbObjectWrapper                   **pre_assignment_buffer;
78     uint32_t                            pre_assignment_buffer_count;
79     uint32_t                            number_of_active_pictures;
80 
81     // Picture Decision Circular Queues
82     PaReferenceQueueEntry             **picture_decision_pa_reference_queue;
83     uint32_t                            picture_decision_pa_reference_queue_head_index;
84     uint32_t                            picture_decision_pa_reference_queue_tail_index;
85 
86     // Picture Manager Circular Queues
87     InputQueueEntry                   **input_picture_queue;
88     uint32_t                            input_picture_queue_head_index;
89     uint32_t                            input_picture_queue_tail_index;
90 
91     ReferenceQueueEntry               **reference_picture_queue;
92     uint32_t                            reference_picture_queue_head_index;
93     uint32_t                            reference_picture_queue_tail_index;
94 
95     // Initial Rate Control Reorder Queue
96     InitialRateControlReorderEntry    **initial_rate_control_reorder_queue;
97     uint32_t                            initial_rate_control_reorder_queue_head_index;
98 
99     // High Level Rate Control Histogram Queue
100     HlRateControlHistogramEntry       **hl_rate_control_historgram_queue;
101     uint32_t                            hl_rate_control_historgram_queue_head_index;
102     EbHandle                            hl_rate_control_historgram_queue_mutex;
103 
104     // Packetization Reorder Queue
105     PacketizationReorderEntry         **packetization_reorder_queue;
106     uint32_t                            packetization_reorder_queue_head_index;
107 
108     // GOP Counters
109     uint32_t                            intra_period_position;        // Current position in intra period
110     uint32_t                            pred_struct_position;         // Current position within a prediction structure
111 
112     uint32_t                            elapsed_non_idr_count;
113     int64_t                             current_input_poc;
114     EB_BOOL                             initial_picture;
115 
116     uint64_t                            last_idr_picture; // the most recently occured IDR picture (in decode order)
117 
118     // Sequence Termination Flags
119     uint64_t                            terminating_picture_number;
120     EB_BOOL                             terminating_sequence_flag_received;
121 
122     // Prediction Structure
123     PredictionStructureGroup           *prediction_structure_group_ptr;
124 
125     // Rate Control Bit Tables
126     RateControlTables                  *rate_control_tables_array;
127     EB_BOOL                             rate_control_tables_array_updated;
128     EbHandle                            rate_table_update_mutex;
129 
130     // Speed Control
131     int64_t                             sc_buffer;
132     int64_t                             sc_frame_in;
133     int64_t                             sc_frame_out;
134     EbHandle                            sc_buffer_mutex;
135 
136     EB_ENC_MODE                         enc_mode;
137 
138     // Rate Control
139     uint32_t                            available_target_bitrate;
140     EB_BOOL                             available_target_bitrate_changed;
141     uint32_t                            vbv_max_rate;
142     uint32_t                            vbv_buf_size;
143     uint64_t                            buffer_fill;
144     uint32_t                            previous_selected_ref_qp;
145     uint64_t                            max_coded_poc;
146     uint32_t                            max_coded_poc_selected_ref_qp;
147 
148     // Dynamic GOP
149     uint32_t                            previous_mini_gop_hierarchical_levels;
150 
151     EbObjectWrapper                    *previous_picture_control_set_wrapper_ptr;
152     EbHandle                            shared_reference_mutex;
153 
154 } EncodeContext;
155 
156 typedef struct EncodeContextInitData {
157     int junk;
158 } EncodeContextInitData;
159 
160 /**************************************
161  * Extern Function Declarations
162  **************************************/
163 extern EbErrorType eb_vp9_encode_context_ctor(
164     EbPtr  *object_dbl_ptr,
165     EbPtr   object_init_data_ptr);
166 
167 #endif // EbEncodeContext_h
168