summaryrefslogtreecommitdiff
path: root/vp9/encoder
diff options
context:
space:
mode:
Diffstat (limited to 'vp9/encoder')
-rw-r--r--vp9/encoder/vp9_encoder.c6
-rw-r--r--vp9/encoder/vp9_rdopt.c18
-rw-r--r--vp9/encoder/vp9_svc_layercontext.c6
-rw-r--r--vp9/encoder/vp9_svc_layercontext.h6
4 files changed, 23 insertions, 13 deletions
diff --git a/vp9/encoder/vp9_encoder.c b/vp9/encoder/vp9_encoder.c
index dae718b99..226856e8a 100644
--- a/vp9/encoder/vp9_encoder.c
+++ b/vp9/encoder/vp9_encoder.c
@@ -6257,7 +6257,11 @@ int vp9_get_compressed_data(VP9_COMP *cpi, unsigned int *frame_flags,
// adjust frame rates based on timestamps given
if (cm->show_frame) {
- adjust_frame_rate(cpi, source);
+ if (cpi->use_svc && cpi->svc.use_set_ref_frame_config &&
+ cpi->svc.duration[cpi->svc.spatial_layer_id] > 0)
+ vp9_svc_adjust_frame_rate(cpi);
+ else
+ adjust_frame_rate(cpi, source);
}
if (is_one_pass_cbr_svc(cpi)) {
diff --git a/vp9/encoder/vp9_rdopt.c b/vp9/encoder/vp9_rdopt.c
index 025c5f8e4..1f1cd40d8 100644
--- a/vp9/encoder/vp9_rdopt.c
+++ b/vp9/encoder/vp9_rdopt.c
@@ -701,17 +701,18 @@ static void block_rd_txfm(int plane, int block, int blk_row, int blk_col,
blk_row, blk_col, plane_bsize, tx_bsize);
dist = (int64_t)tmp * 16;
}
- } else if (max_txsize_lookup[plane_bsize] == tx_size) {
- if (x->skip_txfm[(plane << 2) + (block >> (tx_size << 1))] ==
- SKIP_TXFM_NONE) {
+ } else {
+ int skip_txfm_flag = SKIP_TXFM_NONE;
+ if (max_txsize_lookup[plane_bsize] == tx_size)
+ skip_txfm_flag = x->skip_txfm[(plane << 2) + (block >> (tx_size << 1))];
+ if (skip_txfm_flag == SKIP_TXFM_NONE) {
// full forward transform and quantization
vp9_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, tx_size);
if (x->block_qcoeff_opt)
vp9_optimize_b(x, plane, block, tx_size, coeff_ctx);
dist_block(args->cpi, x, plane, plane_bsize, block, blk_row, blk_col,
tx_size, &dist, &sse);
- } else if (x->skip_txfm[(plane << 2) + (block >> (tx_size << 1))] ==
- SKIP_TXFM_AC_ONLY) {
+ } else if (skip_txfm_flag == SKIP_TXFM_AC_ONLY) {
// compute DC coefficient
tran_low_t *const coeff = BLOCK_OFFSET(x->plane[plane].coeff, block);
tran_low_t *const dqcoeff = BLOCK_OFFSET(xd->plane[plane].dqcoeff, block);
@@ -738,13 +739,6 @@ static void block_rd_txfm(int plane, int block, int blk_row, int blk_col,
sse = x->bsse[(plane << 2) + (block >> (tx_size << 1))] << 4;
dist = sse;
}
- } else {
- // full forward transform and quantization
- vp9_xform_quant(x, plane, block, blk_row, blk_col, plane_bsize, tx_size);
- if (x->block_qcoeff_opt)
- vp9_optimize_b(x, plane, block, tx_size, coeff_ctx);
- dist_block(args->cpi, x, plane, plane_bsize, block, blk_row, blk_col,
- tx_size, &dist, &sse);
}
rd = RDCOST(x->rdmult, x->rddiv, 0, dist);
diff --git a/vp9/encoder/vp9_svc_layercontext.c b/vp9/encoder/vp9_svc_layercontext.c
index 3713ff368..1321c4575 100644
--- a/vp9/encoder/vp9_svc_layercontext.c
+++ b/vp9/encoder/vp9_svc_layercontext.c
@@ -1200,3 +1200,9 @@ void vp9_svc_update_ref_frame(VP9_COMP *const cpi) {
vp9_copy_flags_ref_update_idx(cpi);
vp9_svc_update_ref_frame_buffer_idx(cpi);
}
+
+void vp9_svc_adjust_frame_rate(VP9_COMP *const cpi) {
+ int64_t this_duration =
+ cpi->svc.timebase_fac * cpi->svc.duration[cpi->svc.spatial_layer_id];
+ vp9_new_framerate(cpi, 10000000.0 / this_duration);
+}
diff --git a/vp9/encoder/vp9_svc_layercontext.h b/vp9/encoder/vp9_svc_layercontext.h
index 60fb7da75..fdd62d7de 100644
--- a/vp9/encoder/vp9_svc_layercontext.h
+++ b/vp9/encoder/vp9_svc_layercontext.h
@@ -177,6 +177,10 @@ typedef struct SVC {
int temporal_layer_id_per_spatial[VPX_SS_MAX_LAYERS];
int first_spatial_layer_to_encode;
+
+ int64_t duration[VPX_SS_MAX_LAYERS];
+
+ int64_t timebase_fac;
} SVC;
struct VP9_COMP;
@@ -244,6 +248,8 @@ void vp9_svc_update_ref_frame_buffer_idx(struct VP9_COMP *const cpi);
void vp9_svc_update_ref_frame(struct VP9_COMP *const cpi);
+void vp9_svc_adjust_frame_rate(struct VP9_COMP *const cpi);
+
#ifdef __cplusplus
} // extern "C"
#endif