summaryrefslogtreecommitdiff
path: root/vp9/encoder/vp9_bitstream.c
diff options
context:
space:
mode:
authorDmitry Kovalev <dkovalev@google.com>2013-05-07 12:59:12 -0700
committerGerrit Code Review <gerrit@gerrit.golo.chromium.org>2013-05-07 12:59:12 -0700
commit3cd889762364da9914a136cf8735b8524f3b341e (patch)
tree4faad0fcb4e84e86b44fa8bff90b8e57e3fadb51 /vp9/encoder/vp9_bitstream.c
parenteb927039fdae58552bb5fffe46d1d6c4d6a061b1 (diff)
parent20eef6757362dcca3cd82ad7e0e39e8c3e29768b (diff)
downloadlibvpx-3cd889762364da9914a136cf8735b8524f3b341e.tar
libvpx-3cd889762364da9914a136cf8735b8524f3b341e.tar.gz
libvpx-3cd889762364da9914a136cf8735b8524f3b341e.tar.bz2
libvpx-3cd889762364da9914a136cf8735b8524f3b341e.zip
Merge "Adding encode_loopfilter function." into experimental
Diffstat (limited to 'vp9/encoder/vp9_bitstream.c')
-rw-r--r--vp9/encoder/vp9_bitstream.c108
1 files changed, 57 insertions, 51 deletions
diff --git a/vp9/encoder/vp9_bitstream.c b/vp9/encoder/vp9_bitstream.c
index acc3f78f2..6624f07eb 100644
--- a/vp9/encoder/vp9_bitstream.c
+++ b/vp9/encoder/vp9_bitstream.c
@@ -1618,6 +1618,62 @@ static void segment_reference_frames(VP9_COMP *cpi) {
}
}
+static void encode_loopfilter(MACROBLOCKD *xd, vp9_writer *w) {
+ int i;
+
+ // Write out loop filter deltas applied at the MB level based on mode or
+ // ref frame (if they are enabled).
+ vp9_write_bit(w, xd->mode_ref_lf_delta_enabled);
+
+ if (xd->mode_ref_lf_delta_enabled) {
+ // Do the deltas need to be updated
+ vp9_write_bit(w, xd->mode_ref_lf_delta_update);
+ if (xd->mode_ref_lf_delta_update) {
+ // Send update
+ for (i = 0; i < MAX_REF_LF_DELTAS; i++) {
+ const int delta = xd->ref_lf_deltas[i];
+
+ // Frame level data
+ if (delta != xd->last_ref_lf_deltas[i]) {
+ xd->last_ref_lf_deltas[i] = delta;
+ vp9_write_bit(w, 1);
+
+ if (delta > 0) {
+ vp9_write_literal(w, delta & 0x3F, 6);
+ vp9_write_bit(w, 0); // sign
+ } else {
+ assert(delta < 0);
+ vp9_write_literal(w, (-delta) & 0x3F, 6);
+ vp9_write_bit(w, 1); // sign
+ }
+ } else {
+ vp9_write_bit(w, 0);
+ }
+ }
+
+ // Send update
+ for (i = 0; i < MAX_MODE_LF_DELTAS; i++) {
+ const int delta = xd->mode_lf_deltas[i];
+ if (delta != xd->last_mode_lf_deltas[i]) {
+ xd->last_mode_lf_deltas[i] = delta;
+ vp9_write_bit(w, 1);
+
+ if (delta > 0) {
+ vp9_write_literal(w, delta & 0x3F, 6);
+ vp9_write_bit(w, 0); // sign
+ } else {
+ assert(delta < 0);
+ vp9_write_literal(w, (-delta) & 0x3F, 6);
+ vp9_write_bit(w, 1); // sign
+ }
+ } else {
+ vp9_write_bit(w, 0);
+ }
+ }
+ }
+ }
+}
+
static void encode_segmentation(VP9_COMP *cpi, vp9_writer *w) {
int i, j;
VP9_COMMON *const pc = &cpi->common;
@@ -1772,57 +1828,7 @@ void vp9_pack_bitstream(VP9_COMP *cpi, uint8_t *dest, unsigned long *size) {
}
#endif
- // Write out loop filter deltas applied at the MB level based on mode or ref frame (if they are enabled).
- vp9_write_bit(&header_bc, (xd->mode_ref_lf_delta_enabled) ? 1 : 0);
-
- if (xd->mode_ref_lf_delta_enabled) {
- // Do the deltas need to be updated
- vp9_write_bit(&header_bc, xd->mode_ref_lf_delta_update);
- if (xd->mode_ref_lf_delta_update) {
- // Send update
- for (i = 0; i < MAX_REF_LF_DELTAS; i++) {
- const int delta = xd->ref_lf_deltas[i];
-
- // Frame level data
- if (delta != xd->last_ref_lf_deltas[i]) {
- xd->last_ref_lf_deltas[i] = delta;
- vp9_write_bit(&header_bc, 1);
-
- if (delta > 0) {
- vp9_write_literal(&header_bc, delta & 0x3F, 6);
- vp9_write_bit(&header_bc, 0); // sign
- } else {
- assert(delta < 0);
- vp9_write_literal(&header_bc, (-delta) & 0x3F, 6);
- vp9_write_bit(&header_bc, 1); // sign
- }
- } else {
- vp9_write_bit(&header_bc, 0);
- }
- }
-
- // Send update
- for (i = 0; i < MAX_MODE_LF_DELTAS; i++) {
- const int delta = xd->mode_lf_deltas[i];
-
- if (delta != xd->last_mode_lf_deltas[i]) {
- xd->last_mode_lf_deltas[i] = delta;
- vp9_write_bit(&header_bc, 1);
-
- if (delta > 0) {
- vp9_write_literal(&header_bc, delta & 0x3F, 6);
- vp9_write_bit(&header_bc, 0); // sign
- } else {
- assert(delta < 0);
- vp9_write_literal(&header_bc, (-delta) & 0x3F, 6);
- vp9_write_bit(&header_bc, 1); // sign
- }
- } else {
- vp9_write_bit(&header_bc, 0);
- }
- }
- }
- }
+ encode_loopfilter(xd, &header_bc);
// Frame Q baseline quantizer index
vp9_write_literal(&header_bc, pc->base_qindex, QINDEX_BITS);