1,函数功能
按照cpi中对tile的划分情况依次编码每个tile,即调用av1_encode_tile()进行tiles的编码,注意,从av1_encode_tile开始就定义了关于运动搜索的数目变量和网格搜索的命中数目变量,也就是说对tile的运动搜索有初始化了
2,代码学习
encode_tiles()
static void encode_tiles(AV1_COMP *cpi) {
AV1_COMMON *const cm = &cpi->common;
const int tile_cols = cm->tile_cols;
const int tile_rows = cm->tile_rows;
int tile_col, tile_row;
if (cpi->tile_data == NULL || cpi->allocated_tiles < tile_cols * tile_rows)
av1_alloc_tile_data(cpi);
av1_init_tile_data(cpi);
//根据tile划分依次编码每个tile
for (tile_row = 0; tile_row < tile_rows; ++tile_row) {
for (tile_col = 0; tile_col < tile_cols; ++tile_col) {
TileDataEnc *const this_tile =
&cpi->tile_data[tile_row * cm->tile_cols + tile_col];
cpi->td.intrabc_used = 0;
cpi->td.deltaq_used = 0;
cpi->td.mb.e_mbd.tile_ctx = &this_tile->tctx;
cpi->td.mb.tile_pb_ctx = &this_tile->tctx;
av1_encode_tile(cpi, &cpi->td, tile_row, tile_col);
cpi->intrabc_used |= cpi->td.intrabc_used;
cpi->deltaq_used |= cpi->td.deltaq_used;
}
}
}
av1_encode_tile()
/*初始化above context后调用*av1_encode_sb_row()*完成每个SB行的编码。*/
void av1_encode_tile(AV1_COMP *cpi, ThreadData *td, int tile_row,
int tile_col) {
AV1_COMMON *const cm = &cpi->common;
TileDataEnc *const this_tile =
&cpi->tile_data[tile_row * cm->tile_cols + tile_col];
const TileInfo *const tile_info = &this_tile->tile_info;
int mi_row;
av1_inter_mode_data_init(this_tile);
av1_zero_above_context(cm, &td->mb.e_mbd, tile_info->mi_col_start,
tile_info->mi_col_end, tile_row);
av1_init_above_context(cm, &td->mb.e_mbd, tile_row);
// 设置指向每线程运动搜索计数器的指针。
this_tile->m_search_count = 0; // 运动搜索命中数.
this_tile->ex_search_count = 0; // Exhaustive mesh search hits.彻底的网格搜索命中
td->mb.m_search_count_ptr = &this_tile->m_search_count;
td->mb.ex_search_count_ptr = &this_tile->ex_search_count;
cfl_init(&td->mb.e_mbd.cfl, &cm->seq_params);
av1_crc32c_calculator_init(&td->mb.mb_rd_record.crc_calculator);
for (mi_row = tile_info->mi_row_start; mi_row < tile_info->mi_row_end;
mi_row += cm->seq_params.mib_size) {
av1_encode_sb_row(cpi, td, tile_row, tile_col, mi_row);
}
}
网友评论