unsigned int low_res_ref_frames[MAX_REF_FRAMES];
// The video frame counter value for the key frame, for lowest resolution.
unsigned int key_frame_counter_value;
+ // Flags to signal skipped encoding of previous and base layer stream.
+ unsigned int skip_encoding_prev_stream;
+ unsigned int skip_encoding_base_stream;
LOWER_RES_MB_INFO *mb_info;
} LOWER_RES_FRAME_INFO;
#endif
(LOWER_RES_FRAME_INFO *)cpi->oxcf.mr_low_res_mode_info;
if (cpi->oxcf.mr_encoder_id) {
- // TODO(marpan): This constraint shouldn't be needed, as we would like
- // to allow for key frame setting (forced or periodic) defined per
- // spatial layer. For now, keep this in.
- cm->frame_type = low_res_frame_info->frame_type;
-
// Check if lower resolution is available for motion vector reuse.
if (cm->frame_type != KEY_FRAME) {
cpi->mr_low_res_mv_avail = 1;
== low_res_frame_info->low_res_ref_frames[ALTREF_FRAME]);
*/
}
+ // Disable motion vector reuse (i.e., disable any usage of the low_res)
+ // if the previous lower stream is skipped/disabled.
+ if (low_res_frame_info->skip_encoding_prev_stream) {
+ cpi->mr_low_res_mv_avail = 0;
+ }
}
+ // This stream is not skipped (i.e., it's being encoded), so set this skip
+ // flag to 0. This is needed for the next stream (i.e., which is the next
+ // frame to be encoded).
+ low_res_frame_info->skip_encoding_prev_stream = 0;
// On a key frame: For the lowest resolution, keep track of the key frame
// counter value. For the higher resolutions, reset the current video
// be received for that high layer, which will yield an incorrect
// frame rate (from time-stamp adjustment in above calculation).
if (cpi->oxcf.mr_encoder_id) {
- cpi->ref_framerate = low_res_frame_info->low_res_framerate;
+ if (!low_res_frame_info->skip_encoding_base_stream)
+ cpi->ref_framerate = low_res_frame_info->low_res_framerate;
} else {
// Keep track of frame rate for lowest resolution.
low_res_frame_info->low_res_framerate = cpi->ref_framerate;
+ // The base stream is being encoded so set skip flag to 0.
+ low_res_frame_info->skip_encoding_base_stream = 0;
}
}
#endif
unsigned long deadline) {
vpx_codec_err_t res = VPX_CODEC_OK;
- if (!ctx->cfg.rc_target_bitrate) return res;
+ if (!ctx->cfg.rc_target_bitrate) {
+#if CONFIG_MULTI_RES_ENCODING
+ LOWER_RES_FRAME_INFO *low_res_frame_info =
+ (LOWER_RES_FRAME_INFO *)ctx->cpi->oxcf.mr_low_res_mode_info;
+ low_res_frame_info->skip_encoding_prev_stream = 1;
+ if (ctx->cpi->oxcf.mr_encoder_id == 0)
+ low_res_frame_info->skip_encoding_base_stream = 1;
+#endif
+ return res;
+ }
if (img) res = validate_img(ctx, img);