init_context directly has a QP parameter, instead of passing an encoder_control*

This makes context less tightly coupled with encoder.
This commit is contained in:
Laurent Fasnacht 2014-04-04 11:07:38 +02:00
parent 1e03cf8ac1
commit 946c815932
3 changed files with 44 additions and 45 deletions

View file

@ -28,6 +28,7 @@
#include <string.h> #include <string.h>
#include "config.h" #include "config.h"
#include "encoder.h"
// stuff // stuff
@ -230,76 +231,76 @@ void ctx_init(cabac_ctx *ctx, uint32_t qp, uint32_t init_value)
* \param encoder encoder control struct * \param encoder encoder control struct
* \param slice type of slice we are coding (P/B/I) * \param slice type of slice we are coding (P/B/I)
*/ */
void init_contexts(encoder_control *encoder, int8_t slice) void init_contexts(int8_t QP, int8_t slice)
{ {
uint16_t i; uint16_t i;
// Initialize contexts // Initialize contexts
ctx_init(&g_transform_skip_model_luma, encoder->QP, INIT_TRANSFORMSKIP_FLAG[slice][0]); ctx_init(&g_transform_skip_model_luma, QP, INIT_TRANSFORMSKIP_FLAG[slice][0]);
ctx_init(&g_transform_skip_model_chroma, encoder->QP, INIT_TRANSFORMSKIP_FLAG[slice][1]); ctx_init(&g_transform_skip_model_chroma, QP, INIT_TRANSFORMSKIP_FLAG[slice][1]);
ctx_init(&g_sao_merge_flag_model, encoder->QP, INIT_SAO_MERGE_FLAG[slice]); ctx_init(&g_sao_merge_flag_model, QP, INIT_SAO_MERGE_FLAG[slice]);
ctx_init(&g_sao_type_idx_model, encoder->QP, INIT_SAO_TYPE_IDX[slice]); ctx_init(&g_sao_type_idx_model, QP, INIT_SAO_TYPE_IDX[slice]);
ctx_init(&g_cu_merge_flag_ext_model, encoder->QP, INIT_MERGE_FLAG_EXT[slice][0]); ctx_init(&g_cu_merge_flag_ext_model, QP, INIT_MERGE_FLAG_EXT[slice][0]);
ctx_init(&g_cu_merge_idx_ext_model, encoder->QP, INIT_MERGE_IDX_EXT[slice][0]); ctx_init(&g_cu_merge_idx_ext_model, QP, INIT_MERGE_IDX_EXT[slice][0]);
ctx_init(&g_cu_pred_mode_model, encoder->QP, INIT_PRED_MODE[slice][0]); ctx_init(&g_cu_pred_mode_model, QP, INIT_PRED_MODE[slice][0]);
ctx_init(&g_cu_skip_flag_model[0], encoder->QP, INIT_SKIP_FLAG[slice][0]); ctx_init(&g_cu_skip_flag_model[0], QP, INIT_SKIP_FLAG[slice][0]);
ctx_init(&g_cu_skip_flag_model[1], encoder->QP, INIT_SKIP_FLAG[slice][1]); ctx_init(&g_cu_skip_flag_model[1], QP, INIT_SKIP_FLAG[slice][1]);
ctx_init(&g_cu_skip_flag_model[2], encoder->QP, INIT_SKIP_FLAG[slice][2]); ctx_init(&g_cu_skip_flag_model[2], QP, INIT_SKIP_FLAG[slice][2]);
ctx_init(&g_split_flag_model[0], encoder->QP, INIT_SPLIT_FLAG[slice][0]); ctx_init(&g_split_flag_model[0], QP, INIT_SPLIT_FLAG[slice][0]);
ctx_init(&g_split_flag_model[1], encoder->QP, INIT_SPLIT_FLAG[slice][1]); ctx_init(&g_split_flag_model[1], QP, INIT_SPLIT_FLAG[slice][1]);
ctx_init(&g_split_flag_model[2], encoder->QP, INIT_SPLIT_FLAG[slice][2]); ctx_init(&g_split_flag_model[2], QP, INIT_SPLIT_FLAG[slice][2]);
ctx_init(&g_intra_mode_model, encoder->QP, INIT_INTRA_PRED_MODE[slice]); ctx_init(&g_intra_mode_model, QP, INIT_INTRA_PRED_MODE[slice]);
ctx_init(&g_chroma_pred_model[0], encoder->QP, INIT_CHROMA_PRED_MODE[slice][0]); ctx_init(&g_chroma_pred_model[0], QP, INIT_CHROMA_PRED_MODE[slice][0]);
ctx_init(&g_chroma_pred_model[1], encoder->QP, INIT_CHROMA_PRED_MODE[slice][1]); ctx_init(&g_chroma_pred_model[1], QP, INIT_CHROMA_PRED_MODE[slice][1]);
ctx_init(&g_cu_abs_model_chroma[0], encoder->QP, INIT_ABS_FLAG[slice][4]); ctx_init(&g_cu_abs_model_chroma[0], QP, INIT_ABS_FLAG[slice][4]);
ctx_init(&g_cu_abs_model_chroma[1], encoder->QP, INIT_ABS_FLAG[slice][5]); ctx_init(&g_cu_abs_model_chroma[1], QP, INIT_ABS_FLAG[slice][5]);
//TODO: ignore P/B contexts on intra frame //TODO: ignore P/B contexts on intra frame
ctx_init(&g_cu_qt_root_cbf_model, encoder->QP, INIT_QT_ROOT_CBF[slice][0]); ctx_init(&g_cu_qt_root_cbf_model, QP, INIT_QT_ROOT_CBF[slice][0]);
ctx_init(&g_cu_mvd_model[0], encoder->QP, INIT_MVD[slice][0]); ctx_init(&g_cu_mvd_model[0], QP, INIT_MVD[slice][0]);
ctx_init(&g_cu_mvd_model[1], encoder->QP, INIT_MVD[slice][1]); ctx_init(&g_cu_mvd_model[1], QP, INIT_MVD[slice][1]);
ctx_init(&g_cu_ref_pic_model[0], encoder->QP, INIT_REF_PIC[slice][0]); ctx_init(&g_cu_ref_pic_model[0], QP, INIT_REF_PIC[slice][0]);
ctx_init(&g_cu_ref_pic_model[1], encoder->QP, INIT_REF_PIC[slice][1]); ctx_init(&g_cu_ref_pic_model[1], QP, INIT_REF_PIC[slice][1]);
ctx_init(&g_mvp_idx_model[0], encoder->QP, INIT_MVP_IDX[slice][0]); ctx_init(&g_mvp_idx_model[0], QP, INIT_MVP_IDX[slice][0]);
ctx_init(&g_mvp_idx_model[1], encoder->QP, INIT_MVP_IDX[slice][1]); ctx_init(&g_mvp_idx_model[1], QP, INIT_MVP_IDX[slice][1]);
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
ctx_init(&g_cu_sig_coeff_group_model[i], encoder->QP, INIT_SIG_CG_FLAG[slice][i]); ctx_init(&g_cu_sig_coeff_group_model[i], QP, INIT_SIG_CG_FLAG[slice][i]);
ctx_init(&g_cu_abs_model_luma[i], encoder->QP, INIT_ABS_FLAG[slice][i]); ctx_init(&g_cu_abs_model_luma[i], QP, INIT_ABS_FLAG[slice][i]);
ctx_init(&g_part_size_model[i], encoder->QP, INIT_PART_SIZE[slice][i]); ctx_init(&g_part_size_model[i], QP, INIT_PART_SIZE[slice][i]);
} }
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
ctx_init(&g_trans_subdiv_model[i], encoder->QP, INIT_TRANS_SUBDIV_FLAG[slice][i]); ctx_init(&g_trans_subdiv_model[i], QP, INIT_TRANS_SUBDIV_FLAG[slice][i]);
ctx_init(&g_qt_cbf_model_luma[i], encoder->QP, INIT_QT_CBF[slice][i]); ctx_init(&g_qt_cbf_model_luma[i], QP, INIT_QT_CBF[slice][i]);
ctx_init(&g_qt_cbf_model_chroma[i], encoder->QP, INIT_QT_CBF[slice][i+3]); ctx_init(&g_qt_cbf_model_chroma[i], QP, INIT_QT_CBF[slice][i+3]);
} }
for (i = 0; i < 8; i++) { for (i = 0; i < 8; i++) {
ctx_init(&g_cu_one_model_chroma[i], encoder->QP, INIT_ONE_FLAG[slice][i+16]); ctx_init(&g_cu_one_model_chroma[i], QP, INIT_ONE_FLAG[slice][i+16]);
} }
for (i = 0; i < 15; i++) { for (i = 0; i < 15; i++) {
ctx_init(&g_cu_ctx_last_y_luma[i], encoder->QP, INIT_LAST[slice][i] ); ctx_init(&g_cu_ctx_last_y_luma[i], QP, INIT_LAST[slice][i] );
ctx_init(&g_cu_ctx_last_x_luma[i], encoder->QP, INIT_LAST[slice][i] ); ctx_init(&g_cu_ctx_last_x_luma[i], QP, INIT_LAST[slice][i] );
ctx_init(&g_cu_ctx_last_y_chroma[i], encoder->QP, INIT_LAST[slice][i+15] ); ctx_init(&g_cu_ctx_last_y_chroma[i], QP, INIT_LAST[slice][i+15] );
ctx_init(&g_cu_ctx_last_x_chroma[i], encoder->QP, INIT_LAST[slice][i+15] ); ctx_init(&g_cu_ctx_last_x_chroma[i], QP, INIT_LAST[slice][i+15] );
ctx_init(&g_cu_one_model_luma[i], encoder->QP, INIT_ONE_FLAG[slice][i]); ctx_init(&g_cu_one_model_luma[i], QP, INIT_ONE_FLAG[slice][i]);
} }
ctx_init(&g_cu_one_model_luma[15], encoder->QP, INIT_ONE_FLAG[slice][15]); ctx_init(&g_cu_one_model_luma[15], QP, INIT_ONE_FLAG[slice][15]);
for (i = 0; i < 27; i++) { for (i = 0; i < 27; i++) {
ctx_init(&g_cu_sig_model_luma[i], encoder->QP, INIT_SIG_FLAG[slice][i]); ctx_init(&g_cu_sig_model_luma[i], QP, INIT_SIG_FLAG[slice][i]);
if(i < 15) ctx_init(&g_cu_sig_model_chroma[i], encoder->QP, INIT_SIG_FLAG[slice][i+27]); if(i < 15) ctx_init(&g_cu_sig_model_chroma[i], QP, INIT_SIG_FLAG[slice][i+27]);
} }
} }

