diff options
-rw-r--r-- | README | 11 | ||||
-rw-r--r-- | build/arm-msvs/obj_int_extract.bat | 4 | ||||
-rwxr-xr-x | build/make/gen_msvs_proj.sh | 8 | ||||
-rwxr-xr-x | build/make/gen_msvs_vcxproj.sh | 8 | ||||
-rw-r--r-- | build/x86-msvs/obj_int_extract.bat | 2 | ||||
-rw-r--r-- | examples.mk | 1 | ||||
-rw-r--r-- | libs.mk | 3 | ||||
-rw-r--r-- | vp8/encoder/arm/neon/denoising_neon.c | 87 |
8 files changed, 108 insertions, 16 deletions
@@ -1,5 +1,4 @@ -vpx Multi-Format Codec SDK -README - 1 August 2013 +README - 30 May 2014 Welcome to the WebM VP8/VP9 Codec SDK! @@ -131,6 +130,14 @@ COMPILING THE APPLICATIONS/LIBRARIES: This defaults to config.log. This should give a good indication of what went wrong. If not, contact us for support. +VP8/VP9 TEST VECTORS: + The test vectors can be downloaded and verified using the build system after + running configure. To specify an alternate directory the + LIBVPX_TEST_DATA_PATH environment variable can be used. + + $ ./configure --enable-unit-tests + $ LIBVPX_TEST_DATA_PATH=../libvpx-test-data make testdata + SUPPORT This library is an open source project supported by its community. Please please email webm-discuss@webmproject.org for help. diff --git a/build/arm-msvs/obj_int_extract.bat b/build/arm-msvs/obj_int_extract.bat index 267ed61d5..c0987bcf7 100644 --- a/build/arm-msvs/obj_int_extract.bat +++ b/build/arm-msvs/obj_int_extract.bat @@ -11,8 +11,8 @@ REM Arguments: REM %1 - Relative path to the directory containing the vp8 and vpx_scale REM source directories. REM %2 - Path to obj_int_extract.exe. -cl /I "./" /I "%1" /nologo /c /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP "%1/vp8/encoder/vp8_asm_enc_offsets.c" +cl /I. /I%1 /nologo /c /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP "%~1/vp8/encoder/vp8_asm_enc_offsets.c" %2\obj_int_extract.exe rvds "vp8_asm_enc_offsets.obj" > "vp8_asm_enc_offsets.asm" -cl /I "./" /I "%1" /nologo /c /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP "%1/vpx_scale/vpx_scale_asm_offsets.c" +cl /I. /I%1 /nologo /c /DWINAPI_FAMILY=WINAPI_FAMILY_PHONE_APP "%~1/vpx_scale/vpx_scale_asm_offsets.c" %2\obj_int_extract.exe rvds "vpx_scale_asm_offsets.obj" > "vpx_scale_asm_offsets.asm" diff --git a/build/make/gen_msvs_proj.sh b/build/make/gen_msvs_proj.sh index 4e803b81e..660436d3a 100755 --- a/build/make/gen_msvs_proj.sh +++ b/build/make/gen_msvs_proj.sh @@ -67,7 +67,9 @@ generate_filter() { if [ "${f##*.}" == "$pat" ]; then unset file_list[i] - objf=$(echo ${f%.*}.obj | sed -e 's/^[\./]\+//g' -e 's,[:/],_,g') + objf=$(echo ${f%.*}.obj \ + | sed -e "s,$src_path_bare,," \ + -e 's/^[\./]\+//g' -e 's,[:/ ],_,g') open_tag File RelativePath="$f" if [ "$pat" == "asm" ] && $asm_use_custom_step; then @@ -153,7 +155,7 @@ for opt in "$@"; do opt=${opt##-I} opt=$(fix_path "$opt") incs="${incs}${incs:+;}"${opt}"" - yasmincs="${yasmincs} -I${opt}" + yasmincs="${yasmincs} -I"${opt}"" ;; -D*) defines="${defines}${defines:+;}${opt##-D}" ;; @@ -300,7 +302,7 @@ generate_vcproj() { vpx) tag Tool \ Name="VCPreBuildEventTool" \ - CommandLine="call obj_int_extract.bat $src_path_bare $plat_no_ws\\\$(ConfigurationName)" \ + CommandLine="call obj_int_extract.bat "$src_path_bare" $plat_no_ws\\\$(ConfigurationName)" \ tag Tool \ Name="VCCLCompilerTool" \ diff --git a/build/make/gen_msvs_vcxproj.sh b/build/make/gen_msvs_vcxproj.sh index 8529eed24..4ae511e54 100755 --- a/build/make/gen_msvs_vcxproj.sh +++ b/build/make/gen_msvs_vcxproj.sh @@ -78,7 +78,9 @@ generate_filter() { if [ "${f##*.}" == "$pat" ]; then unset file_list[i] - objf=$(echo ${f%.*}.obj | sed -e 's/^[\./]\+//g' -e 's,[:/],_,g') + objf=$(echo ${f%.*}.obj \ + | sed -e "s,$src_path_bare,," \ + -e 's/^[\./]\+//g' -e 's,[:/ ],_,g') if ([ "$pat" == "asm" ] || [ "$pat" == "s" ]) && $asm_use_custom_step; then # Avoid object file name collisions, i.e. vpx_config.c and @@ -175,7 +177,7 @@ for opt in "$@"; do opt=${opt##-I} opt=$(fix_path "$opt") incs="${incs}${incs:+;}"${opt}"" - yasmincs="${yasmincs} -I${opt}" + yasmincs="${yasmincs} -I"${opt}"" ;; -D*) defines="${defines}${defines:+;}${opt##-D}" ;; @@ -392,7 +394,7 @@ generate_vcxproj() { hostplat=Win32 fi open_tag PreBuildEvent - tag_content Command "call obj_int_extract.bat $src_path_bare $hostplat\\\$(Configuration)" + tag_content Command "call obj_int_extract.bat "$src_path_bare" $hostplat\\\$(Configuration)" close_tag PreBuildEvent fi open_tag ClCompile diff --git a/build/x86-msvs/obj_int_extract.bat b/build/x86-msvs/obj_int_extract.bat index 44d095dc9..dfa3b9083 100644 --- a/build/x86-msvs/obj_int_extract.bat +++ b/build/x86-msvs/obj_int_extract.bat @@ -10,6 +10,6 @@ echo on REM Arguments: REM %1 - Relative path to the directory containing the vp8 source directory. REM %2 - Path to obj_int_extract.exe. -cl /I "./" /I "%1" /nologo /c "%1/vp8/encoder/vp8_asm_enc_offsets.c" +cl /I. /I%1 /nologo /c "%~1/vp8/encoder/vp8_asm_enc_offsets.c" %2\obj_int_extract.exe rvds "vp8_asm_enc_offsets.obj" > "vp8_asm_enc_offsets.asm" diff --git a/examples.mk b/examples.mk index 946c030cb..ce833fcf0 100644 --- a/examples.mk +++ b/examples.mk @@ -306,6 +306,7 @@ $(1): $($(1:.$(VCPROJ_SFX)=).SRCS) vpx.$(VCPROJ_SFX) --name=$$(@:.$(VCPROJ_SFX)=)\ --ver=$$(CONFIG_VS_VERSION)\ --proj-guid=$$($$(@:.$(VCPROJ_SFX)=).GUID)\ + --src-path-bare="$(SRC_PATH_BARE)" \ $$(if $$(CONFIG_STATIC_MSVCRT),--static-crt) \ --out=$$@ $$(INTERNAL_CFLAGS) $$(CFLAGS) \ $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -l$$(CODEC_LIB) $$^ @@ -222,6 +222,7 @@ obj_int_extract.$(VCPROJ_SFX): $(SRC_PATH_BARE)/build/make/obj_int_extract.c --name=obj_int_extract \ --ver=$(CONFIG_VS_VERSION) \ --proj-guid=E1360C65-D375-4335-8057-7ED99CC3F9B2 \ + --src-path-bare="$(SRC_PATH_BARE)" \ $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \ --out=$@ $^ \ -I. \ @@ -253,6 +254,7 @@ vpx.$(VCPROJ_SFX): $(CODEC_SRCS) vpx.def obj_int_extract.$(VCPROJ_SFX) --proj-guid=DCE19DAF-69AC-46DB-B14A-39F0FAA5DB74 \ --module-def=vpx.def \ --ver=$(CONFIG_VS_VERSION) \ + --src-path-bare="$(SRC_PATH_BARE)" \ --out=$@ $(CFLAGS) \ $(filter-out $(addprefix %, $(ASM_INCLUDES)), $^) \ --src-path-bare="$(SRC_PATH_BARE)" \ @@ -447,6 +449,7 @@ test_libvpx.$(VCPROJ_SFX): $(LIBVPX_TEST_SRCS) vpx.$(VCPROJ_SFX) gtest.$(VCPROJ_ -D_VARIADIC_MAX=10 \ --proj-guid=CD837F5F-52D8-4314-A370-895D614166A7 \ --ver=$(CONFIG_VS_VERSION) \ + --src-path-bare="$(SRC_PATH_BARE)" \ $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \ --out=$@ $(INTERNAL_CFLAGS) $(CFLAGS) \ -I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" \ diff --git a/vp8/encoder/arm/neon/denoising_neon.c b/vp8/encoder/arm/neon/denoising_neon.c index b8e403419..78cc6fa37 100644 --- a/vp8/encoder/arm/neon/denoising_neon.c +++ b/vp8/encoder/arm/neon/denoising_neon.c @@ -68,8 +68,8 @@ int vp8_denoiser_filter_neon(unsigned char *mc_running_avg_y, int64x2_t v_sum_diff_total = vdupq_n_s64(0); /* Go over lines. */ - int i; - for (i = 0; i < 16; ++i) { + int r; + for (r = 0; r < 16; ++r) { /* Load inputs. */ const uint8x16_t v_sig = vld1q_u8(sig); const uint8x16_t v_mc_running_avg_y = vld1q_u8(mc_running_avg_y); @@ -145,14 +145,91 @@ int vp8_denoiser_filter_neon(unsigned char *mc_running_avg_y, /* Too much adjustments => copy block. */ { - const int64x1_t x = vqadd_s64(vget_high_s64(v_sum_diff_total), + int64x1_t x = vqadd_s64(vget_high_s64(v_sum_diff_total), vget_low_s64(v_sum_diff_total)); - const int s0 = vget_lane_s32(vabs_s32(vreinterpret_s32_s64(x)), 0); + int sum_diff = vget_lane_s32(vabs_s32(vreinterpret_s32_s64(x)), 0); int sum_diff_thresh = SUM_DIFF_THRESHOLD; if (increase_denoising) sum_diff_thresh = SUM_DIFF_THRESHOLD_HIGH; - if (s0 > sum_diff_thresh) + if (sum_diff > sum_diff_thresh) { + // Before returning to copy the block (i.e., apply no denoising), + // checK if we can still apply some (weaker) temporal filtering to + // this block, that would otherwise not be denoised at all. Simplest + // is to apply an additional adjustment to running_avg_y to bring it + // closer to sig. The adjustment is capped by a maximum delta, and + // chosen such that in most cases the resulting sum_diff will be + // within the accceptable range given by sum_diff_thresh. + + // The delta is set by the excess of absolute pixel diff over the + // threshold. + int delta = ((sum_diff - sum_diff_thresh) >> 8) + 1; + // Only apply the adjustment for max delta up to 3. + if (delta < 4) { + const uint8x16_t k_delta = vmovq_n_u8(delta); + sig -= sig_stride * 16; + mc_running_avg_y -= mc_running_avg_y_stride * 16; + running_avg_y -= running_avg_y_stride * 16; + for (r = 0; r < 16; ++r) { + uint8x16_t v_running_avg_y = vld1q_u8(running_avg_y); + const uint8x16_t v_sig = vld1q_u8(sig); + const uint8x16_t v_mc_running_avg_y = vld1q_u8(mc_running_avg_y); + + /* Calculate absolute difference and sign masks. */ + const uint8x16_t v_abs_diff = vabdq_u8(v_sig, + v_mc_running_avg_y); + const uint8x16_t v_diff_pos_mask = vcltq_u8(v_sig, + v_mc_running_avg_y); + const uint8x16_t v_diff_neg_mask = vcgtq_u8(v_sig, + v_mc_running_avg_y); + // Clamp absolute difference to delta to get the adjustment. + const uint8x16_t v_abs_adjustment = + vminq_u8(v_abs_diff, (k_delta)); + + const uint8x16_t v_pos_adjustment = vandq_u8(v_diff_pos_mask, + v_abs_adjustment); + const uint8x16_t v_neg_adjustment = vandq_u8(v_diff_neg_mask, + v_abs_adjustment); + + v_running_avg_y = vqsubq_u8(v_running_avg_y, v_pos_adjustment); + v_running_avg_y = vqaddq_u8(v_running_avg_y, v_neg_adjustment); + + /* Store results. */ + vst1q_u8(running_avg_y, v_running_avg_y); + + { + const int8x16_t v_sum_diff = + vqsubq_s8(vreinterpretq_s8_u8(v_neg_adjustment), + vreinterpretq_s8_u8(v_pos_adjustment)); + + const int16x8_t fe_dc_ba_98_76_54_32_10 = + vpaddlq_s8(v_sum_diff); + const int32x4_t fedc_ba98_7654_3210 = + vpaddlq_s16(fe_dc_ba_98_76_54_32_10); + const int64x2_t fedcba98_76543210 = + vpaddlq_s32(fedc_ba98_7654_3210); + + v_sum_diff_total = vqaddq_s64(v_sum_diff_total, + fedcba98_76543210); + } + /* Update pointers for next iteration. */ + sig += sig_stride; + mc_running_avg_y += mc_running_avg_y_stride; + running_avg_y += running_avg_y_stride; + } + { + // Update the sum of all pixel differences of this MB. + x = vqadd_s64(vget_high_s64(v_sum_diff_total), + vget_low_s64(v_sum_diff_total)); + sum_diff = vget_lane_s32(vabs_s32(vreinterpret_s32_s64(x)), 0); + + if (sum_diff > sum_diff_thresh) { + return COPY_BLOCK; + } + } + } else { return COPY_BLOCK; + } + } } /* Tell above level that block was filtered. */ |