/work/svt-av1/Source/Lib/Codec/encode_context.c
Line | Count | Source |
1 | | /* |
2 | | * Copyright(c) 2019 Intel Corporation |
3 | | * |
4 | | * This source code is subject to the terms of the BSD 2 Clause License and |
5 | | * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
6 | | * was not distributed with this source code in the LICENSE file, you can |
7 | | * obtain it at https://www.aomedia.org/license/software-license. If the Alliance for Open |
8 | | * Media Patent License 1.0 was not distributed with this source code in the |
9 | | * PATENTS file, you can obtain it at https://www.aomedia.org/license/patent-license. |
10 | | */ |
11 | | |
12 | | #include <stdlib.h> |
13 | | |
14 | | #include "encode_context.h" |
15 | | #include "EbSvtAv1ErrorCodes.h" |
16 | | #include "svt_threads.h" |
17 | | |
18 | | static EbErrorType create_stats_buffer(FIRSTPASS_STATS** frame_stats_buffer, STATS_BUFFER_CTX* stats_buf_context, |
19 | 533 | int num_lap_buffers) { |
20 | 533 | EbErrorType res = EB_ErrorNone; |
21 | | |
22 | 533 | int size = get_stats_buf_size(num_lap_buffers, MAX_LAG_BUFFERS); |
23 | | // *frame_stats_buffer = |
24 | | // (FIRSTPASS_STATS *)aom_calloc(size, sizeof(FIRSTPASS_STATS)); |
25 | 533 | EB_MALLOC_ARRAY((*frame_stats_buffer), size); |
26 | 533 | if (*frame_stats_buffer == NULL) { |
27 | 0 | return EB_ErrorInsufficientResources; |
28 | 0 | } |
29 | | |
30 | 533 | stats_buf_context->stats_in_start = *frame_stats_buffer; |
31 | 533 | stats_buf_context->stats_in_end_write = stats_buf_context->stats_in_start; |
32 | 533 | stats_buf_context->stats_in_end = stats_buf_context->stats_in_start; |
33 | 533 | stats_buf_context->stats_in_buf_end = stats_buf_context->stats_in_start + size; |
34 | | |
35 | 533 | EB_MALLOC_ARRAY(stats_buf_context->total_left_stats, 1); |
36 | 533 | if (stats_buf_context->total_left_stats == NULL) { |
37 | 0 | return EB_ErrorInsufficientResources; |
38 | 0 | } |
39 | 533 | svt_av1_twopass_zero_stats(stats_buf_context->total_left_stats); |
40 | 533 | EB_MALLOC_ARRAY(stats_buf_context->total_stats, 1); |
41 | 533 | if (stats_buf_context->total_stats == NULL) { |
42 | 0 | return EB_ErrorInsufficientResources; |
43 | 0 | } |
44 | 533 | svt_av1_twopass_zero_stats(stats_buf_context->total_stats); |
45 | 533 | stats_buf_context->last_frame_accumulated = -1; |
46 | | |
47 | 533 | EB_CREATE_MUTEX(stats_buf_context->stats_in_write_mutex); |
48 | 533 | return res; |
49 | 533 | } |
50 | | |
51 | 533 | static void destroy_stats_buffer(STATS_BUFFER_CTX* stats_buf_context, FIRSTPASS_STATS* frame_stats_buffer) { |
52 | 533 | EB_FREE_ARRAY(stats_buf_context->total_left_stats); |
53 | 533 | EB_FREE_ARRAY(stats_buf_context->total_stats); |
54 | 533 | EB_FREE_ARRAY(frame_stats_buffer); |
55 | 533 | EB_DESTROY_MUTEX(stats_buf_context->stats_in_write_mutex); |
56 | 533 | } |
57 | | |
58 | 533 | static void encode_context_dctor(EbPtr p) { |
59 | 533 | EncodeContext* obj = (EncodeContext*)p; |
60 | 533 | EB_DESTROY_MUTEX(obj->total_number_of_recon_frame_mutex); |
61 | 533 | EB_DESTROY_MUTEX(obj->total_number_of_shown_frames_mutex); |
62 | 533 | EB_DESTROY_MUTEX(obj->sc_buffer_mutex); |
63 | 533 | EB_DESTROY_MUTEX(obj->stat_file_mutex); |
64 | 533 | EB_DESTROY_MUTEX(obj->frame_updated_mutex); |
65 | 533 | EB_DELETE(obj->prediction_structure_group_ptr); |
66 | 533 | EB_DELETE_PTR_ARRAY(obj->picture_decision_reorder_queue, obj->picture_decision_reorder_queue_size); |
67 | 533 | obj->picture_decision_reorder_queue_size = 0; |
68 | 533 | EB_FREE(obj->pre_assignment_buffer); |
69 | 533 | EB_DELETE_PTR_ARRAY(obj->pic_mgr_input_pic_list, obj->pic_mgr_input_pic_list_size); |
70 | 533 | obj->pic_mgr_input_pic_list_size = 0; |
71 | 533 | EB_DELETE_PTR_ARRAY(obj->ref_pic_list, obj->ref_pic_list_length); |
72 | 533 | EB_DESTROY_MUTEX(obj->ref_pic_list_mutex); |
73 | 533 | EB_DELETE_PTR_ARRAY(obj->pd_dpb, REF_FRAMES); |
74 | 533 | EB_DESTROY_MUTEX(obj->pd_dpb_mutex); |
75 | 533 | EB_DELETE_PTR_ARRAY(obj->packetization_reorder_queue, obj->packetization_reorder_queue_size); |
76 | 533 | obj->packetization_reorder_queue_size = 0; |
77 | 533 | EB_FREE(obj->stats_out.stat); |
78 | 533 | destroy_stats_buffer(&obj->stats_buf_context, obj->frame_stats_buffer); |
79 | 533 | EB_DELETE_PTR_ARRAY(obj->rc.coded_frames_stat_queue, CODED_FRAMES_STAT_QUEUE_MAX_DEPTH); |
80 | | |
81 | 533 | if (obj->rc_param_queue) { |
82 | 533 | EB_FREE_2D(obj->rc_param_queue); |
83 | 533 | } |
84 | 533 | EB_DESTROY_MUTEX(obj->rc_param_queue_mutex); |
85 | 533 | EB_DESTROY_MUTEX(obj->rc.rc_mutex); |
86 | 533 | } |
87 | | |
88 | 533 | EbErrorType svt_aom_encode_context_ctor(EncodeContext* enc_ctx, EbPtr object_init_data_ptr) { |
89 | 533 | uint32_t picture_index; |
90 | | |
91 | 533 | enc_ctx->dctor = encode_context_dctor; |
92 | | |
93 | 533 | (void)object_init_data_ptr; |
94 | 533 | CHECK_REPORT_ERROR(1, enc_ctx->app_callback_ptr, EB_ENC_EC_ERROR29); |
95 | | |
96 | 533 | EB_CREATE_MUTEX(enc_ctx->total_number_of_recon_frame_mutex); |
97 | 533 | EB_CREATE_MUTEX(enc_ctx->frame_updated_mutex); |
98 | 533 | enc_ctx->picture_decision_reorder_queue_size = 0; |
99 | 533 | EB_ALLOC_PTR_ARRAY(enc_ctx->pre_assignment_buffer, PRE_ASSIGNMENT_MAX_DEPTH); |
100 | | |
101 | | // input pic list allocated in svt_av1_enc_init based on number of ppcs |
102 | 533 | enc_ctx->pic_mgr_input_pic_list_size = 0; |
103 | | |
104 | 533 | EB_ALLOC_PTR_ARRAY(enc_ctx->pd_dpb, REF_FRAMES); |
105 | 4.79k | for (picture_index = 0; picture_index < REF_FRAMES; ++picture_index) { |
106 | 4.26k | EB_NEW(enc_ctx->pd_dpb[picture_index], svt_aom_pa_reference_queue_entry_ctor); |
107 | 4.26k | } |
108 | 533 | EB_CREATE_MUTEX(enc_ctx->pd_dpb_mutex); |
109 | 533 | EB_CREATE_MUTEX(enc_ctx->total_number_of_shown_frames_mutex); |
110 | 533 | EB_CREATE_MUTEX(enc_ctx->ref_pic_list_mutex); |
111 | | |
112 | 533 | enc_ctx->initial_picture = true; |
113 | | |
114 | | // Sequence Termination Flags |
115 | 533 | enc_ctx->terminating_picture_number = ~0u; |
116 | 533 | EB_CREATE_MUTEX(enc_ctx->sc_buffer_mutex); |
117 | 533 | enc_ctx->enc_mode = SPEED_CONTROL_INIT_MOD; |
118 | 533 | enc_ctx->recode_tolerance = 25; |
119 | 533 | enc_ctx->rc_cfg.min_cr = 0; |
120 | 533 | EB_CREATE_MUTEX(enc_ctx->stat_file_mutex); |
121 | 533 | enc_ctx->num_lap_buffers = 0; // lap not supported for now |
122 | 533 | int* num_lap_buffers = &enc_ctx->num_lap_buffers; |
123 | 533 | create_stats_buffer(&enc_ctx->frame_stats_buffer, &enc_ctx->stats_buf_context, *num_lap_buffers); |
124 | 533 | EB_ALLOC_PTR_ARRAY(enc_ctx->rc.coded_frames_stat_queue, CODED_FRAMES_STAT_QUEUE_MAX_DEPTH); |
125 | | |
126 | 533 | EB_CREATE_MUTEX(enc_ctx->rc.rc_mutex); |
127 | 1.06M | for (picture_index = 0; picture_index < CODED_FRAMES_STAT_QUEUE_MAX_DEPTH; ++picture_index) { |
128 | 1.06M | EB_NEW(enc_ctx->rc.coded_frames_stat_queue[picture_index], |
129 | 1.06M | svt_aom_rate_control_coded_frames_stats_context_ctor, |
130 | 1.06M | picture_index); |
131 | 1.06M | } |
132 | | #if DEBUG_RC_CAP_LOG |
133 | | enc_ctx->rc.min_bit_actual_per_gop = 0xfffffffffffff; |
134 | | #endif |
135 | 533 | EB_MALLOC_2D(enc_ctx->rc_param_queue, (int32_t)PARALLEL_GOP_MAX_NUMBER, 1); |
136 | | |
137 | 136k | for (int interval_index = 0; interval_index < PARALLEL_GOP_MAX_NUMBER; interval_index++) { |
138 | 136k | enc_ctx->rc_param_queue[interval_index]->first_poc = 0; |
139 | 136k | enc_ctx->rc_param_queue[interval_index]->processed_frame_number = 0; |
140 | 136k | enc_ctx->rc_param_queue[interval_index]->size = -1; |
141 | 136k | enc_ctx->rc_param_queue[interval_index]->end_of_seq_seen = 0; |
142 | 136k | enc_ctx->rc_param_queue[interval_index]->vbr_bits_off_target = 0; |
143 | 136k | enc_ctx->rc_param_queue[interval_index]->vbr_bits_off_target_fast = 0; |
144 | 136k | enc_ctx->rc_param_queue[interval_index]->rolling_target_bits = enc_ctx->rc.avg_frame_bandwidth; |
145 | 136k | enc_ctx->rc_param_queue[interval_index]->rolling_actual_bits = enc_ctx->rc.avg_frame_bandwidth; |
146 | 136k | enc_ctx->rc_param_queue[interval_index]->rate_error_estimate = 0; |
147 | 136k | enc_ctx->rc_param_queue[interval_index]->total_actual_bits = 0; |
148 | 136k | enc_ctx->rc_param_queue[interval_index]->total_target_bits = 0; |
149 | 136k | enc_ctx->rc_param_queue[interval_index]->extend_minq = 0; |
150 | 136k | enc_ctx->rc_param_queue[interval_index]->extend_maxq = 0; |
151 | 136k | enc_ctx->rc_param_queue[interval_index]->extend_minq_fast = 0; |
152 | 136k | } |
153 | 533 | enc_ctx->rc_param_queue_head_index = 0; |
154 | 533 | enc_ctx->cr_sb_end = 0; |
155 | 533 | #if OPT_PERIODIC_CDF_UPDATE |
156 | 533 | enc_ctx->frames_since_last_cdf_update = 0; |
157 | 533 | #endif |
158 | | |
159 | 533 | EB_CREATE_MUTEX(enc_ctx->rc_param_queue_mutex); |
160 | | |
161 | 533 | enc_ctx->roi_map_evt = NULL; |
162 | 533 | return EB_ErrorNone; |
163 | 533 | } |