View file

@ -26,8 +26,6 @@
#include "global.h" #include "global.h"
#include "encoder.h"
// Types // Types
typedef struct typedef struct
@ -38,7 +36,7 @@ typedef struct
// Functions // Functions
void ctx_init(cabac_ctx* ctx, uint32_t qp, uint32_t init_value); void ctx_init(cabac_ctx* ctx, uint32_t qp, uint32_t init_value);
void init_contexts(encoder_control *encoder, int8_t slice); void init_contexts(int8_t QP, int8_t slice);
int32_t context_calc_pattern_sig_ctx( const uint32_t *sig_coeff_group_flag, uint32_t pos_x, uint32_t pos_y, int32_t width); int32_t context_calc_pattern_sig_ctx( const uint32_t *sig_coeff_group_flag, uint32_t pos_x, uint32_t pos_y, int32_t width);
uint32_t context_get_sig_coeff_group( uint32_t *sig_coeff_group_flag,uint32_t pos_x, uint32_t pos_y,int32_t width); uint32_t context_get_sig_coeff_group( uint32_t *sig_coeff_group_flag,uint32_t pos_x, uint32_t pos_y,int32_t width);

View file

@ -461,7 +461,7 @@ void encode_one_frame(encoder_control* encoder)
} }
cabac_start(&cabac); cabac_start(&cabac);
init_contexts(encoder, encoder->in.cur_pic->slicetype); init_contexts(encoder->QP, encoder->in.cur_pic->slicetype);
scalinglist_process(); scalinglist_process();
encode_slice_header(encoder); encode_slice_header(encoder);
bitstream_align(encoder->stream); bitstream_align(encoder->stream);