1 /*
2 * Copyright(c) 2019 Intel Corporation
3 * SPDX - License - Identifier: BSD - 2 - Clause - Patent
4 */
5
6 #include <stdlib.h>
7
8 #include "EbDefinitions.h"
9 #include "EbEncodeContext.h"
10 #include "EbPictureManagerQueue.h"
11
eb_vp9_encode_context_ctor(EbPtr * object_dbl_ptr,EbPtr object_init_data_ptr)12 EbErrorType eb_vp9_encode_context_ctor(
13 EbPtr *object_dbl_ptr,
14 EbPtr object_init_data_ptr)
15 {
16 uint32_t picture_index;
17 EbErrorType return_error = EB_ErrorNone;
18
19 EncodeContext *encode_context_ptr;
20 (void)object_init_data_ptr;
21 EB_MALLOC(EncodeContext*, encode_context_ptr, sizeof(EncodeContext), EB_N_PTR);
22 *object_dbl_ptr = (EbPtr) encode_context_ptr;
23
24 // Callback Functions
25 encode_context_ptr->app_callback_ptr = (EbCallback *) EB_NULL;
26
27 // Port Active State
28 encode_context_ptr->recon_port_active = EB_FALSE;
29
30 // Port Active State
31 EB_CREATEMUTEX(EbHandle, encode_context_ptr->total_number_of_recon_frame_mutex, sizeof(EbHandle), EB_MUTEX);
32
33 encode_context_ptr->total_number_of_recon_frames = 0;
34 // Output Buffer Fifos
35 encode_context_ptr->stream_output_fifo_ptr = (EbFifo*) EB_NULL;
36 encode_context_ptr->recon_output_fifo_ptr = (EbFifo*)EB_NULL;
37
38 // Picture Buffer Fifos
39 encode_context_ptr->input_picture_pool_fifo_ptr = (EbFifo*) EB_NULL;
40 encode_context_ptr->reference_picture_pool_fifo_ptr = (EbFifo*) EB_NULL;
41 encode_context_ptr->pa_reference_picture_pool_fifo_ptr = (EbFifo*) EB_NULL;
42
43 // Picture Decision Reordering Queue
44 encode_context_ptr->picture_decision_reorder_queue_head_index = 0;
45 EB_MALLOC(PictureDecisionReorderEntry**, encode_context_ptr->picture_decision_reorder_queue, sizeof(PictureDecisionReorderEntry*) * PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR);
46
47 for(picture_index=0; picture_index < PICTURE_DECISION_REORDER_QUEUE_MAX_DEPTH; ++picture_index) {
48 return_error = eb_vp9_picture_decision_reorder_entry_ctor(
49 &(encode_context_ptr->picture_decision_reorder_queue[picture_index]),
50 picture_index);
51 if (return_error == EB_ErrorInsufficientResources){
52 return EB_ErrorInsufficientResources;
53 }
54 }
55
56 // Picture Manager Reordering Queue
57 encode_context_ptr->picture_manager_reorder_queue_head_index = 0;
58 EB_MALLOC(PictureManagerReorderEntry**, encode_context_ptr->picture_manager_reorder_queue, sizeof(PictureManagerReorderEntry*) * PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR);
59
60 for (picture_index = 0; picture_index < PICTURE_MANAGER_REORDER_QUEUE_MAX_DEPTH; ++picture_index) {
61 return_error = eb_vp9_picture_manager_reorder_entry_ctor(
62 &(encode_context_ptr->picture_manager_reorder_queue[picture_index]),
63 picture_index);
64 if (return_error == EB_ErrorInsufficientResources){
65 return EB_ErrorInsufficientResources;
66 }
67 }
68
69 // Picture Manager Pre-Assignment Buffer
70 encode_context_ptr->pre_assignment_buffer_intra_count = 0;
71 encode_context_ptr->pre_assignment_buffer_idr_count = 0;
72 encode_context_ptr->pre_assignment_buffer_scene_change_count = 0;
73 encode_context_ptr->pre_assignment_buffer_scene_change_index = 0;
74 encode_context_ptr->pre_assignment_buffer_eos_flag = EB_FALSE;
75 encode_context_ptr->decode_base_number = 0;
76
77 encode_context_ptr->pre_assignment_buffer_count = 0;
78 encode_context_ptr->number_of_active_pictures = 0;
79
80 EB_MALLOC(EbObjectWrapper**, encode_context_ptr->pre_assignment_buffer, sizeof(EbObjectWrapper*) * PRE_ASSIGNMENT_MAX_DEPTH, EB_N_PTR);
81
82 for(picture_index=0; picture_index < PRE_ASSIGNMENT_MAX_DEPTH; ++picture_index) {
83 encode_context_ptr->pre_assignment_buffer[picture_index] = (EbObjectWrapper*) EB_NULL;
84 }
85
86 // Picture Manager Input Queue
87 encode_context_ptr->input_picture_queue_head_index = 0;
88 encode_context_ptr->input_picture_queue_tail_index = 0;
89 EB_MALLOC(InputQueueEntry**, encode_context_ptr->input_picture_queue, sizeof(InputQueueEntry*) * INPUT_QUEUE_MAX_DEPTH, EB_N_PTR);
90
91 for(picture_index=0; picture_index < INPUT_QUEUE_MAX_DEPTH; ++picture_index) {
92 return_error = eb_vp9_input_queue_entry_ctor(
93 &(encode_context_ptr->input_picture_queue[picture_index]));
94 if (return_error == EB_ErrorInsufficientResources){
95 return EB_ErrorInsufficientResources;
96 }
97 }
98
99 // Picture Manager Reference Queue
100 encode_context_ptr->reference_picture_queue_head_index = 0;
101 encode_context_ptr->reference_picture_queue_tail_index = 0;
102 EB_MALLOC(ReferenceQueueEntry**, encode_context_ptr->reference_picture_queue, sizeof(ReferenceQueueEntry*) * REFERENCE_QUEUE_MAX_DEPTH, EB_N_PTR);
103
104 for(picture_index=0; picture_index < REFERENCE_QUEUE_MAX_DEPTH; ++picture_index) {
105 return_error = eb_vp9_reference_queue_entry_ctor(
106 &(encode_context_ptr->reference_picture_queue[picture_index]));
107 if (return_error == EB_ErrorInsufficientResources){
108 return EB_ErrorInsufficientResources;
109 }
110 }
111
112 // Picture Decision PA Reference Queue
113 encode_context_ptr->picture_decision_pa_reference_queue_head_index = 0;
114 encode_context_ptr->picture_decision_pa_reference_queue_tail_index = 0;
115 EB_MALLOC(PaReferenceQueueEntry**, encode_context_ptr->picture_decision_pa_reference_queue, sizeof(PaReferenceQueueEntry*) * PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH, EB_N_PTR);
116
117 for(picture_index=0; picture_index < PICTURE_DECISION_PA_REFERENCE_QUEUE_MAX_DEPTH; ++picture_index) {
118 return_error = eb_vp9_pa_eb_vp9_reference_queue_entry_ctor(
119 &(encode_context_ptr->picture_decision_pa_reference_queue[picture_index]));
120 if (return_error == EB_ErrorInsufficientResources){
121 return EB_ErrorInsufficientResources;
122 }
123 }
124
125 // Initial Rate Control Reordering Queue
126 encode_context_ptr->initial_rate_control_reorder_queue_head_index = 0;
127 EB_MALLOC(InitialRateControlReorderEntry**, encode_context_ptr->initial_rate_control_reorder_queue, sizeof(InitialRateControlReorderEntry*) * INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR);
128
129 for(picture_index=0; picture_index < INITIAL_RATE_CONTROL_REORDER_QUEUE_MAX_DEPTH; ++picture_index) {
130 return_error = eb_vp9_initial_rate_control_reorder_entry_ctor(
131 &(encode_context_ptr->initial_rate_control_reorder_queue[picture_index]),
132 picture_index);
133 if (return_error == EB_ErrorInsufficientResources){
134 return EB_ErrorInsufficientResources;
135 }
136 }
137
138 // High level Rate Control histogram Queue
139 encode_context_ptr->hl_rate_control_historgram_queue_head_index = 0;
140
141 EB_MALLOC(HlRateControlHistogramEntry**, encode_context_ptr->hl_rate_control_historgram_queue, sizeof(HlRateControlHistogramEntry*) * HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH, EB_N_PTR);
142
143 for(picture_index=0; picture_index < HIGH_LEVEL_RATE_CONTROL_HISTOGRAM_QUEUE_MAX_DEPTH; ++picture_index) {
144 return_error = eb_vp9_hl_rate_control_histogram_entry_ctor(
145 &(encode_context_ptr->hl_rate_control_historgram_queue[picture_index]),
146 picture_index);
147 if (return_error == EB_ErrorInsufficientResources){
148 return EB_ErrorInsufficientResources;
149 }
150 }
151 // HLRateControl Historgram Queue Mutex
152 EB_CREATEMUTEX(EbHandle, encode_context_ptr->hl_rate_control_historgram_queue_mutex, sizeof(EbHandle), EB_MUTEX);
153
154 // Packetization Reordering Queue
155 encode_context_ptr->packetization_reorder_queue_head_index = 0;
156 EB_MALLOC(PacketizationReorderEntry**, encode_context_ptr->packetization_reorder_queue, sizeof(PacketizationReorderEntry*) * PACKETIZATION_REORDER_QUEUE_MAX_DEPTH, EB_N_PTR);
157
158 for(picture_index=0; picture_index < PACKETIZATION_REORDER_QUEUE_MAX_DEPTH; ++picture_index) {
159 return_error = eb_vp9_packetization_reorder_entry_ctor(
160 &(encode_context_ptr->packetization_reorder_queue[picture_index]),
161 picture_index);
162 if (return_error == EB_ErrorInsufficientResources){
163 return EB_ErrorInsufficientResources;
164 }
165 }
166
167 encode_context_ptr->intra_period_position = 0;
168 encode_context_ptr->pred_struct_position = 0;
169 encode_context_ptr->current_input_poc = -1;
170 encode_context_ptr->elapsed_non_idr_count = 0;
171 encode_context_ptr->initial_picture = EB_TRUE;
172
173 encode_context_ptr->last_idr_picture = 0;
174
175 // Sequence Termination Flags
176 encode_context_ptr->terminating_picture_number = ~0u;
177 encode_context_ptr->terminating_sequence_flag_received = EB_FALSE;
178
179 // Prediction Structure Group
180 encode_context_ptr->prediction_structure_group_ptr = (PredictionStructureGroup*) EB_NULL;
181
182 // Rate Control
183 encode_context_ptr->available_target_bitrate = 10000000;
184 encode_context_ptr->available_target_bitrate_changed = EB_FALSE;
185 encode_context_ptr->buffer_fill = 0;
186 encode_context_ptr->vbv_buf_size = 0;
187 encode_context_ptr->vbv_max_rate = 0;
188
189 // Rate Control Bit Tables
190 EB_MALLOC(RateControlTables*, encode_context_ptr->rate_control_tables_array, sizeof(RateControlTables) * TOTAL_NUMBER_OF_INITIAL_RC_TABLES_ENTRY, EB_N_PTR);
191
192 return_error = rate_control_tables_ctor(encode_context_ptr->rate_control_tables_array);
193 if (return_error == EB_ErrorInsufficientResources){
194 return EB_ErrorInsufficientResources;
195 }
196 // RC Rate Table Update Mutex
197 EB_CREATEMUTEX(EbHandle, encode_context_ptr->rate_table_update_mutex, sizeof(EbHandle), EB_MUTEX);
198
199 encode_context_ptr->rate_control_tables_array_updated = EB_FALSE;
200
201 EB_CREATEMUTEX(EbHandle, encode_context_ptr->sc_buffer_mutex, sizeof(EbHandle), EB_MUTEX);
202 encode_context_ptr->sc_buffer = 0;
203 encode_context_ptr->sc_frame_in = 0;
204 encode_context_ptr->sc_frame_out = 0;
205 encode_context_ptr->enc_mode = SPEED_CONTROL_INIT_MOD;
206 encode_context_ptr->previous_selected_ref_qp = 32;
207 encode_context_ptr->max_coded_poc = 0;
208 encode_context_ptr->max_coded_poc_selected_ref_qp = 32;
209
210 encode_context_ptr->shared_reference_mutex = eb_vp9_create_mutex();
211 if (encode_context_ptr->shared_reference_mutex == (EbHandle) EB_NULL){
212 return EB_ErrorInsufficientResources;
213 }else {
214 memory_map[*(memory_map_index)].ptr_type = EB_MUTEX;
215 memory_map[(*(memory_map_index))++].ptr = encode_context_ptr->shared_reference_mutex ;
216 *total_lib_memory += (sizeof(EbHandle));
217 }
218
219 return EB_ErrorNone;
220 }
221