summaryrefslogtreecommitdiff
path: root/vp8
diff options
context:
space:
mode:
authorJohn Koleszar <jkoleszar@google.com>2010-09-30 10:26:10 -0700
committerCode Review <code-review@webmproject.org>2010-09-30 10:26:10 -0700
commita047fee606fa32f6a434bc7b08b46787ba2a787d (patch)
treedd4ca46f5aba06d8cdd3ed1840d44a861b7e3571 /vp8
parent8ee7284d604a25838e71636b9cd4a16d53a2555e (diff)
parentb9be7a464f065c3700f937eea01d9298002b37eb (diff)
downloadlibvpx-a047fee606fa32f6a434bc7b08b46787ba2a787d.tar
libvpx-a047fee606fa32f6a434bc7b08b46787ba2a787d.tar.gz
libvpx-a047fee606fa32f6a434bc7b08b46787ba2a787d.tar.bz2
libvpx-a047fee606fa32f6a434bc7b08b46787ba2a787d.zip
Merge "Fix loopfilter delta zero transitions"
Diffstat (limited to 'vp8')
-rw-r--r--vp8/common/blockd.h4
-rw-r--r--vp8/encoder/bitstream.c14
-rw-r--r--vp8/encoder/onyx_if.c20
3 files changed, 20 insertions, 18 deletions
diff --git a/vp8/common/blockd.h b/vp8/common/blockd.h
index 4b7f1a359..75dd4f79d 100644
--- a/vp8/common/blockd.h
+++ b/vp8/common/blockd.h
@@ -262,9 +262,9 @@ typedef struct
unsigned char mode_ref_lf_delta_update;
// Delta values have the range +/- MAX_LOOP_FILTER
- //char ref_lf_deltas[MAX_REF_LF_DELTAS]; // 0 = Intra, Last, GF, ARF
- //char mode_lf_deltas[MAX_MODE_LF_DELTAS]; // 0 = BPRED, ZERO_MV, MV, SPLIT
+ signed char last_ref_lf_deltas[MAX_REF_LF_DELTAS]; // 0 = Intra, Last, GF, ARF
signed char ref_lf_deltas[MAX_REF_LF_DELTAS]; // 0 = Intra, Last, GF, ARF
+ signed char last_mode_lf_deltas[MAX_MODE_LF_DELTAS]; // 0 = BPRED, ZERO_MV, MV, SPLIT
signed char mode_lf_deltas[MAX_MODE_LF_DELTAS]; // 0 = BPRED, ZERO_MV, MV, SPLIT
// Distance of MB away from frame edges
diff --git a/vp8/encoder/bitstream.c b/vp8/encoder/bitstream.c
index 929c17841..412542d10 100644
--- a/vp8/encoder/bitstream.c
+++ b/vp8/encoder/bitstream.c
@@ -1490,9 +1490,11 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size)
if (xd->mode_ref_lf_delta_enabled)
{
// Do the deltas need to be updated
- vp8_write_bit(bc, (xd->mode_ref_lf_delta_update) ? 1 : 0);
+ int send_update = xd->mode_ref_lf_delta_update
+ || cpi->oxcf.error_resilient_mode;
- if (xd->mode_ref_lf_delta_update)
+ vp8_write_bit(bc, send_update);
+ if (send_update)
{
int Data;
@@ -1502,8 +1504,10 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size)
Data = xd->ref_lf_deltas[i];
// Frame level data
- if (Data)
+ if (xd->ref_lf_deltas[i] != xd->last_ref_lf_deltas[i]
+ || cpi->oxcf.error_resilient_mode)
{
+ xd->last_ref_lf_deltas[i] = xd->ref_lf_deltas[i];
vp8_write_bit(bc, 1);
if (Data > 0)
@@ -1527,8 +1531,10 @@ void vp8_pack_bitstream(VP8_COMP *cpi, unsigned char *dest, unsigned long *size)
{
Data = xd->mode_lf_deltas[i];
- if (Data)
+ if (xd->mode_lf_deltas[i] != xd->last_mode_lf_deltas[i]
+ || cpi->oxcf.error_resilient_mode)
{
+ xd->last_mode_lf_deltas[i] = xd->mode_lf_deltas[i];
vp8_write_bit(bc, 1);
if (Data > 0)
diff --git a/vp8/encoder/onyx_if.c b/vp8/encoder/onyx_if.c
index 18ea7b819..7ea7884e4 100644
--- a/vp8/encoder/onyx_if.c
+++ b/vp8/encoder/onyx_if.c
@@ -272,6 +272,8 @@ static void setup_features(VP8_COMP *cpi)
cpi->mb.e_mbd.mode_ref_lf_delta_update = 0;
vpx_memset(cpi->mb.e_mbd.ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
vpx_memset(cpi->mb.e_mbd.mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
+ vpx_memset(cpi->mb.e_mbd.last_ref_lf_deltas, 0, sizeof(cpi->mb.e_mbd.ref_lf_deltas));
+ vpx_memset(cpi->mb.e_mbd.last_mode_lf_deltas, 0, sizeof(cpi->mb.e_mbd.mode_lf_deltas));
// jbb trial !
mode_ref_lf_test_function(cpi);
@@ -4093,6 +4095,9 @@ static void encode_frame_to_data_rate
{
int i;
+ // Reset the loop filter deltas and segmentation map
+ setup_features(cpi);
+
// If segmentation is enabled force a map update for key frames
if (cpi->mb.e_mbd.segmentation_enabled)
{
@@ -4100,12 +4105,6 @@ static void encode_frame_to_data_rate
cpi->mb.e_mbd.update_mb_segmentation_data = 1;
}
- // If mode or reference frame based loop filter deltas are enabled then force an update for key frames.
- if (cpi->mb.e_mbd.mode_ref_lf_delta_enabled)
- {
- cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
- }
-
// The alternate reference frame cannot be active for a key frame
cpi->source_alt_ref_active = FALSE;
@@ -4527,6 +4526,9 @@ static void encode_frame_to_data_rate
// Clear the Alt reference frame active flag when we have a key frame
cpi->source_alt_ref_active = FALSE;
+ // Reset the loop filter deltas and segmentation map
+ setup_features(cpi);
+
// If segmentation is enabled force a map update for key frames
if (cpi->mb.e_mbd.segmentation_enabled)
{
@@ -4534,12 +4536,6 @@ static void encode_frame_to_data_rate
cpi->mb.e_mbd.update_mb_segmentation_data = 1;
}
- // If mode or reference frame based loop filter deltas are enabled then force an update for key frames.
- if (cpi->mb.e_mbd.mode_ref_lf_delta_enabled)
- {
- cpi->mb.e_mbd.mode_ref_lf_delta_update = 1;
- }
-
vp8_restore_coding_context(cpi);
Q = vp8_regulate_q(cpi, cpi->this_frame_target);