summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Paniconi <marpan@google.com>2013-11-01 11:03:03 -0700
committerMarco Paniconi <marpan@google.com>2013-11-01 11:47:40 -0700
commit41138e01f5b301952bba3553da20ac6a6cedf8a8 (patch)
tree01edf7b1902f6113fcacb87d925896913c87afc0
parenta272530bf0962d4cbf54fdb8abd1051f8fbb5917 (diff)
downloadlibvpx-41138e01f5b301952bba3553da20ac6a6cedf8a8.tar
libvpx-41138e01f5b301952bba3553da20ac6a6cedf8a8.tar.gz
libvpx-41138e01f5b301952bba3553da20ac6a6cedf8a8.tar.bz2
libvpx-41138e01f5b301952bba3553da20ac6a6cedf8a8.zip
Fixes to buffer update for temporal layers.
When a frame is dropped due to |buffer_level| < 0 for a given temporal layer, the buffer level for the upper temporal layers was not updated (in calc_pframe_target_size()). This change fixes that. Also, use the layer per-frame-bandwidth for updating the buffer level of the higher layers when a frame is dropped. Change-Id: I660c23f3229b47e9d124a950b480314b4307c5a8
-rw-r--r--vp8/encoder/onyx_if.c3
-rw-r--r--vp8/encoder/ratectrl.c15
2 files changed, 17 insertions, 1 deletions
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index 7c0797599..4b60cfd32 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -3574,7 +3574,8 @@ static void encode_frame_to_data_rate
for (i=cpi->current_layer+1; i<cpi->oxcf.number_of_layers; i++)
{
LAYER_CONTEXT *lc = &cpi->layer_context[i];
- lc->bits_off_target += cpi->av_per_frame_bandwidth;
+ lc->bits_off_target += (int)(lc->target_bandwidth /
+ lc->framerate);
if (lc->bits_off_target > lc->maximum_buffer_size)
lc->bits_off_target = lc->maximum_buffer_size;
lc->buffer_level = lc->bits_off_target;
diff --git a/vp8/encoder/ratectrl.c b/vp8/encoder/ratectrl.c
index 1e8259cf4..fe4db13b3 100644
--- a/vp8/encoder/ratectrl.c
+++ b/vp8/encoder/ratectrl.c
@@ -956,6 +956,21 @@ static void calc_pframe_target_size(VP8_COMP *cpi)
if (cpi->bits_off_target > cpi->oxcf.maximum_buffer_size)
cpi->bits_off_target = (int)cpi->oxcf.maximum_buffer_size;
cpi->buffer_level = cpi->bits_off_target;
+
+ if (cpi->oxcf.number_of_layers > 1) {
+ unsigned int i;
+
+ // Propagate bits saved by dropping the frame to higher layers.
+ for (i = cpi->current_layer + 1; i < cpi->oxcf.number_of_layers;
+ i++) {
+ LAYER_CONTEXT *lc = &cpi->layer_context[i];
+ lc->bits_off_target += (int)(lc->target_bandwidth /
+ lc->framerate);
+ if (lc->bits_off_target > lc->maximum_buffer_size)
+ lc->bits_off_target = lc->maximum_buffer_size;
+ lc->buffer_level = lc->bits_off_target;
+ }
+ }
}
}