Index: source/libvpx/vp9/encoder/vp9_svc_layercontext.c |
=================================================================== |
--- source/libvpx/vp9/encoder/vp9_svc_layercontext.c (revision 292072) |
+++ source/libvpx/vp9/encoder/vp9_svc_layercontext.c (working copy) |
@@ -19,7 +19,7 @@ |
const VP9EncoderConfig *const oxcf = &cpi->oxcf; |
int layer; |
int layer_end; |
- int alt_ref_idx = svc->number_spatial_layers * svc->number_temporal_layers; |
+ int alt_ref_idx = svc->number_spatial_layers; |
svc->spatial_layer_id = 0; |
svc->temporal_layer_id = 0; |
@@ -233,51 +233,31 @@ |
} |
#if CONFIG_SPATIAL_SVC |
-int vp9_svc_lookahead_push(const VP9_COMP *const cpi, struct lookahead_ctx *ctx, |
- YV12_BUFFER_CONFIG *src, int64_t ts_start, |
- int64_t ts_end, unsigned int flags) { |
- struct lookahead_entry *buf; |
- int i, index; |
+static void get_layer_resolution(const int width_org, const int height_org, |
+ const int num, const int den, |
+ int *width_out, int *height_out) { |
+ int w, h; |
- if (vp9_lookahead_push(ctx, src, ts_start, ts_end, flags)) |
- return 1; |
+ if (width_out == NULL || height_out == NULL || den == 0) |
+ return; |
- index = ctx->write_idx - 1; |
- if (index < 0) |
- index += ctx->max_sz; |
+ w = width_org * num / den; |
+ h = height_org * num / den; |
- buf = ctx->buf + index; |
+ // make height and width even to make chrome player happy |
+ w += w % 2; |
+ h += h % 2; |
- if (buf == NULL) |
- return 1; |
- |
- // Store svc parameters for each layer |
- for (i = 0; i < cpi->svc.number_spatial_layers; ++i) |
- buf->svc_params[i] = cpi->svc.layer_context[i].svc_params_received; |
- |
- return 0; |
+ *width_out = w; |
+ *height_out = h; |
} |
-static int copy_svc_params(VP9_COMP *const cpi, struct lookahead_entry *buf) { |
- int layer_id; |
- vpx_svc_parameters_t *layer_param; |
+int vp9_svc_start_frame(VP9_COMP *const cpi) { |
+ int width = 0, height = 0; |
LAYER_CONTEXT *lc; |
int count = 1 << (cpi->svc.number_temporal_layers - 1); |
- // Find the next layer to be encoded |
- for (layer_id = 0; layer_id < cpi->svc.number_spatial_layers; ++layer_id) { |
- if (buf->svc_params[layer_id].spatial_layer >=0) |
- break; |
- } |
- |
- if (layer_id == cpi->svc.number_spatial_layers) |
- return 1; |
- |
- layer_param = &buf->svc_params[layer_id]; |
- cpi->svc.spatial_layer_id = layer_param->spatial_layer; |
- cpi->svc.temporal_layer_id = layer_param->temporal_layer; |
- cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG; |
- |
+ cpi->svc.spatial_layer_id = cpi->svc.spatial_layer_to_encode; |
lc = &cpi->svc.layer_context[cpi->svc.spatial_layer_id]; |
cpi->svc.temporal_layer_id = 0; |
@@ -286,30 +266,19 @@ |
count >>= 1; |
} |
- cpi->lst_fb_idx = |
- cpi->svc.spatial_layer_id * cpi->svc.number_temporal_layers + |
- cpi->svc.temporal_layer_id; |
- if (lc->frames_from_key_frame < cpi->svc.number_temporal_layers) |
- cpi->ref_frame_flags &= ~VP9_LAST_FLAG; |
+ cpi->ref_frame_flags = VP9_ALT_FLAG | VP9_GOLD_FLAG | VP9_LAST_FLAG; |
- if (cpi->svc.spatial_layer_id == 0) { |
- if (cpi->svc.temporal_layer_id == 0) |
- cpi->gld_fb_idx = lc->gold_ref_idx >= 0 ? |
- lc->gold_ref_idx : cpi->lst_fb_idx; |
- else |
- cpi->gld_fb_idx = cpi->lst_fb_idx - 1; |
- } else { |
- if (cpi->svc.temporal_layer_id == 0) |
- cpi->gld_fb_idx = cpi->svc.spatial_layer_id - |
- cpi->svc.number_temporal_layers; |
- else |
- cpi->gld_fb_idx = cpi->lst_fb_idx - 1; |
- } |
+ cpi->lst_fb_idx = cpi->svc.spatial_layer_id; |
+ if (cpi->svc.spatial_layer_id == 0) |
+ cpi->gld_fb_idx = (lc->gold_ref_idx >= 0) ? |
+ lc->gold_ref_idx : cpi->lst_fb_idx; |
+ else |
+ cpi->gld_fb_idx = cpi->svc.spatial_layer_id - 1; |
+ |
if (lc->current_video_frame_in_layer == 0) { |
if (cpi->svc.spatial_layer_id >= 2) { |
- cpi->alt_fb_idx = |
- cpi->svc.spatial_layer_id - 2 * cpi->svc.number_temporal_layers; |
+ cpi->alt_fb_idx = cpi->svc.spatial_layer_id - 2; |
} else { |
cpi->alt_fb_idx = cpi->lst_fb_idx; |
cpi->ref_frame_flags &= (~VP9_LAST_FLAG & ~VP9_ALT_FLAG); |
@@ -331,21 +300,21 @@ |
lc_lower->alt_ref_source != NULL) |
cpi->alt_fb_idx = lc_lower->alt_ref_idx; |
else if (cpi->svc.spatial_layer_id >= 2) |
- cpi->alt_fb_idx = |
- cpi->svc.spatial_layer_id - 2 * cpi->svc.number_temporal_layers; |
+ cpi->alt_fb_idx = cpi->svc.spatial_layer_id - 2; |
else |
cpi->alt_fb_idx = cpi->lst_fb_idx; |
} |
} |
} |
- if (vp9_set_size_literal(cpi, layer_param->width, layer_param->height) != 0) |
+ get_layer_resolution(cpi->oxcf.width, cpi->oxcf.height, |
+ lc->scaling_factor_num, lc->scaling_factor_den, |
+ &width, &height); |
+ if (vp9_set_size_literal(cpi, width, height) != 0) |
return VPX_CODEC_INVALID_PARAM; |
- cpi->oxcf.worst_allowed_q = |
- vp9_quantizer_to_qindex(layer_param->max_quantizer); |
- cpi->oxcf.best_allowed_q = |
- vp9_quantizer_to_qindex(layer_param->min_quantizer); |
+ cpi->oxcf.worst_allowed_q = vp9_quantizer_to_qindex(lc->max_q); |
+ cpi->oxcf.best_allowed_q = vp9_quantizer_to_qindex(lc->min_q); |
vp9_change_config(cpi, &cpi->oxcf); |
@@ -356,29 +325,15 @@ |
return 0; |
} |
-struct lookahead_entry *vp9_svc_lookahead_peek(VP9_COMP *const cpi, |
- struct lookahead_ctx *ctx, |
- int index, int copy_params) { |
- struct lookahead_entry *buf = vp9_lookahead_peek(ctx, index); |
- |
- if (buf != NULL && copy_params != 0) { |
- if (copy_svc_params(cpi, buf) != 0) |
- return NULL; |
- } |
- return buf; |
-} |
- |
struct lookahead_entry *vp9_svc_lookahead_pop(VP9_COMP *const cpi, |
struct lookahead_ctx *ctx, |
int drain) { |
struct lookahead_entry *buf = NULL; |
if (ctx->sz && (drain || ctx->sz == ctx->max_sz - MAX_PRE_FRAMES)) { |
- buf = vp9_svc_lookahead_peek(cpi, ctx, 0, 1); |
+ buf = vp9_lookahead_peek(ctx, 0); |
if (buf != NULL) { |
- // Only remove the buffer when pop the highest layer. Simply set the |
- // spatial_layer to -1 for lower layers. |
- buf->svc_params[cpi->svc.spatial_layer_id].spatial_layer = -1; |
+ // Only remove the buffer when pop the highest layer. |
if (cpi->svc.spatial_layer_id == cpi->svc.number_spatial_layers - 1) { |
vp9_lookahead_pop(ctx, drain); |
} |