Merge remote branch 'internal/upstream' into HEAD

This commit is contained in:
John Koleszar 2010-12-24 00:05:10 -05:00
commit 93536be4b9
6 changed files with 105 additions and 66 deletions

View File

@ -94,6 +94,8 @@ void vp8_cmachine_specific_config(VP8_COMP *cpi)
cpi->rtcd.search.full_search = vp8_full_search_sad; cpi->rtcd.search.full_search = vp8_full_search_sad;
cpi->rtcd.search.diamond_search = vp8_diamond_search_sad; cpi->rtcd.search.diamond_search = vp8_diamond_search_sad;
cpi->rtcd.temporal.apply = vp8_temporal_filter_apply_c;
#endif #endif
// Pure C: // Pure C:

View File

@ -73,6 +73,7 @@ int vp8_estimate_entropy_savings(VP8_COMP *cpi);
int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd); int vp8_calc_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd);
int vp8_calc_low_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd); int vp8_calc_low_ss_err(YV12_BUFFER_CONFIG *source, YV12_BUFFER_CONFIG *dest, const vp8_variance_rtcd_vtable_t *rtcd);
extern void vp8_temporal_filter_prepare_c(VP8_COMP *cpi);
static void set_default_lf_deltas(VP8_COMP *cpi); static void set_default_lf_deltas(VP8_COMP *cpi);
@ -4969,7 +4970,7 @@ int vp8_get_compressed_data(VP8_PTR ptr, unsigned int *frame_flags, unsigned lon
{ {
int thiserr; int thiserr;
cpi->oxcf.arnr_strength = i; cpi->oxcf.arnr_strength = i;
vp8cx_temp_filter_c(cpi); vp8_temporal_filter_prepare_c(cpi);
thiserr = vp8_calc_low_ss_err(&cpi->alt_ref_buffer.source_buffer, thiserr = vp8_calc_low_ss_err(&cpi->alt_ref_buffer.source_buffer,
&cpi->src_buffer[start_frame].source_buffer, IF_RTCD(&cpi->rtcd.variance)); &cpi->src_buffer[start_frame].source_buffer, IF_RTCD(&cpi->rtcd.variance));
@ -4984,7 +4985,7 @@ int vp8_get_compressed_data(VP8_PTR ptr, unsigned int *frame_flags, unsigned lon
if (besti != -1) if (besti != -1)
{ {
cpi->oxcf.arnr_strength = besti; cpi->oxcf.arnr_strength = besti;
vp8cx_temp_filter_c(cpi); vp8_temporal_filter_prepare_c(cpi);
s = &cpi->alt_ref_buffer; s = &cpi->alt_ref_buffer;
// FWG not sure if I need to copy this data for the Alt Ref frame // FWG not sure if I need to copy this data for the Alt Ref frame
@ -4996,7 +4997,7 @@ int vp8_get_compressed_data(VP8_PTR ptr, unsigned int *frame_flags, unsigned lon
s = &cpi->src_buffer[cpi->last_alt_ref_sei]; s = &cpi->src_buffer[cpi->last_alt_ref_sei];
#else #else
vp8cx_temp_filter_c(cpi); vp8_temporal_filter_prepare_c(cpi);
s = &cpi->alt_ref_buffer; s = &cpi->alt_ref_buffer;
// FWG not sure if I need to copy this data for the Alt Ref frame // FWG not sure if I need to copy this data for the Alt Ref frame

View File

@ -27,6 +27,7 @@
#include "vpx_ports/mem.h" #include "vpx_ports/mem.h"
#include "vpx/internal/vpx_codec_internal.h" #include "vpx/internal/vpx_codec_internal.h"
#include "mcomp.h" #include "mcomp.h"
#include "temporal_filter.h"
//#define SPEEDSTATS 1 //#define SPEEDSTATS 1
#define MIN_GF_INTERVAL 4 #define MIN_GF_INTERVAL 4
@ -232,6 +233,7 @@ typedef struct VP8_ENCODER_RTCD
vp8_encodemb_rtcd_vtable_t encodemb; vp8_encodemb_rtcd_vtable_t encodemb;
vp8_quantize_rtcd_vtable_t quantize; vp8_quantize_rtcd_vtable_t quantize;
vp8_search_rtcd_vtable_t search; vp8_search_rtcd_vtable_t search;
vp8_temporal_rtcd_vtable_t temporal;
} VP8_ENCODER_RTCD; } VP8_ENCODER_RTCD;
enum enum

View File

@ -36,11 +36,18 @@
#define ALT_REF_MC_ENABLED 1 // dis/enable MC in AltRef filtering #define ALT_REF_MC_ENABLED 1 // dis/enable MC in AltRef filtering
#define ALT_REF_SUBPEL_ENABLED 1 // dis/enable subpel in MC AltRef filtering #define ALT_REF_SUBPEL_ENABLED 1 // dis/enable subpel in MC AltRef filtering
#define USE_FILTER_LUT 0 // use lookup table to improve filter
#define USE_FILTER_LUT 1
#if VP8_TEMPORAL_ALT_REF #if VP8_TEMPORAL_ALT_REF
#if USE_FILTER_LUT #if USE_FILTER_LUT
// for (strength = 0; strength <= 6; strength++) {
// for (delta = 0; delta <= 18; delta++) {
// float coeff = (3.0 * delta * delta) / pow(2, strength);
// printf("%3d", (int)roundf(coeff > 16 ? 0 : 16-coeff));
// }
// printf("\n");
// }
static int modifier_lut[7][19] = static int modifier_lut[7][19] =
{ {
// Strength=0 // Strength=0
@ -59,7 +66,7 @@ static int modifier_lut[7][19] =
{16, 16, 16, 16, 15, 15, 14, 14, 13, 12, 11, 10, 9, 8, 7, 5, 4, 2, 1} {16, 16, 16, 16, 15, 15, 14, 14, 13, 12, 11, 10, 9, 8, 7, 5, 4, 2, 1}
}; };
#endif #endif
static void build_predictors_mb static void vp8_temporal_filter_predictors_mb_c
( (
MACROBLOCKD *x, MACROBLOCKD *x,
unsigned char *y_mb_ptr, unsigned char *y_mb_ptr,
@ -111,7 +118,7 @@ static void build_predictors_mb
RECON_INVOKE(&x->rtcd->recon, copy8x8)(vptr, stride, &pred[320], 8); RECON_INVOKE(&x->rtcd->recon, copy8x8)(vptr, stride, &pred[320], 8);
} }
} }
static void apply_temporal_filter void vp8_temporal_filter_apply_c
( (
unsigned char *frame1, unsigned char *frame1,
unsigned int stride, unsigned int stride,
@ -140,16 +147,14 @@ static void apply_temporal_filter
int pixel_value = *frame2++; int pixel_value = *frame2++;
#if USE_FILTER_LUT #if USE_FILTER_LUT
// LUT implementation --
// improves precision of filter
modifier = abs(src_byte-pixel_value); modifier = abs(src_byte-pixel_value);
modifier = modifier>18 ? 0 : lut[modifier]; modifier = modifier>18 ? 0 : lut[modifier];
#else #else
modifier = src_byte; modifier = src_byte - pixel_value;
modifier -= pixel_value;
modifier *= modifier; modifier *= modifier;
modifier >>= strength;
modifier *= 3; modifier *= 3;
modifier += 1 << (strength - 1);
modifier >>= strength;
if (modifier > 16) if (modifier > 16)
modifier = 16; modifier = 16;
@ -171,7 +176,7 @@ static void apply_temporal_filter
#if ALT_REF_MC_ENABLED #if ALT_REF_MC_ENABLED
static int dummy_cost[2*mv_max+1]; static int dummy_cost[2*mv_max+1];
static int find_matching_mb static int vp8_temporal_filter_find_matching_mb_c
( (
VP8_COMP *cpi, VP8_COMP *cpi,
YV12_BUFFER_CONFIG *arf_frame, YV12_BUFFER_CONFIG *arf_frame,
@ -308,7 +313,7 @@ static int find_matching_mb
} }
#endif #endif
static void vp8cx_temp_blur1_c static void vp8_temporal_filter_iterate_c
( (
VP8_COMP *cpi, VP8_COMP *cpi,
int frame_count, int frame_count,
@ -412,7 +417,8 @@ static void vp8cx_temp_blur1_c
#define THRESH_HIGH 20000 #define THRESH_HIGH 20000
// Correlation has been lost try MC // Correlation has been lost try MC
err = find_matching_mb ( cpi, err = vp8_temporal_filter_find_matching_mb_c
(cpi,
cpi->frames[alt_ref_index], cpi->frames[alt_ref_index],
cpi->frames[frame], cpi->frames[frame],
mb_y_offset, mb_y_offset,
@ -429,8 +435,8 @@ static void vp8cx_temp_blur1_c
if (filter_weight[frame] != 0) if (filter_weight[frame] != 0)
{ {
// Construct the predictors // Construct the predictors
build_predictors_mb ( vp8_temporal_filter_predictors_mb_c
mbd, (mbd,
cpi->frames[frame]->y_buffer + mb_y_offset, cpi->frames[frame]->y_buffer + mb_y_offset,
cpi->frames[frame]->u_buffer + mb_uv_offset, cpi->frames[frame]->u_buffer + mb_uv_offset,
cpi->frames[frame]->v_buffer + mb_uv_offset, cpi->frames[frame]->v_buffer + mb_uv_offset,
@ -440,7 +446,8 @@ static void vp8cx_temp_blur1_c
predictor); predictor);
// Apply the filter (YUV) // Apply the filter (YUV)
apply_temporal_filter ( f->y_buffer + mb_y_offset, TEMPORAL_INVOKE(&cpi->rtcd.temporal, apply)
(f->y_buffer + mb_y_offset,
f->y_stride, f->y_stride,
predictor, predictor,
16, 16,
@ -449,7 +456,8 @@ static void vp8cx_temp_blur1_c
accumulator, accumulator,
count); count);
apply_temporal_filter ( f->u_buffer + mb_uv_offset, TEMPORAL_INVOKE(&cpi->rtcd.temporal, apply)
(f->u_buffer + mb_uv_offset,
f->uv_stride, f->uv_stride,
predictor + 256, predictor + 256,
8, 8,
@ -458,7 +466,8 @@ static void vp8cx_temp_blur1_c
accumulator + 256, accumulator + 256,
count + 256); count + 256);
apply_temporal_filter ( f->v_buffer + mb_uv_offset, TEMPORAL_INVOKE(&cpi->rtcd.temporal, apply)
(f->v_buffer + mb_uv_offset,
f->uv_stride, f->uv_stride,
predictor + 320, predictor + 320,
8, 8,
@ -534,7 +543,7 @@ static void vp8cx_temp_blur1_c
mbd->pre.v_buffer = v_buffer; mbd->pre.v_buffer = v_buffer;
} }
void vp8cx_temp_filter_c void vp8_temporal_filter_prepare_c
( (
VP8_COMP *cpi VP8_COMP *cpi
) )
@ -642,7 +651,7 @@ void vp8cx_temp_filter_c
= &cpi->src_buffer[which_buffer].source_buffer; = &cpi->src_buffer[which_buffer].source_buffer;
} }
vp8cx_temp_blur1_c ( vp8_temporal_filter_iterate_c (
cpi, cpi,
frames_to_blur, frames_to_blur,
frames_to_blur_backward, frames_to_blur_backward,

View File

@ -12,8 +12,33 @@
#ifndef __INC_VP8_TEMPORAL_FILTER_H #ifndef __INC_VP8_TEMPORAL_FILTER_H
#define __INC_VP8_TEMPORAL_FILTER_H #define __INC_VP8_TEMPORAL_FILTER_H
#include "onyx_int.h" #define prototype_apply(sym)\
void (sym) \
( \
unsigned char *frame1, \
unsigned int stride, \
unsigned char *frame2, \
unsigned int block_size, \
int strength, \
int filter_weight, \
unsigned int *accumulator, \
unsigned int *count \
)
void vp8cx_temp_filter_c(VP8_COMP *cpi); #ifndef vp8_temporal_filter_apply
#define vp8_temporal_filter_apply vp8_temporal_filter_apply_c
#endif
extern prototype_apply(vp8_temporal_filter_apply);
typedef struct
{
prototype_apply(*apply);
} vp8_temporal_rtcd_vtable_t;
#if CONFIG_RUNTIME_CPU_DETECT
#define TEMPORAL_INVOKE(ctx,fn) (ctx)->fn
#else
#define TEMPORAL_INVOKE(ctx,fn) vp8_temporal_filter_##fn
#endif
#endif // __INC_VP8_TEMPORAL_FILTER_H #endif // __INC_VP8_TEMPORAL_FILTER_H

View File

@ -190,11 +190,11 @@ int stats_open_mem(stats_io_t *stats, int pass)
} }
void stats_close(stats_io_t *stats) void stats_close(stats_io_t *stats, int last_pass)
{ {
if (stats->file) if (stats->file)
{ {
if (stats->pass == 1) if (stats->pass == last_pass)
{ {
#if 0 #if 0
#elif USE_POSIX_MMAP #elif USE_POSIX_MMAP
@ -209,7 +209,7 @@ void stats_close(stats_io_t *stats)
} }
else else
{ {
if (stats->pass == 1) if (stats->pass == last_pass)
free(stats->buf.buf); free(stats->buf.buf);
} }
} }
@ -1700,7 +1700,7 @@ int main(int argc, const char **argv_)
} }
fclose(outfile); fclose(outfile);
stats_close(&stats); stats_close(&stats, arg_passes-1);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
if (one_pass_only) if (one_pass_only)