Skip to content

Commit

Permalink
Merge branch 'TMVP_inter'
Browse files Browse the repository at this point in the history
  • Loading branch information
fador committed Feb 13, 2017
2 parents 363b8b4 + 4251607 commit d892be5
Show file tree
Hide file tree
Showing 9 changed files with 240 additions and 96 deletions.
4 changes: 0 additions & 4 deletions src/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -955,10 +955,6 @@ int kvz_config_parse(kvz_config *cfg, const char *name, const char *value)
cfg->lossless = (bool)atobool(value);
else if OPT("tmvp") {
cfg->tmvp_enable = atobool(value);
if (cfg->gop_len && cfg->tmvp_enable) {
fprintf(stderr, "Cannot enable TMVP because GOP is used.\n");
cfg->tmvp_enable = false;
}
if (cfg->tiles_width_count > 1 || cfg->tiles_height_count > 1) {
fprintf(stderr, "Cannot enable TMVP because tiles are used.\n");
cfg->tmvp_enable = false;
Expand Down
4 changes: 0 additions & 4 deletions src/encoder.c
Original file line number Diff line number Diff line change
Expand Up @@ -153,10 +153,6 @@ encoder_control_t* kvz_encoder_control_init(const kvz_config *const cfg)
}

if (encoder->cfg.gop_len > 0) {
if (encoder->cfg.tmvp_enable) {
encoder->cfg.tmvp_enable = false;
fprintf(stderr, "Disabling TMVP because GOP is used.\n");
}
if (encoder->cfg.gop_lowdelay) {
kvz_config_process_lp_gop(&encoder->cfg);
}
Expand Down
37 changes: 23 additions & 14 deletions src/encoder_state-bitstream.c
Original file line number Diff line number Diff line change
Expand Up @@ -460,7 +460,7 @@ static void encoder_state_write_bitstream_pic_parameter_set(bitstream_t* stream,
WRITE_U(stream, 1, 1, "cu_qp_delta_enabled_flag");
WRITE_UE(stream, 0, "diff_cu_qp_delta_depth");
} else {
WRITE_U(stream, 0, 1, "cu_qp_delta_enabled_flag");
WRITE_U(stream, 0, 1, "cu_qp_delta_enabled_flag");
}

//TODO: add QP offsets
Expand Down Expand Up @@ -704,10 +704,10 @@ static void kvz_encoder_state_write_bitstream_slice_header_independent(
int last_poc = 0;
int poc_shift = 0;

WRITE_U(stream, state->frame->poc&0x1f, 5, "pic_order_cnt_lsb");
WRITE_U(stream, 0, 1, "short_term_ref_pic_set_sps_flag");
WRITE_UE(stream, ref_negative, "num_negative_pics");
WRITE_UE(stream, ref_positive, "num_positive_pics");
WRITE_U(stream, state->frame->poc&0x1f, 5, "pic_order_cnt_lsb");
WRITE_U(stream, 0, 1, "short_term_ref_pic_set_sps_flag");
WRITE_UE(stream, ref_negative, "num_negative_pics");
WRITE_UE(stream, ref_positive, "num_positive_pics");
for (j = 0; j < ref_negative; j++) {
int8_t delta_poc = 0;

Expand Down Expand Up @@ -763,7 +763,7 @@ static void kvz_encoder_state_write_bitstream_slice_header_independent(
//WRITE_UE(stream, 0, "short_term_ref_pic_set_idx");

if (state->encoder_control->cfg.tmvp_enable) {
WRITE_U(stream, 1, 1, "slice_temporal_mvp_enabled_flag");
WRITE_U(stream, ref_negative?1:0, 1, "slice_temporal_mvp_enabled_flag");
}
}

Expand All @@ -777,18 +777,27 @@ static void kvz_encoder_state_write_bitstream_slice_header_independent(
WRITE_U(stream, 1, 1, "slice_sao_chroma_flag");
}
}

if (state->frame->slicetype != KVZ_SLICE_I) {
WRITE_U(stream, 1, 1, "num_ref_idx_active_override_flag");
WRITE_UE(stream, ref_negative != 0 ? ref_negative - 1: 0, "num_ref_idx_l0_active_minus1");
if (state->frame->slicetype == KVZ_SLICE_B) {
WRITE_UE(stream, ref_positive != 0 ? ref_positive - 1 : 0, "num_ref_idx_l1_active_minus1");
WRITE_U(stream, 0, 1, "mvd_l1_zero_flag");
}

// Temporal Motion Vector Prediction flags
if (state->encoder_control->cfg.tmvp_enable && ref_negative > 0) {
if (state->frame->slicetype == KVZ_SLICE_B) {
WRITE_UE(stream, ref_positive != 0 ? ref_positive - 1 : 0, "num_ref_idx_l1_active_minus1");
WRITE_U(stream, 0, 1, "mvd_l1_zero_flag");
// Always use L0 for prediction
WRITE_U(stream, 1, 1, "collocated_from_l0_flag");
}

// ToDo: handle B-frames with TMVP
if (state->encoder_control->cfg.tmvp_enable && ref_negative > 1) {
WRITE_UE(stream, 0, "collocated_ref_idx");
if (ref_negative > 1) {
// Use first reference from L0
// ToDo: use better reference
WRITE_UE(stream, 0, "collocated_ref_idx");
}
}

WRITE_UE(stream, 5-MRG_MAX_NUM_CANDS, "five_minus_max_num_merge_cand");
Expand Down Expand Up @@ -852,7 +861,7 @@ void kvz_encoder_state_write_bitstream_slice_header(
if (state->is_leaf) {
num_entry_points = 1;
} else {
encoder_state_entry_points_explore(state, &num_entry_points, &max_length_seen);
encoder_state_entry_points_explore(state, &num_entry_points, &max_length_seen);
}

int num_offsets = num_entry_points - 1;
Expand Down Expand Up @@ -1031,7 +1040,7 @@ static void encoder_state_write_bitstream_main(encoder_state_t * const state)
}
state->frame->total_bits_coded += newpos - curpos;

state->frame->cur_gop_bits_coded = state->previous_encoder_state->frame->cur_gop_bits_coded;
state->frame->cur_gop_bits_coded = state->previous_encoder_state->frame->cur_gop_bits_coded;
state->frame->cur_gop_bits_coded += newpos - curpos;
}

Expand Down
4 changes: 4 additions & 0 deletions src/encoderstate.c
Original file line number Diff line number Diff line change
Expand Up @@ -1128,6 +1128,10 @@ void kvz_encoder_prepare(encoder_state_t *state)
if (!encoder->cfg.gop_len ||
!prev_state->frame->poc ||
encoder->cfg.gop[prev_state->frame->gop_offset].is_ref) {

// Store current list of POCs for use in TMVP derivation
memcpy(prev_state->tile->frame->rec->ref_pocs, state->frame->ref->pocs, sizeof(int32_t)*state->frame->ref->used_size);

// Add previous reconstructed picture as a reference
kvz_image_list_add(state->frame->ref,
prev_state->tile->frame->rec,
Expand Down
2 changes: 1 addition & 1 deletion src/imagelist.c
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ int kvz_image_list_add(image_list_t *list, kvz_picture *im, cu_array_t *cua, int
unsigned new_size = MAX(list->size + 1, list->size * 2);
if (!kvz_image_list_resize(list, new_size)) return 0;
}

for (i = list->used_size; i > 0; i--) {
list->images[i] = list->images[i - 1];
list->cu_arrays[i] = list->cu_arrays[i - 1];
Expand Down
Loading

0 comments on commit d892be5

Please sign in to comment.