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