cpi->rc.per_frame_bandwidth = target_frame_size;
}
-void vp9_second_pass(VP9_COMP *cpi) {
+void vp9_get_svc_params(VP9_COMP *cpi) {
+ VP9_COMMON *const cm = &cpi->common;
+ if ((cm->current_video_frame == 0) ||
+ (cm->frame_flags & FRAMEFLAGS_KEY) ||
+ (cpi->oxcf.auto_key && (cpi->rc.frames_since_key %
+ cpi->key_frame_frequency == 0))) {
+ cm->frame_type = KEY_FRAME;
+ } else {
+ cm->frame_type = INTER_FRAME;
+ }
+ cpi->rc.frames_till_gf_update_due = INT_MAX;
+ cpi->rc.baseline_gf_interval = INT_MAX;
+}
+
+void vp9_get_one_pass_params(VP9_COMP *cpi) {
+ VP9_COMMON *const cm = &cpi->common;
+ if (!cpi->refresh_alt_ref_frame &&
+ (cm->current_video_frame == 0 ||
+ cm->frame_flags & FRAMEFLAGS_KEY ||
+ (cpi->oxcf.auto_key && (cpi->rc.frames_since_key %
+ cpi->key_frame_frequency == 0)))) {
+ cm->frame_type = KEY_FRAME;
+ } else {
+ cm->frame_type = INTER_FRAME;
+ }
+ if (cpi->rc.frames_till_gf_update_due == 0) {
+ cpi->rc.frames_till_gf_update_due = cpi->rc.baseline_gf_interval;
+ cpi->refresh_golden_frame = 1;
+ }
+}
+
+void vp9_get_first_pass_params(VP9_COMP *cpi) {
+ VP9_COMMON *const cm = &cpi->common;
+ if (!cpi->refresh_alt_ref_frame &&
+ (cm->current_video_frame == 0 ||
+ cm->frame_flags & FRAMEFLAGS_KEY)) {
+ cm->frame_type = KEY_FRAME;
+ } else {
+ cm->frame_type = INTER_FRAME;
+ }
+}
+
+void vp9_get_second_pass_params(VP9_COMP *cpi) {
int tmp_q;
int frames_left = (int)(cpi->twopass.total_stats.count -
cpi->common.current_video_frame);
double this_frame_intra_error;
double this_frame_coded_error;
+ if (cpi->refresh_alt_ref_frame) {
+ cpi->common.frame_type = INTER_FRAME;
+ return;
+ }
if (!cpi->twopass.stats_in)
return;
assign_std_frame_bits(cpi, &this_frame_copy);
cpi->rc.per_frame_bandwidth = bak;
}
+ cpi->rc.frames_till_gf_update_due = cpi->rc.baseline_gf_interval;
+ cpi->refresh_golden_frame = 1;
} else {
// Otherwise this is an ordinary frame
// Assign bits from those allocated to the GF group
cpi->ref_frame_flags = ref_frame_flags;
return 0;
}
+
int vp9_update_reference(VP9_PTR ptr, int ref_frame_flags) {
VP9_COMP *cpi = (VP9_COMP *)(ptr);
return 0;
}
+
int vp9_update_entropy(VP9_PTR comp, int update) {
((VP9_COMP *)comp)->common.refresh_frame_context = update;
return 0;
cpi->oxcf.play_alternate && !cpi->refresh_alt_ref_frame) {
cpi->rc.source_alt_ref_pending = 1;
cpi->rc.frames_till_gf_update_due = cpi->rc.baseline_gf_interval;
-
- // TODO(ivan): For SVC encoder, GF automatic update is disabled by using
- // a large GF_interval.
- if (cpi->use_svc) {
- cpi->rc.frames_till_gf_update_due = INT_MAX;
- }
}
if (!cpi->rc.source_alt_ref_pending)
} while (loop);
}
+static void get_ref_frame_flags(VP9_COMP *cpi) {
+ if (cpi->refresh_last_frame & cpi->refresh_golden_frame)
+ cpi->gold_is_last = 1;
+ else if (cpi->refresh_last_frame ^ cpi->refresh_golden_frame)
+ cpi->gold_is_last = 0;
+
+ if (cpi->refresh_last_frame & cpi->refresh_alt_ref_frame)
+ cpi->alt_is_last = 1;
+ else if (cpi->refresh_last_frame ^ cpi->refresh_alt_ref_frame)
+ cpi->alt_is_last = 0;
+
+ if (cpi->refresh_alt_ref_frame & cpi->refresh_golden_frame)
+ cpi->gold_is_alt = 1;
+ else if (cpi->refresh_alt_ref_frame ^ cpi->refresh_golden_frame)
+ cpi->gold_is_alt = 0;
+
+ cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
+
+ if (cpi->gold_is_last)
+ cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
+
+ if (cpi->alt_is_last)
+ cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
+
+ if (cpi->gold_is_alt)
+ cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
+}
+
static void encode_frame_to_data_rate(VP9_COMP *cpi,
size_t *size,
uint8_t *dest,
else
cm->frame_flags = cm->frame_flags&~FRAMEFLAGS_ALTREF;
-
- if (cpi->refresh_last_frame & cpi->refresh_golden_frame)
- cpi->gold_is_last = 1;
- else if (cpi->refresh_last_frame ^ cpi->refresh_golden_frame)
- cpi->gold_is_last = 0;
-
- if (cpi->refresh_last_frame & cpi->refresh_alt_ref_frame)
- cpi->alt_is_last = 1;
- else if (cpi->refresh_last_frame ^ cpi->refresh_alt_ref_frame)
- cpi->alt_is_last = 0;
-
- if (cpi->refresh_alt_ref_frame & cpi->refresh_golden_frame)
- cpi->gold_is_alt = 1;
- else if (cpi->refresh_alt_ref_frame ^ cpi->refresh_golden_frame)
- cpi->gold_is_alt = 0;
-
- cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG;
-
- if (cpi->gold_is_last)
- cpi->ref_frame_flags &= ~VP9_GOLD_FLAG;
-
- if (cpi->alt_is_last)
- cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
-
- if (cpi->gold_is_alt)
- cpi->ref_frame_flags &= ~VP9_ALT_FLAG;
+ get_ref_frame_flags(cpi);
if (cpi->oxcf.play_alternate && cpi->refresh_alt_ref_frame
&& (cm->frame_type != KEY_FRAME))
#endif
// As this frame is a key frame the next defaults to an inter frame.
- cm->frame_type = INTER_FRAME;
vp9_clear_system_state();
cpi->rc.frames_since_key = 0;
} else {
cm->prev_mi_grid_visible = cm->prev_mi_grid_base + cm->mode_info_stride + 1;
}
+static void SvcEncode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
+ unsigned int *frame_flags) {
+ vp9_get_svc_params(cpi);
+ encode_frame_to_data_rate(cpi, size, dest, frame_flags);
+}
+
static void Pass0Encode(VP9_COMP *cpi, size_t *size, uint8_t *dest,
unsigned int *frame_flags) {
+ vp9_get_one_pass_params(cpi);
encode_frame_to_data_rate(cpi, size, dest, frame_flags);
}
(void) dest;
(void) frame_flags;
+ vp9_get_first_pass_params(cpi);
vp9_set_quantizer(cpi, find_fp_qindex());
vp9_first_pass(cpi);
}
uint8_t *dest, unsigned int *frame_flags) {
cpi->enable_encode_breakout = 1;
- if (!cpi->refresh_alt_ref_frame)
- vp9_second_pass(cpi);
-
+ vp9_get_second_pass_params(cpi);
encode_frame_to_data_rate(cpi, size, dest, frame_flags);
// vp9_print_modes_and_motion_vectors(&cpi->common, "encode.stt");
}
#endif
- cm->frame_type = INTER_FRAME;
cm->frame_flags = *frame_flags;
// Reset the frame pointers to the current frame size
vp9_vaq_init();
}
- if (cpi->pass == 1) {
+ if (cpi->use_svc) {
+ SvcEncode(cpi, size, dest, frame_flags);
+ } else if (cpi->pass == 1) {
Pass1Encode(cpi, size, dest, frame_flags);
} else if (cpi->pass == 2) {
Pass2Encode(cpi, size, dest, frame_flags);
cpi->refresh_alt_ref_frame = 0;
cpi->refresh_golden_frame = 0;
cpi->refresh_last_frame = 1;
- cm->frame_type = INTER_FRAME;
}
vpx_usec_timer_mark(&cmptimer);