diff options
author | Allan Sandfeld Jensen <allan.jensen@theqtcompany.com> | 2016-07-14 17:41:05 +0200 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2016-08-04 12:37:36 +0000 |
commit | 399c965b6064c440ddcf4015f5f8e9d131c7a0a6 (patch) | |
tree | 6b06b60ff365abef0e13b3503d593a0df48d20e8 /chromium/third_party/libvpx | |
parent | 7366110654eec46f21b6824f302356426f48cd74 (diff) | |
download | qtwebengine-chromium-399c965b6064c440ddcf4015f5f8e9d131c7a0a6.tar.gz |
BASELINE: Update Chromium to 52.0.2743.76 and Ninja to 1.7.1
Change-Id: I382f51b959689505a60f8b707255ecb344f7d8b4
Reviewed-by: Michael BrĂ¼ning <michael.bruning@qt.io>
Diffstat (limited to 'chromium/third_party/libvpx')
194 files changed, 4697 insertions, 3604 deletions
diff --git a/chromium/third_party/libvpx/BUILD.gn b/chromium/third_party/libvpx/BUILD.gn index 0ea7345e617..5df461638b2 100644 --- a/chromium/third_party/libvpx/BUILD.gn +++ b/chromium/third_party/libvpx/BUILD.gn @@ -113,97 +113,99 @@ if (current_cpu == "x86" || current_cpu == "x64") { } } -static_library("libvpx_intrinsics_mmx") { - configs += [ ":libvpx_config" ] - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] - configs += [ ":libvpx_warnings" ] - if (!is_win) { - cflags = [ "-mmmx" ] - } - if (current_cpu == "x86") { - sources = libvpx_srcs_x86_mmx - } else if (current_cpu == "x64") { - sources = libvpx_srcs_x86_64_mmx +if (current_cpu == "x86" || current_cpu == "x64") { + static_library("libvpx_intrinsics_mmx") { + configs += [ ":libvpx_config" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":libvpx_warnings" ] + if (!is_win) { + cflags = [ "-mmmx" ] + } + if (current_cpu == "x86") { + sources = libvpx_srcs_x86_mmx + } else if (current_cpu == "x64") { + sources = libvpx_srcs_x86_64_mmx + } } -} -static_library("libvpx_intrinsics_sse2") { - configs += [ ":libvpx_config" ] - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] - configs += [ ":libvpx_warnings" ] - if (!is_win || is_clang) { - cflags = [ "-msse2" ] - } - if (current_cpu == "x86") { - sources = libvpx_srcs_x86_sse2 - } else if (current_cpu == "x64") { - sources = libvpx_srcs_x86_64_sse2 + static_library("libvpx_intrinsics_sse2") { + configs += [ ":libvpx_config" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":libvpx_warnings" ] + if (!is_win || is_clang) { + cflags = [ "-msse2" ] + } + if (current_cpu == "x86") { + sources = libvpx_srcs_x86_sse2 + } else if (current_cpu == "x64") { + sources = libvpx_srcs_x86_64_sse2 + } } -} -static_library("libvpx_intrinsics_ssse3") { - configs += [ ":libvpx_config" ] - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] - configs += [ ":libvpx_warnings" ] - if (!is_win || is_clang) { - cflags = [ "-mssse3" ] - } - if (current_cpu == "x86") { - sources = libvpx_srcs_x86_ssse3 - } else if (current_cpu == "x64") { - sources = libvpx_srcs_x86_64_ssse3 + static_library("libvpx_intrinsics_ssse3") { + configs += [ ":libvpx_config" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":libvpx_warnings" ] + if (!is_win || is_clang) { + cflags = [ "-mssse3" ] + } + if (current_cpu == "x86") { + sources = libvpx_srcs_x86_ssse3 + } else if (current_cpu == "x64") { + sources = libvpx_srcs_x86_64_ssse3 + } } -} -static_library("libvpx_intrinsics_sse4_1") { - configs += [ ":libvpx_config" ] - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] - configs += [ ":libvpx_warnings" ] - if (!is_win || is_clang) { - cflags = [ "-msse4.1" ] - } - if (current_cpu == "x86") { - sources = libvpx_srcs_x86_sse4_1 - } else if (current_cpu == "x64") { - sources = libvpx_srcs_x86_64_sse4_1 + static_library("libvpx_intrinsics_sse4_1") { + configs += [ ":libvpx_config" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":libvpx_warnings" ] + if (!is_win || is_clang) { + cflags = [ "-msse4.1" ] + } + if (current_cpu == "x86") { + sources = libvpx_srcs_x86_sse4_1 + } else if (current_cpu == "x64") { + sources = libvpx_srcs_x86_64_sse4_1 + } } -} -static_library("libvpx_intrinsics_avx") { - configs += [ ":libvpx_config" ] - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] - configs += [ ":libvpx_warnings" ] - if (is_win) { - cflags = [ "/arch:AVX" ] - } else { - cflags = [ "-mavx" ] - } - if (current_cpu == "x86") { - sources = libvpx_srcs_x86_avx - } else if (current_cpu == "x64") { - sources = libvpx_srcs_x86_64_avx + static_library("libvpx_intrinsics_avx") { + configs += [ ":libvpx_config" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":libvpx_warnings" ] + if (is_win) { + cflags = [ "/arch:AVX" ] + } else { + cflags = [ "-mavx" ] + } + if (current_cpu == "x86") { + sources = libvpx_srcs_x86_avx + } else if (current_cpu == "x64") { + sources = libvpx_srcs_x86_64_avx + } } -} -static_library("libvpx_intrinsics_avx2") { - configs += [ ":libvpx_config" ] - configs -= [ "//build/config/compiler:chromium_code" ] - configs += [ "//build/config/compiler:no_chromium_code" ] - configs += [ ":libvpx_warnings" ] - if (is_win) { - cflags = [ "/arch:AVX2" ] - } else { - cflags = [ "-mavx2" ] - } - if (current_cpu == "x86") { - sources = libvpx_srcs_x86_avx2 - } else if (current_cpu == "x64") { - sources = libvpx_srcs_x86_64_avx2 + static_library("libvpx_intrinsics_avx2") { + configs += [ ":libvpx_config" ] + configs -= [ "//build/config/compiler:chromium_code" ] + configs += [ "//build/config/compiler:no_chromium_code" ] + configs += [ ":libvpx_warnings" ] + if (is_win) { + cflags = [ "/arch:AVX2" ] + } else { + cflags = [ "-mavx2" ] + } + if (current_cpu == "x86") { + sources = libvpx_srcs_x86_avx2 + } else if (current_cpu == "x64") { + sources = libvpx_srcs_x86_64_avx2 + } } } @@ -272,7 +274,7 @@ static_library("libvpx") { } else { sources = libvpx_srcs_x86_64 } - } else if (current_cpu == "mipsel") { + } else if (current_cpu == "mipsel" || current_cpu == "mips64el") { sources = libvpx_srcs_mips } else if (current_cpu == "arm") { if (arm_use_neon) { diff --git a/chromium/third_party/libvpx/README.chromium b/chromium/third_party/libvpx/README.chromium index e30eda8522b..1eb2b819f27 100644 --- a/chromium/third_party/libvpx/README.chromium +++ b/chromium/third_party/libvpx/README.chromium @@ -5,9 +5,9 @@ License: BSD License File: source/libvpx/LICENSE Security Critical: yes -Date: Tuesday March 29 2016 +Date: Tuesday May 10 2016 Branch: master -Commit: 904cb53302dfebee4a0d795ad6ccebdd5da5f542 +Commit: 57566ff24adbf8109414ea908585cc5edec3ac70 Description: Contains the sources used to compile libvpx binaries used by Google Chrome and diff --git a/chromium/third_party/libvpx/libvpx_srcs.gni b/chromium/third_party/libvpx/libvpx_srcs.gni index c8d157a681c..d602aa753cd 100644 --- a/chromium/third_party/libvpx/libvpx_srcs.gni +++ b/chromium/third_party/libvpx/libvpx_srcs.gni @@ -281,6 +281,7 @@ libvpx_srcs_x86 = [ "//third_party/libvpx/source/libvpx/vpx/vpx_frame_buffer.h", "//third_party/libvpx/source/libvpx/vpx/vpx_image.h", "//third_party/libvpx/source/libvpx/vpx/vpx_integer.h", + "//third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c", "//third_party/libvpx/source/libvpx/vpx_dsp/avg.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.h", @@ -370,6 +371,8 @@ libvpx_srcs_x86_assembly = [ "//third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_dct_mmx.asm", "//third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_error_sse2.asm", "//third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_temporal_filter_apply_sse2.asm", + "//third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_mmx.asm", + "//third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_sse2.asm", "//third_party/libvpx/source/libvpx/vpx_dsp/x86/halfpix_variance_impl_sse2.asm", "//third_party/libvpx/source/libvpx/vpx_dsp/x86/intrapred_sse2.asm", "//third_party/libvpx/source/libvpx/vpx_dsp/x86/intrapred_ssse3.asm", @@ -712,6 +715,7 @@ libvpx_srcs_x86_64 = [ "//third_party/libvpx/source/libvpx/vpx/vpx_frame_buffer.h", "//third_party/libvpx/source/libvpx/vpx/vpx_image.h", "//third_party/libvpx/source/libvpx/vpx/vpx_integer.h", + "//third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c", "//third_party/libvpx/source/libvpx/vpx_dsp/avg.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.h", @@ -803,6 +807,8 @@ libvpx_srcs_x86_64_assembly = [ "//third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_error_sse2.asm", "//third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_quantize_ssse3_x86_64.asm", "//third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_temporal_filter_apply_sse2.asm", + "//third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_mmx.asm", + "//third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_sse2.asm", "//third_party/libvpx/source/libvpx/vpx_dsp/x86/avg_ssse3_x86_64.asm", "//third_party/libvpx/source/libvpx/vpx_dsp/x86/fwd_txfm_ssse3_x86_64.asm", "//third_party/libvpx/source/libvpx/vpx_dsp/x86/halfpix_variance_impl_sse2.asm", @@ -1154,6 +1160,7 @@ libvpx_srcs_arm = [ "//third_party/libvpx/source/libvpx/vpx/vpx_frame_buffer.h", "//third_party/libvpx/source/libvpx/vpx/vpx_image.h", "//third_party/libvpx/source/libvpx/vpx/vpx_integer.h", + "//third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c", "//third_party/libvpx/source/libvpx/vpx_dsp/arm/subpel_variance_media.c", "//third_party/libvpx/source/libvpx/vpx_dsp/avg.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c", @@ -1537,6 +1544,7 @@ libvpx_srcs_arm_neon = [ "//third_party/libvpx/source/libvpx/vpx/vpx_frame_buffer.h", "//third_party/libvpx/source/libvpx/vpx/vpx_image.h", "//third_party/libvpx/source/libvpx/vpx/vpx_integer.h", + "//third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c", "//third_party/libvpx/source/libvpx/vpx_dsp/arm/avg_neon.c", "//third_party/libvpx/source/libvpx/vpx_dsp/arm/fwd_txfm_neon.c", "//third_party/libvpx/source/libvpx/vpx_dsp/arm/idct16x16_neon.c", @@ -1925,6 +1933,7 @@ libvpx_srcs_arm_neon_cpu_detect = [ "//third_party/libvpx/source/libvpx/vpx/vpx_frame_buffer.h", "//third_party/libvpx/source/libvpx/vpx/vpx_image.h", "//third_party/libvpx/source/libvpx/vpx/vpx_integer.h", + "//third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c", "//third_party/libvpx/source/libvpx/vpx_dsp/arm/subpel_variance_media.c", "//third_party/libvpx/source/libvpx/vpx_dsp/avg.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c", @@ -2360,6 +2369,7 @@ libvpx_srcs_arm64 = [ "//third_party/libvpx/source/libvpx/vpx/vpx_frame_buffer.h", "//third_party/libvpx/source/libvpx/vpx/vpx_image.h", "//third_party/libvpx/source/libvpx/vpx/vpx_integer.h", + "//third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c", "//third_party/libvpx/source/libvpx/vpx_dsp/arm/avg_neon.c", "//third_party/libvpx/source/libvpx/vpx_dsp/arm/fwd_txfm_neon.c", "//third_party/libvpx/source/libvpx/vpx_dsp/arm/idct16x16_1_add_neon.c", @@ -2717,6 +2727,7 @@ libvpx_srcs_mips = [ "//third_party/libvpx/source/libvpx/vpx/vpx_frame_buffer.h", "//third_party/libvpx/source/libvpx/vpx/vpx_image.h", "//third_party/libvpx/source/libvpx/vpx/vpx_integer.h", + "//third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c", "//third_party/libvpx/source/libvpx/vpx_dsp/avg.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.h", @@ -3044,6 +3055,7 @@ libvpx_srcs_nacl = [ "//third_party/libvpx/source/libvpx/vpx/vpx_frame_buffer.h", "//third_party/libvpx/source/libvpx/vpx/vpx_image.h", "//third_party/libvpx/source/libvpx/vpx/vpx_integer.h", + "//third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c", "//third_party/libvpx/source/libvpx/vpx_dsp/avg.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.h", @@ -3371,6 +3383,7 @@ libvpx_srcs_generic = [ "//third_party/libvpx/source/libvpx/vpx/vpx_frame_buffer.h", "//third_party/libvpx/source/libvpx/vpx/vpx_image.h", "//third_party/libvpx/source/libvpx/vpx/vpx_integer.h", + "//third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c", "//third_party/libvpx/source/libvpx/vpx_dsp/avg.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c", "//third_party/libvpx/source/libvpx/vpx_dsp/bitreader.h", diff --git a/chromium/third_party/libvpx/libvpx_srcs_arm.gypi b/chromium/third_party/libvpx/libvpx_srcs_arm.gypi index a9c076b25f0..19728c1498a 100644 --- a/chromium/third_party/libvpx/libvpx_srcs_arm.gypi +++ b/chromium/third_party/libvpx/libvpx_srcs_arm.gypi @@ -300,6 +300,7 @@ '<(libvpx_source)/vpx/vpx_frame_buffer.h', '<(libvpx_source)/vpx/vpx_image.h', '<(libvpx_source)/vpx/vpx_integer.h', + '<(libvpx_source)/vpx_dsp/add_noise.c', '<(libvpx_source)/vpx_dsp/arm/bilinear_filter_media.asm', '<(libvpx_source)/vpx_dsp/arm/sad_media.asm', '<(libvpx_source)/vpx_dsp/arm/subpel_variance_media.c', diff --git a/chromium/third_party/libvpx/libvpx_srcs_arm64.gypi b/chromium/third_party/libvpx/libvpx_srcs_arm64.gypi index 8102e43bbee..044f91c335c 100644 --- a/chromium/third_party/libvpx/libvpx_srcs_arm64.gypi +++ b/chromium/third_party/libvpx/libvpx_srcs_arm64.gypi @@ -306,6 +306,7 @@ '<(libvpx_source)/vpx/vpx_frame_buffer.h', '<(libvpx_source)/vpx/vpx_image.h', '<(libvpx_source)/vpx/vpx_integer.h', + '<(libvpx_source)/vpx_dsp/add_noise.c', '<(libvpx_source)/vpx_dsp/arm/avg_neon.c', '<(libvpx_source)/vpx_dsp/arm/fwd_txfm_neon.c', '<(libvpx_source)/vpx_dsp/arm/idct16x16_1_add_neon.c', diff --git a/chromium/third_party/libvpx/libvpx_srcs_arm_neon.gypi b/chromium/third_party/libvpx/libvpx_srcs_arm_neon.gypi index d22fab2d46c..402bf8b9b36 100644 --- a/chromium/third_party/libvpx/libvpx_srcs_arm_neon.gypi +++ b/chromium/third_party/libvpx/libvpx_srcs_arm_neon.gypi @@ -324,6 +324,7 @@ '<(libvpx_source)/vpx/vpx_frame_buffer.h', '<(libvpx_source)/vpx/vpx_image.h', '<(libvpx_source)/vpx/vpx_integer.h', + '<(libvpx_source)/vpx_dsp/add_noise.c', '<(libvpx_source)/vpx_dsp/arm/avg_neon.c', '<(libvpx_source)/vpx_dsp/arm/bilinear_filter_media.asm', '<(libvpx_source)/vpx_dsp/arm/fwd_txfm_neon.c', diff --git a/chromium/third_party/libvpx/libvpx_srcs_arm_neon_cpu_detect.gypi b/chromium/third_party/libvpx/libvpx_srcs_arm_neon_cpu_detect.gypi index a9c076b25f0..19728c1498a 100644 --- a/chromium/third_party/libvpx/libvpx_srcs_arm_neon_cpu_detect.gypi +++ b/chromium/third_party/libvpx/libvpx_srcs_arm_neon_cpu_detect.gypi @@ -300,6 +300,7 @@ '<(libvpx_source)/vpx/vpx_frame_buffer.h', '<(libvpx_source)/vpx/vpx_image.h', '<(libvpx_source)/vpx/vpx_integer.h', + '<(libvpx_source)/vpx_dsp/add_noise.c', '<(libvpx_source)/vpx_dsp/arm/bilinear_filter_media.asm', '<(libvpx_source)/vpx_dsp/arm/sad_media.asm', '<(libvpx_source)/vpx_dsp/arm/subpel_variance_media.c', diff --git a/chromium/third_party/libvpx/libvpx_srcs_generic.gypi b/chromium/third_party/libvpx/libvpx_srcs_generic.gypi index 4166c2f2c9f..5cb451bbafa 100644 --- a/chromium/third_party/libvpx/libvpx_srcs_generic.gypi +++ b/chromium/third_party/libvpx/libvpx_srcs_generic.gypi @@ -278,6 +278,7 @@ '<(libvpx_source)/vpx/vpx_frame_buffer.h', '<(libvpx_source)/vpx/vpx_image.h', '<(libvpx_source)/vpx/vpx_integer.h', + '<(libvpx_source)/vpx_dsp/add_noise.c', '<(libvpx_source)/vpx_dsp/avg.c', '<(libvpx_source)/vpx_dsp/bitreader.c', '<(libvpx_source)/vpx_dsp/bitreader.h', diff --git a/chromium/third_party/libvpx/libvpx_srcs_mips.gypi b/chromium/third_party/libvpx/libvpx_srcs_mips.gypi index 6798714539f..1e37a0a5bd8 100644 --- a/chromium/third_party/libvpx/libvpx_srcs_mips.gypi +++ b/chromium/third_party/libvpx/libvpx_srcs_mips.gypi @@ -280,6 +280,7 @@ '<(libvpx_source)/vpx/vpx_frame_buffer.h', '<(libvpx_source)/vpx/vpx_image.h', '<(libvpx_source)/vpx/vpx_integer.h', + '<(libvpx_source)/vpx_dsp/add_noise.c', '<(libvpx_source)/vpx_dsp/avg.c', '<(libvpx_source)/vpx_dsp/bitreader.c', '<(libvpx_source)/vpx_dsp/bitreader.h', diff --git a/chromium/third_party/libvpx/libvpx_srcs_nacl.gypi b/chromium/third_party/libvpx/libvpx_srcs_nacl.gypi index 4166c2f2c9f..5cb451bbafa 100644 --- a/chromium/third_party/libvpx/libvpx_srcs_nacl.gypi +++ b/chromium/third_party/libvpx/libvpx_srcs_nacl.gypi @@ -278,6 +278,7 @@ '<(libvpx_source)/vpx/vpx_frame_buffer.h', '<(libvpx_source)/vpx/vpx_image.h', '<(libvpx_source)/vpx/vpx_integer.h', + '<(libvpx_source)/vpx_dsp/add_noise.c', '<(libvpx_source)/vpx_dsp/avg.c', '<(libvpx_source)/vpx_dsp/bitreader.c', '<(libvpx_source)/vpx_dsp/bitreader.h', diff --git a/chromium/third_party/libvpx/libvpx_srcs_x86.gypi b/chromium/third_party/libvpx/libvpx_srcs_x86.gypi index a63eb25e8f5..deabc28989e 100644 --- a/chromium/third_party/libvpx/libvpx_srcs_x86.gypi +++ b/chromium/third_party/libvpx/libvpx_srcs_x86.gypi @@ -309,6 +309,7 @@ '<(libvpx_source)/vpx/vpx_frame_buffer.h', '<(libvpx_source)/vpx/vpx_image.h', '<(libvpx_source)/vpx/vpx_integer.h', + '<(libvpx_source)/vpx_dsp/add_noise.c', '<(libvpx_source)/vpx_dsp/avg.c', '<(libvpx_source)/vpx_dsp/bitreader.c', '<(libvpx_source)/vpx_dsp/bitreader.h', @@ -338,6 +339,8 @@ '<(libvpx_source)/vpx_dsp/vpx_dsp_common.h', '<(libvpx_source)/vpx_dsp/vpx_dsp_rtcd.c', '<(libvpx_source)/vpx_dsp/vpx_filter.h', + '<(libvpx_source)/vpx_dsp/x86/add_noise_mmx.asm', + '<(libvpx_source)/vpx_dsp/x86/add_noise_sse2.asm', '<(libvpx_source)/vpx_dsp/x86/convolve.h', '<(libvpx_source)/vpx_dsp/x86/fwd_dct32x32_impl_avx2.h', '<(libvpx_source)/vpx_dsp/x86/fwd_dct32x32_impl_sse2.h', diff --git a/chromium/third_party/libvpx/libvpx_srcs_x86_64.gypi b/chromium/third_party/libvpx/libvpx_srcs_x86_64.gypi index 8fa564a19ab..56dafec688b 100644 --- a/chromium/third_party/libvpx/libvpx_srcs_x86_64.gypi +++ b/chromium/third_party/libvpx/libvpx_srcs_x86_64.gypi @@ -311,6 +311,7 @@ '<(libvpx_source)/vpx/vpx_frame_buffer.h', '<(libvpx_source)/vpx/vpx_image.h', '<(libvpx_source)/vpx/vpx_integer.h', + '<(libvpx_source)/vpx_dsp/add_noise.c', '<(libvpx_source)/vpx_dsp/avg.c', '<(libvpx_source)/vpx_dsp/bitreader.c', '<(libvpx_source)/vpx_dsp/bitreader.h', @@ -340,6 +341,8 @@ '<(libvpx_source)/vpx_dsp/vpx_dsp_common.h', '<(libvpx_source)/vpx_dsp/vpx_dsp_rtcd.c', '<(libvpx_source)/vpx_dsp/vpx_filter.h', + '<(libvpx_source)/vpx_dsp/x86/add_noise_mmx.asm', + '<(libvpx_source)/vpx_dsp/x86/add_noise_sse2.asm', '<(libvpx_source)/vpx_dsp/x86/avg_ssse3_x86_64.asm', '<(libvpx_source)/vpx_dsp/x86/convolve.h', '<(libvpx_source)/vpx_dsp/x86/fwd_dct32x32_impl_avx2.h', diff --git a/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp8_rtcd.h index c8b17ecaeb9..e5ed775baa6 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp8_rtcd.h @@ -179,9 +179,6 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols,in int vp8_mbuverror_c(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_c -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_c - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_c diff --git a/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp9_rtcd.h index ef2d895269a..d83709de63e 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vp9_rtcd.h @@ -84,9 +84,6 @@ void vp9_mbpost_proc_across_ip_c(uint8_t *src, int pitch, int rows, int cols, in void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_c -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_c - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_c diff --git a/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_dsp_rtcd.h index 7680d3a2288..f79818911e0 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm-neon-cpu-detect/vpx_dsp_rtcd.h @@ -301,10 +301,10 @@ void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); RTCD_EXTERN void (*vpx_h_predictor_8x8)(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_c -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_8x8 vpx_hadamard_8x8_c void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); @@ -358,13 +358,13 @@ void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_strid void vpx_idct8x8_64_add_neon(const tran_low_t *input, uint8_t *dest, int dest_stride); RTCD_EXTERN void (*vpx_idct8x8_64_add)(const tran_low_t *input, uint8_t *dest, int dest_stride); -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); -int16_t vpx_int_pro_col_neon(uint8_t const *ref, const int width); -RTCD_EXTERN int16_t (*vpx_int_pro_col)(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); +int16_t vpx_int_pro_col_neon(const uint8_t *ref, const int width); +RTCD_EXTERN int16_t (*vpx_int_pro_col)(const uint8_t *ref, const int width); -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -void vpx_int_pro_row_neon(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -RTCD_EXTERN void (*vpx_int_pro_row)(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +void vpx_int_pro_row_neon(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +RTCD_EXTERN void (*vpx_int_pro_row)(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); #define vpx_iwht4x4_16_add vpx_iwht4x4_16_add_c @@ -421,7 +421,8 @@ void vpx_lpf_vertical_8_dual_neon(uint8_t *s, int pitch, const uint8_t *blimit0, RTCD_EXTERN void (*vpx_lpf_vertical_8_dual)(uint8_t *s, int pitch, const uint8_t *blimit0, const uint8_t *limit0, const uint8_t *thresh0, const uint8_t *blimit1, const uint8_t *limit1, const uint8_t *thresh1); void vpx_minmax_8x8_c(const uint8_t *s, int p, const uint8_t *d, int dp, int *min, int *max); -#define vpx_minmax_8x8 vpx_minmax_8x8_c +void vpx_minmax_8x8_neon(const uint8_t *s, int p, const uint8_t *d, int dp, int *min, int *max); +RTCD_EXTERN void (*vpx_minmax_8x8)(const uint8_t *s, int p, const uint8_t *d, int dp, int *min, int *max); unsigned int vpx_mse16x16_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); unsigned int vpx_mse16x16_media(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); @@ -437,6 +438,9 @@ unsigned int vpx_mse8x16_c(const uint8_t *src_ptr, int source_stride, const uin unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_c +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_c + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); #define vpx_quantize_b vpx_quantize_b_c @@ -825,9 +829,9 @@ uint32_t vpx_variance_halfpixvar16x16_v_media(const unsigned char *src_ptr, int void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); -int vpx_vector_var_neon(int16_t const *ref, int16_t const *src, const int bwl); -RTCD_EXTERN int (*vpx_vector_var)(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); +int vpx_vector_var_neon(const int16_t *ref, const int16_t *src, const int bwl); +RTCD_EXTERN int (*vpx_vector_var)(const int16_t *ref, const int16_t *src, const int bwl); void vpx_dsp_rtcd(void); @@ -971,6 +975,8 @@ static void setup_rtcd_internal(void) if (flags & HAS_NEON) vpx_lpf_vertical_8 = vpx_lpf_vertical_8_neon; vpx_lpf_vertical_8_dual = vpx_lpf_vertical_8_dual_c; if (flags & HAS_NEON) vpx_lpf_vertical_8_dual = vpx_lpf_vertical_8_dual_neon; + vpx_minmax_8x8 = vpx_minmax_8x8_c; + if (flags & HAS_NEON) vpx_minmax_8x8 = vpx_minmax_8x8_neon; vpx_mse16x16 = vpx_mse16x16_media; if (flags & HAS_NEON) vpx_mse16x16 = vpx_mse16x16_neon; vpx_sad16x16 = vpx_sad16x16_media; diff --git a/chromium/third_party/libvpx/source/config/linux/arm-neon/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm-neon/vp8_rtcd.h index 4fba7a73b32..5b23d03feb6 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm-neon/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm-neon/vp8_rtcd.h @@ -179,9 +179,6 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols,in int vp8_mbuverror_c(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_c -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_c - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_c diff --git a/chromium/third_party/libvpx/source/config/linux/arm-neon/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm-neon/vp9_rtcd.h index d7df75a18ee..55280518647 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm-neon/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm-neon/vp9_rtcd.h @@ -84,9 +84,6 @@ void vp9_mbpost_proc_across_ip_c(uint8_t *src, int pitch, int rows, int cols, in void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_c -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_c - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_c diff --git a/chromium/third_party/libvpx/source/config/linux/arm-neon/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm-neon/vpx_dsp_rtcd.h index 30233f9dc5c..0264e1729ae 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm-neon/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm-neon/vpx_dsp_rtcd.h @@ -301,10 +301,10 @@ void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_neon -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_c -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_8x8 vpx_hadamard_8x8_c void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); @@ -358,12 +358,12 @@ void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_strid void vpx_idct8x8_64_add_neon(const tran_low_t *input, uint8_t *dest, int dest_stride); #define vpx_idct8x8_64_add vpx_idct8x8_64_add_neon -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); -int16_t vpx_int_pro_col_neon(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); +int16_t vpx_int_pro_col_neon(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_neon -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -void vpx_int_pro_row_neon(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +void vpx_int_pro_row_neon(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_neon void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -421,7 +421,8 @@ void vpx_lpf_vertical_8_dual_neon(uint8_t *s, int pitch, const uint8_t *blimit0, #define vpx_lpf_vertical_8_dual vpx_lpf_vertical_8_dual_neon void vpx_minmax_8x8_c(const uint8_t *s, int p, const uint8_t *d, int dp, int *min, int *max); -#define vpx_minmax_8x8 vpx_minmax_8x8_c +void vpx_minmax_8x8_neon(const uint8_t *s, int p, const uint8_t *d, int dp, int *min, int *max); +#define vpx_minmax_8x8 vpx_minmax_8x8_neon unsigned int vpx_mse16x16_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); unsigned int vpx_mse16x16_media(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); @@ -437,6 +438,9 @@ unsigned int vpx_mse8x16_c(const uint8_t *src_ptr, int source_stride, const uin unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_c +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_c + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); #define vpx_quantize_b vpx_quantize_b_c @@ -825,8 +829,8 @@ uint32_t vpx_variance_halfpixvar16x16_v_media(const unsigned char *src_ptr, int void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); -int vpx_vector_var_neon(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); +int vpx_vector_var_neon(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_neon void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/config/linux/arm/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm/vp8_rtcd.h index 20783d4ab50..e45ae234baa 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm/vp8_rtcd.h @@ -157,9 +157,6 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols,in int vp8_mbuverror_c(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_c -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_c - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_c diff --git a/chromium/third_party/libvpx/source/config/linux/arm/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm/vp9_rtcd.h index 3d90ad3f3c1..66f57119789 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm/vp9_rtcd.h @@ -80,9 +80,6 @@ void vp9_mbpost_proc_across_ip_c(uint8_t *src, int pitch, int rows, int cols, in void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_c -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_c - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_c diff --git a/chromium/third_party/libvpx/source/config/linux/arm/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm/vpx_dsp_rtcd.h index b83359bda72..af98ff07e0d 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm/vpx_dsp_rtcd.h @@ -262,10 +262,10 @@ void vpx_h_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_c -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_c -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_8x8 vpx_hadamard_8x8_c void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); @@ -307,10 +307,10 @@ void vpx_idct8x8_1_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); #define vpx_idct8x8_64_add vpx_idct8x8_64_add_c -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_c -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_c void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -371,6 +371,9 @@ unsigned int vpx_mse8x16_c(const uint8_t *src_ptr, int source_stride, const uin unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_c +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_c + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); #define vpx_quantize_b vpx_quantize_b_c @@ -727,7 +730,7 @@ uint32_t vpx_variance_halfpixvar16x16_v_media(const unsigned char *src_ptr, int void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_c void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/config/linux/arm64/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm64/vp8_rtcd.h index 0d421b69df3..18ad3eb5b4d 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm64/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm64/vp8_rtcd.h @@ -159,9 +159,6 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols,in int vp8_mbuverror_c(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_c -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_c - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_c diff --git a/chromium/third_party/libvpx/source/config/linux/arm64/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm64/vp9_rtcd.h index d7df75a18ee..55280518647 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm64/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm64/vp9_rtcd.h @@ -84,9 +84,6 @@ void vp9_mbpost_proc_across_ip_c(uint8_t *src, int pitch, int rows, int cols, in void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_c -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_c - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_c diff --git a/chromium/third_party/libvpx/source/config/linux/arm64/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/linux/arm64/vpx_dsp_rtcd.h index 122debdafbb..8c1522c9776 100644 --- a/chromium/third_party/libvpx/source/config/linux/arm64/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/arm64/vpx_dsp_rtcd.h @@ -301,10 +301,10 @@ void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_neon(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_neon -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_c -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_8x8 vpx_hadamard_8x8_c void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); @@ -335,7 +335,8 @@ void vpx_idct32x32_1_add_neon(const tran_low_t *input, uint8_t *dest, int dest_s #define vpx_idct32x32_1_add vpx_idct32x32_1_add_neon void vpx_idct32x32_34_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); -#define vpx_idct32x32_34_add vpx_idct32x32_34_add_c +void vpx_idct32x32_1024_add_neon(const tran_low_t *input, uint8_t *dest, int dest_stride); +#define vpx_idct32x32_34_add vpx_idct32x32_1024_add_neon void vpx_idct4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); void vpx_idct4x4_16_add_neon(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -357,12 +358,12 @@ void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_strid void vpx_idct8x8_64_add_neon(const tran_low_t *input, uint8_t *dest, int dest_stride); #define vpx_idct8x8_64_add vpx_idct8x8_64_add_neon -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); -int16_t vpx_int_pro_col_neon(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); +int16_t vpx_int_pro_col_neon(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_neon -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -void vpx_int_pro_row_neon(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +void vpx_int_pro_row_neon(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_neon void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -414,7 +415,8 @@ void vpx_lpf_vertical_8_dual_c(uint8_t *s, int pitch, const uint8_t *blimit0, co #define vpx_lpf_vertical_8_dual vpx_lpf_vertical_8_dual_c void vpx_minmax_8x8_c(const uint8_t *s, int p, const uint8_t *d, int dp, int *min, int *max); -#define vpx_minmax_8x8 vpx_minmax_8x8_c +void vpx_minmax_8x8_neon(const uint8_t *s, int p, const uint8_t *d, int dp, int *min, int *max); +#define vpx_minmax_8x8 vpx_minmax_8x8_neon unsigned int vpx_mse16x16_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); unsigned int vpx_mse16x16_neon(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); @@ -429,6 +431,9 @@ unsigned int vpx_mse8x16_c(const uint8_t *src_ptr, int source_stride, const uin unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_c +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_c + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); #define vpx_quantize_b vpx_quantize_b_c @@ -809,8 +814,8 @@ uint32_t vpx_variance_halfpixvar16x16_v_c(const unsigned char *src_ptr, int sour void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); -int vpx_vector_var_neon(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); +int vpx_vector_var_neon(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_neon void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/config/linux/generic/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/linux/generic/vp8_rtcd.h index 1697a302be8..38c697f793b 100644 --- a/chromium/third_party/libvpx/source/config/linux/generic/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/generic/vp8_rtcd.h @@ -137,9 +137,6 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols,in int vp8_mbuverror_c(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_c -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_c - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_c diff --git a/chromium/third_party/libvpx/source/config/linux/generic/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/linux/generic/vp9_rtcd.h index 5e16ee1ebae..4af2ce2c4ae 100644 --- a/chromium/third_party/libvpx/source/config/linux/generic/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/generic/vp9_rtcd.h @@ -80,9 +80,6 @@ void vp9_mbpost_proc_across_ip_c(uint8_t *src, int pitch, int rows, int cols, in void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_c -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_c - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_c diff --git a/chromium/third_party/libvpx/source/config/linux/generic/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/linux/generic/vpx_dsp_rtcd.h index b76c67a8972..92ebd9ae5a8 100644 --- a/chromium/third_party/libvpx/source/config/linux/generic/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/generic/vpx_dsp_rtcd.h @@ -262,10 +262,10 @@ void vpx_h_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_c -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_c -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_8x8 vpx_hadamard_8x8_c void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); @@ -307,10 +307,10 @@ void vpx_idct8x8_1_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); #define vpx_idct8x8_64_add vpx_idct8x8_64_add_c -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_c -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_c void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -370,6 +370,9 @@ unsigned int vpx_mse8x16_c(const uint8_t *src_ptr, int source_stride, const uin unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_c +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_c + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); #define vpx_quantize_b vpx_quantize_b_c @@ -718,7 +721,7 @@ uint32_t vpx_variance_halfpixvar16x16_v_c(const unsigned char *src_ptr, int sour void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_c void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/config/linux/ia32/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/linux/ia32/vp8_rtcd.h index affac11003d..d3317dd0eaa 100644 --- a/chromium/third_party/libvpx/source/config/linux/ia32/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/ia32/vp8_rtcd.h @@ -196,11 +196,6 @@ int vp8_mbuverror_mmx(struct macroblock *mb); int vp8_mbuverror_xmm(struct macroblock *mb); RTCD_EXTERN int (*vp8_mbuverror)(struct macroblock *mb); -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_mmx(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_wmt(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -RTCD_EXTERN void (*vp8_plane_add_noise)(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); void vp8_post_proc_down_and_across_mb_row_sse2(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); RTCD_EXTERN void (*vp8_post_proc_down_and_across_mb_row)(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); @@ -363,9 +358,6 @@ static void setup_rtcd_internal(void) vp8_mbuverror = vp8_mbuverror_c; if (flags & HAS_MMX) vp8_mbuverror = vp8_mbuverror_mmx; if (flags & HAS_SSE2) vp8_mbuverror = vp8_mbuverror_xmm; - vp8_plane_add_noise = vp8_plane_add_noise_c; - if (flags & HAS_MMX) vp8_plane_add_noise = vp8_plane_add_noise_mmx; - if (flags & HAS_SSE2) vp8_plane_add_noise = vp8_plane_add_noise_wmt; vp8_post_proc_down_and_across_mb_row = vp8_post_proc_down_and_across_mb_row_c; if (flags & HAS_SSE2) vp8_post_proc_down_and_across_mb_row = vp8_post_proc_down_and_across_mb_row_sse2; vp8_refining_search_sad = vp8_refining_search_sad_c; diff --git a/chromium/third_party/libvpx/source/config/linux/ia32/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/linux/ia32/vp9_rtcd.h index 2882a9f447f..a36dd653bf9 100644 --- a/chromium/third_party/libvpx/source/config/linux/ia32/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/ia32/vp9_rtcd.h @@ -43,8 +43,7 @@ int vp9_denoiser_filter_sse2(const uint8_t *sig, int sig_stride, const uint8_t * RTCD_EXTERN int (*vp9_denoiser_filter)(const uint8_t *sig, int sig_stride, const uint8_t *mc_avg, int mc_avg_stride, uint8_t *avg, int avg_stride, int increase_denoising, BLOCK_SIZE bs, int motion_magnitude); int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +#define vp9_diamond_search_sad vp9_diamond_search_sad_c void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -100,10 +99,6 @@ void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int fli void vp9_mbpost_proc_down_xmm(uint8_t *dst, int pitch, int rows, int cols, int flimit); RTCD_EXTERN void (*vp9_mbpost_proc_down)(uint8_t *dst, int pitch, int rows, int cols, int flimit); -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -void vp9_plane_add_noise_wmt(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -RTCD_EXTERN void (*vp9_plane_add_noise)(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); void vp9_post_proc_down_and_across_xmm(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); RTCD_EXTERN void (*vp9_post_proc_down_and_across)(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); @@ -140,8 +135,6 @@ static void setup_rtcd_internal(void) if (flags & HAS_SSE2) vp9_block_error_fp = vp9_block_error_fp_sse2; vp9_denoiser_filter = vp9_denoiser_filter_c; if (flags & HAS_SSE2) vp9_denoiser_filter = vp9_denoiser_filter_sse2; - vp9_diamond_search_sad = vp9_diamond_search_sad_c; - if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_c; if (flags & HAS_SSE2) vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3; @@ -170,8 +163,6 @@ static void setup_rtcd_internal(void) if (flags & HAS_SSE2) vp9_mbpost_proc_across_ip = vp9_mbpost_proc_across_ip_xmm; vp9_mbpost_proc_down = vp9_mbpost_proc_down_c; if (flags & HAS_SSE2) vp9_mbpost_proc_down = vp9_mbpost_proc_down_xmm; - vp9_plane_add_noise = vp9_plane_add_noise_c; - if (flags & HAS_SSE2) vp9_plane_add_noise = vp9_plane_add_noise_wmt; vp9_post_proc_down_and_across = vp9_post_proc_down_and_across_c; if (flags & HAS_SSE2) vp9_post_proc_down_and_across = vp9_post_proc_down_and_across_xmm; vp9_quantize_fp = vp9_quantize_fp_c; diff --git a/chromium/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h index 9c7f50b16d5..95811725943 100644 --- a/chromium/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/ia32/vpx_dsp_rtcd.h @@ -334,13 +334,13 @@ void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_sse2(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); RTCD_EXTERN void (*vpx_h_predictor_8x8)(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_16x16_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); -RTCD_EXTERN void (*vpx_hadamard_16x16)(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); +RTCD_EXTERN void (*vpx_hadamard_16x16)(const int16_t *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); -RTCD_EXTERN void (*vpx_hadamard_8x8)(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); +RTCD_EXTERN void (*vpx_hadamard_8x8)(const int16_t *src_diff, int src_stride, int16_t *coeff); void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_he_predictor_4x4 vpx_he_predictor_4x4_c @@ -393,13 +393,13 @@ void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_strid void vpx_idct8x8_64_add_sse2(const tran_low_t *input, uint8_t *dest, int dest_stride); RTCD_EXTERN void (*vpx_idct8x8_64_add)(const tran_low_t *input, uint8_t *dest, int dest_stride); -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); -int16_t vpx_int_pro_col_sse2(uint8_t const *ref, const int width); -RTCD_EXTERN int16_t (*vpx_int_pro_col)(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); +int16_t vpx_int_pro_col_sse2(const uint8_t *ref, const int width); +RTCD_EXTERN int16_t (*vpx_int_pro_col)(const uint8_t *ref, const int width); -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -void vpx_int_pro_row_sse2(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -RTCD_EXTERN void (*vpx_int_pro_row)(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +void vpx_int_pro_row_sse2(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +RTCD_EXTERN void (*vpx_int_pro_row)(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); void vpx_iwht4x4_16_add_sse2(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -480,6 +480,11 @@ unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint unsigned int vpx_mse8x8_sse2(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); RTCD_EXTERN unsigned int (*vpx_mse8x8)(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_mmx(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_sse2(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +RTCD_EXTERN void (*vpx_plane_add_noise)(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vpx_quantize_b_sse2(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); RTCD_EXTERN void (*vpx_quantize_b)(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -998,9 +1003,9 @@ RTCD_EXTERN uint32_t (*vpx_variance_halfpixvar16x16_v)(const unsigned char *src_ void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); -int vpx_vector_var_sse2(int16_t const *ref, int16_t const *src, const int bwl); -RTCD_EXTERN int (*vpx_vector_var)(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); +int vpx_vector_var_sse2(const int16_t *ref, const int16_t *src, const int bwl); +RTCD_EXTERN int (*vpx_vector_var)(const int16_t *ref, const int16_t *src, const int bwl); void vpx_dsp_rtcd(void); @@ -1214,6 +1219,9 @@ static void setup_rtcd_internal(void) if (flags & HAS_SSE2) vpx_mse8x16 = vpx_mse8x16_sse2; vpx_mse8x8 = vpx_mse8x8_c; if (flags & HAS_SSE2) vpx_mse8x8 = vpx_mse8x8_sse2; + vpx_plane_add_noise = vpx_plane_add_noise_c; + if (flags & HAS_MMX) vpx_plane_add_noise = vpx_plane_add_noise_mmx; + if (flags & HAS_SSE2) vpx_plane_add_noise = vpx_plane_add_noise_sse2; vpx_quantize_b = vpx_quantize_b_c; if (flags & HAS_SSE2) vpx_quantize_b = vpx_quantize_b_sse2; vpx_sad16x16 = vpx_sad16x16_c; diff --git a/chromium/third_party/libvpx/source/config/linux/mips64el/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/linux/mips64el/vp8_rtcd.h index b7ee61ada8a..b70b23e2409 100644 --- a/chromium/third_party/libvpx/source/config/linux/mips64el/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/mips64el/vp8_rtcd.h @@ -137,9 +137,6 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols,in int vp8_mbuverror_c(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_c -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_c - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_c diff --git a/chromium/third_party/libvpx/source/config/linux/mips64el/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/linux/mips64el/vp9_rtcd.h index 5e16ee1ebae..4af2ce2c4ae 100644 --- a/chromium/third_party/libvpx/source/config/linux/mips64el/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/mips64el/vp9_rtcd.h @@ -80,9 +80,6 @@ void vp9_mbpost_proc_across_ip_c(uint8_t *src, int pitch, int rows, int cols, in void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_c -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_c - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_c diff --git a/chromium/third_party/libvpx/source/config/linux/mips64el/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/linux/mips64el/vpx_dsp_rtcd.h index b76c67a8972..92ebd9ae5a8 100644 --- a/chromium/third_party/libvpx/source/config/linux/mips64el/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/mips64el/vpx_dsp_rtcd.h @@ -262,10 +262,10 @@ void vpx_h_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_c -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_c -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_8x8 vpx_hadamard_8x8_c void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); @@ -307,10 +307,10 @@ void vpx_idct8x8_1_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); #define vpx_idct8x8_64_add vpx_idct8x8_64_add_c -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_c -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_c void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -370,6 +370,9 @@ unsigned int vpx_mse8x16_c(const uint8_t *src_ptr, int source_stride, const uin unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_c +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_c + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); #define vpx_quantize_b vpx_quantize_b_c @@ -718,7 +721,7 @@ uint32_t vpx_variance_halfpixvar16x16_v_c(const unsigned char *src_ptr, int sour void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_c void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/config/linux/mipsel/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/linux/mipsel/vp8_rtcd.h index b7ee61ada8a..b70b23e2409 100644 --- a/chromium/third_party/libvpx/source/config/linux/mipsel/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/mipsel/vp8_rtcd.h @@ -137,9 +137,6 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols,in int vp8_mbuverror_c(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_c -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_c - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_c diff --git a/chromium/third_party/libvpx/source/config/linux/mipsel/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/linux/mipsel/vp9_rtcd.h index 5e16ee1ebae..4af2ce2c4ae 100644 --- a/chromium/third_party/libvpx/source/config/linux/mipsel/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/mipsel/vp9_rtcd.h @@ -80,9 +80,6 @@ void vp9_mbpost_proc_across_ip_c(uint8_t *src, int pitch, int rows, int cols, in void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_c -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_c - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_c diff --git a/chromium/third_party/libvpx/source/config/linux/mipsel/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/linux/mipsel/vpx_dsp_rtcd.h index b76c67a8972..92ebd9ae5a8 100644 --- a/chromium/third_party/libvpx/source/config/linux/mipsel/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/mipsel/vpx_dsp_rtcd.h @@ -262,10 +262,10 @@ void vpx_h_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_c -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_c -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_8x8 vpx_hadamard_8x8_c void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); @@ -307,10 +307,10 @@ void vpx_idct8x8_1_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); #define vpx_idct8x8_64_add vpx_idct8x8_64_add_c -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_c -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_c void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -370,6 +370,9 @@ unsigned int vpx_mse8x16_c(const uint8_t *src_ptr, int source_stride, const uin unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_c +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_c + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); #define vpx_quantize_b vpx_quantize_b_c @@ -718,7 +721,7 @@ uint32_t vpx_variance_halfpixvar16x16_v_c(const unsigned char *src_ptr, int sour void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_c void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/config/linux/x64/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/linux/x64/vp8_rtcd.h index 7ff11f92967..f96309ab0e8 100644 --- a/chromium/third_party/libvpx/source/config/linux/x64/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/x64/vp8_rtcd.h @@ -196,11 +196,6 @@ int vp8_mbuverror_mmx(struct macroblock *mb); int vp8_mbuverror_xmm(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_xmm -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_mmx(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_wmt(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_wmt - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); void vp8_post_proc_down_and_across_mb_row_sse2(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_sse2 diff --git a/chromium/third_party/libvpx/source/config/linux/x64/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/linux/x64/vp9_rtcd.h index 377d39d5697..28b426aadb5 100644 --- a/chromium/third_party/libvpx/source/config/linux/x64/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/x64/vp9_rtcd.h @@ -43,8 +43,7 @@ int vp9_denoiser_filter_sse2(const uint8_t *sig, int sig_stride, const uint8_t * #define vp9_denoiser_filter vp9_denoiser_filter_sse2 int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +#define vp9_diamond_search_sad vp9_diamond_search_sad_c void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -100,10 +99,6 @@ void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int fli void vp9_mbpost_proc_down_xmm(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_xmm -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -void vp9_plane_add_noise_wmt(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_wmt - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); void vp9_post_proc_down_and_across_xmm(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_xmm @@ -137,8 +132,6 @@ static void setup_rtcd_internal(void) vp9_block_error = vp9_block_error_sse2; if (flags & HAS_AVX2) vp9_block_error = vp9_block_error_avx2; - vp9_diamond_search_sad = vp9_diamond_search_sad_c; - if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3; vp9_full_search_sad = vp9_full_search_sad_c; diff --git a/chromium/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h index 7eab80a5fcd..4e8c228017e 100644 --- a/chromium/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/linux/x64/vpx_dsp_rtcd.h @@ -335,14 +335,14 @@ void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_sse2(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_sse2 -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_16x16_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_sse2 -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_ssse3(int16_t const *src_diff, int src_stride, int16_t *coeff); -RTCD_EXTERN void (*vpx_hadamard_8x8)(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_ssse3(const int16_t *src_diff, int src_stride, int16_t *coeff); +RTCD_EXTERN void (*vpx_hadamard_8x8)(const int16_t *src_diff, int src_stride, int16_t *coeff); void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_he_predictor_4x4 vpx_he_predictor_4x4_c @@ -400,12 +400,12 @@ void vpx_idct8x8_64_add_sse2(const tran_low_t *input, uint8_t *dest, int dest_st void vpx_idct8x8_64_add_ssse3(const tran_low_t *input, uint8_t *dest, int dest_stride); RTCD_EXTERN void (*vpx_idct8x8_64_add)(const tran_low_t *input, uint8_t *dest, int dest_stride); -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); -int16_t vpx_int_pro_col_sse2(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); +int16_t vpx_int_pro_col_sse2(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_sse2 -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -void vpx_int_pro_row_sse2(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +void vpx_int_pro_row_sse2(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_sse2 void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -487,6 +487,11 @@ unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint unsigned int vpx_mse8x8_sse2(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_sse2 +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_mmx(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_sse2(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_sse2 + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vpx_quantize_b_sse2(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vpx_quantize_b_ssse3(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -1009,8 +1014,8 @@ uint32_t vpx_variance_halfpixvar16x16_v_sse2(const unsigned char *src_ptr, int s void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); -int vpx_vector_var_sse2(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); +int vpx_vector_var_sse2(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_sse2 void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/config/mac/ia32/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/mac/ia32/vp8_rtcd.h index affac11003d..d3317dd0eaa 100644 --- a/chromium/third_party/libvpx/source/config/mac/ia32/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/mac/ia32/vp8_rtcd.h @@ -196,11 +196,6 @@ int vp8_mbuverror_mmx(struct macroblock *mb); int vp8_mbuverror_xmm(struct macroblock *mb); RTCD_EXTERN int (*vp8_mbuverror)(struct macroblock *mb); -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_mmx(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_wmt(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -RTCD_EXTERN void (*vp8_plane_add_noise)(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); void vp8_post_proc_down_and_across_mb_row_sse2(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); RTCD_EXTERN void (*vp8_post_proc_down_and_across_mb_row)(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); @@ -363,9 +358,6 @@ static void setup_rtcd_internal(void) vp8_mbuverror = vp8_mbuverror_c; if (flags & HAS_MMX) vp8_mbuverror = vp8_mbuverror_mmx; if (flags & HAS_SSE2) vp8_mbuverror = vp8_mbuverror_xmm; - vp8_plane_add_noise = vp8_plane_add_noise_c; - if (flags & HAS_MMX) vp8_plane_add_noise = vp8_plane_add_noise_mmx; - if (flags & HAS_SSE2) vp8_plane_add_noise = vp8_plane_add_noise_wmt; vp8_post_proc_down_and_across_mb_row = vp8_post_proc_down_and_across_mb_row_c; if (flags & HAS_SSE2) vp8_post_proc_down_and_across_mb_row = vp8_post_proc_down_and_across_mb_row_sse2; vp8_refining_search_sad = vp8_refining_search_sad_c; diff --git a/chromium/third_party/libvpx/source/config/mac/ia32/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/mac/ia32/vp9_rtcd.h index 2882a9f447f..a36dd653bf9 100644 --- a/chromium/third_party/libvpx/source/config/mac/ia32/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/mac/ia32/vp9_rtcd.h @@ -43,8 +43,7 @@ int vp9_denoiser_filter_sse2(const uint8_t *sig, int sig_stride, const uint8_t * RTCD_EXTERN int (*vp9_denoiser_filter)(const uint8_t *sig, int sig_stride, const uint8_t *mc_avg, int mc_avg_stride, uint8_t *avg, int avg_stride, int increase_denoising, BLOCK_SIZE bs, int motion_magnitude); int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +#define vp9_diamond_search_sad vp9_diamond_search_sad_c void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -100,10 +99,6 @@ void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int fli void vp9_mbpost_proc_down_xmm(uint8_t *dst, int pitch, int rows, int cols, int flimit); RTCD_EXTERN void (*vp9_mbpost_proc_down)(uint8_t *dst, int pitch, int rows, int cols, int flimit); -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -void vp9_plane_add_noise_wmt(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -RTCD_EXTERN void (*vp9_plane_add_noise)(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); void vp9_post_proc_down_and_across_xmm(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); RTCD_EXTERN void (*vp9_post_proc_down_and_across)(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); @@ -140,8 +135,6 @@ static void setup_rtcd_internal(void) if (flags & HAS_SSE2) vp9_block_error_fp = vp9_block_error_fp_sse2; vp9_denoiser_filter = vp9_denoiser_filter_c; if (flags & HAS_SSE2) vp9_denoiser_filter = vp9_denoiser_filter_sse2; - vp9_diamond_search_sad = vp9_diamond_search_sad_c; - if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_c; if (flags & HAS_SSE2) vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3; @@ -170,8 +163,6 @@ static void setup_rtcd_internal(void) if (flags & HAS_SSE2) vp9_mbpost_proc_across_ip = vp9_mbpost_proc_across_ip_xmm; vp9_mbpost_proc_down = vp9_mbpost_proc_down_c; if (flags & HAS_SSE2) vp9_mbpost_proc_down = vp9_mbpost_proc_down_xmm; - vp9_plane_add_noise = vp9_plane_add_noise_c; - if (flags & HAS_SSE2) vp9_plane_add_noise = vp9_plane_add_noise_wmt; vp9_post_proc_down_and_across = vp9_post_proc_down_and_across_c; if (flags & HAS_SSE2) vp9_post_proc_down_and_across = vp9_post_proc_down_and_across_xmm; vp9_quantize_fp = vp9_quantize_fp_c; diff --git a/chromium/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h index 9c7f50b16d5..95811725943 100644 --- a/chromium/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/mac/ia32/vpx_dsp_rtcd.h @@ -334,13 +334,13 @@ void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_sse2(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); RTCD_EXTERN void (*vpx_h_predictor_8x8)(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_16x16_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); -RTCD_EXTERN void (*vpx_hadamard_16x16)(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); +RTCD_EXTERN void (*vpx_hadamard_16x16)(const int16_t *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); -RTCD_EXTERN void (*vpx_hadamard_8x8)(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); +RTCD_EXTERN void (*vpx_hadamard_8x8)(const int16_t *src_diff, int src_stride, int16_t *coeff); void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_he_predictor_4x4 vpx_he_predictor_4x4_c @@ -393,13 +393,13 @@ void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_strid void vpx_idct8x8_64_add_sse2(const tran_low_t *input, uint8_t *dest, int dest_stride); RTCD_EXTERN void (*vpx_idct8x8_64_add)(const tran_low_t *input, uint8_t *dest, int dest_stride); -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); -int16_t vpx_int_pro_col_sse2(uint8_t const *ref, const int width); -RTCD_EXTERN int16_t (*vpx_int_pro_col)(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); +int16_t vpx_int_pro_col_sse2(const uint8_t *ref, const int width); +RTCD_EXTERN int16_t (*vpx_int_pro_col)(const uint8_t *ref, const int width); -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -void vpx_int_pro_row_sse2(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -RTCD_EXTERN void (*vpx_int_pro_row)(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +void vpx_int_pro_row_sse2(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +RTCD_EXTERN void (*vpx_int_pro_row)(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); void vpx_iwht4x4_16_add_sse2(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -480,6 +480,11 @@ unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint unsigned int vpx_mse8x8_sse2(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); RTCD_EXTERN unsigned int (*vpx_mse8x8)(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_mmx(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_sse2(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +RTCD_EXTERN void (*vpx_plane_add_noise)(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vpx_quantize_b_sse2(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); RTCD_EXTERN void (*vpx_quantize_b)(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -998,9 +1003,9 @@ RTCD_EXTERN uint32_t (*vpx_variance_halfpixvar16x16_v)(const unsigned char *src_ void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); -int vpx_vector_var_sse2(int16_t const *ref, int16_t const *src, const int bwl); -RTCD_EXTERN int (*vpx_vector_var)(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); +int vpx_vector_var_sse2(const int16_t *ref, const int16_t *src, const int bwl); +RTCD_EXTERN int (*vpx_vector_var)(const int16_t *ref, const int16_t *src, const int bwl); void vpx_dsp_rtcd(void); @@ -1214,6 +1219,9 @@ static void setup_rtcd_internal(void) if (flags & HAS_SSE2) vpx_mse8x16 = vpx_mse8x16_sse2; vpx_mse8x8 = vpx_mse8x8_c; if (flags & HAS_SSE2) vpx_mse8x8 = vpx_mse8x8_sse2; + vpx_plane_add_noise = vpx_plane_add_noise_c; + if (flags & HAS_MMX) vpx_plane_add_noise = vpx_plane_add_noise_mmx; + if (flags & HAS_SSE2) vpx_plane_add_noise = vpx_plane_add_noise_sse2; vpx_quantize_b = vpx_quantize_b_c; if (flags & HAS_SSE2) vpx_quantize_b = vpx_quantize_b_sse2; vpx_sad16x16 = vpx_sad16x16_c; diff --git a/chromium/third_party/libvpx/source/config/mac/x64/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/mac/x64/vp8_rtcd.h index 7ff11f92967..f96309ab0e8 100644 --- a/chromium/third_party/libvpx/source/config/mac/x64/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/mac/x64/vp8_rtcd.h @@ -196,11 +196,6 @@ int vp8_mbuverror_mmx(struct macroblock *mb); int vp8_mbuverror_xmm(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_xmm -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_mmx(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_wmt(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_wmt - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); void vp8_post_proc_down_and_across_mb_row_sse2(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_sse2 diff --git a/chromium/third_party/libvpx/source/config/mac/x64/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/mac/x64/vp9_rtcd.h index 377d39d5697..28b426aadb5 100644 --- a/chromium/third_party/libvpx/source/config/mac/x64/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/mac/x64/vp9_rtcd.h @@ -43,8 +43,7 @@ int vp9_denoiser_filter_sse2(const uint8_t *sig, int sig_stride, const uint8_t * #define vp9_denoiser_filter vp9_denoiser_filter_sse2 int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +#define vp9_diamond_search_sad vp9_diamond_search_sad_c void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -100,10 +99,6 @@ void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int fli void vp9_mbpost_proc_down_xmm(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_xmm -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -void vp9_plane_add_noise_wmt(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_wmt - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); void vp9_post_proc_down_and_across_xmm(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_xmm @@ -137,8 +132,6 @@ static void setup_rtcd_internal(void) vp9_block_error = vp9_block_error_sse2; if (flags & HAS_AVX2) vp9_block_error = vp9_block_error_avx2; - vp9_diamond_search_sad = vp9_diamond_search_sad_c; - if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3; vp9_full_search_sad = vp9_full_search_sad_c; diff --git a/chromium/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h index 7eab80a5fcd..4e8c228017e 100644 --- a/chromium/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/mac/x64/vpx_dsp_rtcd.h @@ -335,14 +335,14 @@ void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_sse2(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_sse2 -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_16x16_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_sse2 -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_ssse3(int16_t const *src_diff, int src_stride, int16_t *coeff); -RTCD_EXTERN void (*vpx_hadamard_8x8)(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_ssse3(const int16_t *src_diff, int src_stride, int16_t *coeff); +RTCD_EXTERN void (*vpx_hadamard_8x8)(const int16_t *src_diff, int src_stride, int16_t *coeff); void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_he_predictor_4x4 vpx_he_predictor_4x4_c @@ -400,12 +400,12 @@ void vpx_idct8x8_64_add_sse2(const tran_low_t *input, uint8_t *dest, int dest_st void vpx_idct8x8_64_add_ssse3(const tran_low_t *input, uint8_t *dest, int dest_stride); RTCD_EXTERN void (*vpx_idct8x8_64_add)(const tran_low_t *input, uint8_t *dest, int dest_stride); -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); -int16_t vpx_int_pro_col_sse2(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); +int16_t vpx_int_pro_col_sse2(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_sse2 -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -void vpx_int_pro_row_sse2(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +void vpx_int_pro_row_sse2(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_sse2 void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -487,6 +487,11 @@ unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint unsigned int vpx_mse8x8_sse2(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_sse2 +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_mmx(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_sse2(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_sse2 + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vpx_quantize_b_sse2(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vpx_quantize_b_ssse3(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -1009,8 +1014,8 @@ uint32_t vpx_variance_halfpixvar16x16_v_sse2(const unsigned char *src_ptr, int s void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); -int vpx_vector_var_sse2(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); +int vpx_vector_var_sse2(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_sse2 void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/config/nacl/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/nacl/vp8_rtcd.h index 1697a302be8..38c697f793b 100644 --- a/chromium/third_party/libvpx/source/config/nacl/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/nacl/vp8_rtcd.h @@ -137,9 +137,6 @@ void vp8_mbpost_proc_down_c(unsigned char *dst, int pitch, int rows, int cols,in int vp8_mbuverror_c(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_c -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_c - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_c diff --git a/chromium/third_party/libvpx/source/config/nacl/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/nacl/vp9_rtcd.h index 5e16ee1ebae..4af2ce2c4ae 100644 --- a/chromium/third_party/libvpx/source/config/nacl/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/nacl/vp9_rtcd.h @@ -80,9 +80,6 @@ void vp9_mbpost_proc_across_ip_c(uint8_t *src, int pitch, int rows, int cols, in void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_c -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_c - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_c diff --git a/chromium/third_party/libvpx/source/config/nacl/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/nacl/vpx_dsp_rtcd.h index b76c67a8972..92ebd9ae5a8 100644 --- a/chromium/third_party/libvpx/source/config/nacl/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/nacl/vpx_dsp_rtcd.h @@ -262,10 +262,10 @@ void vpx_h_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_c -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_c -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_8x8 vpx_hadamard_8x8_c void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); @@ -307,10 +307,10 @@ void vpx_idct8x8_1_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); #define vpx_idct8x8_64_add vpx_idct8x8_64_add_c -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_c -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_c void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -370,6 +370,9 @@ unsigned int vpx_mse8x16_c(const uint8_t *src_ptr, int source_stride, const uin unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_c +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_c + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); #define vpx_quantize_b vpx_quantize_b_c @@ -718,7 +721,7 @@ uint32_t vpx_variance_halfpixvar16x16_v_c(const unsigned char *src_ptr, int sour void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_c void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/config/vpx_version.h b/chromium/third_party/libvpx/source/config/vpx_version.h index f8fb67823a5..d53a3677472 100644 --- a/chromium/third_party/libvpx/source/config/vpx_version.h +++ b/chromium/third_party/libvpx/source/config/vpx_version.h @@ -1,7 +1,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 5 #define VERSION_PATCH 0 -#define VERSION_EXTRA "650-g904cb53" +#define VERSION_EXTRA "882-g57566ff" #define VERSION_PACKED ((VERSION_MAJOR<<16)|(VERSION_MINOR<<8)|(VERSION_PATCH)) -#define VERSION_STRING_NOSP "v1.5.0-650-g904cb53" -#define VERSION_STRING " v1.5.0-650-g904cb53" +#define VERSION_STRING_NOSP "v1.5.0-882-g57566ff" +#define VERSION_STRING " v1.5.0-882-g57566ff" diff --git a/chromium/third_party/libvpx/source/config/win/ia32/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/win/ia32/vp8_rtcd.h index affac11003d..d3317dd0eaa 100644 --- a/chromium/third_party/libvpx/source/config/win/ia32/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/win/ia32/vp8_rtcd.h @@ -196,11 +196,6 @@ int vp8_mbuverror_mmx(struct macroblock *mb); int vp8_mbuverror_xmm(struct macroblock *mb); RTCD_EXTERN int (*vp8_mbuverror)(struct macroblock *mb); -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_mmx(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_wmt(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -RTCD_EXTERN void (*vp8_plane_add_noise)(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); void vp8_post_proc_down_and_across_mb_row_sse2(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); RTCD_EXTERN void (*vp8_post_proc_down_and_across_mb_row)(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); @@ -363,9 +358,6 @@ static void setup_rtcd_internal(void) vp8_mbuverror = vp8_mbuverror_c; if (flags & HAS_MMX) vp8_mbuverror = vp8_mbuverror_mmx; if (flags & HAS_SSE2) vp8_mbuverror = vp8_mbuverror_xmm; - vp8_plane_add_noise = vp8_plane_add_noise_c; - if (flags & HAS_MMX) vp8_plane_add_noise = vp8_plane_add_noise_mmx; - if (flags & HAS_SSE2) vp8_plane_add_noise = vp8_plane_add_noise_wmt; vp8_post_proc_down_and_across_mb_row = vp8_post_proc_down_and_across_mb_row_c; if (flags & HAS_SSE2) vp8_post_proc_down_and_across_mb_row = vp8_post_proc_down_and_across_mb_row_sse2; vp8_refining_search_sad = vp8_refining_search_sad_c; diff --git a/chromium/third_party/libvpx/source/config/win/ia32/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/win/ia32/vp9_rtcd.h index 2882a9f447f..a36dd653bf9 100644 --- a/chromium/third_party/libvpx/source/config/win/ia32/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/win/ia32/vp9_rtcd.h @@ -43,8 +43,7 @@ int vp9_denoiser_filter_sse2(const uint8_t *sig, int sig_stride, const uint8_t * RTCD_EXTERN int (*vp9_denoiser_filter)(const uint8_t *sig, int sig_stride, const uint8_t *mc_avg, int mc_avg_stride, uint8_t *avg, int avg_stride, int increase_denoising, BLOCK_SIZE bs, int motion_magnitude); int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +#define vp9_diamond_search_sad vp9_diamond_search_sad_c void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -100,10 +99,6 @@ void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int fli void vp9_mbpost_proc_down_xmm(uint8_t *dst, int pitch, int rows, int cols, int flimit); RTCD_EXTERN void (*vp9_mbpost_proc_down)(uint8_t *dst, int pitch, int rows, int cols, int flimit); -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -void vp9_plane_add_noise_wmt(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -RTCD_EXTERN void (*vp9_plane_add_noise)(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); void vp9_post_proc_down_and_across_xmm(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); RTCD_EXTERN void (*vp9_post_proc_down_and_across)(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); @@ -140,8 +135,6 @@ static void setup_rtcd_internal(void) if (flags & HAS_SSE2) vp9_block_error_fp = vp9_block_error_fp_sse2; vp9_denoiser_filter = vp9_denoiser_filter_c; if (flags & HAS_SSE2) vp9_denoiser_filter = vp9_denoiser_filter_sse2; - vp9_diamond_search_sad = vp9_diamond_search_sad_c; - if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_c; if (flags & HAS_SSE2) vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3; @@ -170,8 +163,6 @@ static void setup_rtcd_internal(void) if (flags & HAS_SSE2) vp9_mbpost_proc_across_ip = vp9_mbpost_proc_across_ip_xmm; vp9_mbpost_proc_down = vp9_mbpost_proc_down_c; if (flags & HAS_SSE2) vp9_mbpost_proc_down = vp9_mbpost_proc_down_xmm; - vp9_plane_add_noise = vp9_plane_add_noise_c; - if (flags & HAS_SSE2) vp9_plane_add_noise = vp9_plane_add_noise_wmt; vp9_post_proc_down_and_across = vp9_post_proc_down_and_across_c; if (flags & HAS_SSE2) vp9_post_proc_down_and_across = vp9_post_proc_down_and_across_xmm; vp9_quantize_fp = vp9_quantize_fp_c; diff --git a/chromium/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h index 9c7f50b16d5..95811725943 100644 --- a/chromium/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/win/ia32/vpx_dsp_rtcd.h @@ -334,13 +334,13 @@ void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_sse2(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); RTCD_EXTERN void (*vpx_h_predictor_8x8)(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_16x16_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); -RTCD_EXTERN void (*vpx_hadamard_16x16)(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); +RTCD_EXTERN void (*vpx_hadamard_16x16)(const int16_t *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); -RTCD_EXTERN void (*vpx_hadamard_8x8)(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); +RTCD_EXTERN void (*vpx_hadamard_8x8)(const int16_t *src_diff, int src_stride, int16_t *coeff); void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_he_predictor_4x4 vpx_he_predictor_4x4_c @@ -393,13 +393,13 @@ void vpx_idct8x8_64_add_c(const tran_low_t *input, uint8_t *dest, int dest_strid void vpx_idct8x8_64_add_sse2(const tran_low_t *input, uint8_t *dest, int dest_stride); RTCD_EXTERN void (*vpx_idct8x8_64_add)(const tran_low_t *input, uint8_t *dest, int dest_stride); -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); -int16_t vpx_int_pro_col_sse2(uint8_t const *ref, const int width); -RTCD_EXTERN int16_t (*vpx_int_pro_col)(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); +int16_t vpx_int_pro_col_sse2(const uint8_t *ref, const int width); +RTCD_EXTERN int16_t (*vpx_int_pro_col)(const uint8_t *ref, const int width); -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -void vpx_int_pro_row_sse2(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -RTCD_EXTERN void (*vpx_int_pro_row)(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +void vpx_int_pro_row_sse2(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +RTCD_EXTERN void (*vpx_int_pro_row)(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); void vpx_iwht4x4_16_add_sse2(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -480,6 +480,11 @@ unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint unsigned int vpx_mse8x8_sse2(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); RTCD_EXTERN unsigned int (*vpx_mse8x8)(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_mmx(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_sse2(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +RTCD_EXTERN void (*vpx_plane_add_noise)(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vpx_quantize_b_sse2(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); RTCD_EXTERN void (*vpx_quantize_b)(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -998,9 +1003,9 @@ RTCD_EXTERN uint32_t (*vpx_variance_halfpixvar16x16_v)(const unsigned char *src_ void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); -int vpx_vector_var_sse2(int16_t const *ref, int16_t const *src, const int bwl); -RTCD_EXTERN int (*vpx_vector_var)(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); +int vpx_vector_var_sse2(const int16_t *ref, const int16_t *src, const int bwl); +RTCD_EXTERN int (*vpx_vector_var)(const int16_t *ref, const int16_t *src, const int bwl); void vpx_dsp_rtcd(void); @@ -1214,6 +1219,9 @@ static void setup_rtcd_internal(void) if (flags & HAS_SSE2) vpx_mse8x16 = vpx_mse8x16_sse2; vpx_mse8x8 = vpx_mse8x8_c; if (flags & HAS_SSE2) vpx_mse8x8 = vpx_mse8x8_sse2; + vpx_plane_add_noise = vpx_plane_add_noise_c; + if (flags & HAS_MMX) vpx_plane_add_noise = vpx_plane_add_noise_mmx; + if (flags & HAS_SSE2) vpx_plane_add_noise = vpx_plane_add_noise_sse2; vpx_quantize_b = vpx_quantize_b_c; if (flags & HAS_SSE2) vpx_quantize_b = vpx_quantize_b_sse2; vpx_sad16x16 = vpx_sad16x16_c; diff --git a/chromium/third_party/libvpx/source/config/win/x64/vp8_rtcd.h b/chromium/third_party/libvpx/source/config/win/x64/vp8_rtcd.h index 7ff11f92967..f96309ab0e8 100644 --- a/chromium/third_party/libvpx/source/config/win/x64/vp8_rtcd.h +++ b/chromium/third_party/libvpx/source/config/win/x64/vp8_rtcd.h @@ -196,11 +196,6 @@ int vp8_mbuverror_mmx(struct macroblock *mb); int vp8_mbuverror_xmm(struct macroblock *mb); #define vp8_mbuverror vp8_mbuverror_xmm -void vp8_plane_add_noise_c(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_mmx(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -void vp8_plane_add_noise_wmt(unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch); -#define vp8_plane_add_noise vp8_plane_add_noise_wmt - void vp8_post_proc_down_and_across_mb_row_c(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); void vp8_post_proc_down_and_across_mb_row_sse2(unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size); #define vp8_post_proc_down_and_across_mb_row vp8_post_proc_down_and_across_mb_row_sse2 diff --git a/chromium/third_party/libvpx/source/config/win/x64/vp9_rtcd.h b/chromium/third_party/libvpx/source/config/win/x64/vp9_rtcd.h index 377d39d5697..28b426aadb5 100644 --- a/chromium/third_party/libvpx/source/config/win/x64/vp9_rtcd.h +++ b/chromium/third_party/libvpx/source/config/win/x64/vp9_rtcd.h @@ -43,8 +43,7 @@ int vp9_denoiser_filter_sse2(const uint8_t *sig, int sig_stride, const uint8_t * #define vp9_denoiser_filter vp9_denoiser_filter_sse2 int vp9_diamond_search_sad_c(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -int vp9_diamond_search_sad_avx(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); -RTCD_EXTERN int (*vp9_diamond_search_sad)(const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv); +#define vp9_diamond_search_sad vp9_diamond_search_sad_c void vp9_fdct8x8_quant_c(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vp9_fdct8x8_quant_sse2(const int16_t *input, int stride, tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -100,10 +99,6 @@ void vp9_mbpost_proc_down_c(uint8_t *dst, int pitch, int rows, int cols, int fli void vp9_mbpost_proc_down_xmm(uint8_t *dst, int pitch, int rows, int cols, int flimit); #define vp9_mbpost_proc_down vp9_mbpost_proc_down_xmm -void vp9_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -void vp9_plane_add_noise_wmt(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); -#define vp9_plane_add_noise vp9_plane_add_noise_wmt - void vp9_post_proc_down_and_across_c(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); void vp9_post_proc_down_and_across_xmm(const uint8_t *src_ptr, uint8_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit); #define vp9_post_proc_down_and_across vp9_post_proc_down_and_across_xmm @@ -137,8 +132,6 @@ static void setup_rtcd_internal(void) vp9_block_error = vp9_block_error_sse2; if (flags & HAS_AVX2) vp9_block_error = vp9_block_error_avx2; - vp9_diamond_search_sad = vp9_diamond_search_sad_c; - if (flags & HAS_AVX) vp9_diamond_search_sad = vp9_diamond_search_sad_avx; vp9_fdct8x8_quant = vp9_fdct8x8_quant_sse2; if (flags & HAS_SSSE3) vp9_fdct8x8_quant = vp9_fdct8x8_quant_ssse3; vp9_full_search_sad = vp9_full_search_sad_c; diff --git a/chromium/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h b/chromium/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h index 7eab80a5fcd..4e8c228017e 100644 --- a/chromium/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h +++ b/chromium/third_party/libvpx/source/config/win/x64/vpx_dsp_rtcd.h @@ -335,14 +335,14 @@ void vpx_h_predictor_8x8_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *abov void vpx_h_predictor_8x8_sse2(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_h_predictor_8x8 vpx_h_predictor_8x8_sse2 -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_16x16_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_16x16_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); #define vpx_hadamard_16x16 vpx_hadamard_16x16_sse2 -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_sse2(int16_t const *src_diff, int src_stride, int16_t *coeff); -void vpx_hadamard_8x8_ssse3(int16_t const *src_diff, int src_stride, int16_t *coeff); -RTCD_EXTERN void (*vpx_hadamard_8x8)(int16_t const *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_sse2(const int16_t *src_diff, int src_stride, int16_t *coeff); +void vpx_hadamard_8x8_ssse3(const int16_t *src_diff, int src_stride, int16_t *coeff); +RTCD_EXTERN void (*vpx_hadamard_8x8)(const int16_t *src_diff, int src_stride, int16_t *coeff); void vpx_he_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_he_predictor_4x4 vpx_he_predictor_4x4_c @@ -400,12 +400,12 @@ void vpx_idct8x8_64_add_sse2(const tran_low_t *input, uint8_t *dest, int dest_st void vpx_idct8x8_64_add_ssse3(const tran_low_t *input, uint8_t *dest, int dest_stride); RTCD_EXTERN void (*vpx_idct8x8_64_add)(const tran_low_t *input, uint8_t *dest, int dest_stride); -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width); -int16_t vpx_int_pro_col_sse2(uint8_t const *ref, const int width); +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width); +int16_t vpx_int_pro_col_sse2(const uint8_t *ref, const int width); #define vpx_int_pro_col vpx_int_pro_col_sse2 -void vpx_int_pro_row_c(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); -void vpx_int_pro_row_sse2(int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height); +void vpx_int_pro_row_c(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); +void vpx_int_pro_row_sse2(int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height); #define vpx_int_pro_row vpx_int_pro_row_sse2 void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int dest_stride); @@ -487,6 +487,11 @@ unsigned int vpx_mse8x8_c(const uint8_t *src_ptr, int source_stride, const uint unsigned int vpx_mse8x8_sse2(const uint8_t *src_ptr, int source_stride, const uint8_t *ref_ptr, int recon_stride, unsigned int *sse); #define vpx_mse8x8 vpx_mse8x8_sse2 +void vpx_plane_add_noise_c(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_mmx(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +void vpx_plane_add_noise_sse2(uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch); +#define vpx_plane_add_noise vpx_plane_add_noise_sse2 + void vpx_quantize_b_c(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vpx_quantize_b_sse2(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); void vpx_quantize_b_ssse3(const tran_low_t *coeff_ptr, intptr_t n_coeffs, int skip_block, const int16_t *zbin_ptr, const int16_t *round_ptr, const int16_t *quant_ptr, const int16_t *quant_shift_ptr, tran_low_t *qcoeff_ptr, tran_low_t *dqcoeff_ptr, const int16_t *dequant_ptr, uint16_t *eob_ptr, const int16_t *scan, const int16_t *iscan); @@ -1009,8 +1014,8 @@ uint32_t vpx_variance_halfpixvar16x16_v_sse2(const unsigned char *src_ptr, int s void vpx_ve_predictor_4x4_c(uint8_t *dst, ptrdiff_t y_stride, const uint8_t *above, const uint8_t *left); #define vpx_ve_predictor_4x4 vpx_ve_predictor_4x4_c -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, const int bwl); -int vpx_vector_var_sse2(int16_t const *ref, int16_t const *src, const int bwl); +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl); +int vpx_vector_var_sse2(const int16_t *ref, const int16_t *src, const int bwl); #define vpx_vector_var vpx_vector_var_sse2 void vpx_dsp_rtcd(void); diff --git a/chromium/third_party/libvpx/source/libvpx/README b/chromium/third_party/libvpx/source/libvpx/README index 979440eb70b..29072b91958 100644 --- a/chromium/third_party/libvpx/source/libvpx/README +++ b/chromium/third_party/libvpx/source/libvpx/README @@ -47,7 +47,6 @@ COMPILING THE APPLICATIONS/LIBRARIES: --help output of the configure script. As of this writing, the list of available targets is: - armv6-darwin-gcc armv6-linux-rvct armv6-linux-gcc armv6-none-rvct diff --git a/chromium/third_party/libvpx/source/libvpx/build/make/configure.sh b/chromium/third_party/libvpx/source/libvpx/build/make/configure.sh index d888268dc8f..7b471ca2805 100644 --- a/chromium/third_party/libvpx/source/libvpx/build/make/configure.sh +++ b/chromium/third_party/libvpx/source/libvpx/build/make/configure.sh @@ -644,6 +644,9 @@ process_common_toolchain() { # detect tgt_isa case "$gcctarget" in + aarch64*) + tgt_isa=arm64 + ;; armv6*) tgt_isa=armv6 ;; @@ -1015,18 +1018,7 @@ EOF NM="$(${XCRUN_FIND} nm)" RANLIB="$(${XCRUN_FIND} ranlib)" AS_SFX=.s - - # Special handling of ld for armv6 because libclang_rt.ios.a does - # not contain armv6 support in Apple's clang package: - # Apple LLVM version 5.1 (clang-503.0.40) (based on LLVM 3.4svn). - # TODO(tomfinegan): Remove this. Our minimum iOS version (6.0) - # renders support for armv6 unnecessary because the 3GS and up - # support neon. - if [ "${tgt_isa}" = "armv6" ]; then - LD="$(${XCRUN_FIND} ld)" - else - LD="${CXX:-$(${XCRUN_FIND} ld)}" - fi + LD="${CXX:-$(${XCRUN_FIND} ld)}" # ASFLAGS is written here instead of using check_add_asflags # because we need to overwrite all of ASFLAGS and purge the @@ -1066,7 +1058,7 @@ EOF if enabled rvct; then # Check if we have CodeSourcery GCC in PATH. Needed for # libraries - hash arm-none-linux-gnueabi-gcc 2>&- || \ + which arm-none-linux-gnueabi-gcc 2>&- || \ die "Couldn't find CodeSourcery GCC from PATH" # Use armcc as a linker to enable translation of @@ -1187,6 +1179,12 @@ EOF soft_disable avx2 ;; esac + case $vc_version in + 7|8|9) + echo "${tgt_cc} omits stdint.h, disabling webm-io..." + soft_disable webm_io + ;; + esac ;; esac diff --git a/chromium/third_party/libvpx/source/libvpx/build/make/gen_msvs_proj.sh b/chromium/third_party/libvpx/source/libvpx/build/make/gen_msvs_proj.sh index 0cf335b3d26..2b91fbfbc46 100755 --- a/chromium/third_party/libvpx/source/libvpx/build/make/gen_msvs_proj.sh +++ b/chromium/third_party/libvpx/source/libvpx/build/make/gen_msvs_proj.sh @@ -193,7 +193,7 @@ for opt in "$@"; do done # Make one call to fix_path for file_list to improve performance. -fix_file_list +fix_file_list file_list outfile=${outfile:-/dev/stdout} guid=${guid:-`generate_uuid`} diff --git a/chromium/third_party/libvpx/source/libvpx/build/make/gen_msvs_vcxproj.sh b/chromium/third_party/libvpx/source/libvpx/build/make/gen_msvs_vcxproj.sh index 182ea28fa77..e98611d1024 100755 --- a/chromium/third_party/libvpx/source/libvpx/build/make/gen_msvs_vcxproj.sh +++ b/chromium/third_party/libvpx/source/libvpx/build/make/gen_msvs_vcxproj.sh @@ -211,7 +211,7 @@ for opt in "$@"; do done # Make one call to fix_path for file_list to improve performance. -fix_file_list +fix_file_list file_list outfile=${outfile:-/dev/stdout} guid=${guid:-`generate_uuid`} diff --git a/chromium/third_party/libvpx/source/libvpx/build/make/iosbuild.sh b/chromium/third_party/libvpx/source/libvpx/build/make/iosbuild.sh index ae5ba182d57..149cb27ab79 100755 --- a/chromium/third_party/libvpx/source/libvpx/build/make/iosbuild.sh +++ b/chromium/third_party/libvpx/source/libvpx/build/make/iosbuild.sh @@ -24,6 +24,7 @@ CONFIGURE_ARGS="--disable-docs --disable-unit-tests" DIST_DIR="_dist" FRAMEWORK_DIR="VPX.framework" +FRAMEWORK_LIB="VPX.framework/VPX" HEADER_DIR="${FRAMEWORK_DIR}/Headers/vpx" SCRIPT_DIR=$(dirname "$0") LIBVPX_SOURCE_DIR=$(cd ${SCRIPT_DIR}/../..; pwd) @@ -137,6 +138,44 @@ create_vpx_framework_config_shim() { printf "#endif // ${include_guard}" >> "${config_file}" } +# Verifies that $FRAMEWORK_LIB fat library contains requested builds. +verify_framework_targets() { + local requested_cpus="" + local cpu="" + + # Extract CPU from full target name. + for target; do + cpu="${target%%-*}" + if [ "${cpu}" = "x86" ]; then + # lipo -info outputs i386 for libvpx x86 targets. + cpu="i386" + fi + requested_cpus="${requested_cpus}${cpu} " + done + + # Get target CPUs present in framework library. + local targets_built=$(${LIPO} -info ${FRAMEWORK_LIB}) + + # $LIPO -info outputs a string like the following: + # Architectures in the fat file: $FRAMEWORK_LIB <architectures> + # Capture only the architecture strings. + targets_built=${targets_built##*: } + + # Sort CPU strings to make the next step a simple string compare. + local actual=$(echo ${targets_built} | tr " " "\n" | sort | tr "\n" " ") + local requested=$(echo ${requested_cpus} | tr " " "\n" | sort | tr "\n" " ") + + vlog "Requested ${FRAMEWORK_LIB} CPUs: ${requested}" + vlog "Actual ${FRAMEWORK_LIB} CPUs: ${actual}" + + if [ "${requested}" != "${actual}" ]; then + elog "Actual ${FRAMEWORK_LIB} targets do not match requested target list." + elog " Requested target CPUs: ${requested}" + elog " Actual target CPUs: ${actual}" + return 1 + fi +} + # Configures and builds each target specified by $1, and then builds # VPX.framework. build_framework() { @@ -176,13 +215,13 @@ build_framework() { # Copy in vpx_version.h. cp -p "${BUILD_ROOT}/${target}/vpx_version.h" "${HEADER_DIR}" - vlog "Created fat library ${FRAMEWORK_DIR}/VPX containing:" + # Confirm VPX.framework/VPX contains the targets requested. + verify_framework_targets ${targets} + + vlog "Created fat library ${FRAMEWORK_LIB} containing:" for lib in ${lib_list}; do vlog " $(echo ${lib} | awk -F / '{print $2, $NF}')" done - - # TODO(tomfinegan): Verify that expected targets are included within - # VPX.framework/VPX via lipo -info. } # Trap function. Cleans up the subtree used to build all targets contained in @@ -285,6 +324,7 @@ cat << EOF CONFIGURE_ARGS=${CONFIGURE_ARGS} EXTRA_CONFIGURE_ARGS=${EXTRA_CONFIGURE_ARGS} FRAMEWORK_DIR=${FRAMEWORK_DIR} + FRAMEWORK_LIB=${FRAMEWORK_LIB} HEADER_DIR=${HEADER_DIR} LIBVPX_SOURCE_DIR=${LIBVPX_SOURCE_DIR} LIPO=${LIPO} diff --git a/chromium/third_party/libvpx/source/libvpx/build/make/msvs_common.sh b/chromium/third_party/libvpx/source/libvpx/build/make/msvs_common.sh index 90c14888c24..88f1cf9b570 100644 --- a/chromium/third_party/libvpx/source/libvpx/build/make/msvs_common.sh +++ b/chromium/third_party/libvpx/source/libvpx/build/make/msvs_common.sh @@ -39,11 +39,12 @@ fix_path() { } # Corrects the paths in file_list in one pass for efficiency. +# $1 is the name of the array to be modified. fix_file_list() { - # TODO(jzern): this could be more generic and take the array as a param. - files=$(fix_path "${file_list[@]}") + declare -n array_ref=$1 + files=$(fix_path "${array_ref[@]}") local IFS=$'\n' - file_list=($files) + array_ref=($files) } generate_uuid() { diff --git a/chromium/third_party/libvpx/source/libvpx/build/make/version.sh b/chromium/third_party/libvpx/source/libvpx/build/make/version.sh index b340142c934..6967527771b 100755 --- a/chromium/third_party/libvpx/source/libvpx/build/make/version.sh +++ b/chromium/third_party/libvpx/source/libvpx/build/make/version.sh @@ -24,8 +24,9 @@ out_file=${2} id=${3:-VERSION_STRING} git_version_id="" -if [ -d "${source_path}/.git" ]; then +if [ -e "${source_path}/.git" ]; then # Source Path is a git working copy. Check for local modifications. + # Note that git submodules may have a file as .git, not a directory. export GIT_DIR="${source_path}/.git" git_version_id=`git describe --match=v[0-9]* 2>/dev/null` fi diff --git a/chromium/third_party/libvpx/source/libvpx/configure b/chromium/third_party/libvpx/source/libvpx/configure index 095cddf2dbe..91407d33c7e 100755 --- a/chromium/third_party/libvpx/source/libvpx/configure +++ b/chromium/third_party/libvpx/source/libvpx/configure @@ -98,11 +98,11 @@ EOF # all_platforms is a list of all supported target platforms. Maintain # alphabetically by architecture, generic-gnu last. -all_platforms="${all_platforms} armv6-darwin-gcc" all_platforms="${all_platforms} armv6-linux-rvct" all_platforms="${all_platforms} armv6-linux-gcc" all_platforms="${all_platforms} armv6-none-rvct" all_platforms="${all_platforms} arm64-darwin-gcc" +all_platforms="${all_platforms} arm64-linux-gcc" all_platforms="${all_platforms} armv7-android-gcc" #neon Cortex-A8 all_platforms="${all_platforms} armv7-darwin-gcc" #neon Cortex-A8 all_platforms="${all_platforms} armv7-linux-rvct" #neon Cortex-A8 diff --git a/chromium/third_party/libvpx/source/libvpx/examples.mk b/chromium/third_party/libvpx/source/libvpx/examples.mk index f10bec68c36..c891a549622 100644 --- a/chromium/third_party/libvpx/source/libvpx/examples.mk +++ b/chromium/third_party/libvpx/source/libvpx/examples.mk @@ -36,21 +36,30 @@ LIBYUV_SRCS += third_party/libyuv/include/libyuv/basic_types.h \ third_party/libyuv/source/scale_neon64.cc \ third_party/libyuv/source/scale_win.cc \ -LIBWEBM_COMMON_SRCS += third_party/libwebm/webmids.hpp +LIBWEBM_COMMON_SRCS += third_party/libwebm/common/hdr_util.cc \ + third_party/libwebm/common/hdr_util.h \ + third_party/libwebm/common/webmids.h -LIBWEBM_MUXER_SRCS += third_party/libwebm/mkvmuxer.cpp \ - third_party/libwebm/mkvmuxerutil.cpp \ - third_party/libwebm/mkvwriter.cpp \ - third_party/libwebm/mkvmuxer.hpp \ - third_party/libwebm/mkvmuxertypes.hpp \ - third_party/libwebm/mkvmuxerutil.hpp \ - third_party/libwebm/mkvparser.hpp \ - third_party/libwebm/mkvwriter.hpp +LIBWEBM_MUXER_SRCS += third_party/libwebm/mkvmuxer/mkvmuxer.cc \ + third_party/libwebm/mkvmuxer/mkvmuxerutil.cc \ + third_party/libwebm/mkvmuxer/mkvwriter.cc \ + third_party/libwebm/mkvmuxer/mkvmuxer.h \ + third_party/libwebm/mkvmuxer/mkvmuxertypes.h \ + third_party/libwebm/mkvmuxer/mkvmuxerutil.h \ + third_party/libwebm/mkvparser/mkvparser.h \ + third_party/libwebm/mkvmuxer/mkvwriter.h + +LIBWEBM_PARSER_SRCS = third_party/libwebm/mkvparser/mkvparser.cc \ + third_party/libwebm/mkvparser/mkvreader.cc \ + third_party/libwebm/mkvparser/mkvparser.h \ + third_party/libwebm/mkvparser/mkvreader.h + +# Add compile flags and include path for libwebm sources. +ifeq ($(CONFIG_WEBM_IO),yes) + CXXFLAGS += -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS + INC_PATH-yes += $(SRC_PATH_BARE)/third_party/libwebm +endif -LIBWEBM_PARSER_SRCS = third_party/libwebm/mkvparser.cpp \ - third_party/libwebm/mkvreader.cpp \ - third_party/libwebm/mkvparser.hpp \ - third_party/libwebm/mkvreader.hpp # List of examples to build. UTILS are tools meant for distribution # while EXAMPLES demonstrate specific portions of the API. @@ -70,6 +79,7 @@ ifeq ($(CONFIG_LIBYUV),yes) endif ifeq ($(CONFIG_WEBM_IO),yes) vpxdec.SRCS += $(LIBWEBM_COMMON_SRCS) + vpxdec.SRCS += $(LIBWEBM_MUXER_SRCS) vpxdec.SRCS += $(LIBWEBM_PARSER_SRCS) vpxdec.SRCS += webmdec.cc webmdec.h endif @@ -93,6 +103,7 @@ endif ifeq ($(CONFIG_WEBM_IO),yes) vpxenc.SRCS += $(LIBWEBM_COMMON_SRCS) vpxenc.SRCS += $(LIBWEBM_MUXER_SRCS) + vpxenc.SRCS += $(LIBWEBM_PARSER_SRCS) vpxenc.SRCS += webmenc.cc webmenc.h endif vpxenc.GUID = 548DEC74-7A15-4B2B-AFC3-AA102E7C25C1 diff --git a/chromium/third_party/libvpx/source/libvpx/examples/vpx_temporal_svc_encoder.c b/chromium/third_party/libvpx/source/libvpx/examples/vpx_temporal_svc_encoder.c index 16abb9deb09..e6c09fb713d 100644 --- a/chromium/third_party/libvpx/source/libvpx/examples/vpx_temporal_svc_encoder.c +++ b/chromium/third_party/libvpx/source/libvpx/examples/vpx_temporal_svc_encoder.c @@ -715,7 +715,7 @@ int main(int argc, char **argv) { vpx_codec_control(&codec, VP8E_SET_CPUUSED, speed); vpx_codec_control(&codec, VP9E_SET_AQ_MODE, 3); vpx_codec_control(&codec, VP9E_SET_FRAME_PERIODIC_BOOST, 0); - vpx_codec_control(&codec, VP9E_SET_NOISE_SENSITIVITY, 0); + vpx_codec_control(&codec, VP9E_SET_NOISE_SENSITIVITY, kDenoiserOff); vpx_codec_control(&codec, VP8E_SET_STATIC_THRESHOLD, 1); vpx_codec_control(&codec, VP9E_SET_TUNE_CONTENT, 0); vpx_codec_control(&codec, VP9E_SET_TILE_COLUMNS, (cfg.g_threads >> 1)); diff --git a/chromium/third_party/libvpx/source/libvpx/libs.mk b/chromium/third_party/libvpx/source/libvpx/libs.mk index e6fb068bf76..54592abb1cf 100644 --- a/chromium/third_party/libvpx/source/libvpx/libs.mk +++ b/chromium/third_party/libvpx/source/libvpx/libs.mk @@ -183,6 +183,9 @@ INSTALL-SRCS-$(CONFIG_CODEC_SRCS) += third_party/x86inc/x86inc.asm endif CODEC_EXPORTS-yes += vpx/exports_com CODEC_EXPORTS-$(CONFIG_ENCODERS) += vpx/exports_enc +ifeq ($(CONFIG_SPATIAL_SVC),yes) +CODEC_EXPORTS-$(CONFIG_ENCODERS) += vpx/exports_spatial_svc +endif CODEC_EXPORTS-$(CONFIG_DECODERS) += vpx/exports_dec INSTALL-LIBS-yes += include/vpx/vpx_codec.h @@ -394,6 +397,12 @@ $(filter %$(ASM).o,$(OBJS-yes)): $(BUILD_PFX)vpx_config.asm $(shell $(SRC_PATH_BARE)/build/make/version.sh "$(SRC_PATH_BARE)" $(BUILD_PFX)vpx_version.h) CLEAN-OBJS += $(BUILD_PFX)vpx_version.h +# +# Add include path for libwebm sources. +# +ifeq ($(CONFIG_WEBM_IO),yes) + CXXFLAGS += -I$(SRC_PATH_BARE)/third_party/libwebm +endif ## ## libvpx test directives @@ -469,6 +478,7 @@ test_libvpx.$(VCPROJ_SFX): $(LIBVPX_TEST_SRCS) vpx.$(VCPROJ_SFX) gtest.$(VCPROJ_ $(if $(CONFIG_STATIC_MSVCRT),--static-crt) \ --out=$@ $(INTERNAL_CFLAGS) $(CFLAGS) \ -I. -I"$(SRC_PATH_BARE)/third_party/googletest/src/include" \ + $(if $(CONFIG_WEBM_IO),-I"$(SRC_PATH_BARE)/third_party/libwebm") \ -L. -l$(CODEC_LIB) -l$(GTEST_LIB) $^ PROJECTS-$(CONFIG_MSVS) += test_libvpx.$(VCPROJ_SFX) diff --git a/chromium/third_party/libvpx/source/libvpx/md5_utils.c b/chromium/third_party/libvpx/source/libvpx/md5_utils.c index f4f893a2d67..a9b979a4197 100644 --- a/chromium/third_party/libvpx/source/libvpx/md5_utils.c +++ b/chromium/third_party/libvpx/source/libvpx/md5_utils.c @@ -150,12 +150,23 @@ MD5Final(md5byte digest[16], struct MD5Context *ctx) { #define MD5STEP(f,w,x,y,z,in,s) \ (w += f(x,y,z) + in, w = (w<<s | w>>(32-s)) + x) +#if defined(__clang__) && defined(__has_attribute) +#if __has_attribute(no_sanitize) +#define VPX_NO_UNSIGNED_OVERFLOW_CHECK \ + __attribute__((no_sanitize("unsigned-integer-overflow"))) +#endif +#endif + +#ifndef VPX_NO_UNSIGNED_OVERFLOW_CHECK +#define VPX_NO_UNSIGNED_OVERFLOW_CHECK +#endif + /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ -void +VPX_NO_UNSIGNED_OVERFLOW_CHECK void MD5Transform(UWORD32 buf[4], UWORD32 const in[16]) { register UWORD32 a, b, c, d; @@ -238,4 +249,6 @@ MD5Transform(UWORD32 buf[4], UWORD32 const in[16]) { buf[3] += d; } +#undef VPX_NO_UNSIGNED_OVERFLOW_CHECK + #endif diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/Android.mk b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/Android.mk index be9d77deed7..8149a083f4f 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/Android.mk +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/Android.mk @@ -2,9 +2,16 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE:= libwebm -LOCAL_SRC_FILES:= mkvparser.cpp \ - mkvreader.cpp \ - mkvmuxer.cpp \ - mkvmuxerutil.cpp \ - mkvwriter.cpp +LOCAL_CPPFLAGS:=-D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS +LOCAL_CPPFLAGS+=-D__STDC_LIMIT_MACROS -Wno-extern-c-compat +LOCAL_C_INCLUDES:= $(LOCAL_PATH) +LOCAL_EXPORT_C_INCLUDES:= $(LOCAL_PATH) + +LOCAL_SRC_FILES:= common/file_util.cc \ + common/hdr_util.cc \ + mkvparser/mkvparser.cc \ + mkvparser/mkvreader.cc \ + mkvmuxer/mkvmuxer.cc \ + mkvmuxer/mkvmuxerutil.cc \ + mkvmuxer/mkvwriter.cc include $(BUILD_STATIC_LIBRARY) diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/README.libvpx b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/README.libvpx index 2989d3d89a6..73f83032225 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/README.libvpx +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/README.libvpx @@ -1,5 +1,5 @@ URL: https://chromium.googlesource.com/webm/libwebm -Version: 476366249e1fda7710a389cd41c57db42305e0d4 +Version: 32d5ac49414a8914ec1e1f285f3f927c6e8ec29d License: BSD License File: LICENSE.txt diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/RELEASE.TXT b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/RELEASE.TXT deleted file mode 100644 index db1b77117ce..00000000000 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/RELEASE.TXT +++ /dev/null @@ -1,34 +0,0 @@ -1.0.0.5 - * Handled case when no duration - * Handled empty clusters - * Handled empty clusters when seeking - * Implemented check lacing bits - -1.0.0.4 - * Made Cues member variables mutables - * Defined against badly-formatted cue points - * Segment::GetCluster returns CuePoint too - * Separated cue-based searches - -1.0.0.3 - * Added Block::GetOffset() to get a frame's offset in a block - * Changed cluster count type from size_t to long - * Parsed SeekHead to find cues - * Allowed seeking beyond end of cluster cache - * Added not to attempt to reparse cues element - * Restructured Segment::LoadCluster - * Marked position of cues without parsing cues element - * Allowed cue points to be loaded incrementally - * Implemented to load lazily cue points as they're searched - * Merged Cues::LoadCuePoint into Cues::Find - * Lazy init cues - * Loaded cue point during find - -1.0.0.2 - * added support for Cues element - * seeking was improved - -1.0.0.1 - * fixed item 141 - * added item 142 - * added this file, RELEASE.TXT, to repository diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/file_util.cc b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/file_util.cc new file mode 100644 index 00000000000..4f91318f3e9 --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/file_util.cc @@ -0,0 +1,67 @@ +// Copyright (c) 2016 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +#include "common/file_util.h" + +#include <sys/stat.h> +#ifndef _MSC_VER +#include <unistd.h> // close() +#endif + +#include <cstdio> +#include <cstdlib> +#include <fstream> +#include <ios> + +namespace libwebm { + +std::string GetTempFileName() { +#if !defined _MSC_VER && !defined __MINGW32__ + char temp_file_name_template[] = "libwebm_temp.XXXXXX"; + int fd = mkstemp(temp_file_name_template); + if (fd != -1) { + close(fd); + return std::string(temp_file_name_template); + } + return std::string(); +#else + char tmp_file_name[_MAX_PATH]; + errno_t err = tmpnam_s(tmp_file_name); + if (err == 0) { + return std::string(tmp_file_name); + } + return std::string(); +#endif +} + +uint64_t GetFileSize(const std::string& file_name) { + uint64_t file_size = 0; +#ifndef _MSC_VER + struct stat st; + st.st_size = 0; + if (stat(file_name.c_str(), &st) == 0) { +#else + struct _stat st; + st.st_size = 0; + if (_stat(file_name.c_str(), &st) == 0) { +#endif + file_size = st.st_size; + } + return file_size; +} + +TempFileDeleter::TempFileDeleter() { file_name_ = GetTempFileName(); } + +TempFileDeleter::~TempFileDeleter() { + std::ifstream file(file_name_.c_str()); + if (file.good()) { + file.close(); + std::remove(file_name_.c_str()); + } +} + +} // namespace libwebm diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/file_util.h b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/file_util.h new file mode 100644 index 00000000000..0e71eac11e4 --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/file_util.h @@ -0,0 +1,41 @@ +// Copyright (c) 2016 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +#ifndef LIBWEBM_COMMON_FILE_UTIL_H_ +#define LIBWEBM_COMMON_FILE_UTIL_H_ + +#include <stdint.h> + +#include <string> + +#include "mkvmuxer/mkvmuxertypes.h" // LIBWEBM_DISALLOW_COPY_AND_ASSIGN() + +namespace libwebm { + +// Returns a temporary file name. +std::string GetTempFileName(); + +// Returns size of file specified by |file_name|, or 0 upon failure. +uint64_t GetFileSize(const std::string& file_name); + +// Manages life of temporary file specified at time of construction. Deletes +// file upon destruction. +class TempFileDeleter { + public: + TempFileDeleter(); + explicit TempFileDeleter(std::string file_name) : file_name_(file_name) {} + ~TempFileDeleter(); + const std::string& name() const { return file_name_; } + + private: + std::string file_name_; + LIBWEBM_DISALLOW_COPY_AND_ASSIGN(TempFileDeleter); +}; + +} // namespace libwebm + +#endif // LIBWEBM_COMMON_FILE_UTIL_H_
\ No newline at end of file diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/hdr_util.cc b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/hdr_util.cc new file mode 100644 index 00000000000..e1a9842fb6e --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/hdr_util.cc @@ -0,0 +1,182 @@ +// Copyright (c) 2016 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +#include "hdr_util.h" + +#include <cstddef> +#include <new> + +#include "mkvparser/mkvparser.h" + +namespace libwebm { +bool CopyPrimaryChromaticity(const mkvparser::PrimaryChromaticity& parser_pc, + PrimaryChromaticityPtr* muxer_pc) { + muxer_pc->reset(new (std::nothrow) + mkvmuxer::PrimaryChromaticity(parser_pc.x, parser_pc.y)); + if (!muxer_pc->get()) + return false; + return true; +} + +bool MasteringMetadataValuePresent(double value) { + return value != mkvparser::MasteringMetadata::kValueNotPresent; +} + +bool CopyMasteringMetadata(const mkvparser::MasteringMetadata& parser_mm, + mkvmuxer::MasteringMetadata* muxer_mm) { + if (MasteringMetadataValuePresent(parser_mm.luminance_max)) + muxer_mm->luminance_max = parser_mm.luminance_max; + if (MasteringMetadataValuePresent(parser_mm.luminance_min)) + muxer_mm->luminance_min = parser_mm.luminance_min; + + PrimaryChromaticityPtr r_ptr(NULL); + PrimaryChromaticityPtr g_ptr(NULL); + PrimaryChromaticityPtr b_ptr(NULL); + PrimaryChromaticityPtr wp_ptr(NULL); + + if (parser_mm.r) { + if (!CopyPrimaryChromaticity(*parser_mm.r, &r_ptr)) + return false; + } + if (parser_mm.g) { + if (!CopyPrimaryChromaticity(*parser_mm.g, &g_ptr)) + return false; + } + if (parser_mm.b) { + if (!CopyPrimaryChromaticity(*parser_mm.b, &b_ptr)) + return false; + } + if (parser_mm.white_point) { + if (!CopyPrimaryChromaticity(*parser_mm.white_point, &wp_ptr)) + return false; + } + + if (!muxer_mm->SetChromaticity(r_ptr.get(), g_ptr.get(), b_ptr.get(), + wp_ptr.get())) { + return false; + } + + return true; +} + +bool ColourValuePresent(long long value) { + return value != mkvparser::Colour::kValueNotPresent; +} + +bool CopyColour(const mkvparser::Colour& parser_colour, + mkvmuxer::Colour* muxer_colour) { + if (!muxer_colour) + return false; + + if (ColourValuePresent(parser_colour.matrix_coefficients)) + muxer_colour->matrix_coefficients = parser_colour.matrix_coefficients; + if (ColourValuePresent(parser_colour.bits_per_channel)) + muxer_colour->bits_per_channel = parser_colour.bits_per_channel; + if (ColourValuePresent(parser_colour.chroma_subsampling_horz)) + muxer_colour->chroma_subsampling_horz = + parser_colour.chroma_subsampling_horz; + if (ColourValuePresent(parser_colour.chroma_subsampling_vert)) + muxer_colour->chroma_subsampling_vert = + parser_colour.chroma_subsampling_vert; + if (ColourValuePresent(parser_colour.cb_subsampling_horz)) + muxer_colour->cb_subsampling_horz = parser_colour.cb_subsampling_horz; + if (ColourValuePresent(parser_colour.cb_subsampling_vert)) + muxer_colour->cb_subsampling_vert = parser_colour.cb_subsampling_vert; + if (ColourValuePresent(parser_colour.chroma_siting_horz)) + muxer_colour->chroma_siting_horz = parser_colour.chroma_siting_horz; + if (ColourValuePresent(parser_colour.chroma_siting_vert)) + muxer_colour->chroma_siting_vert = parser_colour.chroma_siting_vert; + if (ColourValuePresent(parser_colour.range)) + muxer_colour->range = parser_colour.range; + if (ColourValuePresent(parser_colour.transfer_characteristics)) + muxer_colour->transfer_characteristics = + parser_colour.transfer_characteristics; + if (ColourValuePresent(parser_colour.primaries)) + muxer_colour->primaries = parser_colour.primaries; + if (ColourValuePresent(parser_colour.max_cll)) + muxer_colour->max_cll = parser_colour.max_cll; + if (ColourValuePresent(parser_colour.max_fall)) + muxer_colour->max_fall = parser_colour.max_fall; + + if (parser_colour.mastering_metadata) { + mkvmuxer::MasteringMetadata muxer_mm; + if (!CopyMasteringMetadata(*parser_colour.mastering_metadata, &muxer_mm)) + return false; + if (!muxer_colour->SetMasteringMetadata(muxer_mm)) + return false; + } + return true; +} + +// Format of VPx private data: +// +// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// | ID Byte | Length | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | +// | | +// : Bytes 1..Length of Codec Feature : +// | | +// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ +// +// ID Byte Format +// ID byte is an unsigned byte. +// 0 1 2 3 4 5 6 7 +// +-+-+-+-+-+-+-+-+ +// |X| ID | +// +-+-+-+-+-+-+-+-+ +// +// The X bit is reserved. +// +// Currently only profile level is supported. ID byte must be set to 1, and +// length must be 1. Supported values are: +// +// 10: Level 1 +// 11: Level 1.1 +// 20: Level 2 +// 21: Level 2.1 +// 30: Level 3 +// 31: Level 3.1 +// 40: Level 4 +// 41: Level 4.1 +// 50: Level 5 +// 51: Level 5.1 +// 52: Level 5.2 +// 60: Level 6 +// 61: Level 6.1 +// 62: Level 6.2 +// +// See the following link for more information: +// http://www.webmproject.org/vp9/profiles/ +int ParseVpxCodecPrivate(const uint8_t* private_data, int32_t length) { + const int kVpxCodecPrivateLength = 3; + if (!private_data || length != kVpxCodecPrivateLength) + return 0; + + const uint8_t id_byte = *private_data; + if (id_byte != 1) + return 0; + + const int kVpxProfileLength = 1; + const uint8_t length_byte = private_data[1]; + if (length_byte != kVpxProfileLength) + return 0; + + const int level = static_cast<int>(private_data[2]); + + const int kNumLevels = 14; + const int levels[kNumLevels] = {10, 11, 20, 21, 30, 31, 40, + 41, 50, 51, 52, 60, 61, 62}; + + for (int i = 0; i < kNumLevels; ++i) { + if (level == levels[i]) + return level; + } + + return 0; +} +} // namespace libwebm diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/hdr_util.h b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/hdr_util.h new file mode 100644 index 00000000000..d30c2b9f2a0 --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/hdr_util.h @@ -0,0 +1,51 @@ +// Copyright (c) 2016 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +#ifndef LIBWEBM_COMMON_HDR_UTIL_H_ +#define LIBWEBM_COMMON_HDR_UTIL_H_ + +#include <stdint.h> + +#include <memory> + +#include "mkvmuxer/mkvmuxer.h" + +namespace mkvparser { +struct Colour; +struct MasteringMetadata; +struct PrimaryChromaticity; +} // namespace mkvparser + +namespace libwebm { +// Utility types and functions for working with the Colour element and its +// children. Copiers return true upon success. Presence functions return true +// when the specified element is present. + +// TODO(tomfinegan): These should be moved to libwebm_utils once c++11 is +// required by libwebm. + +typedef std::auto_ptr<mkvmuxer::PrimaryChromaticity> PrimaryChromaticityPtr; + +bool CopyPrimaryChromaticity(const mkvparser::PrimaryChromaticity& parser_pc, + PrimaryChromaticityPtr* muxer_pc); + +bool MasteringMetadataValuePresent(double value); + +bool CopyMasteringMetadata(const mkvparser::MasteringMetadata& parser_mm, + mkvmuxer::MasteringMetadata* muxer_mm); + +bool ColourValuePresent(long long value); + +bool CopyColour(const mkvparser::Colour& parser_colour, + mkvmuxer::Colour* muxer_colour); + +// Returns VP9 profile upon success or 0 upon failure. +int ParseVpxCodecPrivate(const uint8_t* private_data, int32_t length); + +} // namespace libwebm + +#endif // LIBWEBM_COMMON_HDR_UTIL_H_ diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/webmids.hpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/webmids.h index ad4ab573889..32a0c5fb911 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/webmids.hpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/common/webmids.h @@ -6,10 +6,10 @@ // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. -#ifndef WEBMIDS_HPP -#define WEBMIDS_HPP +#ifndef COMMON_WEBMIDS_H_ +#define COMMON_WEBMIDS_H_ -namespace mkvmuxer { +namespace libwebm { enum MkvId { kMkvEBML = 0x1A45DFA3, @@ -95,6 +95,35 @@ enum MkvId { kMkvAspectRatioType = 0x54B3, kMkvFrameRate = 0x2383E3, // end video + // colour + kMkvColour = 0x55B0, + kMkvMatrixCoefficients = 0x55B1, + kMkvBitsPerChannel = 0x55B2, + kMkvChromaSubsamplingHorz = 0x55B3, + kMkvChromaSubsamplingVert = 0x55B4, + kMkvCbSubsamplingHorz = 0x55B5, + kMkvCbSubsamplingVert = 0x55B6, + kMkvChromaSitingHorz = 0x55B7, + kMkvChromaSitingVert = 0x55B8, + kMkvRange = 0x55B9, + kMkvTransferCharacteristics = 0x55BA, + kMkvPrimaries = 0x55BB, + kMkvMaxCLL = 0x55BC, + kMkvMaxFALL = 0x55BD, + // mastering metadata + kMkvMasteringMetadata = 0x55D0, + kMkvPrimaryRChromaticityX = 0x55D1, + kMkvPrimaryRChromaticityY = 0x55D2, + kMkvPrimaryGChromaticityX = 0x55D3, + kMkvPrimaryGChromaticityY = 0x55D4, + kMkvPrimaryBChromaticityX = 0x55D5, + kMkvPrimaryBChromaticityY = 0x55D6, + kMkvWhitePointChromaticityX = 0x55D7, + kMkvWhitePointChromaticityY = 0x55D8, + kMkvLuminanceMax = 0x55D9, + kMkvLuminanceMin = 0x55DA, + // end mastering metadata + // end colour // audio kMkvAudio = 0xE1, kMkvSamplingFrequency = 0xB5, @@ -150,6 +179,6 @@ enum MkvId { kMkvTagString = 0x4487 }; -} // end namespace mkvmuxer +} // namespace libwebm -#endif // WEBMIDS_HPP +#endif // COMMON_WEBMIDS_H_ diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer.cpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxer.cc index 9be3119a460..c79ce24ed35 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer.cpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxer.cc @@ -6,27 +6,28 @@ // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. -#include "mkvmuxer.hpp" +#include "mkvmuxer/mkvmuxer.h" +#include <cfloat> #include <climits> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> +#include <memory> #include <new> +#include <vector> -#include "mkvmuxerutil.hpp" -#include "mkvparser.hpp" -#include "mkvwriter.hpp" -#include "webmids.hpp" - -#ifdef _MSC_VER -// Disable MSVC warnings that suggest making code non-portable. -#pragma warning(disable : 4996) -#endif +#include "common/webmids.h" +#include "mkvmuxer/mkvmuxerutil.h" +#include "mkvmuxer/mkvwriter.h" +#include "mkvparser/mkvparser.h" namespace mkvmuxer { +const float MasteringMetadata::kValueNotPresent = FLT_MAX; +const uint64_t Colour::kValueNotPresent = UINT64_MAX; + namespace { // Deallocate the string designated by |dst|, and then copy the |src| // string to |dst|. The caller owns both the |src| string and the @@ -55,6 +56,20 @@ bool StrCpy(const char* src, char** dst_ptr) { strcpy(dst, src); // NOLINT return true; } + +typedef std::auto_ptr<PrimaryChromaticity> PrimaryChromaticityPtr; +bool CopyChromaticity(const PrimaryChromaticity* src, + PrimaryChromaticityPtr* dst) { + if (!dst) + return false; + + dst->reset(new (std::nothrow) PrimaryChromaticity(src->x, src->y)); + if (!dst->get()) + return false; + + return true; +} + } // namespace /////////////////////////////////////////////////////////////// @@ -65,31 +80,31 @@ IMkvWriter::IMkvWriter() {} IMkvWriter::~IMkvWriter() {} -bool WriteEbmlHeader(IMkvWriter* writer, uint64 doc_type_version) { +bool WriteEbmlHeader(IMkvWriter* writer, uint64_t doc_type_version) { // Level 0 - uint64 size = EbmlElementSize(kMkvEBMLVersion, 1ULL); - size += EbmlElementSize(kMkvEBMLReadVersion, 1ULL); - size += EbmlElementSize(kMkvEBMLMaxIDLength, 4ULL); - size += EbmlElementSize(kMkvEBMLMaxSizeLength, 8ULL); - size += EbmlElementSize(kMkvDocType, "webm"); - size += EbmlElementSize(kMkvDocTypeVersion, doc_type_version); - size += EbmlElementSize(kMkvDocTypeReadVersion, 2ULL); + uint64_t size = EbmlElementSize(libwebm::kMkvEBMLVersion, UINT64_C(1)); + size += EbmlElementSize(libwebm::kMkvEBMLReadVersion, UINT64_C(1)); + size += EbmlElementSize(libwebm::kMkvEBMLMaxIDLength, UINT64_C(4)); + size += EbmlElementSize(libwebm::kMkvEBMLMaxSizeLength, UINT64_C(8)); + size += EbmlElementSize(libwebm::kMkvDocType, "webm"); + size += EbmlElementSize(libwebm::kMkvDocTypeVersion, doc_type_version); + size += EbmlElementSize(libwebm::kMkvDocTypeReadVersion, UINT64_C(2)); - if (!WriteEbmlMasterElement(writer, kMkvEBML, size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvEBML, size)) return false; - if (!WriteEbmlElement(writer, kMkvEBMLVersion, 1ULL)) + if (!WriteEbmlElement(writer, libwebm::kMkvEBMLVersion, UINT64_C(1))) return false; - if (!WriteEbmlElement(writer, kMkvEBMLReadVersion, 1ULL)) + if (!WriteEbmlElement(writer, libwebm::kMkvEBMLReadVersion, UINT64_C(1))) return false; - if (!WriteEbmlElement(writer, kMkvEBMLMaxIDLength, 4ULL)) + if (!WriteEbmlElement(writer, libwebm::kMkvEBMLMaxIDLength, UINT64_C(4))) return false; - if (!WriteEbmlElement(writer, kMkvEBMLMaxSizeLength, 8ULL)) + if (!WriteEbmlElement(writer, libwebm::kMkvEBMLMaxSizeLength, UINT64_C(8))) return false; - if (!WriteEbmlElement(writer, kMkvDocType, "webm")) + if (!WriteEbmlElement(writer, libwebm::kMkvDocType, "webm")) return false; - if (!WriteEbmlElement(writer, kMkvDocTypeVersion, doc_type_version)) + if (!WriteEbmlElement(writer, libwebm::kMkvDocTypeVersion, doc_type_version)) return false; - if (!WriteEbmlElement(writer, kMkvDocTypeReadVersion, 2ULL)) + if (!WriteEbmlElement(writer, libwebm::kMkvDocTypeReadVersion, UINT64_C(2))) return false; return true; @@ -100,16 +115,16 @@ bool WriteEbmlHeader(IMkvWriter* writer) { } bool ChunkedCopy(mkvparser::IMkvReader* source, mkvmuxer::IMkvWriter* dst, - mkvmuxer::int64 start, int64 size) { + int64_t start, int64_t size) { // TODO(vigneshv): Check if this is a reasonable value. - const uint32 kBufSize = 2048; - uint8* buf = new uint8[kBufSize]; - int64 offset = start; + const uint32_t kBufSize = 2048; + uint8_t* buf = new uint8_t[kBufSize]; + int64_t offset = start; while (size > 0) { - const int64 read_len = (size > kBufSize) ? kBufSize : size; + const int64_t read_len = (size > kBufSize) ? kBufSize : size; if (source->Read(offset, static_cast<long>(read_len), buf)) return false; - dst->Write(buf, static_cast<uint32>(read_len)); + dst->Write(buf, static_cast<uint32_t>(read_len)); offset += read_len; size -= read_len; } @@ -126,6 +141,7 @@ Frame::Frame() additional_(NULL), additional_length_(0), duration_(0), + duration_set_(false), frame_(NULL), is_key_(false), length_(0), @@ -158,16 +174,19 @@ bool Frame::CopyFrom(const Frame& frame) { return false; } duration_ = frame.duration(); + duration_set_ = frame.duration_set(); is_key_ = frame.is_key(); track_number_ = frame.track_number(); timestamp_ = frame.timestamp(); discard_padding_ = frame.discard_padding(); + reference_block_timestamp_ = frame.reference_block_timestamp(); + reference_block_timestamp_set_ = frame.reference_block_timestamp_set(); return true; } -bool Frame::Init(const uint8* frame, uint64 length) { - uint8* const data = - new (std::nothrow) uint8[static_cast<size_t>(length)]; // NOLINT +bool Frame::Init(const uint8_t* frame, uint64_t length) { + uint8_t* const data = + new (std::nothrow) uint8_t[static_cast<size_t>(length)]; // NOLINT if (!data) return false; @@ -179,10 +198,10 @@ bool Frame::Init(const uint8* frame, uint64 length) { return true; } -bool Frame::AddAdditionalData(const uint8* additional, uint64 length, - uint64 add_id) { - uint8* const data = - new (std::nothrow) uint8[static_cast<size_t>(length)]; // NOLINT +bool Frame::AddAdditionalData(const uint8_t* additional, uint64_t length, + uint64_t add_id) { + uint8_t* const data = + new (std::nothrow) uint8_t[static_cast<size_t>(length)]; // NOLINT if (!data) return false; @@ -216,7 +235,12 @@ bool Frame::CanBeSimpleBlock() const { return additional_ == NULL && discard_padding_ == 0 && duration_ == 0; } -void Frame::set_reference_block_timestamp(int64 reference_block_timestamp) { +void Frame::set_duration(uint64_t duration) { + duration_ = duration; + duration_set_ = true; +} + +void Frame::set_reference_block_timestamp(int64_t reference_block_timestamp) { reference_block_timestamp_ = reference_block_timestamp; reference_block_timestamp_set_ = true; } @@ -238,61 +262,64 @@ bool CuePoint::Write(IMkvWriter* writer) const { if (!writer || track_ < 1 || cluster_pos_ < 1) return false; - uint64 size = EbmlElementSize(kMkvCueClusterPosition, cluster_pos_); - size += EbmlElementSize(kMkvCueTrack, track_); + uint64_t size = + EbmlElementSize(libwebm::kMkvCueClusterPosition, cluster_pos_); + size += EbmlElementSize(libwebm::kMkvCueTrack, track_); if (output_block_number_ && block_number_ > 1) - size += EbmlElementSize(kMkvCueBlockNumber, block_number_); - const uint64 track_pos_size = - EbmlMasterElementSize(kMkvCueTrackPositions, size) + size; - const uint64 payload_size = - EbmlElementSize(kMkvCueTime, time_) + track_pos_size; + size += EbmlElementSize(libwebm::kMkvCueBlockNumber, block_number_); + const uint64_t track_pos_size = + EbmlMasterElementSize(libwebm::kMkvCueTrackPositions, size) + size; + const uint64_t payload_size = + EbmlElementSize(libwebm::kMkvCueTime, time_) + track_pos_size; - if (!WriteEbmlMasterElement(writer, kMkvCuePoint, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvCuePoint, payload_size)) return false; - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return false; - if (!WriteEbmlElement(writer, kMkvCueTime, time_)) + if (!WriteEbmlElement(writer, libwebm::kMkvCueTime, time_)) return false; - if (!WriteEbmlMasterElement(writer, kMkvCueTrackPositions, size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvCueTrackPositions, size)) return false; - if (!WriteEbmlElement(writer, kMkvCueTrack, track_)) + if (!WriteEbmlElement(writer, libwebm::kMkvCueTrack, track_)) return false; - if (!WriteEbmlElement(writer, kMkvCueClusterPosition, cluster_pos_)) + if (!WriteEbmlElement(writer, libwebm::kMkvCueClusterPosition, cluster_pos_)) return false; if (output_block_number_ && block_number_ > 1) - if (!WriteEbmlElement(writer, kMkvCueBlockNumber, block_number_)) + if (!WriteEbmlElement(writer, libwebm::kMkvCueBlockNumber, block_number_)) return false; - const int64 stop_position = writer->Position(); + const int64_t stop_position = writer->Position(); if (stop_position < 0) return false; - if (stop_position - payload_position != static_cast<int64>(payload_size)) + if (stop_position - payload_position != static_cast<int64_t>(payload_size)) return false; return true; } -uint64 CuePoint::PayloadSize() const { - uint64 size = EbmlElementSize(kMkvCueClusterPosition, cluster_pos_); - size += EbmlElementSize(kMkvCueTrack, track_); +uint64_t CuePoint::PayloadSize() const { + uint64_t size = + EbmlElementSize(libwebm::kMkvCueClusterPosition, cluster_pos_); + size += EbmlElementSize(libwebm::kMkvCueTrack, track_); if (output_block_number_ && block_number_ > 1) - size += EbmlElementSize(kMkvCueBlockNumber, block_number_); - const uint64 track_pos_size = - EbmlMasterElementSize(kMkvCueTrackPositions, size) + size; - const uint64 payload_size = - EbmlElementSize(kMkvCueTime, time_) + track_pos_size; + size += EbmlElementSize(libwebm::kMkvCueBlockNumber, block_number_); + const uint64_t track_pos_size = + EbmlMasterElementSize(libwebm::kMkvCueTrackPositions, size) + size; + const uint64_t payload_size = + EbmlElementSize(libwebm::kMkvCueTime, time_) + track_pos_size; return payload_size; } -uint64 CuePoint::Size() const { - const uint64 payload_size = PayloadSize(); - return EbmlMasterElementSize(kMkvCuePoint, payload_size) + payload_size; +uint64_t CuePoint::Size() const { + const uint64_t payload_size = PayloadSize(); + return EbmlMasterElementSize(libwebm::kMkvCuePoint, payload_size) + + payload_size; } /////////////////////////////////////////////////////////////// @@ -307,7 +334,7 @@ Cues::Cues() Cues::~Cues() { if (cue_entries_) { - for (int32 i = 0; i < cue_entries_size_; ++i) { + for (int32_t i = 0; i < cue_entries_size_; ++i) { CuePoint* const cue = cue_entries_[i]; delete cue; } @@ -321,7 +348,7 @@ bool Cues::AddCue(CuePoint* cue) { if ((cue_entries_size_ + 1) > cue_entries_capacity_) { // Add more CuePoints. - const int32 new_capacity = + const int32_t new_capacity = (!cue_entries_capacity_) ? 2 : cue_entries_capacity_ * 2; if (new_capacity < 1) @@ -332,7 +359,7 @@ bool Cues::AddCue(CuePoint* cue) { if (!cues) return false; - for (int32 i = 0; i < cue_entries_size_; ++i) { + for (int32_t i = 0; i < cue_entries_size_; ++i) { cues[i] = cue_entries_[i]; } @@ -347,7 +374,7 @@ bool Cues::AddCue(CuePoint* cue) { return true; } -CuePoint* Cues::GetCueByIndex(int32 index) const { +CuePoint* Cues::GetCueByIndex(int32_t index) const { if (cue_entries_ == NULL) return NULL; @@ -357,11 +384,11 @@ CuePoint* Cues::GetCueByIndex(int32 index) const { return cue_entries_[index]; } -uint64 Cues::Size() { - uint64 size = 0; - for (int32 i = 0; i < cue_entries_size_; ++i) +uint64_t Cues::Size() { + uint64_t size = 0; + for (int32_t i = 0; i < cue_entries_size_; ++i) size += GetCueByIndex(i)->Size(); - size += EbmlMasterElementSize(kMkvCues, size); + size += EbmlMasterElementSize(libwebm::kMkvCues, size); return size; } @@ -369,8 +396,8 @@ bool Cues::Write(IMkvWriter* writer) const { if (!writer) return false; - uint64 size = 0; - for (int32 i = 0; i < cue_entries_size_; ++i) { + uint64_t size = 0; + for (int32_t i = 0; i < cue_entries_size_; ++i) { const CuePoint* const cue = GetCueByIndex(i); if (!cue) @@ -379,25 +406,25 @@ bool Cues::Write(IMkvWriter* writer) const { size += cue->Size(); } - if (!WriteEbmlMasterElement(writer, kMkvCues, size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvCues, size)) return false; - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return false; - for (int32 i = 0; i < cue_entries_size_; ++i) { + for (int32_t i = 0; i < cue_entries_size_; ++i) { const CuePoint* const cue = GetCueByIndex(i); if (!cue->Write(writer)) return false; } - const int64 stop_position = writer->Position(); + const int64_t stop_position = writer->Position(); if (stop_position < 0) return false; - if (stop_position - payload_position != static_cast<int64>(size)) + if (stop_position - payload_position != static_cast<int64_t>(size)) return false; return true; @@ -409,36 +436,40 @@ bool Cues::Write(IMkvWriter* writer) const { ContentEncAESSettings::ContentEncAESSettings() : cipher_mode_(kCTR) {} -uint64 ContentEncAESSettings::Size() const { - const uint64 payload = PayloadSize(); - const uint64 size = - EbmlMasterElementSize(kMkvContentEncAESSettings, payload) + payload; +uint64_t ContentEncAESSettings::Size() const { + const uint64_t payload = PayloadSize(); + const uint64_t size = + EbmlMasterElementSize(libwebm::kMkvContentEncAESSettings, payload) + + payload; return size; } bool ContentEncAESSettings::Write(IMkvWriter* writer) const { - const uint64 payload = PayloadSize(); + const uint64_t payload = PayloadSize(); - if (!WriteEbmlMasterElement(writer, kMkvContentEncAESSettings, payload)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvContentEncAESSettings, + payload)) return false; - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return false; - if (!WriteEbmlElement(writer, kMkvAESSettingsCipherMode, cipher_mode_)) + if (!WriteEbmlElement(writer, libwebm::kMkvAESSettingsCipherMode, + cipher_mode_)) return false; - const int64 stop_position = writer->Position(); + const int64_t stop_position = writer->Position(); if (stop_position < 0 || - stop_position - payload_position != static_cast<int64>(payload)) + stop_position - payload_position != static_cast<int64_t>(payload)) return false; return true; } -uint64 ContentEncAESSettings::PayloadSize() const { - uint64 size = EbmlElementSize(kMkvAESSettingsCipherMode, cipher_mode_); +uint64_t ContentEncAESSettings::PayloadSize() const { + uint64_t size = + EbmlElementSize(libwebm::kMkvAESSettingsCipherMode, cipher_mode_); return size; } @@ -456,14 +487,14 @@ ContentEncoding::ContentEncoding() ContentEncoding::~ContentEncoding() { delete[] enc_key_id_; } -bool ContentEncoding::SetEncryptionID(const uint8* id, uint64 length) { +bool ContentEncoding::SetEncryptionID(const uint8_t* id, uint64_t length) { if (!id || length < 1) return false; delete[] enc_key_id_; enc_key_id_ = - new (std::nothrow) uint8[static_cast<size_t>(length)]; // NOLINT + new (std::nothrow) uint8_t[static_cast<size_t>(length)]; // NOLINT if (!enc_key_id_) return false; @@ -473,79 +504,89 @@ bool ContentEncoding::SetEncryptionID(const uint8* id, uint64 length) { return true; } -uint64 ContentEncoding::Size() const { - const uint64 encryption_size = EncryptionSize(); - const uint64 encoding_size = EncodingSize(0, encryption_size); - const uint64 encodings_size = - EbmlMasterElementSize(kMkvContentEncoding, encoding_size) + encoding_size; +uint64_t ContentEncoding::Size() const { + const uint64_t encryption_size = EncryptionSize(); + const uint64_t encoding_size = EncodingSize(0, encryption_size); + const uint64_t encodings_size = + EbmlMasterElementSize(libwebm::kMkvContentEncoding, encoding_size) + + encoding_size; return encodings_size; } bool ContentEncoding::Write(IMkvWriter* writer) const { - const uint64 encryption_size = EncryptionSize(); - const uint64 encoding_size = EncodingSize(0, encryption_size); - const uint64 size = - EbmlMasterElementSize(kMkvContentEncoding, encoding_size) + encoding_size; + const uint64_t encryption_size = EncryptionSize(); + const uint64_t encoding_size = EncodingSize(0, encryption_size); + const uint64_t size = + EbmlMasterElementSize(libwebm::kMkvContentEncoding, encoding_size) + + encoding_size; - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return false; - if (!WriteEbmlMasterElement(writer, kMkvContentEncoding, encoding_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvContentEncoding, + encoding_size)) return false; - if (!WriteEbmlElement(writer, kMkvContentEncodingOrder, encoding_order_)) + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncodingOrder, + encoding_order_)) return false; - if (!WriteEbmlElement(writer, kMkvContentEncodingScope, encoding_scope_)) + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncodingScope, + encoding_scope_)) return false; - if (!WriteEbmlElement(writer, kMkvContentEncodingType, encoding_type_)) + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncodingType, + encoding_type_)) return false; - if (!WriteEbmlMasterElement(writer, kMkvContentEncryption, encryption_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvContentEncryption, + encryption_size)) return false; - if (!WriteEbmlElement(writer, kMkvContentEncAlgo, enc_algo_)) + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncAlgo, enc_algo_)) return false; - if (!WriteEbmlElement(writer, kMkvContentEncKeyID, enc_key_id_, + if (!WriteEbmlElement(writer, libwebm::kMkvContentEncKeyID, enc_key_id_, enc_key_id_length_)) return false; if (!enc_aes_settings_.Write(writer)) return false; - const int64 stop_position = writer->Position(); + const int64_t stop_position = writer->Position(); if (stop_position < 0 || - stop_position - payload_position != static_cast<int64>(size)) + stop_position - payload_position != static_cast<int64_t>(size)) return false; return true; } -uint64 ContentEncoding::EncodingSize(uint64 compresion_size, - uint64 encryption_size) const { +uint64_t ContentEncoding::EncodingSize(uint64_t compresion_size, + uint64_t encryption_size) const { // TODO(fgalligan): Add support for compression settings. if (compresion_size != 0) return 0; - uint64 encoding_size = 0; + uint64_t encoding_size = 0; if (encryption_size > 0) { encoding_size += - EbmlMasterElementSize(kMkvContentEncryption, encryption_size) + + EbmlMasterElementSize(libwebm::kMkvContentEncryption, encryption_size) + encryption_size; } - encoding_size += EbmlElementSize(kMkvContentEncodingType, encoding_type_); - encoding_size += EbmlElementSize(kMkvContentEncodingScope, encoding_scope_); - encoding_size += EbmlElementSize(kMkvContentEncodingOrder, encoding_order_); + encoding_size += + EbmlElementSize(libwebm::kMkvContentEncodingType, encoding_type_); + encoding_size += + EbmlElementSize(libwebm::kMkvContentEncodingScope, encoding_scope_); + encoding_size += + EbmlElementSize(libwebm::kMkvContentEncodingOrder, encoding_order_); return encoding_size; } -uint64 ContentEncoding::EncryptionSize() const { - const uint64 aes_size = enc_aes_settings_.Size(); +uint64_t ContentEncoding::EncryptionSize() const { + const uint64_t aes_size = enc_aes_settings_.Size(); - uint64 encryption_size = - EbmlElementSize(kMkvContentEncKeyID, enc_key_id_, enc_key_id_length_); - encryption_size += EbmlElementSize(kMkvContentEncAlgo, enc_algo_); + uint64_t encryption_size = EbmlElementSize(libwebm::kMkvContentEncKeyID, + enc_key_id_, enc_key_id_length_); + encryption_size += EbmlElementSize(libwebm::kMkvContentEncAlgo, enc_algo_); return encryption_size + aes_size; } @@ -577,7 +618,7 @@ Track::~Track() { delete[] name_; if (content_encoding_entries_) { - for (uint32 i = 0; i < content_encoding_entries_size_; ++i) { + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { ContentEncoding* const encoding = content_encoding_entries_[i]; delete encoding; } @@ -586,7 +627,7 @@ Track::~Track() { } bool Track::AddContentEncoding() { - const uint32 count = content_encoding_entries_size_ + 1; + const uint32_t count = content_encoding_entries_size_ + 1; ContentEncoding** const content_encoding_entries = new (std::nothrow) ContentEncoding*[count]; // NOLINT @@ -600,7 +641,7 @@ bool Track::AddContentEncoding() { return false; } - for (uint32 i = 0; i < content_encoding_entries_size_; ++i) { + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { content_encoding_entries[i] = content_encoding_entries_[i]; } @@ -612,7 +653,7 @@ bool Track::AddContentEncoding() { return true; } -ContentEncoding* Track::GetContentEncodingByIndex(uint32 index) const { +ContentEncoding* Track::GetContentEncodingByIndex(uint32_t index) const { if (content_encoding_entries_ == NULL) return NULL; @@ -622,46 +663,47 @@ ContentEncoding* Track::GetContentEncodingByIndex(uint32 index) const { return content_encoding_entries_[index]; } -uint64 Track::PayloadSize() const { - uint64 size = EbmlElementSize(kMkvTrackNumber, number_); - size += EbmlElementSize(kMkvTrackUID, uid_); - size += EbmlElementSize(kMkvTrackType, type_); +uint64_t Track::PayloadSize() const { + uint64_t size = EbmlElementSize(libwebm::kMkvTrackNumber, number_); + size += EbmlElementSize(libwebm::kMkvTrackUID, uid_); + size += EbmlElementSize(libwebm::kMkvTrackType, type_); if (codec_id_) - size += EbmlElementSize(kMkvCodecID, codec_id_); + size += EbmlElementSize(libwebm::kMkvCodecID, codec_id_); if (codec_private_) - size += EbmlElementSize(kMkvCodecPrivate, codec_private_, + size += EbmlElementSize(libwebm::kMkvCodecPrivate, codec_private_, codec_private_length_); if (language_) - size += EbmlElementSize(kMkvLanguage, language_); + size += EbmlElementSize(libwebm::kMkvLanguage, language_); if (name_) - size += EbmlElementSize(kMkvName, name_); + size += EbmlElementSize(libwebm::kMkvName, name_); if (max_block_additional_id_) - size += EbmlElementSize(kMkvMaxBlockAdditionID, max_block_additional_id_); + size += EbmlElementSize(libwebm::kMkvMaxBlockAdditionID, + max_block_additional_id_); if (codec_delay_) - size += EbmlElementSize(kMkvCodecDelay, codec_delay_); + size += EbmlElementSize(libwebm::kMkvCodecDelay, codec_delay_); if (seek_pre_roll_) - size += EbmlElementSize(kMkvSeekPreRoll, seek_pre_roll_); + size += EbmlElementSize(libwebm::kMkvSeekPreRoll, seek_pre_roll_); if (default_duration_) - size += EbmlElementSize(kMkvDefaultDuration, default_duration_); + size += EbmlElementSize(libwebm::kMkvDefaultDuration, default_duration_); if (content_encoding_entries_size_ > 0) { - uint64 content_encodings_size = 0; - for (uint32 i = 0; i < content_encoding_entries_size_; ++i) { + uint64_t content_encodings_size = 0; + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { ContentEncoding* const encoding = content_encoding_entries_[i]; content_encodings_size += encoding->Size(); } - size += - EbmlMasterElementSize(kMkvContentEncodings, content_encodings_size) + - content_encodings_size; + size += EbmlMasterElementSize(libwebm::kMkvContentEncodings, + content_encodings_size) + + content_encodings_size; } return size; } -uint64 Track::Size() const { - uint64 size = PayloadSize(); - size += EbmlMasterElementSize(kMkvTrackEntry, size); +uint64_t Track::Size() const { + uint64_t size = PayloadSize(); + size += EbmlMasterElementSize(libwebm::kMkvTrackEntry, size); return size; } @@ -675,95 +717,97 @@ bool Track::Write(IMkvWriter* writer) const { // |size| may be bigger than what is written out in this function because // derived classes may write out more data in the Track element. - const uint64 payload_size = PayloadSize(); + const uint64_t payload_size = PayloadSize(); - if (!WriteEbmlMasterElement(writer, kMkvTrackEntry, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvTrackEntry, payload_size)) return false; - uint64 size = EbmlElementSize(kMkvTrackNumber, number_); - size += EbmlElementSize(kMkvTrackUID, uid_); - size += EbmlElementSize(kMkvTrackType, type_); + uint64_t size = EbmlElementSize(libwebm::kMkvTrackNumber, number_); + size += EbmlElementSize(libwebm::kMkvTrackUID, uid_); + size += EbmlElementSize(libwebm::kMkvTrackType, type_); if (codec_id_) - size += EbmlElementSize(kMkvCodecID, codec_id_); + size += EbmlElementSize(libwebm::kMkvCodecID, codec_id_); if (codec_private_) - size += EbmlElementSize(kMkvCodecPrivate, codec_private_, + size += EbmlElementSize(libwebm::kMkvCodecPrivate, codec_private_, codec_private_length_); if (language_) - size += EbmlElementSize(kMkvLanguage, language_); + size += EbmlElementSize(libwebm::kMkvLanguage, language_); if (name_) - size += EbmlElementSize(kMkvName, name_); + size += EbmlElementSize(libwebm::kMkvName, name_); if (max_block_additional_id_) - size += EbmlElementSize(kMkvMaxBlockAdditionID, max_block_additional_id_); + size += EbmlElementSize(libwebm::kMkvMaxBlockAdditionID, + max_block_additional_id_); if (codec_delay_) - size += EbmlElementSize(kMkvCodecDelay, codec_delay_); + size += EbmlElementSize(libwebm::kMkvCodecDelay, codec_delay_); if (seek_pre_roll_) - size += EbmlElementSize(kMkvSeekPreRoll, seek_pre_roll_); + size += EbmlElementSize(libwebm::kMkvSeekPreRoll, seek_pre_roll_); if (default_duration_) - size += EbmlElementSize(kMkvDefaultDuration, default_duration_); + size += EbmlElementSize(libwebm::kMkvDefaultDuration, default_duration_); - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return false; - if (!WriteEbmlElement(writer, kMkvTrackNumber, number_)) + if (!WriteEbmlElement(writer, libwebm::kMkvTrackNumber, number_)) return false; - if (!WriteEbmlElement(writer, kMkvTrackUID, uid_)) + if (!WriteEbmlElement(writer, libwebm::kMkvTrackUID, uid_)) return false; - if (!WriteEbmlElement(writer, kMkvTrackType, type_)) + if (!WriteEbmlElement(writer, libwebm::kMkvTrackType, type_)) return false; if (max_block_additional_id_) { - if (!WriteEbmlElement(writer, kMkvMaxBlockAdditionID, + if (!WriteEbmlElement(writer, libwebm::kMkvMaxBlockAdditionID, max_block_additional_id_)) { return false; } } if (codec_delay_) { - if (!WriteEbmlElement(writer, kMkvCodecDelay, codec_delay_)) + if (!WriteEbmlElement(writer, libwebm::kMkvCodecDelay, codec_delay_)) return false; } if (seek_pre_roll_) { - if (!WriteEbmlElement(writer, kMkvSeekPreRoll, seek_pre_roll_)) + if (!WriteEbmlElement(writer, libwebm::kMkvSeekPreRoll, seek_pre_roll_)) return false; } if (default_duration_) { - if (!WriteEbmlElement(writer, kMkvDefaultDuration, default_duration_)) + if (!WriteEbmlElement(writer, libwebm::kMkvDefaultDuration, + default_duration_)) return false; } if (codec_id_) { - if (!WriteEbmlElement(writer, kMkvCodecID, codec_id_)) + if (!WriteEbmlElement(writer, libwebm::kMkvCodecID, codec_id_)) return false; } if (codec_private_) { - if (!WriteEbmlElement(writer, kMkvCodecPrivate, codec_private_, + if (!WriteEbmlElement(writer, libwebm::kMkvCodecPrivate, codec_private_, codec_private_length_)) return false; } if (language_) { - if (!WriteEbmlElement(writer, kMkvLanguage, language_)) + if (!WriteEbmlElement(writer, libwebm::kMkvLanguage, language_)) return false; } if (name_) { - if (!WriteEbmlElement(writer, kMkvName, name_)) + if (!WriteEbmlElement(writer, libwebm::kMkvName, name_)) return false; } - int64 stop_position = writer->Position(); + int64_t stop_position = writer->Position(); if (stop_position < 0 || - stop_position - payload_position != static_cast<int64>(size)) + stop_position - payload_position != static_cast<int64_t>(size)) return false; if (content_encoding_entries_size_ > 0) { - uint64 content_encodings_size = 0; - for (uint32 i = 0; i < content_encoding_entries_size_; ++i) { + uint64_t content_encodings_size = 0; + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { ContentEncoding* const encoding = content_encoding_entries_[i]; content_encodings_size += encoding->Size(); } - if (!WriteEbmlMasterElement(writer, kMkvContentEncodings, + if (!WriteEbmlMasterElement(writer, libwebm::kMkvContentEncodings, content_encodings_size)) return false; - for (uint32 i = 0; i < content_encoding_entries_size_; ++i) { + for (uint32_t i = 0; i < content_encoding_entries_size_; ++i) { ContentEncoding* const encoding = content_encoding_entries_[i]; if (!encoding->Write(writer)) return false; @@ -776,14 +820,14 @@ bool Track::Write(IMkvWriter* writer) const { return true; } -bool Track::SetCodecPrivate(const uint8* codec_private, uint64 length) { +bool Track::SetCodecPrivate(const uint8_t* codec_private, uint64_t length) { if (!codec_private || length < 1) return false; delete[] codec_private_; codec_private_ = - new (std::nothrow) uint8[static_cast<size_t>(length)]; // NOLINT + new (std::nothrow) uint8_t[static_cast<size_t>(length)]; // NOLINT if (!codec_private_) return false; @@ -844,6 +888,279 @@ void Track::set_name(const char* name) { /////////////////////////////////////////////////////////////// // +// Colour and its child elements + +uint64_t PrimaryChromaticity::PrimaryChromaticityPayloadSize( + libwebm::MkvId x_id, libwebm::MkvId y_id) const { + return EbmlElementSize(x_id, x) + EbmlElementSize(y_id, y); +} + +bool PrimaryChromaticity::Write(IMkvWriter* writer, libwebm::MkvId x_id, + libwebm::MkvId y_id) const { + return WriteEbmlElement(writer, x_id, x) && WriteEbmlElement(writer, y_id, y); +} + +uint64_t MasteringMetadata::MasteringMetadataSize() const { + uint64_t size = PayloadSize(); + + if (size > 0) + size += EbmlMasterElementSize(libwebm::kMkvMasteringMetadata, size); + + return size; +} + +bool MasteringMetadata::Write(IMkvWriter* writer) const { + const uint64_t size = PayloadSize(); + + // Don't write an empty element. + if (size == 0) + return true; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvMasteringMetadata, size)) + return false; + if (luminance_max != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvLuminanceMax, luminance_max)) { + return false; + } + if (luminance_min != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvLuminanceMin, luminance_min)) { + return false; + } + if (r_ && + !r_->Write(writer, libwebm::kMkvPrimaryRChromaticityX, + libwebm::kMkvPrimaryRChromaticityY)) { + return false; + } + if (g_ && + !g_->Write(writer, libwebm::kMkvPrimaryGChromaticityX, + libwebm::kMkvPrimaryGChromaticityY)) { + return false; + } + if (b_ && + !b_->Write(writer, libwebm::kMkvPrimaryBChromaticityX, + libwebm::kMkvPrimaryBChromaticityY)) { + return false; + } + if (white_point_ && + !white_point_->Write(writer, libwebm::kMkvWhitePointChromaticityX, + libwebm::kMkvWhitePointChromaticityY)) { + return false; + } + + return true; +} + +bool MasteringMetadata::SetChromaticity( + const PrimaryChromaticity* r, const PrimaryChromaticity* g, + const PrimaryChromaticity* b, const PrimaryChromaticity* white_point) { + PrimaryChromaticityPtr r_ptr(NULL); + if (r) { + if (!CopyChromaticity(r, &r_ptr)) + return false; + } + PrimaryChromaticityPtr g_ptr(NULL); + if (g) { + if (!CopyChromaticity(g, &g_ptr)) + return false; + } + PrimaryChromaticityPtr b_ptr(NULL); + if (b) { + if (!CopyChromaticity(b, &b_ptr)) + return false; + } + PrimaryChromaticityPtr wp_ptr(NULL); + if (white_point) { + if (!CopyChromaticity(white_point, &wp_ptr)) + return false; + } + + r_ = r_ptr.release(); + g_ = g_ptr.release(); + b_ = b_ptr.release(); + white_point_ = wp_ptr.release(); + return true; +} + +uint64_t MasteringMetadata::PayloadSize() const { + uint64_t size = 0; + + if (luminance_max != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvLuminanceMax, luminance_max); + if (luminance_min != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvLuminanceMin, luminance_min); + + if (r_) { + size += r_->PrimaryChromaticityPayloadSize( + libwebm::kMkvPrimaryRChromaticityX, libwebm::kMkvPrimaryRChromaticityY); + } + if (g_) { + size += g_->PrimaryChromaticityPayloadSize( + libwebm::kMkvPrimaryGChromaticityX, libwebm::kMkvPrimaryGChromaticityY); + } + if (b_) { + size += b_->PrimaryChromaticityPayloadSize( + libwebm::kMkvPrimaryBChromaticityX, libwebm::kMkvPrimaryBChromaticityY); + } + if (white_point_) { + size += white_point_->PrimaryChromaticityPayloadSize( + libwebm::kMkvWhitePointChromaticityX, + libwebm::kMkvWhitePointChromaticityY); + } + + return size; +} + +uint64_t Colour::ColourSize() const { + uint64_t size = PayloadSize(); + + if (size > 0) + size += EbmlMasterElementSize(libwebm::kMkvColour, size); + + return size; +} + +bool Colour::Write(IMkvWriter* writer) const { + const uint64_t size = PayloadSize(); + + // Don't write an empty element. + if (size == 0) + return true; + + if (!WriteEbmlMasterElement(writer, libwebm::kMkvColour, size)) + return false; + + if (matrix_coefficients != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvMatrixCoefficients, + matrix_coefficients)) { + return false; + } + if (bits_per_channel != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvBitsPerChannel, + bits_per_channel)) { + return false; + } + if (chroma_subsampling_horz != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvChromaSubsamplingHorz, + chroma_subsampling_horz)) { + return false; + } + if (chroma_subsampling_vert != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvChromaSubsamplingVert, + chroma_subsampling_vert)) { + return false; + } + + if (cb_subsampling_horz != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvCbSubsamplingHorz, + cb_subsampling_horz)) { + return false; + } + if (cb_subsampling_vert != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvCbSubsamplingVert, + cb_subsampling_vert)) { + return false; + } + if (chroma_siting_horz != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvChromaSitingHorz, + chroma_siting_horz)) { + return false; + } + if (chroma_siting_vert != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvChromaSitingVert, + chroma_siting_vert)) { + return false; + } + if (range != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvRange, range)) { + return false; + } + if (transfer_characteristics != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvTransferCharacteristics, + transfer_characteristics)) { + return false; + } + if (primaries != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvPrimaries, primaries)) { + return false; + } + if (max_cll != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvMaxCLL, max_cll)) { + return false; + } + if (max_fall != kValueNotPresent && + !WriteEbmlElement(writer, libwebm::kMkvMaxFALL, max_fall)) { + return false; + } + + if (mastering_metadata_ && !mastering_metadata_->Write(writer)) + return false; + + return true; +} + +bool Colour::SetMasteringMetadata(const MasteringMetadata& mastering_metadata) { + std::auto_ptr<MasteringMetadata> mm_ptr(new MasteringMetadata()); + if (!mm_ptr.get()) + return false; + + mm_ptr->luminance_max = mastering_metadata.luminance_max; + mm_ptr->luminance_min = mastering_metadata.luminance_min; + + if (!mm_ptr->SetChromaticity(mastering_metadata.r(), mastering_metadata.g(), + mastering_metadata.b(), + mastering_metadata.white_point())) { + return false; + } + + delete mastering_metadata_; + mastering_metadata_ = mm_ptr.release(); + return true; +} + +uint64_t Colour::PayloadSize() const { + uint64_t size = 0; + + if (matrix_coefficients != kValueNotPresent) + size += + EbmlElementSize(libwebm::kMkvMatrixCoefficients, matrix_coefficients); + if (bits_per_channel != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvBitsPerChannel, bits_per_channel); + if (chroma_subsampling_horz != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvChromaSubsamplingHorz, + chroma_subsampling_horz); + if (chroma_subsampling_vert != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvChromaSubsamplingVert, + chroma_subsampling_vert); + if (cb_subsampling_horz != kValueNotPresent) + size += + EbmlElementSize(libwebm::kMkvCbSubsamplingHorz, cb_subsampling_horz); + if (cb_subsampling_vert != kValueNotPresent) + size += + EbmlElementSize(libwebm::kMkvCbSubsamplingVert, cb_subsampling_vert); + if (chroma_siting_horz != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvChromaSitingHorz, chroma_siting_horz); + if (chroma_siting_vert != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvChromaSitingVert, chroma_siting_vert); + if (range != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvRange, range); + if (transfer_characteristics != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvTransferCharacteristics, + transfer_characteristics); + if (primaries != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvPrimaries, primaries); + if (max_cll != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvMaxCLL, max_cll); + if (max_fall != kValueNotPresent) + size += EbmlElementSize(libwebm::kMkvMaxFALL, max_fall); + + if (mastering_metadata_) + size += mastering_metadata_->MasteringMetadataSize(); + + return size; +} + +/////////////////////////////////////////////////////////////// +// // VideoTrack Class VideoTrack::VideoTrack(unsigned int* seed) @@ -858,11 +1175,12 @@ VideoTrack::VideoTrack(unsigned int* seed) height_(0), stereo_mode_(0), alpha_mode_(0), - width_(0) {} + width_(0), + colour_(NULL) {} -VideoTrack::~VideoTrack() {} +VideoTrack::~VideoTrack() { delete colour_; } -bool VideoTrack::SetStereoMode(uint64 stereo_mode) { +bool VideoTrack::SetStereoMode(uint64_t stereo_mode) { if (stereo_mode != kMono && stereo_mode != kSideBySideLeftIsFirst && stereo_mode != kTopBottomRightIsFirst && stereo_mode != kTopBottomLeftIsFirst && @@ -873,7 +1191,7 @@ bool VideoTrack::SetStereoMode(uint64 stereo_mode) { return true; } -bool VideoTrack::SetAlphaMode(uint64 alpha_mode) { +bool VideoTrack::SetAlphaMode(uint64_t alpha_mode) { if (alpha_mode != kNoAlpha && alpha_mode != kAlpha) return false; @@ -881,11 +1199,11 @@ bool VideoTrack::SetAlphaMode(uint64 alpha_mode) { return true; } -uint64 VideoTrack::PayloadSize() const { - const uint64 parent_size = Track::PayloadSize(); +uint64_t VideoTrack::PayloadSize() const { + const uint64_t parent_size = Track::PayloadSize(); - uint64 size = VideoPayloadSize(); - size += EbmlMasterElementSize(kMkvVideo, size); + uint64_t size = VideoPayloadSize(); + size += EbmlMasterElementSize(libwebm::kMkvVideo, size); return parent_size + size; } @@ -894,88 +1212,122 @@ bool VideoTrack::Write(IMkvWriter* writer) const { if (!Track::Write(writer)) return false; - const uint64 size = VideoPayloadSize(); + const uint64_t size = VideoPayloadSize(); - if (!WriteEbmlMasterElement(writer, kMkvVideo, size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvVideo, size)) return false; - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return false; - if (!WriteEbmlElement(writer, kMkvPixelWidth, width_)) + if (!WriteEbmlElement(writer, libwebm::kMkvPixelWidth, width_)) return false; - if (!WriteEbmlElement(writer, kMkvPixelHeight, height_)) + if (!WriteEbmlElement(writer, libwebm::kMkvPixelHeight, height_)) return false; if (display_width_ > 0) { - if (!WriteEbmlElement(writer, kMkvDisplayWidth, display_width_)) + if (!WriteEbmlElement(writer, libwebm::kMkvDisplayWidth, display_width_)) return false; } if (display_height_ > 0) { - if (!WriteEbmlElement(writer, kMkvDisplayHeight, display_height_)) + if (!WriteEbmlElement(writer, libwebm::kMkvDisplayHeight, display_height_)) return false; } if (crop_left_ > 0) { - if (!WriteEbmlElement(writer, kMkvPixelCropLeft, crop_left_)) + if (!WriteEbmlElement(writer, libwebm::kMkvPixelCropLeft, crop_left_)) return false; } if (crop_right_ > 0) { - if (!WriteEbmlElement(writer, kMkvPixelCropRight, crop_right_)) + if (!WriteEbmlElement(writer, libwebm::kMkvPixelCropRight, crop_right_)) return false; } if (crop_top_ > 0) { - if (!WriteEbmlElement(writer, kMkvPixelCropTop, crop_top_)) + if (!WriteEbmlElement(writer, libwebm::kMkvPixelCropTop, crop_top_)) return false; } if (crop_bottom_ > 0) { - if (!WriteEbmlElement(writer, kMkvPixelCropBottom, crop_bottom_)) + if (!WriteEbmlElement(writer, libwebm::kMkvPixelCropBottom, crop_bottom_)) return false; } if (stereo_mode_ > kMono) { - if (!WriteEbmlElement(writer, kMkvStereoMode, stereo_mode_)) + if (!WriteEbmlElement(writer, libwebm::kMkvStereoMode, stereo_mode_)) return false; } if (alpha_mode_ > kNoAlpha) { - if (!WriteEbmlElement(writer, kMkvAlphaMode, alpha_mode_)) + if (!WriteEbmlElement(writer, libwebm::kMkvAlphaMode, alpha_mode_)) return false; } if (frame_rate_ > 0.0) { - if (!WriteEbmlElement(writer, kMkvFrameRate, + if (!WriteEbmlElement(writer, libwebm::kMkvFrameRate, static_cast<float>(frame_rate_))) { return false; } } + if (colour_) { + if (!colour_->Write(writer)) + return false; + } - const int64 stop_position = writer->Position(); + const int64_t stop_position = writer->Position(); if (stop_position < 0 || - stop_position - payload_position != static_cast<int64>(size)) { + stop_position - payload_position != static_cast<int64_t>(size)) { + return false; + } + + return true; +} + +bool VideoTrack::SetColour(const Colour& colour) { + std::auto_ptr<Colour> colour_ptr(new Colour()); + if (!colour_ptr.get()) return false; + + if (colour.mastering_metadata()) { + if (!colour_ptr->SetMasteringMetadata(*colour.mastering_metadata())) + return false; } + colour_ptr->matrix_coefficients = colour.matrix_coefficients; + colour_ptr->bits_per_channel = colour.bits_per_channel; + colour_ptr->chroma_subsampling_horz = colour.chroma_subsampling_horz; + colour_ptr->chroma_subsampling_vert = colour.chroma_subsampling_vert; + colour_ptr->cb_subsampling_horz = colour.cb_subsampling_horz; + colour_ptr->cb_subsampling_vert = colour.cb_subsampling_vert; + colour_ptr->chroma_siting_horz = colour.chroma_siting_horz; + colour_ptr->chroma_siting_vert = colour.chroma_siting_vert; + colour_ptr->range = colour.range; + colour_ptr->transfer_characteristics = colour.transfer_characteristics; + colour_ptr->primaries = colour.primaries; + colour_ptr->max_cll = colour.max_cll; + colour_ptr->max_fall = colour.max_fall; + colour_ = colour_ptr.release(); return true; } -uint64 VideoTrack::VideoPayloadSize() const { - uint64 size = EbmlElementSize(kMkvPixelWidth, width_); - size += EbmlElementSize(kMkvPixelHeight, height_); +uint64_t VideoTrack::VideoPayloadSize() const { + uint64_t size = EbmlElementSize(libwebm::kMkvPixelWidth, width_); + size += EbmlElementSize(libwebm::kMkvPixelHeight, height_); if (display_width_ > 0) - size += EbmlElementSize(kMkvDisplayWidth, display_width_); + size += EbmlElementSize(libwebm::kMkvDisplayWidth, display_width_); if (display_height_ > 0) - size += EbmlElementSize(kMkvDisplayHeight, display_height_); + size += EbmlElementSize(libwebm::kMkvDisplayHeight, display_height_); if (crop_left_ > 0) - size += EbmlElementSize(kMkvPixelCropLeft, crop_left_); + size += EbmlElementSize(libwebm::kMkvPixelCropLeft, crop_left_); if (crop_right_ > 0) - size += EbmlElementSize(kMkvPixelCropRight, crop_right_); + size += EbmlElementSize(libwebm::kMkvPixelCropRight, crop_right_); if (crop_top_ > 0) - size += EbmlElementSize(kMkvPixelCropTop, crop_top_); + size += EbmlElementSize(libwebm::kMkvPixelCropTop, crop_top_); if (crop_bottom_ > 0) - size += EbmlElementSize(kMkvPixelCropBottom, crop_bottom_); + size += EbmlElementSize(libwebm::kMkvPixelCropBottom, crop_bottom_); if (stereo_mode_ > kMono) - size += EbmlElementSize(kMkvStereoMode, stereo_mode_); + size += EbmlElementSize(libwebm::kMkvStereoMode, stereo_mode_); if (alpha_mode_ > kNoAlpha) - size += EbmlElementSize(kMkvAlphaMode, alpha_mode_); + size += EbmlElementSize(libwebm::kMkvAlphaMode, alpha_mode_); if (frame_rate_ > 0.0) - size += EbmlElementSize(kMkvFrameRate, static_cast<float>(frame_rate_)); + size += EbmlElementSize(libwebm::kMkvFrameRate, + static_cast<float>(frame_rate_)); + if (colour_) + size += colour_->ColourSize(); return size; } @@ -989,15 +1341,15 @@ AudioTrack::AudioTrack(unsigned int* seed) AudioTrack::~AudioTrack() {} -uint64 AudioTrack::PayloadSize() const { - const uint64 parent_size = Track::PayloadSize(); +uint64_t AudioTrack::PayloadSize() const { + const uint64_t parent_size = Track::PayloadSize(); - uint64 size = - EbmlElementSize(kMkvSamplingFrequency, static_cast<float>(sample_rate_)); - size += EbmlElementSize(kMkvChannels, channels_); + uint64_t size = EbmlElementSize(libwebm::kMkvSamplingFrequency, + static_cast<float>(sample_rate_)); + size += EbmlElementSize(libwebm::kMkvChannels, channels_); if (bit_depth_ > 0) - size += EbmlElementSize(kMkvBitDepth, bit_depth_); - size += EbmlMasterElementSize(kMkvAudio, size); + size += EbmlElementSize(libwebm::kMkvBitDepth, bit_depth_); + size += EbmlMasterElementSize(libwebm::kMkvAudio, size); return parent_size + size; } @@ -1007,31 +1359,31 @@ bool AudioTrack::Write(IMkvWriter* writer) const { return false; // Calculate AudioSettings size. - uint64 size = - EbmlElementSize(kMkvSamplingFrequency, static_cast<float>(sample_rate_)); - size += EbmlElementSize(kMkvChannels, channels_); + uint64_t size = EbmlElementSize(libwebm::kMkvSamplingFrequency, + static_cast<float>(sample_rate_)); + size += EbmlElementSize(libwebm::kMkvChannels, channels_); if (bit_depth_ > 0) - size += EbmlElementSize(kMkvBitDepth, bit_depth_); + size += EbmlElementSize(libwebm::kMkvBitDepth, bit_depth_); - if (!WriteEbmlMasterElement(writer, kMkvAudio, size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvAudio, size)) return false; - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return false; - if (!WriteEbmlElement(writer, kMkvSamplingFrequency, + if (!WriteEbmlElement(writer, libwebm::kMkvSamplingFrequency, static_cast<float>(sample_rate_))) return false; - if (!WriteEbmlElement(writer, kMkvChannels, channels_)) + if (!WriteEbmlElement(writer, libwebm::kMkvChannels, channels_)) return false; if (bit_depth_ > 0) - if (!WriteEbmlElement(writer, kMkvBitDepth, bit_depth_)) + if (!WriteEbmlElement(writer, libwebm::kMkvBitDepth, bit_depth_)) return false; - const int64 stop_position = writer->Position(); + const int64_t stop_position = writer->Position(); if (stop_position < 0 || - stop_position - payload_position != static_cast<int64>(size)) + stop_position - payload_position != static_cast<int64_t>(size)) return false; return true; @@ -1047,11 +1399,12 @@ const char Tracks::kVp8CodecId[] = "V_VP8"; const char Tracks::kVp9CodecId[] = "V_VP9"; const char Tracks::kVp10CodecId[] = "V_VP10"; -Tracks::Tracks() : track_entries_(NULL), track_entries_size_(0) {} +Tracks::Tracks() + : track_entries_(NULL), track_entries_size_(0), wrote_tracks_(false) {} Tracks::~Tracks() { if (track_entries_) { - for (uint32 i = 0; i < track_entries_size_; ++i) { + for (uint32_t i = 0; i < track_entries_size_; ++i) { Track* const track = track_entries_[i]; delete track; } @@ -1059,8 +1412,8 @@ Tracks::~Tracks() { } } -bool Tracks::AddTrack(Track* track, int32 number) { - if (number < 0) +bool Tracks::AddTrack(Track* track, int32_t number) { + if (number < 0 || wrote_tracks_) return false; // This muxer only supports track numbers in the range [1, 126], in @@ -1071,23 +1424,23 @@ bool Tracks::AddTrack(Track* track, int32 number) { if (number > 0x7E) return false; - uint32 track_num = number; + uint32_t track_num = number; if (track_num > 0) { // Check to make sure a track does not already have |track_num|. - for (uint32 i = 0; i < track_entries_size_; ++i) { + for (uint32_t i = 0; i < track_entries_size_; ++i) { if (track_entries_[i]->number() == track_num) return false; } } - const uint32 count = track_entries_size_ + 1; + const uint32_t count = track_entries_size_ + 1; Track** const track_entries = new (std::nothrow) Track*[count]; // NOLINT if (!track_entries) return false; - for (uint32 i = 0; i < track_entries_size_; ++i) { + for (uint32_t i = 0; i < track_entries_size_; ++i) { track_entries[i] = track_entries_[i]; } @@ -1101,7 +1454,7 @@ bool Tracks::AddTrack(Track* track, int32 number) { bool exit = false; do { exit = true; - for (uint32 i = 0; i < track_entries_size_; ++i) { + for (uint32_t i = 0; i < track_entries_size_; ++i) { if (track_entries[i]->number() == track_num) { track_num++; exit = false; @@ -1118,7 +1471,7 @@ bool Tracks::AddTrack(Track* track, int32 number) { return true; } -const Track* Tracks::GetTrackByIndex(uint32 index) const { +const Track* Tracks::GetTrackByIndex(uint32_t index) const { if (track_entries_ == NULL) return NULL; @@ -1128,9 +1481,9 @@ const Track* Tracks::GetTrackByIndex(uint32 index) const { return track_entries_[index]; } -Track* Tracks::GetTrackByNumber(uint64 track_number) const { - const int32 count = track_entries_size(); - for (int32 i = 0; i < count; ++i) { +Track* Tracks::GetTrackByNumber(uint64_t track_number) const { + const int32_t count = track_entries_size(); + for (int32_t i = 0; i < count; ++i) { if (track_entries_[i]->number() == track_number) return track_entries_[i]; } @@ -1138,7 +1491,7 @@ Track* Tracks::GetTrackByNumber(uint64 track_number) const { return NULL; } -bool Tracks::TrackIsAudio(uint64 track_number) const { +bool Tracks::TrackIsAudio(uint64_t track_number) const { const Track* const track = GetTrackByNumber(track_number); if (track->type() == kAudio) @@ -1147,7 +1500,7 @@ bool Tracks::TrackIsAudio(uint64 track_number) const { return false; } -bool Tracks::TrackIsVideo(uint64 track_number) const { +bool Tracks::TrackIsVideo(uint64_t track_number) const { const Track* const track = GetTrackByNumber(track_number); if (track->type() == kVideo) @@ -1157,9 +1510,9 @@ bool Tracks::TrackIsVideo(uint64 track_number) const { } bool Tracks::Write(IMkvWriter* writer) const { - uint64 size = 0; - const int32 count = track_entries_size(); - for (int32 i = 0; i < count; ++i) { + uint64_t size = 0; + const int32_t count = track_entries_size(); + for (int32_t i = 0; i < count; ++i) { const Track* const track = GetTrackByIndex(i); if (!track) @@ -1168,24 +1521,25 @@ bool Tracks::Write(IMkvWriter* writer) const { size += track->Size(); } - if (!WriteEbmlMasterElement(writer, kMkvTracks, size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvTracks, size)) return false; - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return false; - for (int32 i = 0; i < count; ++i) { + for (int32_t i = 0; i < count; ++i) { const Track* const track = GetTrackByIndex(i); if (!track->Write(writer)) return false; } - const int64 stop_position = writer->Position(); + const int64_t stop_position = writer->Position(); if (stop_position < 0 || - stop_position - payload_position != static_cast<int64>(size)) + stop_position - payload_position != static_cast<int64_t>(size)) return false; + wrote_tracks_ = true; return true; } @@ -1195,9 +1549,10 @@ bool Tracks::Write(IMkvWriter* writer) const { bool Chapter::set_id(const char* id) { return StrCpy(id, &id_); } -void Chapter::set_time(const Segment& segment, uint64 start_ns, uint64 end_ns) { +void Chapter::set_time(const Segment& segment, uint64_t start_ns, + uint64_t end_ns) { const SegmentInfo* const info = segment.GetSegmentInfo(); - const uint64 timecode_scale = info->timecode_scale(); + const uint64_t timecode_scale = info->timecode_scale(); start_timecode_ = start_ns / timecode_scale; end_timecode_ = end_ns / timecode_scale; } @@ -1292,38 +1647,40 @@ bool Chapter::ExpandDisplaysArray() { return true; } -uint64 Chapter::WriteAtom(IMkvWriter* writer) const { - uint64 payload_size = EbmlElementSize(kMkvChapterStringUID, id_) + - EbmlElementSize(kMkvChapterUID, uid_) + - EbmlElementSize(kMkvChapterTimeStart, start_timecode_) + - EbmlElementSize(kMkvChapterTimeEnd, end_timecode_); +uint64_t Chapter::WriteAtom(IMkvWriter* writer) const { + uint64_t payload_size = + EbmlElementSize(libwebm::kMkvChapterStringUID, id_) + + EbmlElementSize(libwebm::kMkvChapterUID, uid_) + + EbmlElementSize(libwebm::kMkvChapterTimeStart, start_timecode_) + + EbmlElementSize(libwebm::kMkvChapterTimeEnd, end_timecode_); for (int idx = 0; idx < displays_count_; ++idx) { const Display& d = displays_[idx]; payload_size += d.WriteDisplay(NULL); } - const uint64 atom_size = - EbmlMasterElementSize(kMkvChapterAtom, payload_size) + payload_size; + const uint64_t atom_size = + EbmlMasterElementSize(libwebm::kMkvChapterAtom, payload_size) + + payload_size; if (writer == NULL) return atom_size; - const int64 start = writer->Position(); + const int64_t start = writer->Position(); - if (!WriteEbmlMasterElement(writer, kMkvChapterAtom, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvChapterAtom, payload_size)) return 0; - if (!WriteEbmlElement(writer, kMkvChapterStringUID, id_)) + if (!WriteEbmlElement(writer, libwebm::kMkvChapterStringUID, id_)) return 0; - if (!WriteEbmlElement(writer, kMkvChapterUID, uid_)) + if (!WriteEbmlElement(writer, libwebm::kMkvChapterUID, uid_)) return 0; - if (!WriteEbmlElement(writer, kMkvChapterTimeStart, start_timecode_)) + if (!WriteEbmlElement(writer, libwebm::kMkvChapterTimeStart, start_timecode_)) return 0; - if (!WriteEbmlElement(writer, kMkvChapterTimeEnd, end_timecode_)) + if (!WriteEbmlElement(writer, libwebm::kMkvChapterTimeEnd, end_timecode_)) return 0; for (int idx = 0; idx < displays_count_; ++idx) { @@ -1333,9 +1690,9 @@ uint64 Chapter::WriteAtom(IMkvWriter* writer) const { return 0; } - const int64 stop = writer->Position(); + const int64_t stop = writer->Position(); - if (stop >= start && uint64(stop - start) != atom_size) + if (stop >= start && uint64_t(stop - start) != atom_size) return 0; return atom_size; @@ -1365,42 +1722,44 @@ bool Chapter::Display::set_country(const char* country) { return StrCpy(country, &country_); } -uint64 Chapter::Display::WriteDisplay(IMkvWriter* writer) const { - uint64 payload_size = EbmlElementSize(kMkvChapString, title_); +uint64_t Chapter::Display::WriteDisplay(IMkvWriter* writer) const { + uint64_t payload_size = EbmlElementSize(libwebm::kMkvChapString, title_); if (language_) - payload_size += EbmlElementSize(kMkvChapLanguage, language_); + payload_size += EbmlElementSize(libwebm::kMkvChapLanguage, language_); if (country_) - payload_size += EbmlElementSize(kMkvChapCountry, country_); + payload_size += EbmlElementSize(libwebm::kMkvChapCountry, country_); - const uint64 display_size = - EbmlMasterElementSize(kMkvChapterDisplay, payload_size) + payload_size; + const uint64_t display_size = + EbmlMasterElementSize(libwebm::kMkvChapterDisplay, payload_size) + + payload_size; if (writer == NULL) return display_size; - const int64 start = writer->Position(); + const int64_t start = writer->Position(); - if (!WriteEbmlMasterElement(writer, kMkvChapterDisplay, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvChapterDisplay, + payload_size)) return 0; - if (!WriteEbmlElement(writer, kMkvChapString, title_)) + if (!WriteEbmlElement(writer, libwebm::kMkvChapString, title_)) return 0; if (language_) { - if (!WriteEbmlElement(writer, kMkvChapLanguage, language_)) + if (!WriteEbmlElement(writer, libwebm::kMkvChapLanguage, language_)) return 0; } if (country_) { - if (!WriteEbmlElement(writer, kMkvChapCountry, country_)) + if (!WriteEbmlElement(writer, libwebm::kMkvChapCountry, country_)) return 0; } - const int64 stop = writer->Position(); + const int64_t stop = writer->Position(); - if (stop >= start && uint64(stop - start) != display_size) + if (stop >= start && uint64_t(stop - start) != display_size) return 0; return display_size; @@ -1438,19 +1797,19 @@ bool Chapters::Write(IMkvWriter* writer) const { if (writer == NULL) return false; - const uint64 payload_size = WriteEdition(NULL); // return size only + const uint64_t payload_size = WriteEdition(NULL); // return size only - if (!WriteEbmlMasterElement(writer, kMkvChapters, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvChapters, payload_size)) return false; - const int64 start = writer->Position(); + const int64_t start = writer->Position(); if (WriteEdition(writer) == 0) // error return false; - const int64 stop = writer->Position(); + const int64_t stop = writer->Position(); - if (stop >= start && uint64(stop - start) != payload_size) + if (stop >= start && uint64_t(stop - start) != payload_size) return false; return true; @@ -1480,36 +1839,37 @@ bool Chapters::ExpandChaptersArray() { return true; } -uint64 Chapters::WriteEdition(IMkvWriter* writer) const { - uint64 payload_size = 0; +uint64_t Chapters::WriteEdition(IMkvWriter* writer) const { + uint64_t payload_size = 0; for (int idx = 0; idx < chapters_count_; ++idx) { const Chapter& chapter = chapters_[idx]; payload_size += chapter.WriteAtom(NULL); } - const uint64 edition_size = - EbmlMasterElementSize(kMkvEditionEntry, payload_size) + payload_size; + const uint64_t edition_size = + EbmlMasterElementSize(libwebm::kMkvEditionEntry, payload_size) + + payload_size; if (writer == NULL) // return size only return edition_size; - const int64 start = writer->Position(); + const int64_t start = writer->Position(); - if (!WriteEbmlMasterElement(writer, kMkvEditionEntry, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvEditionEntry, payload_size)) return 0; // error for (int idx = 0; idx < chapters_count_; ++idx) { const Chapter& chapter = chapters_[idx]; - const uint64 chapter_size = chapter.WriteAtom(writer); + const uint64_t chapter_size = chapter.WriteAtom(writer); if (chapter_size == 0) // error return 0; } - const int64 stop = writer->Position(); + const int64_t stop = writer->Position(); - if (stop >= start && uint64(stop - start) != edition_size) + if (stop >= start && uint64_t(stop - start) != edition_size) return 0; return edition_size; @@ -1581,23 +1941,23 @@ bool Tag::ExpandSimpleTagsArray() { return true; } -uint64 Tag::Write(IMkvWriter* writer) const { - uint64 payload_size = 0; +uint64_t Tag::Write(IMkvWriter* writer) const { + uint64_t payload_size = 0; for (int idx = 0; idx < simple_tags_count_; ++idx) { const SimpleTag& st = simple_tags_[idx]; payload_size += st.Write(NULL); } - const uint64 tag_size = - EbmlMasterElementSize(kMkvTag, payload_size) + payload_size; + const uint64_t tag_size = + EbmlMasterElementSize(libwebm::kMkvTag, payload_size) + payload_size; if (writer == NULL) return tag_size; - const int64 start = writer->Position(); + const int64_t start = writer->Position(); - if (!WriteEbmlMasterElement(writer, kMkvTag, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvTag, payload_size)) return 0; for (int idx = 0; idx < simple_tags_count_; ++idx) { @@ -1607,9 +1967,9 @@ uint64 Tag::Write(IMkvWriter* writer) const { return 0; } - const int64 stop = writer->Position(); + const int64_t stop = writer->Position(); - if (stop >= start && uint64(stop - start) != tag_size) + if (stop >= start && uint64_t(stop - start) != tag_size) return 0; return tag_size; @@ -1635,31 +1995,32 @@ bool Tag::SimpleTag::set_tag_string(const char* tag_string) { return StrCpy(tag_string, &tag_string_); } -uint64 Tag::SimpleTag::Write(IMkvWriter* writer) const { - uint64 payload_size = EbmlElementSize(kMkvTagName, tag_name_); +uint64_t Tag::SimpleTag::Write(IMkvWriter* writer) const { + uint64_t payload_size = EbmlElementSize(libwebm::kMkvTagName, tag_name_); - payload_size += EbmlElementSize(kMkvTagString, tag_string_); + payload_size += EbmlElementSize(libwebm::kMkvTagString, tag_string_); - const uint64 simple_tag_size = - EbmlMasterElementSize(kMkvSimpleTag, payload_size) + payload_size; + const uint64_t simple_tag_size = + EbmlMasterElementSize(libwebm::kMkvSimpleTag, payload_size) + + payload_size; if (writer == NULL) return simple_tag_size; - const int64 start = writer->Position(); + const int64_t start = writer->Position(); - if (!WriteEbmlMasterElement(writer, kMkvSimpleTag, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvSimpleTag, payload_size)) return 0; - if (!WriteEbmlElement(writer, kMkvTagName, tag_name_)) + if (!WriteEbmlElement(writer, libwebm::kMkvTagName, tag_name_)) return 0; - if (!WriteEbmlElement(writer, kMkvTagString, tag_string_)) + if (!WriteEbmlElement(writer, libwebm::kMkvTagString, tag_string_)) return 0; - const int64 stop = writer->Position(); + const int64_t stop = writer->Position(); - if (stop >= start && uint64(stop - start) != simple_tag_size) + if (stop >= start && uint64_t(stop - start) != simple_tag_size) return 0; return simple_tag_size; @@ -1694,29 +2055,29 @@ bool Tags::Write(IMkvWriter* writer) const { if (writer == NULL) return false; - uint64 payload_size = 0; + uint64_t payload_size = 0; for (int idx = 0; idx < tags_count_; ++idx) { const Tag& tag = tags_[idx]; payload_size += tag.Write(NULL); } - if (!WriteEbmlMasterElement(writer, kMkvTags, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvTags, payload_size)) return false; - const int64 start = writer->Position(); + const int64_t start = writer->Position(); for (int idx = 0; idx < tags_count_; ++idx) { const Tag& tag = tags_[idx]; - const uint64 tag_size = tag.Write(writer); + const uint64_t tag_size = tag.Write(writer); if (tag_size == 0) // error return 0; } - const int64 stop = writer->Position(); + const int64_t stop = writer->Position(); - if (stop >= start && uint64(stop - start) != payload_size) + if (stop >= start && uint64_t(stop - start) != payload_size) return false; return true; @@ -1750,15 +2111,18 @@ bool Tags::ExpandTagsArray() { // // Cluster class -Cluster::Cluster(uint64 timecode, int64 cues_pos, uint64 timecode_scale) +Cluster::Cluster(uint64_t timecode, int64_t cues_pos, uint64_t timecode_scale, + bool write_last_frame_with_duration, bool fixed_size_timecode) : blocks_added_(0), finalized_(false), + fixed_size_timecode_(fixed_size_timecode), header_written_(false), payload_size_(0), position_for_cues_(cues_pos), size_position_(-1), timecode_(timecode), timecode_scale_(timecode_scale), + write_last_frame_with_duration_(write_last_frame_with_duration), writer_(NULL) {} Cluster::~Cluster() {} @@ -1771,24 +2135,27 @@ bool Cluster::Init(IMkvWriter* ptr_writer) { return true; } -bool Cluster::AddFrame(const Frame* const frame) { return DoWriteFrame(frame); } +bool Cluster::AddFrame(const Frame* const frame) { + return QueueOrWriteFrame(frame); +} -bool Cluster::AddFrame(const uint8* data, uint64 length, uint64 track_number, - uint64 abs_timecode, bool is_key) { +bool Cluster::AddFrame(const uint8_t* data, uint64_t length, + uint64_t track_number, uint64_t abs_timecode, + bool is_key) { Frame frame; if (!frame.Init(data, length)) return false; frame.set_track_number(track_number); frame.set_timestamp(abs_timecode); frame.set_is_key(is_key); - return DoWriteFrame(&frame); + return QueueOrWriteFrame(&frame); } -bool Cluster::AddFrameWithAdditional(const uint8* data, uint64 length, - const uint8* additional, - uint64 additional_length, uint64 add_id, - uint64 track_number, uint64 abs_timecode, - bool is_key) { +bool Cluster::AddFrameWithAdditional(const uint8_t* data, uint64_t length, + const uint8_t* additional, + uint64_t additional_length, + uint64_t add_id, uint64_t track_number, + uint64_t abs_timecode, bool is_key) { if (!additional || additional_length == 0) { return false; } @@ -1800,13 +2167,13 @@ bool Cluster::AddFrameWithAdditional(const uint8* data, uint64 length, frame.set_track_number(track_number); frame.set_timestamp(abs_timecode); frame.set_is_key(is_key); - return DoWriteFrame(&frame); + return QueueOrWriteFrame(&frame); } -bool Cluster::AddFrameWithDiscardPadding(const uint8* data, uint64 length, - int64 discard_padding, - uint64 track_number, - uint64 abs_timecode, bool is_key) { +bool Cluster::AddFrameWithDiscardPadding(const uint8_t* data, uint64_t length, + int64_t discard_padding, + uint64_t track_number, + uint64_t abs_timecode, bool is_key) { Frame frame; if (!frame.Init(data, length)) return false; @@ -1814,11 +2181,12 @@ bool Cluster::AddFrameWithDiscardPadding(const uint8* data, uint64 length, frame.set_track_number(track_number); frame.set_timestamp(abs_timecode); frame.set_is_key(is_key); - return DoWriteFrame(&frame); + return QueueOrWriteFrame(&frame); } -bool Cluster::AddMetadata(const uint8* data, uint64 length, uint64 track_number, - uint64 abs_timecode, uint64 duration_timecode) { +bool Cluster::AddMetadata(const uint8_t* data, uint64_t length, + uint64_t track_number, uint64_t abs_timecode, + uint64_t duration_timecode) { Frame frame; if (!frame.Init(data, length)) return false; @@ -1826,17 +2194,62 @@ bool Cluster::AddMetadata(const uint8* data, uint64 length, uint64 track_number, frame.set_timestamp(abs_timecode); frame.set_duration(duration_timecode); frame.set_is_key(true); // All metadata blocks are keyframes. - return DoWriteFrame(&frame); + return QueueOrWriteFrame(&frame); } -void Cluster::AddPayloadSize(uint64 size) { payload_size_ += size; } +void Cluster::AddPayloadSize(uint64_t size) { payload_size_ += size; } bool Cluster::Finalize() { - if (!writer_ || finalized_ || size_position_ == -1) + return !write_last_frame_with_duration_ && Finalize(false, 0); +} + +bool Cluster::Finalize(bool set_last_frame_duration, uint64_t duration) { + if (!writer_ || finalized_) + return false; + + if (write_last_frame_with_duration_) { + // Write out held back Frames. This essentially performs a k-way merge + // across all tracks in the increasing order of timestamps. + while (!stored_frames_.empty()) { + Frame* frame = stored_frames_.begin()->second.front(); + + // Get the next frame to write (frame with least timestamp across all + // tracks). + for (FrameMapIterator frames_iterator = ++stored_frames_.begin(); + frames_iterator != stored_frames_.end(); ++frames_iterator) { + if (frames_iterator->second.front()->timestamp() < frame->timestamp()) { + frame = frames_iterator->second.front(); + } + } + + // Set the duration if it's the last frame for the track. + if (set_last_frame_duration && + stored_frames_[frame->track_number()].size() == 1 && + !frame->duration_set()) { + frame->set_duration(duration - frame->timestamp()); + if (!frame->is_key() && !frame->reference_block_timestamp_set()) { + frame->set_reference_block_timestamp( + last_block_timestamp_[frame->track_number()]); + } + } + + // Write the frame and remove it from |stored_frames_|. + const bool wrote_frame = DoWriteFrame(frame); + stored_frames_[frame->track_number()].pop_front(); + if (stored_frames_[frame->track_number()].empty()) { + stored_frames_.erase(frame->track_number()); + } + delete frame; + if (!wrote_frame) + return false; + } + } + + if (size_position_ == -1) return false; if (writer_->Seekable()) { - const int64 pos = writer_->Position(); + const int64_t pos = writer_->Position(); if (writer_->Position(size_position_)) return false; @@ -1853,9 +2266,10 @@ bool Cluster::Finalize() { return true; } -uint64 Cluster::Size() const { - const uint64 element_size = - EbmlMasterElementSize(kMkvCluster, 0xFFFFFFFFFFFFFFFFULL) + payload_size_; +uint64_t Cluster::Size() const { + const uint64_t element_size = + EbmlMasterElementSize(libwebm::kMkvCluster, 0xFFFFFFFFFFFFFFFFULL) + + payload_size_; return element_size; } @@ -1871,15 +2285,15 @@ bool Cluster::PreWriteBlock() { return true; } -void Cluster::PostWriteBlock(uint64 element_size) { +void Cluster::PostWriteBlock(uint64_t element_size) { AddPayloadSize(element_size); ++blocks_added_; } -int64 Cluster::GetRelativeTimecode(int64 abs_timecode) const { - const int64 cluster_timecode = this->Cluster::timecode(); - const int64 rel_timecode = - static_cast<int64>(abs_timecode) - cluster_timecode; +int64_t Cluster::GetRelativeTimecode(int64_t abs_timecode) const { + const int64_t cluster_timecode = this->Cluster::timecode(); + const int64_t rel_timecode = + static_cast<int64_t>(abs_timecode) - cluster_timecode; if (rel_timecode < 0 || rel_timecode > kMaxBlockTimecode) return -1; @@ -1894,11 +2308,67 @@ bool Cluster::DoWriteFrame(const Frame* const frame) { if (!PreWriteBlock()) return false; - const uint64 element_size = WriteFrame(writer_, frame, this); + const uint64_t element_size = WriteFrame(writer_, frame, this); if (element_size == 0) return false; PostWriteBlock(element_size); + last_block_timestamp_[frame->track_number()] = frame->timestamp(); + return true; +} + +bool Cluster::QueueOrWriteFrame(const Frame* const frame) { + if (!frame || !frame->IsValid()) + return false; + + // If |write_last_frame_with_duration_| is not set, then write the frame right + // away. + if (!write_last_frame_with_duration_) { + return DoWriteFrame(frame); + } + + // Queue the current frame. + uint64_t track_number = frame->track_number(); + Frame* const frame_to_store = new Frame(); + frame_to_store->CopyFrom(*frame); + stored_frames_[track_number].push_back(frame_to_store); + + // Iterate through all queued frames in the current track except the last one + // and write it if it is okay to do so (i.e.) no other track has an held back + // frame with timestamp <= the timestamp of the frame in question. + std::vector<std::list<Frame*>::iterator> frames_to_erase; + for (std::list<Frame *>::iterator + current_track_iterator = stored_frames_[track_number].begin(), + end = --stored_frames_[track_number].end(); + current_track_iterator != end; ++current_track_iterator) { + const Frame* const frame_to_write = *current_track_iterator; + bool okay_to_write = true; + for (FrameMapIterator track_iterator = stored_frames_.begin(); + track_iterator != stored_frames_.end(); ++track_iterator) { + if (track_iterator->first == track_number) { + continue; + } + if (track_iterator->second.front()->timestamp() < + frame_to_write->timestamp()) { + okay_to_write = false; + break; + } + } + if (okay_to_write) { + const bool wrote_frame = DoWriteFrame(frame_to_write); + delete frame_to_write; + if (!wrote_frame) + return false; + frames_to_erase.push_back(current_track_iterator); + } else { + break; + } + } + for (std::vector<std::list<Frame*>::iterator>::iterator iterator = + frames_to_erase.begin(); + iterator != frames_to_erase.end(); ++iterator) { + stored_frames_[track_number].erase(*iterator); + } return true; } @@ -1906,7 +2376,7 @@ bool Cluster::WriteClusterHeader() { if (finalized_) return false; - if (WriteID(writer_, kMkvCluster)) + if (WriteID(writer_, libwebm::kMkvCluster)) return false; // Save for later. @@ -1917,9 +2387,12 @@ bool Cluster::WriteClusterHeader() { if (SerializeInt(writer_, kEbmlUnknownValue, 8)) return false; - if (!WriteEbmlElement(writer_, kMkvTimecode, timecode())) + if (!WriteEbmlElement(writer_, libwebm::kMkvTimecode, timecode(), + fixed_size_timecode_ ? 8 : 0)) { return false; - AddPayloadSize(EbmlElementSize(kMkvTimecode, timecode())); + } + AddPayloadSize(EbmlElementSize(libwebm::kMkvTimecode, timecode(), + fixed_size_timecode_ ? 8 : 0)); header_written_ = true; return true; @@ -1930,7 +2403,7 @@ bool Cluster::WriteClusterHeader() { // SeekHead Class SeekHead::SeekHead() : start_pos_(0ULL) { - for (int32 i = 0; i < kSeekEntryCount; ++i) { + for (int32_t i = 0; i < kSeekEntryCount; ++i) { seek_entry_id_[i] = 0; seek_entry_pos_[i] = 0; } @@ -1943,17 +2416,19 @@ bool SeekHead::Finalize(IMkvWriter* writer) const { if (start_pos_ == -1) return false; - uint64 payload_size = 0; - uint64 entry_size[kSeekEntryCount]; + uint64_t payload_size = 0; + uint64_t entry_size[kSeekEntryCount]; - for (int32 i = 0; i < kSeekEntryCount; ++i) { + for (int32_t i = 0; i < kSeekEntryCount; ++i) { if (seek_entry_id_[i] != 0) { - entry_size[i] = - EbmlElementSize(kMkvSeekID, static_cast<uint64>(seek_entry_id_[i])); - entry_size[i] += EbmlElementSize(kMkvSeekPosition, seek_entry_pos_[i]); + entry_size[i] = EbmlElementSize( + libwebm::kMkvSeekID, static_cast<uint64_t>(seek_entry_id_[i])); + entry_size[i] += + EbmlElementSize(libwebm::kMkvSeekPosition, seek_entry_pos_[i]); payload_size += - EbmlMasterElementSize(kMkvSeek, entry_size[i]) + entry_size[i]; + EbmlMasterElementSize(libwebm::kMkvSeek, entry_size[i]) + + entry_size[i]; } } @@ -1961,34 +2436,35 @@ bool SeekHead::Finalize(IMkvWriter* writer) const { if (payload_size == 0) return true; - const int64 pos = writer->Position(); + const int64_t pos = writer->Position(); if (writer->Position(start_pos_)) return false; - if (!WriteEbmlMasterElement(writer, kMkvSeekHead, payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvSeekHead, payload_size)) return false; - for (int32 i = 0; i < kSeekEntryCount; ++i) { + for (int32_t i = 0; i < kSeekEntryCount; ++i) { if (seek_entry_id_[i] != 0) { - if (!WriteEbmlMasterElement(writer, kMkvSeek, entry_size[i])) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvSeek, entry_size[i])) return false; - if (!WriteEbmlElement(writer, kMkvSeekID, - static_cast<uint64>(seek_entry_id_[i]))) + if (!WriteEbmlElement(writer, libwebm::kMkvSeekID, + static_cast<uint64_t>(seek_entry_id_[i]))) return false; - if (!WriteEbmlElement(writer, kMkvSeekPosition, seek_entry_pos_[i])) + if (!WriteEbmlElement(writer, libwebm::kMkvSeekPosition, + seek_entry_pos_[i])) return false; } } - const uint64 total_entry_size = kSeekEntryCount * MaxEntrySize(); - const uint64 total_size = - EbmlMasterElementSize(kMkvSeekHead, total_entry_size) + + const uint64_t total_entry_size = kSeekEntryCount * MaxEntrySize(); + const uint64_t total_size = + EbmlMasterElementSize(libwebm::kMkvSeekHead, total_entry_size) + total_entry_size; - const int64 size_left = total_size - (writer->Position() - start_pos_); + const int64_t size_left = total_size - (writer->Position() - start_pos_); - const uint64 bytes_written = WriteVoidElement(writer, size_left); + const uint64_t bytes_written = WriteVoidElement(writer, size_left); if (!bytes_written) return false; @@ -2000,20 +2476,21 @@ bool SeekHead::Finalize(IMkvWriter* writer) const { } bool SeekHead::Write(IMkvWriter* writer) { - const uint64 entry_size = kSeekEntryCount * MaxEntrySize(); - const uint64 size = EbmlMasterElementSize(kMkvSeekHead, entry_size); + const uint64_t entry_size = kSeekEntryCount * MaxEntrySize(); + const uint64_t size = + EbmlMasterElementSize(libwebm::kMkvSeekHead, entry_size); start_pos_ = writer->Position(); - const uint64 bytes_written = WriteVoidElement(writer, size + entry_size); + const uint64_t bytes_written = WriteVoidElement(writer, size + entry_size); if (!bytes_written) return false; return true; } -bool SeekHead::AddSeekEntry(uint32 id, uint64 pos) { - for (int32 i = 0; i < kSeekEntryCount; ++i) { +bool SeekHead::AddSeekEntry(uint32_t id, uint64_t pos) { + for (int32_t i = 0; i < kSeekEntryCount; ++i) { if (seek_entry_id_[i] == 0) { seek_entry_id_[i] = id; seek_entry_pos_[i] = pos; @@ -2023,19 +2500,19 @@ bool SeekHead::AddSeekEntry(uint32 id, uint64 pos) { return false; } -uint32 SeekHead::GetId(int index) const { +uint32_t SeekHead::GetId(int index) const { if (index < 0 || index >= kSeekEntryCount) return UINT_MAX; return seek_entry_id_[index]; } -uint64 SeekHead::GetPosition(int index) const { +uint64_t SeekHead::GetPosition(int index) const { if (index < 0 || index >= kSeekEntryCount) return ULLONG_MAX; return seek_entry_pos_[index]; } -bool SeekHead::SetSeekEntry(int index, uint32 id, uint64 position) { +bool SeekHead::SetSeekEntry(int index, uint32_t id, uint64_t position) { if (index < 0 || index >= kSeekEntryCount) return false; seek_entry_id_[index] = id; @@ -2043,12 +2520,12 @@ bool SeekHead::SetSeekEntry(int index, uint32 id, uint64 position) { return true; } -uint64 SeekHead::MaxEntrySize() const { - const uint64 max_entry_payload_size = - EbmlElementSize(kMkvSeekID, 0xffffffffULL) + - EbmlElementSize(kMkvSeekPosition, 0xffffffffffffffffULL); - const uint64 max_entry_size = - EbmlMasterElementSize(kMkvSeek, max_entry_payload_size) + +uint64_t SeekHead::MaxEntrySize() const { + const uint64_t max_entry_payload_size = + EbmlElementSize(libwebm::kMkvSeekID, UINT64_C(0xffffffff)) + + EbmlElementSize(libwebm::kMkvSeekPosition, UINT64_C(0xffffffffffffffff)); + const uint64_t max_entry_size = + EbmlMasterElementSize(libwebm::kMkvSeek, max_entry_payload_size) + max_entry_payload_size; return max_entry_size; @@ -2072,10 +2549,10 @@ SegmentInfo::~SegmentInfo() { } bool SegmentInfo::Init() { - int32 major; - int32 minor; - int32 build; - int32 revision; + int32_t major; + int32_t minor; + int32_t build; + int32_t revision; GetVersion(&major, &minor, &build, &revision); char temp[256]; #ifdef _MSC_VER @@ -2115,12 +2592,12 @@ bool SegmentInfo::Finalize(IMkvWriter* writer) const { if (duration_pos_ == -1) return false; - const int64 pos = writer->Position(); + const int64_t pos = writer->Position(); if (writer->Position(duration_pos_)) return false; - if (!WriteEbmlElement(writer, kMkvDuration, + if (!WriteEbmlElement(writer, libwebm::kMkvDuration, static_cast<float>(duration_))) return false; @@ -2136,43 +2613,45 @@ bool SegmentInfo::Write(IMkvWriter* writer) { if (!writer || !muxing_app_ || !writing_app_) return false; - uint64 size = EbmlElementSize(kMkvTimecodeScale, timecode_scale_); + uint64_t size = EbmlElementSize(libwebm::kMkvTimecodeScale, timecode_scale_); if (duration_ > 0.0) - size += EbmlElementSize(kMkvDuration, static_cast<float>(duration_)); + size += + EbmlElementSize(libwebm::kMkvDuration, static_cast<float>(duration_)); if (date_utc_ != LLONG_MIN) - size += EbmlDateElementSize(kMkvDateUTC); - size += EbmlElementSize(kMkvMuxingApp, muxing_app_); - size += EbmlElementSize(kMkvWritingApp, writing_app_); + size += EbmlDateElementSize(libwebm::kMkvDateUTC); + size += EbmlElementSize(libwebm::kMkvMuxingApp, muxing_app_); + size += EbmlElementSize(libwebm::kMkvWritingApp, writing_app_); - if (!WriteEbmlMasterElement(writer, kMkvInfo, size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvInfo, size)) return false; - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return false; - if (!WriteEbmlElement(writer, kMkvTimecodeScale, timecode_scale_)) + if (!WriteEbmlElement(writer, libwebm::kMkvTimecodeScale, timecode_scale_)) return false; if (duration_ > 0.0) { // Save for later duration_pos_ = writer->Position(); - if (!WriteEbmlElement(writer, kMkvDuration, static_cast<float>(duration_))) + if (!WriteEbmlElement(writer, libwebm::kMkvDuration, + static_cast<float>(duration_))) return false; } if (date_utc_ != LLONG_MIN) - WriteEbmlDateElement(writer, kMkvDateUTC, date_utc_); + WriteEbmlDateElement(writer, libwebm::kMkvDateUTC, date_utc_); - if (!WriteEbmlElement(writer, kMkvMuxingApp, muxing_app_)) + if (!WriteEbmlElement(writer, libwebm::kMkvMuxingApp, muxing_app_)) return false; - if (!WriteEbmlElement(writer, kMkvWritingApp, writing_app_)) + if (!WriteEbmlElement(writer, libwebm::kMkvWritingApp, writing_app_)) return false; - const int64 stop_position = writer->Position(); + const int64_t stop_position = writer->Position(); if (stop_position < 0 || - stop_position - payload_position != static_cast<int64>(size)) + stop_position - payload_position != static_cast<int64_t>(size)) return false; return true; @@ -2244,6 +2723,8 @@ Segment::Segment() mode_(kFile), new_cuepoint_(false), output_cues_(true), + accurate_cluster_duration_(false), + fixed_size_cluster_timecode_(false), payload_pos_(0), size_position_(0), doc_type_version_(kDefaultDocTypeVersion), @@ -2260,7 +2741,7 @@ Segment::Segment() Segment::~Segment() { if (cluster_list_) { - for (int32 i = 0; i < cluster_list_size_; ++i) { + for (int32_t i = 0; i < cluster_list_size_; ++i) { Cluster* const cluster = cluster_list_[i]; delete cluster; } @@ -2268,7 +2749,7 @@ Segment::~Segment() { } if (frames_) { - for (int32 i = 0; i < frames_size_; ++i) { + for (int32_t i = 0; i < frames_size_; ++i) { Frame* const frame = frames_[i]; delete frame; } @@ -2292,13 +2773,13 @@ Segment::~Segment() { } } -void Segment::MoveCuesBeforeClustersHelper(uint64 diff, int32 index, - uint64* cues_size) { +void Segment::MoveCuesBeforeClustersHelper(uint64_t diff, int32_t index, + uint64_t* cues_size) { CuePoint* const cue_point = cues_.GetCueByIndex(index); if (cue_point == NULL) return; - const uint64 old_cue_point_size = cue_point->Size(); - const uint64 cluster_pos = cue_point->cluster_pos() + diff; + const uint64_t old_cue_point_size = cue_point->Size(); + const uint64_t cluster_pos = cue_point->cluster_pos() + diff; cue_point->set_cluster_pos(cluster_pos); // update the new cluster position // New size of the cue is computed as follows // Let a = current sum of size of all CuePoints @@ -2308,40 +2789,40 @@ void Segment::MoveCuesBeforeClustersHelper(uint64 diff, int32 index, // Let d = b + c. Now d is the |diff| passed to the next recursive call. // Let e = a + b. Now e is the |cues_size| passed to the next recursive // call. - const uint64 cue_point_size_diff = cue_point->Size() - old_cue_point_size; - const uint64 cue_size_diff = + const uint64_t cue_point_size_diff = cue_point->Size() - old_cue_point_size; + const uint64_t cue_size_diff = GetCodedUIntSize(*cues_size + cue_point_size_diff) - GetCodedUIntSize(*cues_size); *cues_size += cue_point_size_diff; diff = cue_size_diff + cue_point_size_diff; if (diff > 0) { - for (int32 i = 0; i < cues_.cue_entries_size(); ++i) { + for (int32_t i = 0; i < cues_.cue_entries_size(); ++i) { MoveCuesBeforeClustersHelper(diff, i, cues_size); } } } void Segment::MoveCuesBeforeClusters() { - const uint64 current_cue_size = cues_.Size(); - uint64 cue_size = 0; - for (int32 i = 0; i < cues_.cue_entries_size(); ++i) + const uint64_t current_cue_size = cues_.Size(); + uint64_t cue_size = 0; + for (int32_t i = 0; i < cues_.cue_entries_size(); ++i) cue_size += cues_.GetCueByIndex(i)->Size(); - for (int32 i = 0; i < cues_.cue_entries_size(); ++i) + for (int32_t i = 0; i < cues_.cue_entries_size(); ++i) MoveCuesBeforeClustersHelper(current_cue_size, i, &cue_size); // Adjust the Seek Entry to reflect the change in position // of Cluster and Cues - int32 cluster_index = 0; - int32 cues_index = 0; - for (int32 i = 0; i < SeekHead::kSeekEntryCount; ++i) { - if (seek_head_.GetId(i) == kMkvCluster) + int32_t cluster_index = 0; + int32_t cues_index = 0; + for (int32_t i = 0; i < SeekHead::kSeekEntryCount; ++i) { + if (seek_head_.GetId(i) == libwebm::kMkvCluster) cluster_index = i; - if (seek_head_.GetId(i) == kMkvCues) + if (seek_head_.GetId(i) == libwebm::kMkvCues) cues_index = i; } - seek_head_.SetSeekEntry(cues_index, kMkvCues, + seek_head_.SetSeekEntry(cues_index, libwebm::kMkvCues, seek_head_.GetPosition(cluster_index)); - seek_head_.SetSeekEntry(cluster_index, kMkvCluster, + seek_head_.SetSeekEntry(cluster_index, libwebm::kMkvCluster, cues_.Size() + seek_head_.GetPosition(cues_index)); } @@ -2359,8 +2840,8 @@ bool Segment::CopyAndMoveCuesBeforeClusters(mkvparser::IMkvReader* reader, IMkvWriter* writer) { if (!writer->Seekable() || chunking_) return false; - const int64 cluster_offset = - cluster_list_[0]->size_position() - GetUIntSize(kMkvCluster); + const int64_t cluster_offset = + cluster_list_[0]->size_position() - GetUIntSize(libwebm::kMkvCluster); // Copy the headers. if (!ChunkedCopy(reader, writer, 0, cluster_offset)) @@ -2383,8 +2864,8 @@ bool Segment::CopyAndMoveCuesBeforeClusters(mkvparser::IMkvReader* reader, return false; // Update the Segment size in case the Cues size has changed. - const int64 pos = writer->Position(); - const int64 segment_size = writer->Position() - payload_pos_; + const int64_t pos = writer->Position(); + const int64_t segment_size = writer->Position() - payload_pos_; if (writer->Position(size_position_) || WriteUIntSize(writer, segment_size, 8) || writer->Position(pos)) return false; @@ -2395,15 +2876,17 @@ bool Segment::Finalize() { if (WriteFramesAll() < 0) return false; - if (mode_ == kFile) { - if (cluster_list_size_ > 0) { - // Update last cluster's size - Cluster* const old_cluster = cluster_list_[cluster_list_size_ - 1]; + if (cluster_list_size_ > 0) { + // Update last cluster's size + Cluster* const old_cluster = cluster_list_[cluster_list_size_ - 1]; - if (!old_cluster || !old_cluster->Finalize()) - return false; - } + // For the last frame of the last Cluster, we don't write it as a BlockGroup + // with Duration unless the frame itself has duration set explicitly. + if (!old_cluster || !old_cluster->Finalize(false, 0)) + return false; + } + if (mode_ == kFile) { if (chunking_ && chunk_writer_cluster_) { chunk_writer_cluster_->Close(); chunk_count_++; @@ -2417,7 +2900,7 @@ bool Segment::Finalize() { return false; if (output_cues_) - if (!seek_head_.AddSeekEntry(kMkvCues, MaxOffset())) + if (!seek_head_.AddSeekEntry(libwebm::kMkvCues, MaxOffset())) return false; if (chunking_) { @@ -2448,11 +2931,11 @@ bool Segment::Finalize() { if (size_position_ == -1) return false; - const int64 segment_size = MaxOffset(); + const int64_t segment_size = MaxOffset(); if (segment_size < 1) return false; - const int64 pos = writer_header_->Position(); + const int64_t pos = writer_header_->Position(); UpdateDocTypeVersion(); if (doc_type_version_ != doc_type_version_written_) { if (writer_header_->Position(0)) @@ -2490,7 +2973,7 @@ bool Segment::Finalize() { return true; } -Track* Segment::AddTrack(int32 number) { +Track* Segment::AddTrack(int32_t number) { Track* const track = new (std::nothrow) Track(&seed_); // NOLINT if (!track) @@ -2508,7 +2991,7 @@ Chapter* Segment::AddChapter() { return chapters_.AddChapter(&seed_); } Tag* Segment::AddTag() { return tags_.AddTag(); } -uint64 Segment::AddVideoTrack(int32 width, int32 height, int32 number) { +uint64_t Segment::AddVideoTrack(int32_t width, int32_t height, int32_t number) { VideoTrack* const track = new (std::nothrow) VideoTrack(&seed_); // NOLINT if (!track) return 0; @@ -2524,7 +3007,7 @@ uint64 Segment::AddVideoTrack(int32 width, int32 height, int32 number) { return track->number(); } -bool Segment::AddCuePoint(uint64 timestamp, uint64 track) { +bool Segment::AddCuePoint(uint64_t timestamp, uint64_t track) { if (cluster_list_size_ < 1) return false; @@ -2547,7 +3030,8 @@ bool Segment::AddCuePoint(uint64 timestamp, uint64 track) { return true; } -uint64 Segment::AddAudioTrack(int32 sample_rate, int32 channels, int32 number) { +uint64_t Segment::AddAudioTrack(int32_t sample_rate, int32_t channels, + int32_t number) { AudioTrack* const track = new (std::nothrow) AudioTrack(&seed_); // NOLINT if (!track) return 0; @@ -2562,8 +3046,8 @@ uint64 Segment::AddAudioTrack(int32 sample_rate, int32 channels, int32 number) { return track->number(); } -bool Segment::AddFrame(const uint8* data, uint64 length, uint64 track_number, - uint64 timestamp, bool is_key) { +bool Segment::AddFrame(const uint8_t* data, uint64_t length, + uint64_t track_number, uint64_t timestamp, bool is_key) { if (!data) return false; @@ -2576,11 +3060,11 @@ bool Segment::AddFrame(const uint8* data, uint64 length, uint64 track_number, return AddGenericFrame(&frame); } -bool Segment::AddFrameWithAdditional(const uint8* data, uint64 length, - const uint8* additional, - uint64 additional_length, uint64 add_id, - uint64 track_number, uint64 timestamp, - bool is_key) { +bool Segment::AddFrameWithAdditional(const uint8_t* data, uint64_t length, + const uint8_t* additional, + uint64_t additional_length, + uint64_t add_id, uint64_t track_number, + uint64_t timestamp, bool is_key) { if (!data || !additional) return false; @@ -2595,10 +3079,10 @@ bool Segment::AddFrameWithAdditional(const uint8* data, uint64 length, return AddGenericFrame(&frame); } -bool Segment::AddFrameWithDiscardPadding(const uint8* data, uint64 length, - int64 discard_padding, - uint64 track_number, uint64 timestamp, - bool is_key) { +bool Segment::AddFrameWithDiscardPadding(const uint8_t* data, uint64_t length, + int64_t discard_padding, + uint64_t track_number, + uint64_t timestamp, bool is_key) { if (!data) return false; @@ -2612,8 +3096,9 @@ bool Segment::AddFrameWithDiscardPadding(const uint8* data, uint64 length, return AddGenericFrame(&frame); } -bool Segment::AddMetadata(const uint8* data, uint64 length, uint64 track_number, - uint64 timestamp_ns, uint64 duration_ns) { +bool Segment::AddMetadata(const uint8_t* data, uint64_t length, + uint64_t track_number, uint64_t timestamp_ns, + uint64_t duration_ns) { if (!data) return false; @@ -2702,6 +3187,14 @@ bool Segment::AddGenericFrame(const Frame* frame) { void Segment::OutputCues(bool output_cues) { output_cues_ = output_cues; } +void Segment::AccurateClusterDuration(bool accurate_cluster_duration) { + accurate_cluster_duration_ = accurate_cluster_duration; +} + +void Segment::UseFixedSizeClusterTimecode(bool fixed_size_cluster_timecode) { + fixed_size_cluster_timecode_ = fixed_size_cluster_timecode; +} + bool Segment::SetChunking(bool chunking, const char* filename) { if (chunk_count_ > 0) return false; @@ -2781,7 +3274,7 @@ bool Segment::SetChunking(bool chunking, const char* filename) { return true; } -bool Segment::CuesTrack(uint64 track_number) { +bool Segment::CuesTrack(uint64_t track_number) { const Track* const track = GetTrackByNumber(track_number); if (!track) return false; @@ -2792,7 +3285,7 @@ bool Segment::CuesTrack(uint64 track_number) { void Segment::ForceNewClusterOnNextFrame() { force_new_cluster_ = true; } -Track* Segment::GetTrackByNumber(uint64 track_number) const { +Track* Segment::GetTrackByNumber(uint64_t track_number) const { return tracks_.GetTrackByNumber(track_number); } @@ -2803,11 +3296,11 @@ bool Segment::WriteSegmentHeader() { if (!WriteEbmlHeader(writer_header_, doc_type_version_)) return false; doc_type_version_written_ = doc_type_version_; - ebml_header_size_ = static_cast<int32>(writer_header_->Position()); + ebml_header_size_ = static_cast<int32_t>(writer_header_->Position()); // Write "unknown" (-1) as segment size value. If mode is kFile, Segment // will write over duration when the file is finalized. - if (WriteID(writer_header_, kMkvSegment)) + if (WriteID(writer_header_, libwebm::kMkvSegment)) return false; // Save for later. @@ -2831,25 +3324,25 @@ bool Segment::WriteSegmentHeader() { return false; } - if (!seek_head_.AddSeekEntry(kMkvInfo, MaxOffset())) + if (!seek_head_.AddSeekEntry(libwebm::kMkvInfo, MaxOffset())) return false; if (!segment_info_.Write(writer_header_)) return false; - if (!seek_head_.AddSeekEntry(kMkvTracks, MaxOffset())) + if (!seek_head_.AddSeekEntry(libwebm::kMkvTracks, MaxOffset())) return false; if (!tracks_.Write(writer_header_)) return false; if (chapters_.Count() > 0) { - if (!seek_head_.AddSeekEntry(kMkvChapters, MaxOffset())) + if (!seek_head_.AddSeekEntry(libwebm::kMkvChapters, MaxOffset())) return false; if (!chapters_.Write(writer_header_)) return false; } if (tags_.Count() > 0) { - if (!seek_head_.AddSeekEntry(kMkvTags, MaxOffset())) + if (!seek_head_.AddSeekEntry(libwebm::kMkvTags, MaxOffset())) return false; if (!tags_.Write(writer_header_)) return false; @@ -2870,7 +3363,7 @@ bool Segment::WriteSegmentHeader() { // Here we are testing whether to create a new cluster, given a frame // having time frame_timestamp_ns. // -int Segment::TestFrame(uint64 track_number, uint64 frame_timestamp_ns, +int Segment::TestFrame(uint64_t track_number, uint64_t frame_timestamp_ns, bool is_key) const { if (force_new_cluster_) return 1; @@ -2888,11 +3381,11 @@ int Segment::TestFrame(uint64 track_number, uint64 frame_timestamp_ns, // written to the existing cluster, or that a new cluster should be // created. - const uint64 timecode_scale = segment_info_.timecode_scale(); - const uint64 frame_timecode = frame_timestamp_ns / timecode_scale; + const uint64_t timecode_scale = segment_info_.timecode_scale(); + const uint64_t frame_timecode = frame_timestamp_ns / timecode_scale; const Cluster* const last_cluster = cluster_list_[cluster_list_size_ - 1]; - const uint64 last_cluster_timecode = last_cluster->timecode(); + const uint64_t last_cluster_timecode = last_cluster->timecode(); // For completeness we test for the case when the frame's timecode // is less than the cluster's timecode. Although in principle that @@ -2907,7 +3400,7 @@ int Segment::TestFrame(uint64 track_number, uint64 frame_timestamp_ns, // using a 16-bit signed integer), then we cannot write this frame // to that cluster, and so we must create a new cluster. - const int64 delta_timecode = frame_timecode - last_cluster_timecode; + const int64_t delta_timecode = frame_timecode - last_cluster_timecode; if (delta_timecode > kMaxBlockTimecode) return 2; @@ -2923,7 +3416,7 @@ int Segment::TestFrame(uint64 track_number, uint64 frame_timestamp_ns, // already, where "too many" is defined as "the total time of frames // in the cluster exceeds a threshold". - const uint64 delta_ns = delta_timecode * timecode_scale; + const uint64_t delta_ns = delta_timecode * timecode_scale; if (max_cluster_duration_ > 0 && delta_ns >= max_cluster_duration_) return 1; @@ -2932,7 +3425,7 @@ int Segment::TestFrame(uint64 track_number, uint64 frame_timestamp_ns, // cluster is created when the size of the current cluster exceeds a // threshold. - const uint64 cluster_size = last_cluster->payload_size(); + const uint64_t cluster_size = last_cluster->payload_size(); if (max_cluster_size_ > 0 && cluster_size >= max_cluster_size_) return 1; @@ -2942,19 +3435,19 @@ int Segment::TestFrame(uint64 track_number, uint64 frame_timestamp_ns, return 0; } -bool Segment::MakeNewCluster(uint64 frame_timestamp_ns) { - const int32 new_size = cluster_list_size_ + 1; +bool Segment::MakeNewCluster(uint64_t frame_timestamp_ns) { + const int32_t new_size = cluster_list_size_ + 1; if (new_size > cluster_list_capacity_) { // Add more clusters. - const int32 new_capacity = + const int32_t new_capacity = (cluster_list_capacity_ <= 0) ? 1 : cluster_list_capacity_ * 2; Cluster** const clusters = new (std::nothrow) Cluster*[new_capacity]; // NOLINT if (!clusters) return false; - for (int32 i = 0; i < cluster_list_size_; ++i) { + for (int32_t i = 0; i < cluster_list_size_; ++i) { clusters[i] = cluster_list_[i]; } @@ -2967,19 +3460,17 @@ bool Segment::MakeNewCluster(uint64 frame_timestamp_ns) { if (!WriteFramesLessThan(frame_timestamp_ns)) return false; - if (mode_ == kFile) { - if (cluster_list_size_ > 0) { - // Update old cluster's size - Cluster* const old_cluster = cluster_list_[cluster_list_size_ - 1]; + if (cluster_list_size_ > 0) { + // Update old cluster's size + Cluster* const old_cluster = cluster_list_[cluster_list_size_ - 1]; - if (!old_cluster || !old_cluster->Finalize()) - return false; - } - - if (output_cues_) - new_cuepoint_ = true; + if (!old_cluster || !old_cluster->Finalize(true, frame_timestamp_ns)) + return false; } + if (output_cues_) + new_cuepoint_ = true; + if (chunking_ && cluster_list_size_ > 0) { chunk_writer_cluster_->Close(); chunk_count_++; @@ -2990,24 +3481,25 @@ bool Segment::MakeNewCluster(uint64 frame_timestamp_ns) { return false; } - const uint64 timecode_scale = segment_info_.timecode_scale(); - const uint64 frame_timecode = frame_timestamp_ns / timecode_scale; + const uint64_t timecode_scale = segment_info_.timecode_scale(); + const uint64_t frame_timecode = frame_timestamp_ns / timecode_scale; - uint64 cluster_timecode = frame_timecode; + uint64_t cluster_timecode = frame_timecode; if (frames_size_ > 0) { const Frame* const f = frames_[0]; // earliest queued frame - const uint64 ns = f->timestamp(); - const uint64 tc = ns / timecode_scale; + const uint64_t ns = f->timestamp(); + const uint64_t tc = ns / timecode_scale; if (tc < cluster_timecode) cluster_timecode = tc; } Cluster*& cluster = cluster_list_[cluster_list_size_]; - const int64 offset = MaxOffset(); - cluster = new (std::nothrow) Cluster(cluster_timecode, // NOLINT - offset, segment_info_.timecode_scale()); + const int64_t offset = MaxOffset(); + cluster = new (std::nothrow) + Cluster(cluster_timecode, offset, segment_info_.timecode_scale(), + accurate_cluster_duration_, fixed_size_cluster_timecode_); if (!cluster) return false; @@ -3018,8 +3510,8 @@ bool Segment::MakeNewCluster(uint64 frame_timestamp_ns) { return true; } -bool Segment::DoNewClusterProcessing(uint64 track_number, - uint64 frame_timestamp_ns, bool is_key) { +bool Segment::DoNewClusterProcessing(uint64_t track_number, + uint64_t frame_timestamp_ns, bool is_key) { for (;;) { // Based on the characteristics of the current frame and current // cluster, decide whether to create a new cluster. @@ -3055,12 +3547,12 @@ bool Segment::CheckHeaderInfo() { if (!WriteSegmentHeader()) return false; - if (!seek_head_.AddSeekEntry(kMkvCluster, MaxOffset())) + if (!seek_head_.AddSeekEntry(libwebm::kMkvCluster, MaxOffset())) return false; if (output_cues_ && cues_track_ == 0) { // Check for a video track - for (uint32 i = 0; i < tracks_.track_entries_size(); ++i) { + for (uint32_t i = 0; i < tracks_.track_entries_size(); ++i) { const Track* const track = tracks_.GetTrackByIndex(i); if (!track) return false; @@ -3085,7 +3577,7 @@ bool Segment::CheckHeaderInfo() { } void Segment::UpdateDocTypeVersion() { - for (uint32 index = 0; index < tracks_.track_entries_size(); ++index) { + for (uint32_t index = 0; index < tracks_.track_entries_size(); ++index) { const Track* track = tracks_.GetTrackByIndex(index); if (track == NULL) break; @@ -3127,14 +3619,14 @@ bool Segment::UpdateChunkName(const char* ext, char** name) const { return true; } -int64 Segment::MaxOffset() { +int64_t Segment::MaxOffset() { if (!writer_header_) return -1; - int64 offset = writer_header_->Position() - payload_pos_; + int64_t offset = writer_header_->Position() - payload_pos_; if (chunking_) { - for (int32 i = 0; i < cluster_list_size_; ++i) { + for (int32_t i = 0; i < cluster_list_size_; ++i) { Cluster* const cluster = cluster_list_[i]; offset += cluster->Size(); } @@ -3147,11 +3639,11 @@ int64 Segment::MaxOffset() { } bool Segment::QueueFrame(Frame* frame) { - const int32 new_size = frames_size_ + 1; + const int32_t new_size = frames_size_ + 1; if (new_size > frames_capacity_) { // Add more frames. - const int32 new_capacity = (!frames_capacity_) ? 2 : frames_capacity_ * 2; + const int32_t new_capacity = (!frames_capacity_) ? 2 : frames_capacity_ * 2; if (new_capacity < 1) return false; @@ -3160,7 +3652,7 @@ bool Segment::QueueFrame(Frame* frame) { if (!frames) return false; - for (int32 i = 0; i < frames_size_; ++i) { + for (int32_t i = 0; i < frames_size_; ++i) { frames[i] = frames_[i]; } @@ -3186,7 +3678,7 @@ int Segment::WriteFramesAll() { if (!cluster) return -1; - for (int32 i = 0; i < frames_size_; ++i) { + for (int32_t i = 0; i < frames_size_; ++i) { Frame*& frame = frames_[i]; // TODO(jzern/vigneshv): using Segment::AddGenericFrame here would limit the // places where |doc_type_version_| needs to be updated. @@ -3215,7 +3707,7 @@ int Segment::WriteFramesAll() { return result; } -bool Segment::WriteFramesLessThan(uint64 timestamp) { +bool Segment::WriteFramesLessThan(uint64_t timestamp) { // Check |cluster_list_size_| to see if this is the first cluster. If it is // the first cluster the audio frames that are less than the first video // timesatmp will be written in a later step. @@ -3227,11 +3719,11 @@ bool Segment::WriteFramesLessThan(uint64 timestamp) { if (!cluster) return false; - int32 shift_left = 0; + int32_t shift_left = 0; // TODO(fgalligan): Change this to use the durations of frames instead of // the next frame's start time if the duration is accurate. - for (int32 i = 1; i < frames_size_; ++i) { + for (int32_t i = 1; i < frames_size_; ++i) { const Frame* const frame_curr = frames_[i]; if (frame_curr->timestamp() > timestamp) @@ -3262,8 +3754,8 @@ bool Segment::WriteFramesLessThan(uint64 timestamp) { if (shift_left >= frames_size_) return false; - const int32 new_frames_size = frames_size_ - shift_left; - for (int32 i = 0; i < new_frames_size; ++i) { + const int32_t new_frames_size = frames_size_ - shift_left; + for (int32_t i = 0; i < new_frames_size; ++i) { frames_[i] = frames_[i + shift_left]; } diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer.hpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxer.h index 03a002c93b3..55ba07196df 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer.hpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxer.h @@ -6,24 +6,31 @@ // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. -#ifndef MKVMUXER_HPP -#define MKVMUXER_HPP +#ifndef MKVMUXER_MKVMUXER_H_ +#define MKVMUXER_MKVMUXER_H_ -#include "mkvmuxertypes.hpp" +#include <stdint.h> + +#include <cstddef> +#include <list> +#include <map> + +#include "common/webmids.h" +#include "mkvmuxer/mkvmuxertypes.h" // For a description of the WebM elements see // http://www.webmproject.org/code/specs/container/. namespace mkvparser { class IMkvReader; -} // end namespace +} // namespace mkvparser namespace mkvmuxer { class MkvWriter; class Segment; -const uint64 kMaxTrackNumber = 126; +const uint64_t kMaxTrackNumber = 126; /////////////////////////////////////////////////////////////// // Interface used by the mkvmuxer to write out the Mkv data. @@ -59,15 +66,15 @@ class IMkvWriter { // Writes out the EBML header for a WebM file. This function must be called // before any other libwebm writing functions are called. -bool WriteEbmlHeader(IMkvWriter* writer, uint64 doc_type_version); +bool WriteEbmlHeader(IMkvWriter* writer, uint64_t doc_type_version); // Deprecated. Writes out EBML header with doc_type_version as // kDefaultDocTypeVersion. Exists for backward compatibility. bool WriteEbmlHeader(IMkvWriter* writer); // Copies in Chunk from source to destination between the given byte positions -bool ChunkedCopy(mkvparser::IMkvReader* source, IMkvWriter* dst, int64 start, - int64 size); +bool ChunkedCopy(mkvparser::IMkvReader* source, IMkvWriter* dst, int64_t start, + int64_t size); /////////////////////////////////////////////////////////////// // Class to hold data the will be written to a block. @@ -81,10 +88,11 @@ class Frame { bool CopyFrom(const Frame& frame); // Copies |frame| data into |frame_|. Returns true on success. - bool Init(const uint8* frame, uint64 length); + bool Init(const uint8_t* frame, uint64_t length); // Copies |additional| data into |additional_|. Returns true on success. - bool AddAdditionalData(const uint8* additional, uint64 length, uint64 add_id); + bool AddAdditionalData(const uint8_t* additional, uint64_t length, + uint64_t add_id); // Returns true if the frame has valid parameters. bool IsValid() const; @@ -93,62 +101,70 @@ class Frame { // parameters. bool CanBeSimpleBlock() const; - uint64 add_id() const { return add_id_; } - const uint8* additional() const { return additional_; } - uint64 additional_length() const { return additional_length_; } - void set_duration(uint64 duration) { duration_ = duration; } - uint64 duration() const { return duration_; } - const uint8* frame() const { return frame_; } + uint64_t add_id() const { return add_id_; } + const uint8_t* additional() const { return additional_; } + uint64_t additional_length() const { return additional_length_; } + void set_duration(uint64_t duration); + uint64_t duration() const { return duration_; } + bool duration_set() const { return duration_set_; } + const uint8_t* frame() const { return frame_; } void set_is_key(bool key) { is_key_ = key; } bool is_key() const { return is_key_; } - uint64 length() const { return length_; } - void set_track_number(uint64 track_number) { track_number_ = track_number; } - uint64 track_number() const { return track_number_; } - void set_timestamp(uint64 timestamp) { timestamp_ = timestamp; } - uint64 timestamp() const { return timestamp_; } - void set_discard_padding(int64 discard_padding) { + uint64_t length() const { return length_; } + void set_track_number(uint64_t track_number) { track_number_ = track_number; } + uint64_t track_number() const { return track_number_; } + void set_timestamp(uint64_t timestamp) { timestamp_ = timestamp; } + uint64_t timestamp() const { return timestamp_; } + void set_discard_padding(int64_t discard_padding) { discard_padding_ = discard_padding; } - int64 discard_padding() const { return discard_padding_; } - void set_reference_block_timestamp(int64 reference_block_timestamp); - int64 reference_block_timestamp() const { return reference_block_timestamp_; } + int64_t discard_padding() const { return discard_padding_; } + void set_reference_block_timestamp(int64_t reference_block_timestamp); + int64_t reference_block_timestamp() const { + return reference_block_timestamp_; + } bool reference_block_timestamp_set() const { return reference_block_timestamp_set_; } private: // Id of the Additional data. - uint64 add_id_; + uint64_t add_id_; // Pointer to additional data. Owned by this class. - uint8* additional_; + uint8_t* additional_; // Length of the additional data. - uint64 additional_length_; + uint64_t additional_length_; // Duration of the frame in nanoseconds. - uint64 duration_; + uint64_t duration_; + + // Flag indicating that |duration_| has been set. Setting duration causes the + // frame to be written out as a Block with BlockDuration instead of as a + // SimpleBlock. + bool duration_set_; // Pointer to the data. Owned by this class. - uint8* frame_; + uint8_t* frame_; // Flag telling if the data should set the key flag of a block. bool is_key_; // Length of the data. - uint64 length_; + uint64_t length_; // Mkv track number the data is associated with. - uint64 track_number_; + uint64_t track_number_; // Timestamp of the data in nanoseconds. - uint64 timestamp_; + uint64_t timestamp_; // Discard padding for the frame. - int64 discard_padding_; + int64_t discard_padding_; // Reference block timestamp. - int64 reference_block_timestamp_; + int64_t reference_block_timestamp_; // Flag indicating if |reference_block_timestamp_| has been set. bool reference_block_timestamp_set_; @@ -164,19 +180,19 @@ class CuePoint { ~CuePoint(); // Returns the size in bytes for the entire CuePoint element. - uint64 Size() const; + uint64_t Size() const; // Output the CuePoint element to the writer. Returns true on success. bool Write(IMkvWriter* writer) const; - void set_time(uint64 time) { time_ = time; } - uint64 time() const { return time_; } - void set_track(uint64 track) { track_ = track; } - uint64 track() const { return track_; } - void set_cluster_pos(uint64 cluster_pos) { cluster_pos_ = cluster_pos; } - uint64 cluster_pos() const { return cluster_pos_; } - void set_block_number(uint64 block_number) { block_number_ = block_number; } - uint64 block_number() const { return block_number_; } + void set_time(uint64_t time) { time_ = time; } + uint64_t time() const { return time_; } + void set_track(uint64_t track) { track_ = track; } + uint64_t track() const { return track_; } + void set_cluster_pos(uint64_t cluster_pos) { cluster_pos_ = cluster_pos; } + uint64_t cluster_pos() const { return cluster_pos_; } + void set_block_number(uint64_t block_number) { block_number_ = block_number; } + uint64_t block_number() const { return block_number_; } void set_output_block_number(bool output_block_number) { output_block_number_ = output_block_number; } @@ -184,19 +200,19 @@ class CuePoint { private: // Returns the size in bytes for the payload of the CuePoint element. - uint64 PayloadSize() const; + uint64_t PayloadSize() const; // Absolute timecode according to the segment time base. - uint64 time_; + uint64_t time_; // The Track element associated with the CuePoint. - uint64 track_; + uint64_t track_; // The position of the Cluster containing the Block. - uint64 cluster_pos_; + uint64_t cluster_pos_; // Number of the Block within the Cluster, starting from 1. - uint64 block_number_; + uint64_t block_number_; // If true the muxer will write out the block number for the cue if the // block number is different than the default of 1. Default is set to true. @@ -217,15 +233,15 @@ class Cues { // Returns the cue point by index. Returns NULL if there is no cue point // match. - CuePoint* GetCueByIndex(int32 index) const; + CuePoint* GetCueByIndex(int32_t index) const; // Returns the total size of the Cues element - uint64 Size(); + uint64_t Size(); // Output the Cues element to the writer. Returns true on success. bool Write(IMkvWriter* writer) const; - int32 cue_entries_size() const { return cue_entries_size_; } + int32_t cue_entries_size() const { return cue_entries_size_; } void set_output_block_number(bool output_block_number) { output_block_number_ = output_block_number; } @@ -233,10 +249,10 @@ class Cues { private: // Number of allocated elements in |cue_entries_|. - int32 cue_entries_capacity_; + int32_t cue_entries_capacity_; // Number of CuePoints in |cue_entries_|. - int32 cue_entries_size_; + int32_t cue_entries_size_; // CuePoint list. CuePoint** cue_entries_; @@ -258,21 +274,21 @@ class ContentEncAESSettings { ~ContentEncAESSettings() {} // Returns the size in bytes for the ContentEncAESSettings element. - uint64 Size() const; + uint64_t Size() const; // Writes out the ContentEncAESSettings element to |writer|. Returns true on // success. bool Write(IMkvWriter* writer) const; - uint64 cipher_mode() const { return cipher_mode_; } + uint64_t cipher_mode() const { return cipher_mode_; } private: // Returns the size in bytes for the payload of the ContentEncAESSettings // element. - uint64 PayloadSize() const; + uint64_t PayloadSize() const; // Sub elements - uint64 cipher_mode_; + uint64_t cipher_mode_; LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncAESSettings); }; @@ -291,45 +307,158 @@ class ContentEncoding { // Sets the content encryption id. Copies |length| bytes from |id| to // |enc_key_id_|. Returns true on success. - bool SetEncryptionID(const uint8* id, uint64 length); + bool SetEncryptionID(const uint8_t* id, uint64_t length); // Returns the size in bytes for the ContentEncoding element. - uint64 Size() const; + uint64_t Size() const; // Writes out the ContentEncoding element to |writer|. Returns true on // success. bool Write(IMkvWriter* writer) const; - uint64 enc_algo() const { return enc_algo_; } - uint64 encoding_order() const { return encoding_order_; } - uint64 encoding_scope() const { return encoding_scope_; } - uint64 encoding_type() const { return encoding_type_; } + uint64_t enc_algo() const { return enc_algo_; } + uint64_t encoding_order() const { return encoding_order_; } + uint64_t encoding_scope() const { return encoding_scope_; } + uint64_t encoding_type() const { return encoding_type_; } ContentEncAESSettings* enc_aes_settings() { return &enc_aes_settings_; } private: // Returns the size in bytes for the encoding elements. - uint64 EncodingSize(uint64 compresion_size, uint64 encryption_size) const; + uint64_t EncodingSize(uint64_t compresion_size, + uint64_t encryption_size) const; // Returns the size in bytes for the encryption elements. - uint64 EncryptionSize() const; + uint64_t EncryptionSize() const; // Track element names - uint64 enc_algo_; - uint8* enc_key_id_; - uint64 encoding_order_; - uint64 encoding_scope_; - uint64 encoding_type_; + uint64_t enc_algo_; + uint8_t* enc_key_id_; + uint64_t encoding_order_; + uint64_t encoding_scope_; + uint64_t encoding_type_; // ContentEncAESSettings element. ContentEncAESSettings enc_aes_settings_; // Size of the ContentEncKeyID data in bytes. - uint64 enc_key_id_length_; + uint64_t enc_key_id_length_; LIBWEBM_DISALLOW_COPY_AND_ASSIGN(ContentEncoding); }; /////////////////////////////////////////////////////////////// +// Colour element. +struct PrimaryChromaticity { + PrimaryChromaticity(float x_val, float y_val) : x(x_val), y(y_val) {} + PrimaryChromaticity() : x(0), y(0) {} + ~PrimaryChromaticity() {} + uint64_t PrimaryChromaticityPayloadSize(libwebm::MkvId x_id, + libwebm::MkvId y_id) const; + bool Write(IMkvWriter* writer, libwebm::MkvId x_id, + libwebm::MkvId y_id) const; + + float x; + float y; +}; + +class MasteringMetadata { + public: + static const float kValueNotPresent; + + MasteringMetadata() + : luminance_max(kValueNotPresent), + luminance_min(kValueNotPresent), + r_(NULL), + g_(NULL), + b_(NULL), + white_point_(NULL) {} + ~MasteringMetadata() { + delete r_; + delete g_; + delete b_; + delete white_point_; + } + + // Returns total size of the MasteringMetadata element. + uint64_t MasteringMetadataSize() const; + bool Write(IMkvWriter* writer) const; + + // Copies non-null chromaticity. + bool SetChromaticity(const PrimaryChromaticity* r, + const PrimaryChromaticity* g, + const PrimaryChromaticity* b, + const PrimaryChromaticity* white_point); + const PrimaryChromaticity* r() const { return r_; } + const PrimaryChromaticity* g() const { return g_; } + const PrimaryChromaticity* b() const { return b_; } + const PrimaryChromaticity* white_point() const { return white_point_; } + + float luminance_max; + float luminance_min; + + private: + // Returns size of MasteringMetadata child elements. + uint64_t PayloadSize() const; + + PrimaryChromaticity* r_; + PrimaryChromaticity* g_; + PrimaryChromaticity* b_; + PrimaryChromaticity* white_point_; +}; + +class Colour { + public: + static const uint64_t kValueNotPresent; + Colour() + : matrix_coefficients(kValueNotPresent), + bits_per_channel(kValueNotPresent), + chroma_subsampling_horz(kValueNotPresent), + chroma_subsampling_vert(kValueNotPresent), + cb_subsampling_horz(kValueNotPresent), + cb_subsampling_vert(kValueNotPresent), + chroma_siting_horz(kValueNotPresent), + chroma_siting_vert(kValueNotPresent), + range(kValueNotPresent), + transfer_characteristics(kValueNotPresent), + primaries(kValueNotPresent), + max_cll(kValueNotPresent), + max_fall(kValueNotPresent), + mastering_metadata_(NULL) {} + ~Colour() { delete mastering_metadata_; } + + // Returns total size of the Colour element. + uint64_t ColourSize() const; + bool Write(IMkvWriter* writer) const; + + // Deep copies |mastering_metadata|. + bool SetMasteringMetadata(const MasteringMetadata& mastering_metadata); + + const MasteringMetadata* mastering_metadata() const { + return mastering_metadata_; + } + + uint64_t matrix_coefficients; + uint64_t bits_per_channel; + uint64_t chroma_subsampling_horz; + uint64_t chroma_subsampling_vert; + uint64_t cb_subsampling_horz; + uint64_t cb_subsampling_vert; + uint64_t chroma_siting_horz; + uint64_t chroma_siting_vert; + uint64_t range; + uint64_t transfer_characteristics; + uint64_t primaries; + uint64_t max_cll; + uint64_t max_fall; + + private: + // Returns size of Colour child elements. + uint64_t PayloadSize() const; + + MasteringMetadata* mastering_metadata_; +}; + +/////////////////////////////////////////////////////////////// // Track element. class Track { public: @@ -342,76 +471,76 @@ class Track { // Returns the ContentEncoding by index. Returns NULL if there is no // ContentEncoding match. - ContentEncoding* GetContentEncodingByIndex(uint32 index) const; + ContentEncoding* GetContentEncodingByIndex(uint32_t index) const; // Returns the size in bytes for the payload of the Track element. - virtual uint64 PayloadSize() const; + virtual uint64_t PayloadSize() const; // Returns the size in bytes of the Track element. - virtual uint64 Size() const; + virtual uint64_t Size() const; // Output the Track element to the writer. Returns true on success. virtual bool Write(IMkvWriter* writer) const; // Sets the CodecPrivate element of the Track element. Copies |length| // bytes from |codec_private| to |codec_private_|. Returns true on success. - bool SetCodecPrivate(const uint8* codec_private, uint64 length); + bool SetCodecPrivate(const uint8_t* codec_private, uint64_t length); void set_codec_id(const char* codec_id); const char* codec_id() const { return codec_id_; } - const uint8* codec_private() const { return codec_private_; } + const uint8_t* codec_private() const { return codec_private_; } void set_language(const char* language); const char* language() const { return language_; } - void set_max_block_additional_id(uint64 max_block_additional_id) { + void set_max_block_additional_id(uint64_t max_block_additional_id) { max_block_additional_id_ = max_block_additional_id; } - uint64 max_block_additional_id() const { return max_block_additional_id_; } + uint64_t max_block_additional_id() const { return max_block_additional_id_; } void set_name(const char* name); const char* name() const { return name_; } - void set_number(uint64 number) { number_ = number; } - uint64 number() const { return number_; } - void set_type(uint64 type) { type_ = type; } - uint64 type() const { return type_; } - void set_uid(uint64 uid) { uid_ = uid; } - uint64 uid() const { return uid_; } - void set_codec_delay(uint64 codec_delay) { codec_delay_ = codec_delay; } - uint64 codec_delay() const { return codec_delay_; } - void set_seek_pre_roll(uint64 seek_pre_roll) { + void set_number(uint64_t number) { number_ = number; } + uint64_t number() const { return number_; } + void set_type(uint64_t type) { type_ = type; } + uint64_t type() const { return type_; } + void set_uid(uint64_t uid) { uid_ = uid; } + uint64_t uid() const { return uid_; } + void set_codec_delay(uint64_t codec_delay) { codec_delay_ = codec_delay; } + uint64_t codec_delay() const { return codec_delay_; } + void set_seek_pre_roll(uint64_t seek_pre_roll) { seek_pre_roll_ = seek_pre_roll; } - uint64 seek_pre_roll() const { return seek_pre_roll_; } - void set_default_duration(uint64 default_duration) { + uint64_t seek_pre_roll() const { return seek_pre_roll_; } + void set_default_duration(uint64_t default_duration) { default_duration_ = default_duration; } - uint64 default_duration() const { return default_duration_; } + uint64_t default_duration() const { return default_duration_; } - uint64 codec_private_length() const { return codec_private_length_; } - uint32 content_encoding_entries_size() const { + uint64_t codec_private_length() const { return codec_private_length_; } + uint32_t content_encoding_entries_size() const { return content_encoding_entries_size_; } private: // Track element names. char* codec_id_; - uint8* codec_private_; + uint8_t* codec_private_; char* language_; - uint64 max_block_additional_id_; + uint64_t max_block_additional_id_; char* name_; - uint64 number_; - uint64 type_; - uint64 uid_; - uint64 codec_delay_; - uint64 seek_pre_roll_; - uint64 default_duration_; + uint64_t number_; + uint64_t type_; + uint64_t uid_; + uint64_t codec_delay_; + uint64_t seek_pre_roll_; + uint64_t default_duration_; // Size of the CodecPrivate data in bytes. - uint64 codec_private_length_; + uint64_t codec_private_length_; // ContentEncoding element list. ContentEncoding** content_encoding_entries_; // Number of ContentEncoding elements added. - uint32 content_encoding_entries_size_; + uint32_t content_encoding_entries_size_; LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Track); }; @@ -437,56 +566,63 @@ class VideoTrack : public Track { // Returns the size in bytes for the payload of the Track element plus the // video specific elements. - virtual uint64 PayloadSize() const; + virtual uint64_t PayloadSize() const; // Output the VideoTrack element to the writer. Returns true on success. virtual bool Write(IMkvWriter* writer) const; // Sets the video's stereo mode. Returns true on success. - bool SetStereoMode(uint64 stereo_mode); + bool SetStereoMode(uint64_t stereo_mode); // Sets the video's alpha mode. Returns true on success. - bool SetAlphaMode(uint64 alpha_mode); - - void set_display_height(uint64 height) { display_height_ = height; } - uint64 display_height() const { return display_height_; } - void set_display_width(uint64 width) { display_width_ = width; } - uint64 display_width() const { return display_width_; } - - void set_crop_left(uint64 crop_left) { crop_left_ = crop_left; } - uint64 crop_left() const { return crop_left_; } - void set_crop_right(uint64 crop_right) { crop_right_ = crop_right; } - uint64 crop_right() const { return crop_right_; } - void set_crop_top(uint64 crop_top) { crop_top_ = crop_top; } - uint64 crop_top() const { return crop_top_; } - void set_crop_bottom(uint64 crop_bottom) { crop_bottom_ = crop_bottom; } - uint64 crop_bottom() const { return crop_bottom_; } + bool SetAlphaMode(uint64_t alpha_mode); + + void set_display_height(uint64_t height) { display_height_ = height; } + uint64_t display_height() const { return display_height_; } + void set_display_width(uint64_t width) { display_width_ = width; } + uint64_t display_width() const { return display_width_; } + + void set_crop_left(uint64_t crop_left) { crop_left_ = crop_left; } + uint64_t crop_left() const { return crop_left_; } + void set_crop_right(uint64_t crop_right) { crop_right_ = crop_right; } + uint64_t crop_right() const { return crop_right_; } + void set_crop_top(uint64_t crop_top) { crop_top_ = crop_top; } + uint64_t crop_top() const { return crop_top_; } + void set_crop_bottom(uint64_t crop_bottom) { crop_bottom_ = crop_bottom; } + uint64_t crop_bottom() const { return crop_bottom_; } void set_frame_rate(double frame_rate) { frame_rate_ = frame_rate; } double frame_rate() const { return frame_rate_; } - void set_height(uint64 height) { height_ = height; } - uint64 height() const { return height_; } - uint64 stereo_mode() { return stereo_mode_; } - uint64 alpha_mode() { return alpha_mode_; } - void set_width(uint64 width) { width_ = width; } - uint64 width() const { return width_; } + void set_height(uint64_t height) { height_ = height; } + uint64_t height() const { return height_; } + uint64_t stereo_mode() { return stereo_mode_; } + uint64_t alpha_mode() { return alpha_mode_; } + void set_width(uint64_t width) { width_ = width; } + uint64_t width() const { return width_; } + + Colour* colour() { return colour_; } + + // Deep copies |colour|. + bool SetColour(const Colour& colour); private: // Returns the size in bytes of the Video element. - uint64 VideoPayloadSize() const; + uint64_t VideoPayloadSize() const; // Video track element names. - uint64 display_height_; - uint64 display_width_; - uint64 crop_left_; - uint64 crop_right_; - uint64 crop_top_; - uint64 crop_bottom_; + uint64_t display_height_; + uint64_t display_width_; + uint64_t crop_left_; + uint64_t crop_right_; + uint64_t crop_top_; + uint64_t crop_bottom_; double frame_rate_; - uint64 height_; - uint64 stereo_mode_; - uint64 alpha_mode_; - uint64 width_; + uint64_t height_; + uint64_t stereo_mode_; + uint64_t alpha_mode_; + uint64_t width_; + + Colour* colour_; LIBWEBM_DISALLOW_COPY_AND_ASSIGN(VideoTrack); }; @@ -501,22 +637,22 @@ class AudioTrack : public Track { // Returns the size in bytes for the payload of the Track element plus the // audio specific elements. - virtual uint64 PayloadSize() const; + virtual uint64_t PayloadSize() const; // Output the AudioTrack element to the writer. Returns true on success. virtual bool Write(IMkvWriter* writer) const; - void set_bit_depth(uint64 bit_depth) { bit_depth_ = bit_depth; } - uint64 bit_depth() const { return bit_depth_; } - void set_channels(uint64 channels) { channels_ = channels; } - uint64 channels() const { return channels_; } + void set_bit_depth(uint64_t bit_depth) { bit_depth_ = bit_depth; } + uint64_t bit_depth() const { return bit_depth_; } + void set_channels(uint64_t channels) { channels_ = channels; } + uint64_t channels() const { return channels_; } void set_sample_rate(double sample_rate) { sample_rate_ = sample_rate; } double sample_rate() const { return sample_rate_; } private: // Audio track element names. - uint64 bit_depth_; - uint64 channels_; + uint64_t bit_depth_; + uint64_t channels_; double sample_rate_; LIBWEBM_DISALLOW_COPY_AND_ASSIGN(AudioTrack); @@ -542,32 +678,35 @@ class Tracks { // deleted by the Tracks object. Returns true on success. |number| is the // number to use for the track. |number| must be >= 0. If |number| == 0 // then the muxer will decide on the track number. - bool AddTrack(Track* track, int32 number); + bool AddTrack(Track* track, int32_t number); // Returns the track by index. Returns NULL if there is no track match. - const Track* GetTrackByIndex(uint32 idx) const; + const Track* GetTrackByIndex(uint32_t idx) const; // Search the Tracks and return the track that matches |tn|. Returns NULL // if there is no track match. - Track* GetTrackByNumber(uint64 track_number) const; + Track* GetTrackByNumber(uint64_t track_number) const; // Returns true if the track number is an audio track. - bool TrackIsAudio(uint64 track_number) const; + bool TrackIsAudio(uint64_t track_number) const; // Returns true if the track number is a video track. - bool TrackIsVideo(uint64 track_number) const; + bool TrackIsVideo(uint64_t track_number) const; // Output the Tracks element to the writer. Returns true on success. bool Write(IMkvWriter* writer) const; - uint32 track_entries_size() const { return track_entries_size_; } + uint32_t track_entries_size() const { return track_entries_size_; } private: // Track element list. Track** track_entries_; // Number of Track elements added. - uint32 track_entries_size_; + uint32_t track_entries_size_; + + // Whether or not Tracks element has already been written via IMkvWriter. + mutable bool wrote_tracks_; LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Tracks); }; @@ -585,12 +724,12 @@ class Chapter { // Converts the nanosecond start and stop times of this chapter to // their corresponding timecode values, and stores them that way. - void set_time(const Segment& segment, uint64 start_time_ns, - uint64 end_time_ns); + void set_time(const Segment& segment, uint64_t start_time_ns, + uint64_t end_time_ns); // Sets the uid for this chapter. Primarily used to enable // deterministic output from the muxer. - void set_uid(const uint64 uid) { uid_ = uid; } + void set_uid(const uint64_t uid) { uid_ = uid; } // Add a title string to this chapter, per the semantics described // here: @@ -637,7 +776,7 @@ class Chapter { // If |writer| is non-NULL, serialize the Display sub-element of // the Atom into the stream. Returns the Display element size on // success, 0 if error. - uint64 WriteDisplay(IMkvWriter* writer) const; + uint64_t WriteDisplay(IMkvWriter* writer) const; private: char* title_; @@ -670,20 +809,20 @@ class Chapter { // If |writer| is non-NULL, serialize the Atom sub-element into the // stream. Returns the total size of the element on success, 0 if // error. - uint64 WriteAtom(IMkvWriter* writer) const; + uint64_t WriteAtom(IMkvWriter* writer) const; // The string identifier for this chapter (corresponds to WebVTT cue // identifier). char* id_; // Start timecode of the chapter. - uint64 start_timecode_; + uint64_t start_timecode_; // Stop timecode of the chapter. - uint64 end_timecode_; + uint64_t end_timecode_; // The binary identifier for this chapter. - uint64 uid_; + uint64_t uid_; // The Atom element can contain multiple Display sub-elements, as // the same logical title can be rendered in different languages. @@ -723,7 +862,7 @@ class Chapters { // If |writer| is non-NULL, serialize the Edition sub-element of the // Chapters element into the stream. Returns the Edition element // size on success, 0 if error. - uint64 WriteEdition(IMkvWriter* writer) const; + uint64_t WriteEdition(IMkvWriter* writer) const; // Total length of the chapters_ array. int chapters_size_; @@ -768,7 +907,7 @@ class Tag { // If |writer| is non-NULL, serialize the SimpleTag sub-element of // the Atom into the stream. Returns the SimpleTag element size on // success, 0 if error. - uint64 Write(IMkvWriter* writer) const; + uint64_t Write(IMkvWriter* writer) const; private: char* tag_name_; @@ -795,7 +934,7 @@ class Tag { // If |writer| is non-NULL, serialize the Tag sub-element into the // stream. Returns the total size of the element on success, 0 if // error. - uint64 Write(IMkvWriter* writer) const; + uint64_t Write(IMkvWriter* writer) const; // The Atom element can contain multiple SimpleTag sub-elements SimpleTag* simple_tags_; @@ -853,7 +992,9 @@ class Cluster { // |timecode| is the absolute timecode of the cluster. |cues_pos| is the // position for the cluster within the segment that should be written in // the cues element. |timecode_scale| is the timecode scale of the segment. - Cluster(uint64 timecode, int64 cues_pos, uint64 timecode_scale); + Cluster(uint64_t timecode, int64_t cues_pos, uint64_t timecode_scale, + bool write_last_frame_with_duration = false, + bool fixed_size_timecode = false); ~Cluster(); bool Init(IMkvWriter* ptr_writer); @@ -872,8 +1013,8 @@ class Cluster { // timecode: Absolute (not relative to cluster) timestamp of the // frame, expressed in timecode units. // is_key: Flag telling whether or not this frame is a key frame. - bool AddFrame(const uint8* data, uint64 length, uint64 track_number, - uint64 timecode, // timecode units (absolute) + bool AddFrame(const uint8_t* data, uint64_t length, uint64_t track_number, + uint64_t timecode, // timecode units (absolute) bool is_key); // Adds a frame to be output in the file. The frame is written out through @@ -889,10 +1030,11 @@ class Cluster { // abs_timecode: Absolute (not relative to cluster) timestamp of the // frame, expressed in timecode units. // is_key: Flag telling whether or not this frame is a key frame. - bool AddFrameWithAdditional(const uint8* data, uint64 length, - const uint8* additional, uint64 additional_length, - uint64 add_id, uint64 track_number, - uint64 abs_timecode, bool is_key); + bool AddFrameWithAdditional(const uint8_t* data, uint64_t length, + const uint8_t* additional, + uint64_t additional_length, uint64_t add_id, + uint64_t track_number, uint64_t abs_timecode, + bool is_key); // Adds a frame to be output in the file. The frame is written out through // |writer_| if successful. Returns true on success. @@ -905,9 +1047,10 @@ class Cluster { // abs_timecode: Absolute (not relative to cluster) timestamp of the // frame, expressed in timecode units. // is_key: Flag telling whether or not this frame is a key frame. - bool AddFrameWithDiscardPadding(const uint8* data, uint64 length, - int64 discard_padding, uint64 track_number, - uint64 abs_timecode, bool is_key); + bool AddFrameWithDiscardPadding(const uint8_t* data, uint64_t length, + int64_t discard_padding, + uint64_t track_number, uint64_t abs_timecode, + bool is_key); // Writes a frame of metadata to the output medium; returns true on // success. @@ -923,31 +1066,53 @@ class Cluster { // The metadata frame is written as a block group, with a duration // sub-element but no reference time sub-elements (indicating that // it is considered a keyframe, per Matroska semantics). - bool AddMetadata(const uint8* data, uint64 length, uint64 track_number, - uint64 timecode, uint64 duration); + bool AddMetadata(const uint8_t* data, uint64_t length, uint64_t track_number, + uint64_t timecode, uint64_t duration); // Increments the size of the cluster's data in bytes. - void AddPayloadSize(uint64 size); + void AddPayloadSize(uint64_t size); // Closes the cluster so no more data can be written to it. Will update the - // cluster's size if |writer_| is seekable. Returns true on success. + // cluster's size if |writer_| is seekable. Returns true on success. This + // variant of Finalize() fails when |write_last_frame_with_duration_| is set + // to true. bool Finalize(); + // Closes the cluster so no more data can be written to it. Will update the + // cluster's size if |writer_| is seekable. Returns true on success. + // Inputs: + // set_last_frame_duration: Boolean indicating whether or not the duration + // of the last frame should be set. If set to + // false, the |duration| value is ignored and + // |write_last_frame_with_duration_| will not be + // honored. + // duration: Duration of the Cluster in timecode scale. + bool Finalize(bool set_last_frame_duration, uint64_t duration); + // Returns the size in bytes for the entire Cluster element. - uint64 Size() const; + uint64_t Size() const; // Given |abs_timecode|, calculates timecode relative to most recent timecode. // Returns -1 on failure, or a relative timecode. - int64 GetRelativeTimecode(int64 abs_timecode) const; - - int64 size_position() const { return size_position_; } - int32 blocks_added() const { return blocks_added_; } - uint64 payload_size() const { return payload_size_; } - int64 position_for_cues() const { return position_for_cues_; } - uint64 timecode() const { return timecode_; } - uint64 timecode_scale() const { return timecode_scale_; } + int64_t GetRelativeTimecode(int64_t abs_timecode) const; + + int64_t size_position() const { return size_position_; } + int32_t blocks_added() const { return blocks_added_; } + uint64_t payload_size() const { return payload_size_; } + int64_t position_for_cues() const { return position_for_cues_; } + uint64_t timecode() const { return timecode_; } + uint64_t timecode_scale() const { return timecode_scale_; } + void set_write_last_frame_with_duration(bool write_last_frame_with_duration) { + write_last_frame_with_duration_ = write_last_frame_with_duration; + } + bool write_last_frame_with_duration() const { + return write_last_frame_with_duration_; + } private: + // Iterator type for the |stored_frames_| map. + typedef std::map<uint64_t, std::list<Frame*> >::iterator FrameMapIterator; + // Utility method that confirms that blocks can still be added, and that the // cluster header has been written. Used by |DoWriteFrame*|. Returns true // when successful. @@ -955,37 +1120,58 @@ class Cluster { // Utility method used by the |DoWriteFrame*| methods that handles the book // keeping required after each block is written. - void PostWriteBlock(uint64 element_size); + void PostWriteBlock(uint64_t element_size); // Does some verification and calls WriteFrame. bool DoWriteFrame(const Frame* const frame); + // Either holds back the given frame, or writes it out depending on whether or + // not |write_last_frame_with_duration_| is set. + bool QueueOrWriteFrame(const Frame* const frame); + // Outputs the Cluster header to |writer_|. Returns true on success. bool WriteClusterHeader(); // Number of blocks added to the cluster. - int32 blocks_added_; + int32_t blocks_added_; // Flag telling if the cluster has been closed. bool finalized_; + // Flag indicating whether the cluster's timecode will always be written out + // using 8 bytes. + bool fixed_size_timecode_; + // Flag telling if the cluster's header has been written. bool header_written_; // The size of the cluster elements in bytes. - uint64 payload_size_; + uint64_t payload_size_; // The file position used for cue points. - const int64 position_for_cues_; + const int64_t position_for_cues_; // The file position of the cluster's size element. - int64 size_position_; + int64_t size_position_; // The absolute timecode of the cluster. - const uint64 timecode_; + const uint64_t timecode_; // The timecode scale of the Segment containing the cluster. - const uint64 timecode_scale_; + const uint64_t timecode_scale_; + + // Flag indicating whether the last frame of the cluster should be written as + // a Block with Duration. If set to true, then it will result in holding back + // of frames and the parameterized version of Finalize() must be called to + // finish writing the Cluster. + bool write_last_frame_with_duration_; + + // Map used to hold back frames, if required. Track number is the key. + std::map<uint64_t, std::list<Frame*> > stored_frames_; + + // Map from track number to the timestamp of the last block written for that + // track. + std::map<uint64_t, uint64_t> last_block_timestamp_; // Pointer to the writer object. Not owned by this class. IMkvWriter* writer_; @@ -1006,42 +1192,42 @@ class SeekHead { // Adds a seek entry to be written out when the element is finalized. |id| // must be the coded mkv element id. |pos| is the file position of the // element. Returns true on success. - bool AddSeekEntry(uint32 id, uint64 pos); + bool AddSeekEntry(uint32_t id, uint64_t pos); // Writes out SeekHead and SeekEntry elements. Returns true on success. bool Finalize(IMkvWriter* writer) const; // Returns the id of the Seek Entry at the given index. Returns -1 if index is // out of range. - uint32 GetId(int index) const; + uint32_t GetId(int index) const; // Returns the position of the Seek Entry at the given index. Returns -1 if // index is out of range. - uint64 GetPosition(int index) const; + uint64_t GetPosition(int index) const; // Sets the Seek Entry id and position at given index. // Returns true on success. - bool SetSeekEntry(int index, uint32 id, uint64 position); + bool SetSeekEntry(int index, uint32_t id, uint64_t position); // Reserves space by writing out a Void element which will be updated with // a SeekHead element later. Returns true on success. bool Write(IMkvWriter* writer); // We are going to put a cap on the number of Seek Entries. - const static int32 kSeekEntryCount = 5; + const static int32_t kSeekEntryCount = 5; private: // Returns the maximum size in bytes of one seek entry. - uint64 MaxEntrySize() const; + uint64_t MaxEntrySize() const; // Seek entry id element list. - uint32 seek_entry_id_[kSeekEntryCount]; + uint32_t seek_entry_id_[kSeekEntryCount]; // Seek entry pos element list. - uint64 seek_entry_pos_[kSeekEntryCount]; + uint64_t seek_entry_pos_[kSeekEntryCount]; // The file position of SeekHead element. - int64 start_pos_; + int64_t start_pos_; LIBWEBM_DISALLOW_COPY_AND_ASSIGN(SeekHead); }; @@ -1067,12 +1253,12 @@ class SegmentInfo { double duration() const { return duration_; } void set_muxing_app(const char* app); const char* muxing_app() const { return muxing_app_; } - void set_timecode_scale(uint64 scale) { timecode_scale_ = scale; } - uint64 timecode_scale() const { return timecode_scale_; } + void set_timecode_scale(uint64_t scale) { timecode_scale_ = scale; } + uint64_t timecode_scale() const { return timecode_scale_; } void set_writing_app(const char* app); const char* writing_app() const { return writing_app_; } - void set_date_utc(int64 date_utc) { date_utc_ = date_utc; } - int64 date_utc() const { return date_utc_; } + void set_date_utc(int64_t date_utc) { date_utc_ = date_utc; } + int64_t date_utc() const { return date_utc_; } private: // Segment Information element names. @@ -1081,14 +1267,14 @@ class SegmentInfo { double duration_; // Set to libwebm-%d.%d.%d.%d, major, minor, build, revision. char* muxing_app_; - uint64 timecode_scale_; + uint64_t timecode_scale_; // Initially set to libwebm-%d.%d.%d.%d, major, minor, build, revision. char* writing_app_; // LLONG_MIN when DateUTC is not set. - int64 date_utc_; + int64_t date_utc_; // The file position of the duration element. - int64 duration_pos_; + int64_t duration_pos_; LIBWEBM_DISALLOW_COPY_AND_ASSIGN(SegmentInfo); }; @@ -1108,8 +1294,8 @@ class Segment { kBeforeClusters = 0x1 // Position Cues before Clusters }; - const static uint32 kDefaultDocTypeVersion = 2; - const static uint64 kDefaultMaxClusterDuration = 30000000000ULL; + const static uint32_t kDefaultDocTypeVersion = 2; + const static uint64_t kDefaultMaxClusterDuration = 30000000000ULL; Segment(); ~Segment(); @@ -1123,13 +1309,13 @@ class Segment { // error. |number| is the number to use for the track. |number| // must be >= 0. If |number| == 0 then the muxer will decide on the // track number. - Track* AddTrack(int32 number); + Track* AddTrack(int32_t number); // Adds a Vorbis audio track to the segment. Returns the number of the track // on success, 0 on error. |number| is the number to use for the audio track. // |number| must be >= 0. If |number| == 0 then the muxer will decide on // the track number. - uint64 AddAudioTrack(int32 sample_rate, int32 channels, int32 number); + uint64_t AddAudioTrack(int32_t sample_rate, int32_t channels, int32_t number); // Adds an empty chapter to the chapters of this segment. Returns // non-NULL on success. After adding the chapter, the caller should @@ -1145,7 +1331,7 @@ class Segment { // nanoseconds of the cue's time. |track| is the Track of the Cue. This // function must be called after AddFrame to calculate the correct // BlockNumber for the CuePoint. Returns true on success. - bool AddCuePoint(uint64 timestamp, uint64 track); + bool AddCuePoint(uint64_t timestamp, uint64_t track); // Adds a frame to be output in the file. Returns true on success. // Inputs: @@ -1155,8 +1341,8 @@ class Segment { // functions. // timestamp: Timestamp of the frame in nanoseconds from 0. // is_key: Flag telling whether or not this frame is a key frame. - bool AddFrame(const uint8* data, uint64 length, uint64 track_number, - uint64 timestamp_ns, bool is_key); + bool AddFrame(const uint8_t* data, uint64_t length, uint64_t track_number, + uint64_t timestamp_ns, bool is_key); // Writes a frame of metadata to the output medium; returns true on // success. @@ -1172,8 +1358,8 @@ class Segment { // The metadata frame is written as a block group, with a duration // sub-element but no reference time sub-elements (indicating that // it is considered a keyframe, per Matroska semantics). - bool AddMetadata(const uint8* data, uint64 length, uint64 track_number, - uint64 timestamp_ns, uint64 duration_ns); + bool AddMetadata(const uint8_t* data, uint64_t length, uint64_t track_number, + uint64_t timestamp_ns, uint64_t duration_ns); // Writes a frame with additional data to the output medium; returns true on // success. @@ -1188,10 +1374,11 @@ class Segment { // timestamp: Absolute timestamp of the frame, expressed in nanosecond // units. // is_key: Flag telling whether or not this frame is a key frame. - bool AddFrameWithAdditional(const uint8* data, uint64 length, - const uint8* additional, uint64 additional_length, - uint64 add_id, uint64 track_number, - uint64 timestamp, bool is_key); + bool AddFrameWithAdditional(const uint8_t* data, uint64_t length, + const uint8_t* additional, + uint64_t additional_length, uint64_t add_id, + uint64_t track_number, uint64_t timestamp, + bool is_key); // Writes a frame with DiscardPadding to the output medium; returns true on // success. @@ -1204,9 +1391,10 @@ class Segment { // timestamp: Absolute timestamp of the frame, expressed in nanosecond // units. // is_key: Flag telling whether or not this frame is a key frame. - bool AddFrameWithDiscardPadding(const uint8* data, uint64 length, - int64 discard_padding, uint64 track_number, - uint64 timestamp, bool is_key); + bool AddFrameWithDiscardPadding(const uint8_t* data, uint64_t length, + int64_t discard_padding, + uint64_t track_number, uint64_t timestamp, + bool is_key); // Writes a Frame to the output medium. Chooses the correct way of writing // the frame (Block vs SimpleBlock) based on the parameters passed. @@ -1218,7 +1406,7 @@ class Segment { // success, 0 on error. |number| is the number to use for the video track. // |number| must be >= 0. If |number| == 0 then the muxer will decide on // the track number. - uint64 AddVideoTrack(int32 width, int32 height, int32 number); + uint64_t AddVideoTrack(int32_t width, int32_t height, int32_t number); // This function must be called after Finalize() if you need a copy of the // output with Cues written before the Clusters. It will return false if the @@ -1237,7 +1425,7 @@ class Segment { // Sets which track to use for the Cues element. Must have added the track // before calling this function. Returns true on success. |track_number| is // returned by the Add track functions. - bool CuesTrack(uint64 track_number); + bool CuesTrack(uint64_t track_number); // This will force the muxer to create a new Cluster when the next frame is // added. @@ -1257,11 +1445,17 @@ class Segment { // Search the Tracks and return the track that matches |track_number|. // Returns NULL if there is no track match. - Track* GetTrackByNumber(uint64 track_number) const; + Track* GetTrackByNumber(uint64_t track_number) const; // Toggles whether to output a cues element. void OutputCues(bool output_cues); + // Toggles whether to write the last frame in each Cluster with Duration. + void AccurateClusterDuration(bool accurate_cluster_duration); + + // Toggles whether to write the Cluster Timecode using exactly 8 bytes. + void UseFixedSizeClusterTimecode(bool fixed_size_cluster_timecode); + // Sets if the muxer will output files in chunks or not. |chunking| is a // flag telling whether or not to turn on chunking. |filename| is the base // filename for the chunk files. The header chunk file will be named @@ -1274,15 +1468,15 @@ class Segment { bool SetChunking(bool chunking, const char* filename); bool chunking() const { return chunking_; } - uint64 cues_track() const { return cues_track_; } - void set_max_cluster_duration(uint64 max_cluster_duration) { + uint64_t cues_track() const { return cues_track_; } + void set_max_cluster_duration(uint64_t max_cluster_duration) { max_cluster_duration_ = max_cluster_duration; } - uint64 max_cluster_duration() const { return max_cluster_duration_; } - void set_max_cluster_size(uint64 max_cluster_size) { + uint64_t max_cluster_duration() const { return max_cluster_duration_; } + void set_max_cluster_size(uint64_t max_cluster_size) { max_cluster_size_ = max_cluster_size; } - uint64 max_cluster_size() const { return max_cluster_size_; } + uint64_t max_cluster_size() const { return max_cluster_size_; } void set_mode(Mode mode) { mode_ = mode; } Mode mode() const { return mode_; } CuesPosition cues_position() const { return cues_position_; } @@ -1306,7 +1500,7 @@ class Segment { // Returns the maximum offset within the segment's payload. When chunking // this function is needed to determine offsets of elements within the // chunked files. Returns -1 on error. - int64 MaxOffset(); + int64_t MaxOffset(); // Adds the frame to our frame array. bool QueueFrame(Frame* frame); @@ -1318,7 +1512,7 @@ class Segment { // Output all frames that are queued that have an end time that is less // then |timestamp|. Returns true on success and if there are no frames // queued. - bool WriteFramesLessThan(uint64 timestamp); + bool WriteFramesLessThan(uint64_t timestamp); // Outputs the segment header, Segment Information element, SeekHead element, // and Tracks element to |writer_|. @@ -1332,16 +1526,17 @@ class Segment { // 0 = do not create a new cluster, and write frame to the existing cluster // 1 = create a new cluster, and write frame to that new cluster // 2 = create a new cluster, and re-run test - int TestFrame(uint64 track_num, uint64 timestamp_ns, bool key) const; + int TestFrame(uint64_t track_num, uint64_t timestamp_ns, bool key) const; // Create a new cluster, using the earlier of the first enqueued // frame, or the indicated time. Returns true on success. - bool MakeNewCluster(uint64 timestamp_ns); + bool MakeNewCluster(uint64_t timestamp_ns); // Checks whether a new cluster needs to be created, and if so // creates a new cluster. Returns false if creation of a new cluster // was necessary but creation was not successful. - bool DoNewClusterProcessing(uint64 track_num, uint64 timestamp_ns, bool key); + bool DoNewClusterProcessing(uint64_t track_num, uint64_t timestamp_ns, + bool key); // Adjusts Cue Point values (to place Cues before Clusters) so that they // reflect the correct offsets. @@ -1355,7 +1550,8 @@ class Segment { // accounted for. // index - index in the list of Cues which is currently being adjusted. // cue_size - sum of size of all the CuePoint elements. - void MoveCuesBeforeClustersHelper(uint64 diff, int index, uint64* cue_size); + void MoveCuesBeforeClustersHelper(uint64_t diff, int index, + uint64_t* cue_size); // Seeds the random number generator used to make UIDs. unsigned int seed_; @@ -1394,22 +1590,22 @@ class Segment { char* chunking_base_name_; // File position offset where the Clusters end. - int64 cluster_end_offset_; + int64_t cluster_end_offset_; // List of clusters. Cluster** cluster_list_; // Number of cluster pointers allocated in the cluster list. - int32 cluster_list_capacity_; + int32_t cluster_list_capacity_; // Number of clusters in the cluster list. - int32 cluster_list_size_; + int32_t cluster_list_size_; // Indicates whether Cues should be written before or after Clusters CuesPosition cues_position_; // Track number that is associated with the cues element for this segment. - uint64 cues_track_; + uint64_t cues_track_; // Tells the muxer to force a new cluster on the next Block. bool force_new_cluster_; @@ -1421,10 +1617,10 @@ class Segment { Frame** frames_; // Number of frame pointers allocated in the frame list. - int32 frames_capacity_; + int32_t frames_capacity_; // Number of frames in the frame list. - int32 frames_size_; + int32_t frames_size_; // Flag telling if a video track has been added to the segment. bool has_video_; @@ -1433,23 +1629,23 @@ class Segment { bool header_written_; // Duration of the last block in nanoseconds. - uint64 last_block_duration_; + uint64_t last_block_duration_; // Last timestamp in nanoseconds added to a cluster. - uint64 last_timestamp_; + uint64_t last_timestamp_; // Last timestamp in nanoseconds by track number added to a cluster. - uint64 last_track_timestamp_[kMaxTrackNumber]; + uint64_t last_track_timestamp_[kMaxTrackNumber]; // Maximum time in nanoseconds for a cluster duration. This variable is a // guideline and some clusters may have a longer duration. Default is 30 // seconds. - uint64 max_cluster_duration_; + uint64_t max_cluster_duration_; // Maximum size in bytes for a cluster. This variable is a guideline and // some clusters may have a larger size. Default is 0 which signifies that // the muxer will decide the size. - uint64 max_cluster_size_; + uint64_t max_cluster_size_; // The mode that segment is in. If set to |kLive| the writer must not // seek backwards. @@ -1462,22 +1658,29 @@ class Segment { // Flag whether or not the muxer should output a Cues element. bool output_cues_; + // Flag whether or not the last frame in each Cluster will have a Duration + // element in it. + bool accurate_cluster_duration_; + + // Flag whether or not to write the Cluster Timecode using exactly 8 bytes. + bool fixed_size_cluster_timecode_; + // The size of the EBML header, used to validate the header if // WriteEbmlHeader() is called more than once. - int32 ebml_header_size_; + int32_t ebml_header_size_; // The file position of the segment's payload. - int64 payload_pos_; + int64_t payload_pos_; // The file position of the element's size. - int64 size_position_; + int64_t size_position_; // Current DocTypeVersion (|doc_type_version_|) and that written in // WriteSegmentHeader(). // WriteEbmlHeader() will be called from Finalize() if |doc_type_version_| // differs from |doc_type_version_written_|. - uint32 doc_type_version_; - uint32 doc_type_version_written_; + uint32_t doc_type_version_; + uint32_t doc_type_version_written_; // Pointer to the writer objects. Not owned by this class. IMkvWriter* writer_cluster_; @@ -1487,6 +1690,6 @@ class Segment { LIBWEBM_DISALLOW_COPY_AND_ASSIGN(Segment); }; -} // end namespace mkvmuxer +} // namespace mkvmuxer -#endif // MKVMUXER_HPP +#endif // MKVMUXER_MKVMUXER_H_ diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxertypes.hpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxertypes.h index d0fc9fec881..e5db121605f 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxertypes.hpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxertypes.h @@ -6,25 +6,23 @@ // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. -#ifndef MKVMUXERTYPES_HPP -#define MKVMUXERTYPES_HPP - -// Copied from Chromium basictypes.h -// A macro to disallow the copy constructor and operator= functions -// This should be used in the private: declarations for a class -#define LIBWEBM_DISALLOW_COPY_AND_ASSIGN(TypeName) \ - TypeName(const TypeName&); \ - void operator=(const TypeName&) +#ifndef MKVMUXER_MKVMUXERTYPES_H_ +#define MKVMUXER_MKVMUXERTYPES_H_ namespace mkvmuxer { - typedef unsigned char uint8; typedef short int16; typedef int int32; typedef unsigned int uint32; typedef long long int64; typedef unsigned long long uint64; +} // namespace mkvmuxer -} // end namespace mkvmuxer +// Copied from Chromium basictypes.h +// A macro to disallow the copy constructor and operator= functions +// This should be used in the private: declarations for a class +#define LIBWEBM_DISALLOW_COPY_AND_ASSIGN(TypeName) \ + TypeName(const TypeName&); \ + void operator=(const TypeName&) -#endif // MKVMUXERTYPES_HPP +#endif // MKVMUXER_MKVMUXERTYPES_HPP_ diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxerutil.cpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxerutil.cc index 27ab15d51f1..3562b8ab828 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxerutil.cpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxerutil.cc @@ -6,7 +6,7 @@ // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. -#include "mkvmuxerutil.hpp" +#include "mkvmuxer/mkvmuxerutil.h" #ifdef __ANDROID__ #include <fcntl.h> @@ -20,13 +20,9 @@ #include <ctime> #include <new> -#include "mkvwriter.hpp" -#include "webmids.hpp" - -#ifdef _MSC_VER -// Disable MSVC warnings that suggest making code non-portable. -#pragma warning(disable : 4996) -#endif +#include "common/webmids.h" +#include "mkvmuxer/mkvmuxer.h" +#include "mkvmuxer/mkvwriter.h" namespace mkvmuxer { @@ -35,64 +31,68 @@ namespace { // Date elements are always 8 octets in size. const int kDateElementSize = 8; -uint64 WriteBlock(IMkvWriter* writer, const Frame* const frame, int64 timecode, - uint64 timecode_scale) { - uint64 block_additional_elem_size = 0; - uint64 block_addid_elem_size = 0; - uint64 block_more_payload_size = 0; - uint64 block_more_elem_size = 0; - uint64 block_additions_payload_size = 0; - uint64 block_additions_elem_size = 0; +uint64_t WriteBlock(IMkvWriter* writer, const Frame* const frame, + int64_t timecode, uint64_t timecode_scale) { + uint64_t block_additional_elem_size = 0; + uint64_t block_addid_elem_size = 0; + uint64_t block_more_payload_size = 0; + uint64_t block_more_elem_size = 0; + uint64_t block_additions_payload_size = 0; + uint64_t block_additions_elem_size = 0; if (frame->additional()) { - block_additional_elem_size = EbmlElementSize( - kMkvBlockAdditional, frame->additional(), frame->additional_length()); - block_addid_elem_size = EbmlElementSize(kMkvBlockAddID, frame->add_id()); + block_additional_elem_size = + EbmlElementSize(libwebm::kMkvBlockAdditional, frame->additional(), + frame->additional_length()); + block_addid_elem_size = + EbmlElementSize(libwebm::kMkvBlockAddID, frame->add_id()); block_more_payload_size = block_addid_elem_size + block_additional_elem_size; block_more_elem_size = - EbmlMasterElementSize(kMkvBlockMore, block_more_payload_size) + + EbmlMasterElementSize(libwebm::kMkvBlockMore, block_more_payload_size) + block_more_payload_size; block_additions_payload_size = block_more_elem_size; block_additions_elem_size = - EbmlMasterElementSize(kMkvBlockAdditions, + EbmlMasterElementSize(libwebm::kMkvBlockAdditions, block_additions_payload_size) + block_additions_payload_size; } - uint64 discard_padding_elem_size = 0; + uint64_t discard_padding_elem_size = 0; if (frame->discard_padding() != 0) { discard_padding_elem_size = - EbmlElementSize(kMkvDiscardPadding, frame->discard_padding()); + EbmlElementSize(libwebm::kMkvDiscardPadding, frame->discard_padding()); } - const uint64 reference_block_timestamp = + const uint64_t reference_block_timestamp = frame->reference_block_timestamp() / timecode_scale; - uint64 reference_block_elem_size = 0; + uint64_t reference_block_elem_size = 0; if (!frame->is_key()) { reference_block_elem_size = - EbmlElementSize(kMkvReferenceBlock, reference_block_timestamp); + EbmlElementSize(libwebm::kMkvReferenceBlock, reference_block_timestamp); } - const uint64 duration = frame->duration() / timecode_scale; - uint64 block_duration_elem_size = 0; + const uint64_t duration = frame->duration() / timecode_scale; + uint64_t block_duration_elem_size = 0; if (duration > 0) - block_duration_elem_size = EbmlElementSize(kMkvBlockDuration, duration); + block_duration_elem_size = + EbmlElementSize(libwebm::kMkvBlockDuration, duration); - const uint64 block_payload_size = 4 + frame->length(); - const uint64 block_elem_size = - EbmlMasterElementSize(kMkvBlock, block_payload_size) + block_payload_size; + const uint64_t block_payload_size = 4 + frame->length(); + const uint64_t block_elem_size = + EbmlMasterElementSize(libwebm::kMkvBlock, block_payload_size) + + block_payload_size; - const uint64 block_group_payload_size = + const uint64_t block_group_payload_size = block_elem_size + block_additions_elem_size + block_duration_elem_size + discard_padding_elem_size + reference_block_elem_size; - if (!WriteEbmlMasterElement(writer, kMkvBlockGroup, + if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockGroup, block_group_payload_size)) { return 0; } - if (!WriteEbmlMasterElement(writer, kMkvBlock, block_payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlock, block_payload_size)) return 0; if (WriteUInt(writer, frame->track_number())) @@ -105,77 +105,81 @@ uint64 WriteBlock(IMkvWriter* writer, const Frame* const frame, int64 timecode, if (SerializeInt(writer, 0, 1)) return 0; - if (writer->Write(frame->frame(), static_cast<uint32>(frame->length()))) + if (writer->Write(frame->frame(), static_cast<uint32_t>(frame->length()))) return 0; if (frame->additional()) { - if (!WriteEbmlMasterElement(writer, kMkvBlockAdditions, + if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockAdditions, block_additions_payload_size)) { return 0; } - if (!WriteEbmlMasterElement(writer, kMkvBlockMore, block_more_payload_size)) + if (!WriteEbmlMasterElement(writer, libwebm::kMkvBlockMore, + block_more_payload_size)) return 0; - if (!WriteEbmlElement(writer, kMkvBlockAddID, frame->add_id())) + if (!WriteEbmlElement(writer, libwebm::kMkvBlockAddID, frame->add_id())) return 0; - if (!WriteEbmlElement(writer, kMkvBlockAdditional, frame->additional(), - frame->additional_length())) { + if (!WriteEbmlElement(writer, libwebm::kMkvBlockAdditional, + frame->additional(), frame->additional_length())) { return 0; } } if (frame->discard_padding() != 0 && - !WriteEbmlElement(writer, kMkvDiscardPadding, frame->discard_padding())) { + !WriteEbmlElement(writer, libwebm::kMkvDiscardPadding, + frame->discard_padding())) { return false; } if (!frame->is_key() && - !WriteEbmlElement(writer, kMkvReferenceBlock, + !WriteEbmlElement(writer, libwebm::kMkvReferenceBlock, reference_block_timestamp)) { return false; } - if (duration > 0 && !WriteEbmlElement(writer, kMkvBlockDuration, duration)) { + if (duration > 0 && + !WriteEbmlElement(writer, libwebm::kMkvBlockDuration, duration)) { return false; } - return EbmlMasterElementSize(kMkvBlockGroup, block_group_payload_size) + + return EbmlMasterElementSize(libwebm::kMkvBlockGroup, + block_group_payload_size) + block_group_payload_size; } -uint64 WriteSimpleBlock(IMkvWriter* writer, const Frame* const frame, - int64 timecode) { - if (WriteID(writer, kMkvSimpleBlock)) +uint64_t WriteSimpleBlock(IMkvWriter* writer, const Frame* const frame, + int64_t timecode) { + if (WriteID(writer, libwebm::kMkvSimpleBlock)) return 0; - const int32 size = static_cast<int32>(frame->length()) + 4; + const int32_t size = static_cast<int32_t>(frame->length()) + 4; if (WriteUInt(writer, size)) return 0; - if (WriteUInt(writer, static_cast<uint64>(frame->track_number()))) + if (WriteUInt(writer, static_cast<uint64_t>(frame->track_number()))) return 0; if (SerializeInt(writer, timecode, 2)) return 0; - uint64 flags = 0; + uint64_t flags = 0; if (frame->is_key()) flags |= 0x80; if (SerializeInt(writer, flags, 1)) return 0; - if (writer->Write(frame->frame(), static_cast<uint32>(frame->length()))) + if (writer->Write(frame->frame(), static_cast<uint32_t>(frame->length()))) return 0; - return GetUIntSize(kMkvSimpleBlock) + GetCodedUIntSize(size) + 4 + - frame->length(); + return static_cast<uint64_t>(GetUIntSize(libwebm::kMkvSimpleBlock) + + GetCodedUIntSize(size) + 4 + frame->length()); } } // namespace -int32 GetCodedUIntSize(uint64 value) { +int32_t GetCodedUIntSize(uint64_t value) { if (value < 0x000000000000007FULL) return 1; else if (value < 0x0000000000003FFFULL) @@ -193,7 +197,7 @@ int32 GetCodedUIntSize(uint64 value) { return 8; } -int32 GetUIntSize(uint64 value) { +int32_t GetUIntSize(uint64_t value) { if (value < 0x0000000000000100ULL) return 1; else if (value < 0x0000000000010000ULL) @@ -211,26 +215,26 @@ int32 GetUIntSize(uint64 value) { return 8; } -int32 GetIntSize(int64 value) { +int32_t GetIntSize(int64_t value) { // Doubling the requested value ensures positive values with their high bit // set are written with 0-padding to avoid flipping the signedness. - const uint64 v = (value < 0) ? value ^ -1LL : value; + const uint64_t v = (value < 0) ? value ^ -1LL : value; return GetUIntSize(2 * v); } -uint64 EbmlMasterElementSize(uint64 type, uint64 value) { +uint64_t EbmlMasterElementSize(uint64_t type, uint64_t value) { // Size of EBML ID - int32 ebml_size = GetUIntSize(type); + int32_t ebml_size = GetUIntSize(type); // Datasize ebml_size += GetCodedUIntSize(value); - return ebml_size; + return static_cast<uint64_t>(ebml_size); } -uint64 EbmlElementSize(uint64 type, int64 value) { +uint64_t EbmlElementSize(uint64_t type, int64_t value) { // Size of EBML ID - int32 ebml_size = GetUIntSize(type); + int32_t ebml_size = GetUIntSize(type); // Datasize ebml_size += GetIntSize(value); @@ -238,15 +242,20 @@ uint64 EbmlElementSize(uint64 type, int64 value) { // Size of Datasize ebml_size++; - return ebml_size; + return static_cast<uint64_t>(ebml_size); +} + +uint64_t EbmlElementSize(uint64_t type, uint64_t value) { + return EbmlElementSize(type, value, 0); } -uint64 EbmlElementSize(uint64 type, uint64 value) { +uint64_t EbmlElementSize(uint64_t type, uint64_t value, uint64_t fixed_size) { // Size of EBML ID - int32 ebml_size = GetUIntSize(type); + uint64_t ebml_size = static_cast<uint64_t>(GetUIntSize(type)); // Datasize - ebml_size += GetUIntSize(value); + ebml_size += + (fixed_size > 0) ? fixed_size : static_cast<uint64_t>(GetUIntSize(value)); // Size of Datasize ebml_size++; @@ -254,9 +263,9 @@ uint64 EbmlElementSize(uint64 type, uint64 value) { return ebml_size; } -uint64 EbmlElementSize(uint64 type, float /* value */) { +uint64_t EbmlElementSize(uint64_t type, float /* value */) { // Size of EBML ID - uint64 ebml_size = GetUIntSize(type); + uint64_t ebml_size = static_cast<uint64_t>(GetUIntSize(type)); // Datasize ebml_size += sizeof(float); @@ -267,12 +276,12 @@ uint64 EbmlElementSize(uint64 type, float /* value */) { return ebml_size; } -uint64 EbmlElementSize(uint64 type, const char* value) { +uint64_t EbmlElementSize(uint64_t type, const char* value) { if (!value) return 0; // Size of EBML ID - uint64 ebml_size = GetUIntSize(type); + uint64_t ebml_size = static_cast<uint64_t>(GetUIntSize(type)); // Datasize ebml_size += strlen(value); @@ -283,12 +292,12 @@ uint64 EbmlElementSize(uint64 type, const char* value) { return ebml_size; } -uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size) { +uint64_t EbmlElementSize(uint64_t type, const uint8_t* value, uint64_t size) { if (!value) return 0; // Size of EBML ID - uint64 ebml_size = GetUIntSize(type); + uint64_t ebml_size = static_cast<uint64_t>(GetUIntSize(type)); // Datasize ebml_size += size; @@ -299,9 +308,9 @@ uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size) { return ebml_size; } -uint64 EbmlDateElementSize(uint64 type) { +uint64_t EbmlDateElementSize(uint64_t type) { // Size of EBML ID - uint64 ebml_size = GetUIntSize(type); + uint64_t ebml_size = static_cast<uint64_t>(GetUIntSize(type)); // Datasize ebml_size += kDateElementSize; @@ -312,18 +321,18 @@ uint64 EbmlDateElementSize(uint64 type) { return ebml_size; } -int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size) { +int32_t SerializeInt(IMkvWriter* writer, int64_t value, int32_t size) { if (!writer || size < 1 || size > 8) return -1; - for (int32 i = 1; i <= size; ++i) { - const int32 byte_count = size - i; - const int32 bit_count = byte_count * 8; + for (int32_t i = 1; i <= size; ++i) { + const int32_t byte_count = size - i; + const int32_t bit_count = byte_count * 8; - const int64 bb = value >> bit_count; - const uint8 b = static_cast<uint8>(bb); + const int64_t bb = value >> bit_count; + const uint8_t b = static_cast<uint8_t>(bb); - const int32 status = writer->Write(&b, 1); + const int32_t status = writer->Write(&b, 1); if (status < 0) return status; @@ -332,26 +341,26 @@ int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size) { return 0; } -int32 SerializeFloat(IMkvWriter* writer, float f) { +int32_t SerializeFloat(IMkvWriter* writer, float f) { if (!writer) return -1; - assert(sizeof(uint32) == sizeof(float)); + assert(sizeof(uint32_t) == sizeof(float)); // This union is merely used to avoid a reinterpret_cast from float& to // uint32& which will result in violation of strict aliasing. union U32 { - uint32 u32; + uint32_t u32; float f; } value; value.f = f; - for (int32 i = 1; i <= 4; ++i) { - const int32 byte_count = 4 - i; - const int32 bit_count = byte_count * 8; + for (int32_t i = 1; i <= 4; ++i) { + const int32_t byte_count = 4 - i; + const int32_t bit_count = byte_count * 8; - const uint8 byte = static_cast<uint8>(value.u32 >> bit_count); + const uint8_t byte = static_cast<uint8_t>(value.u32 >> bit_count); - const int32 status = writer->Write(&byte, 1); + const int32_t status = writer->Write(&byte, 1); if (status < 0) return status; @@ -360,21 +369,21 @@ int32 SerializeFloat(IMkvWriter* writer, float f) { return 0; } -int32 WriteUInt(IMkvWriter* writer, uint64 value) { +int32_t WriteUInt(IMkvWriter* writer, uint64_t value) { if (!writer) return -1; - int32 size = GetCodedUIntSize(value); + int32_t size = GetCodedUIntSize(value); return WriteUIntSize(writer, value, size); } -int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size) { +int32_t WriteUIntSize(IMkvWriter* writer, uint64_t value, int32_t size) { if (!writer || size < 0 || size > 8) return -1; if (size > 0) { - const uint64 bit = 1LL << (size * 7); + const uint64_t bit = 1LL << (size * 7); if (value > (bit - 2)) return -1; @@ -382,11 +391,11 @@ int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size) { value |= bit; } else { size = 1; - int64 bit; + int64_t bit; for (;;) { bit = 1LL << (size * 7); - const uint64 max = bit - 2; + const uint64_t max = bit - 2; if (value <= max) break; @@ -403,18 +412,18 @@ int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size) { return SerializeInt(writer, value, size); } -int32 WriteID(IMkvWriter* writer, uint64 type) { +int32_t WriteID(IMkvWriter* writer, uint64_t type) { if (!writer) return -1; writer->ElementStartNotify(type, writer->Position()); - const int32 size = GetUIntSize(type); + const int32_t size = GetUIntSize(type); return SerializeInt(writer, type, size); } -bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 type, uint64 size) { +bool WriteEbmlMasterElement(IMkvWriter* writer, uint64_t type, uint64_t size) { if (!writer) return false; @@ -427,41 +436,51 @@ bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 type, uint64 size) { return true; } -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value) { +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, uint64_t value) { + return WriteEbmlElement(writer, type, value, 0); +} + +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, uint64_t value, + uint64_t fixed_size) { if (!writer) return false; if (WriteID(writer, type)) return false; - const uint64 size = GetUIntSize(value); + uint64_t size = static_cast<uint64_t>(GetUIntSize(value)); + if (fixed_size > 0) { + if (size > fixed_size) + return false; + size = fixed_size; + } if (WriteUInt(writer, size)) return false; - if (SerializeInt(writer, value, static_cast<int32>(size))) + if (SerializeInt(writer, value, static_cast<int32_t>(size))) return false; return true; } -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, int64 value) { +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, int64_t value) { if (!writer) return false; if (WriteID(writer, type)) return 0; - const uint64 size = GetIntSize(value); + const uint64_t size = GetIntSize(value); if (WriteUInt(writer, size)) return false; - if (SerializeInt(writer, value, static_cast<int32>(size))) + if (SerializeInt(writer, value, static_cast<int32_t>(size))) return false; return true; } -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value) { +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, float value) { if (!writer) return false; @@ -477,25 +496,25 @@ bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value) { return true; } -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value) { +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, const char* value) { if (!writer || !value) return false; if (WriteID(writer, type)) return false; - const uint64 length = strlen(value); + const uint64_t length = strlen(value); if (WriteUInt(writer, length)) return false; - if (writer->Write(value, static_cast<const uint32>(length))) + if (writer->Write(value, static_cast<const uint32_t>(length))) return false; return true; } -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value, - uint64 size) { +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, const uint8_t* value, + uint64_t size) { if (!writer || !value || size < 1) return false; @@ -505,13 +524,13 @@ bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value, if (WriteUInt(writer, size)) return false; - if (writer->Write(value, static_cast<uint32>(size))) + if (writer->Write(value, static_cast<uint32_t>(size))) return false; return true; } -bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value) { +bool WriteEbmlDateElement(IMkvWriter* writer, uint64_t type, int64_t value) { if (!writer) return false; @@ -527,8 +546,8 @@ bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value) { return true; } -uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame, - Cluster* cluster) { +uint64_t WriteFrame(IMkvWriter* writer, const Frame* const frame, + Cluster* cluster) { if (!writer || !frame || !frame->IsValid() || !cluster || !cluster->timecode_scale()) return 0; @@ -537,7 +556,7 @@ uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame, // timecode for the cluster itself (remember that block timecode // is a signed, 16-bit integer). However, as a simplification we // only permit non-negative cluster-relative timecodes for blocks. - const int64 relative_timecode = cluster->GetRelativeTimecode( + const int64_t relative_timecode = cluster->GetRelativeTimecode( frame->timestamp() / cluster->timecode_scale()); if (relative_timecode < 0 || relative_timecode > kMaxBlockTimecode) return 0; @@ -548,53 +567,53 @@ uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame, cluster->timecode_scale()); } -uint64 WriteVoidElement(IMkvWriter* writer, uint64 size) { +uint64_t WriteVoidElement(IMkvWriter* writer, uint64_t size) { if (!writer) return false; // Subtract one for the void ID and the coded size. - uint64 void_entry_size = size - 1 - GetCodedUIntSize(size - 1); - uint64 void_size = - EbmlMasterElementSize(kMkvVoid, void_entry_size) + void_entry_size; + uint64_t void_entry_size = size - 1 - GetCodedUIntSize(size - 1); + uint64_t void_size = + EbmlMasterElementSize(libwebm::kMkvVoid, void_entry_size) + + void_entry_size; if (void_size != size) return 0; - const int64 payload_position = writer->Position(); + const int64_t payload_position = writer->Position(); if (payload_position < 0) return 0; - if (WriteID(writer, kMkvVoid)) + if (WriteID(writer, libwebm::kMkvVoid)) return 0; if (WriteUInt(writer, void_entry_size)) return 0; - const uint8 value = 0; - for (int32 i = 0; i < static_cast<int32>(void_entry_size); ++i) { + const uint8_t value = 0; + for (int32_t i = 0; i < static_cast<int32_t>(void_entry_size); ++i) { if (writer->Write(&value, 1)) return 0; } - const int64 stop_position = writer->Position(); + const int64_t stop_position = writer->Position(); if (stop_position < 0 || - stop_position - payload_position != static_cast<int64>(void_size)) + stop_position - payload_position != static_cast<int64_t>(void_size)) return 0; return void_size; } -void GetVersion(int32* major, int32* minor, int32* build, int32* revision) { +void GetVersion(int32_t* major, int32_t* minor, int32_t* build, + int32_t* revision) { *major = 0; *minor = 2; *build = 1; *revision = 0; } -} // namespace mkvmuxer - -mkvmuxer::uint64 mkvmuxer::MakeUID(unsigned int* seed) { - uint64 uid = 0; +uint64_t MakeUID(unsigned int* seed) { + uint64_t uid = 0; #ifdef __MINGW32__ srand(*seed); @@ -606,24 +625,26 @@ mkvmuxer::uint64 mkvmuxer::MakeUID(unsigned int* seed) { // TODO(fgalligan): Move random number generation to platform specific code. #ifdef _MSC_VER (void)seed; - const int32 nn = rand(); + const int32_t nn = rand(); #elif __ANDROID__ - int32 temp_num = 1; + int32_t temp_num = 1; int fd = open("/dev/urandom", O_RDONLY); if (fd != -1) { - read(fd, &temp_num, sizeof(int32)); + read(fd, &temp_num, sizeof(temp_num)); close(fd); } - const int32 nn = temp_num; + const int32_t nn = temp_num; #elif defined __MINGW32__ - const int32 nn = rand(); + const int32_t nn = rand(); #else - const int32 nn = rand_r(seed); + const int32_t nn = rand_r(seed); #endif - const int32 n = 0xFF & (nn >> 4); // throw away low-order bits + const int32_t n = 0xFF & (nn >> 4); // throw away low-order bits uid |= n; } return uid; } + +} // namespace mkvmuxer diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxerutil.h b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxerutil.h new file mode 100644 index 00000000000..0e21a2dcbe5 --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvmuxerutil.h @@ -0,0 +1,95 @@ +// Copyright (c) 2012 The WebM project authors. All Rights Reserved. +// +// Use of this source code is governed by a BSD-style license +// that can be found in the LICENSE file in the root of the source +// tree. An additional intellectual property rights grant can be found +// in the file PATENTS. All contributing project authors may +// be found in the AUTHORS file in the root of the source tree. +#ifndef MKVMUXER_MKVMUXERUTIL_H_ +#define MKVMUXER_MKVMUXERUTIL_H_ + +#include <stdint.h> + +namespace mkvmuxer { +class Cluster; +class Frame; +class IMkvWriter; + +const uint64_t kEbmlUnknownValue = 0x01FFFFFFFFFFFFFFULL; +const int64_t kMaxBlockTimecode = 0x07FFFLL; + +// Writes out |value| in Big Endian order. Returns 0 on success. +int32_t SerializeInt(IMkvWriter* writer, int64_t value, int32_t size); + +// Returns the size in bytes of the element. +int32_t GetUIntSize(uint64_t value); +int32_t GetIntSize(int64_t value); +int32_t GetCodedUIntSize(uint64_t value); +uint64_t EbmlMasterElementSize(uint64_t type, uint64_t value); +uint64_t EbmlElementSize(uint64_t type, int64_t value); +uint64_t EbmlElementSize(uint64_t type, uint64_t value); +uint64_t EbmlElementSize(uint64_t type, float value); +uint64_t EbmlElementSize(uint64_t type, const char* value); +uint64_t EbmlElementSize(uint64_t type, const uint8_t* value, uint64_t size); +uint64_t EbmlDateElementSize(uint64_t type); + +// Returns the size in bytes of the element assuming that the element was +// written using |fixed_size| bytes. If |fixed_size| is set to zero, then it +// computes the necessary number of bytes based on |value|. +uint64_t EbmlElementSize(uint64_t type, uint64_t value, uint64_t fixed_size); + +// Creates an EBML coded number from |value| and writes it out. The size of +// the coded number is determined by the value of |value|. |value| must not +// be in a coded form. Returns 0 on success. +int32_t WriteUInt(IMkvWriter* writer, uint64_t value); + +// Creates an EBML coded number from |value| and writes it out. The size of +// the coded number is determined by the value of |size|. |value| must not +// be in a coded form. Returns 0 on success. +int32_t WriteUIntSize(IMkvWriter* writer, uint64_t value, int32_t size); + +// Output an Mkv master element. Returns true if the element was written. +bool WriteEbmlMasterElement(IMkvWriter* writer, uint64_t value, uint64_t size); + +// Outputs an Mkv ID, calls |IMkvWriter::ElementStartNotify|, and passes the +// ID to |SerializeInt|. Returns 0 on success. +int32_t WriteID(IMkvWriter* writer, uint64_t type); + +// Output an Mkv non-master element. Returns true if the element was written. +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, uint64_t value); +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, int64_t value); +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, float value); +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, const char* value); +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, const uint8_t* value, + uint64_t size); +bool WriteEbmlDateElement(IMkvWriter* writer, uint64_t type, int64_t value); + +// Output an Mkv non-master element using fixed size. The element will be +// written out using exactly |fixed_size| bytes. If |fixed_size| is set to zero +// then it computes the necessary number of bytes based on |value|. Returns true +// if the element was written. +bool WriteEbmlElement(IMkvWriter* writer, uint64_t type, uint64_t value, + uint64_t fixed_size); + +// Output a Mkv Frame. It decides the correct element to write (Block vs +// SimpleBlock) based on the parameters of the Frame. +uint64_t WriteFrame(IMkvWriter* writer, const Frame* const frame, + Cluster* cluster); + +// Output a void element. |size| must be the entire size in bytes that will be +// void. The function will calculate the size of the void header and subtract +// it from |size|. +uint64_t WriteVoidElement(IMkvWriter* writer, uint64_t size); + +// Returns the version number of the muxer in |major|, |minor|, |build|, +// and |revision|. +void GetVersion(int32_t* major, int32_t* minor, int32_t* build, + int32_t* revision); + +// Returns a random number to be used for UID, using |seed| to seed +// the random-number generator (see POSIX rand_r() for semantics). +uint64_t MakeUID(unsigned int* seed); + +} // namespace mkvmuxer + +#endif // MKVMUXER_MKVMUXERUTIL_H_ diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvwriter.cpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvwriter.cc index 75d4350c708..ca48e149c6d 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvwriter.cpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvwriter.cc @@ -6,14 +6,12 @@ // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. -#include "mkvwriter.hpp" +#include "mkvmuxer/mkvwriter.h" #ifdef _MSC_VER #include <share.h> // for _SH_DENYWR #endif -#include <new> - namespace mkvmuxer { MkvWriter::MkvWriter() : file_(NULL), writer_owns_file_(true) {} diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvwriter.hpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvwriter.h index 684560c92d9..4227c63748a 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvwriter.hpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxer/mkvwriter.h @@ -6,13 +6,13 @@ // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. -#ifndef MKVWRITER_HPP -#define MKVWRITER_HPP +#ifndef MKVMUXER_MKVWRITER_H_ +#define MKVMUXER_MKVWRITER_H_ #include <stdio.h> -#include "mkvmuxer.hpp" -#include "mkvmuxertypes.hpp" +#include "mkvmuxer/mkvmuxer.h" +#include "mkvmuxer/mkvmuxertypes.h" namespace mkvmuxer { @@ -46,6 +46,6 @@ class MkvWriter : public IMkvWriter { LIBWEBM_DISALLOW_COPY_AND_ASSIGN(MkvWriter); }; -} // end namespace mkvmuxer +} // namespace mkvmuxer -#endif // MKVWRITER_HPP +#endif // MKVMUXER_MKVWRITER_H_ diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxerutil.hpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxerutil.hpp deleted file mode 100644 index e3185769429..00000000000 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvmuxerutil.hpp +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) 2012 The WebM project authors. All Rights Reserved. -// -// Use of this source code is governed by a BSD-style license -// that can be found in the LICENSE file in the root of the source -// tree. An additional intellectual property rights grant can be found -// in the file PATENTS. All contributing project authors may -// be found in the AUTHORS file in the root of the source tree. - -#ifndef MKVMUXERUTIL_HPP -#define MKVMUXERUTIL_HPP - -#include "mkvmuxer.hpp" -#include "mkvmuxertypes.hpp" - -namespace mkvmuxer { - -class IMkvWriter; - -const uint64 kEbmlUnknownValue = 0x01FFFFFFFFFFFFFFULL; -const int64 kMaxBlockTimecode = 0x07FFFLL; - -// Writes out |value| in Big Endian order. Returns 0 on success. -int32 SerializeInt(IMkvWriter* writer, int64 value, int32 size); - -// Returns the size in bytes of the element. -int32 GetUIntSize(uint64 value); -int32 GetIntSize(int64 value); -int32 GetCodedUIntSize(uint64 value); -uint64 EbmlMasterElementSize(uint64 type, uint64 value); -uint64 EbmlElementSize(uint64 type, int64 value); -uint64 EbmlElementSize(uint64 type, uint64 value); -uint64 EbmlElementSize(uint64 type, float value); -uint64 EbmlElementSize(uint64 type, const char* value); -uint64 EbmlElementSize(uint64 type, const uint8* value, uint64 size); -uint64 EbmlDateElementSize(uint64 type); - -// Creates an EBML coded number from |value| and writes it out. The size of -// the coded number is determined by the value of |value|. |value| must not -// be in a coded form. Returns 0 on success. -int32 WriteUInt(IMkvWriter* writer, uint64 value); - -// Creates an EBML coded number from |value| and writes it out. The size of -// the coded number is determined by the value of |size|. |value| must not -// be in a coded form. Returns 0 on success. -int32 WriteUIntSize(IMkvWriter* writer, uint64 value, int32 size); - -// Output an Mkv master element. Returns true if the element was written. -bool WriteEbmlMasterElement(IMkvWriter* writer, uint64 value, uint64 size); - -// Outputs an Mkv ID, calls |IMkvWriter::ElementStartNotify|, and passes the -// ID to |SerializeInt|. Returns 0 on success. -int32 WriteID(IMkvWriter* writer, uint64 type); - -// Output an Mkv non-master element. Returns true if the element was written. -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, uint64 value); -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, int64 value); -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, float value); -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const char* value); -bool WriteEbmlElement(IMkvWriter* writer, uint64 type, const uint8* value, - uint64 size); -bool WriteEbmlDateElement(IMkvWriter* writer, uint64 type, int64 value); - -// Output a Mkv Frame. It decides the correct element to write (Block vs -// SimpleBlock) based on the parameters of the Frame. -uint64 WriteFrame(IMkvWriter* writer, const Frame* const frame, - Cluster* cluster); - -// Output a void element. |size| must be the entire size in bytes that will be -// void. The function will calculate the size of the void header and subtract -// it from |size|. -uint64 WriteVoidElement(IMkvWriter* writer, uint64 size); - -// Returns the version number of the muxer in |major|, |minor|, |build|, -// and |revision|. -void GetVersion(int32* major, int32* minor, int32* build, int32* revision); - -// Returns a random number to be used for UID, using |seed| to seed -// the random-number generator (see POSIX rand_r() for semantics). -uint64 MakeUID(unsigned int* seed); - -} // end namespace mkvmuxer - -#endif // MKVMUXERUTIL_HPP diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser.cpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser/mkvparser.cc index f2855d50661..21801154d9f 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser.cpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser/mkvparser.cc @@ -5,8 +5,7 @@ // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. - -#include "mkvparser.hpp" +#include "mkvparser/mkvparser.h" #if defined(_MSC_VER) && _MSC_VER < 1800 #include <float.h> // _isnan() / _finite() @@ -14,19 +13,18 @@ #endif #include <cassert> +#include <cfloat> #include <climits> #include <cmath> #include <cstring> +#include <memory> #include <new> -#include "webmids.hpp" - -#ifdef _MSC_VER -// Disable MSVC warnings that suggest making code non-portable. -#pragma warning(disable : 4996) -#endif +#include "common/webmids.h" namespace mkvparser { +const float MasteringMetadata::kValueNotPresent = FLT_MAX; +const long long Colour::kValueNotPresent = LLONG_MAX; #ifdef MSC_COMPAT inline bool isnan(double val) { return !!_isnan(val); } @@ -38,8 +36,9 @@ inline bool isinf(double val) { return std::isinf(val); } IMkvReader::~IMkvReader() {} -template<typename Type> Type* SafeArrayAlloc(unsigned long long num_elements, - unsigned long long element_size) { +template <typename Type> +Type* SafeArrayAlloc(unsigned long long num_elements, + unsigned long long element_size) { if (num_elements == 0 || element_size == 0) return NULL; @@ -350,9 +349,8 @@ long UnserializeString(IMkvReader* pReader, long long pos, long long size, return 0; } -long ParseElementHeader(IMkvReader* pReader, long long& pos, - long long stop, long long& id, - long long& size) { +long ParseElementHeader(IMkvReader* pReader, long long& pos, long long stop, + long long& id, long long& size) { if (stop >= 0 && pos >= stop) return E_FILE_FORMAT_INVALID; @@ -386,7 +384,7 @@ long ParseElementHeader(IMkvReader* pReader, long long& pos, // pos now designates payload - if (stop >= 0 && pos >= stop) + if (stop >= 0 && pos > stop) return E_FILE_FORMAT_INVALID; return 0; // success @@ -520,7 +518,6 @@ long long EBMLHeader::Parse(IMkvReader* pReader, long long& pos) { return status; pos = 0; - long long end = (available >= 1024) ? 1024 : available; // Scan until we find what looks like the first byte of the EBML header. const long long kMaxScanBytes = (available >= 1024) ? 1024 : available; @@ -544,8 +541,10 @@ long long EBMLHeader::Parse(IMkvReader* pReader, long long& pos) { long len = 0; const long long ebml_id = ReadID(pReader, pos, len); - // TODO(tomfinegan): Move Matroska ID constants into a common namespace. - if (len != 4 || ebml_id != mkvmuxer::kMkvEBML) + if (ebml_id == E_BUFFER_NOT_FULL) + return E_BUFFER_NOT_FULL; + + if (len != 4 || ebml_id != libwebm::kMkvEBML) return E_FILE_FORMAT_INVALID; // Move read pos forward to the EBML header size field. @@ -584,7 +583,7 @@ long long EBMLHeader::Parse(IMkvReader* pReader, long long& pos) { if ((available - pos) < result) return pos + result; - end = pos + result; + const long long end = pos + result; Init(); @@ -599,27 +598,27 @@ long long EBMLHeader::Parse(IMkvReader* pReader, long long& pos) { if (size == 0) return E_FILE_FORMAT_INVALID; - if (id == mkvmuxer::kMkvEBMLVersion) { + if (id == libwebm::kMkvEBMLVersion) { m_version = UnserializeUInt(pReader, pos, size); if (m_version <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvEBMLReadVersion) { + } else if (id == libwebm::kMkvEBMLReadVersion) { m_readVersion = UnserializeUInt(pReader, pos, size); if (m_readVersion <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvEBMLMaxIDLength) { + } else if (id == libwebm::kMkvEBMLMaxIDLength) { m_maxIdLength = UnserializeUInt(pReader, pos, size); if (m_maxIdLength <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvEBMLMaxSizeLength) { + } else if (id == libwebm::kMkvEBMLMaxSizeLength) { m_maxSizeLength = UnserializeUInt(pReader, pos, size); if (m_maxSizeLength <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvDocType) { + } else if (id == libwebm::kMkvDocType) { if (m_docType) return E_FILE_FORMAT_INVALID; @@ -627,12 +626,12 @@ long long EBMLHeader::Parse(IMkvReader* pReader, long long& pos) { if (status) // error return status; - } else if (id == mkvmuxer::kMkvDocTypeVersion) { + } else if (id == libwebm::kMkvDocTypeVersion) { m_docTypeVersion = UnserializeUInt(pReader, pos, size); if (m_docTypeVersion <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvDocTypeReadVersion) { + } else if (id == libwebm::kMkvDocTypeReadVersion) { m_docTypeReadVersion = UnserializeUInt(pReader, pos, size); if (m_docTypeReadVersion <= 0) @@ -650,8 +649,8 @@ long long EBMLHeader::Parse(IMkvReader* pReader, long long& pos) { return E_FILE_FORMAT_INVALID; // Make sure EBMLMaxIDLength and EBMLMaxSizeLength are valid. - if (m_maxIdLength <= 0 || m_maxIdLength > 4 || - m_maxSizeLength <= 0 || m_maxSizeLength > 8) + if (m_maxIdLength <= 0 || m_maxIdLength > 4 || m_maxSizeLength <= 0 || + m_maxSizeLength > 8) return E_FILE_FORMAT_INVALID; return 0; @@ -786,7 +785,7 @@ long long Segment::CreateInstance(IMkvReader* pReader, long long pos, // Handle "unknown size" for live streaming of webm files. const long long unknown_size = (1LL << (7 * len)) - 1; - if (id == mkvmuxer::kMkvSegment) { + if (id == libwebm::kMkvSegment) { if (size == unknown_size) size = -1; @@ -878,7 +877,7 @@ long long Segment::ParseHeaders() { if (id < 0) return E_FILE_FORMAT_INVALID; - if (id == mkvmuxer::kMkvCluster) + if (id == libwebm::kMkvCluster) break; pos += len; // consume ID @@ -930,7 +929,7 @@ long long Segment::ParseHeaders() { if ((pos + size) > available) return pos + size; - if (id == mkvmuxer::kMkvInfo) { + if (id == libwebm::kMkvInfo) { if (m_pInfo) return E_FILE_FORMAT_INVALID; @@ -944,7 +943,7 @@ long long Segment::ParseHeaders() { if (status) return status; - } else if (id == mkvmuxer::kMkvTracks) { + } else if (id == libwebm::kMkvTracks) { if (m_pTracks) return E_FILE_FORMAT_INVALID; @@ -958,7 +957,7 @@ long long Segment::ParseHeaders() { if (status) return status; - } else if (id == mkvmuxer::kMkvCues) { + } else if (id == libwebm::kMkvCues) { if (m_pCues == NULL) { m_pCues = new (std::nothrow) Cues(this, pos, size, element_start, element_size); @@ -966,7 +965,7 @@ long long Segment::ParseHeaders() { if (m_pCues == NULL) return -1; } - } else if (id == mkvmuxer::kMkvSeekHead) { + } else if (id == libwebm::kMkvSeekHead) { if (m_pSeekHead == NULL) { m_pSeekHead = new (std::nothrow) SeekHead(this, pos, size, element_start, element_size); @@ -979,7 +978,7 @@ long long Segment::ParseHeaders() { if (status) return status; } - } else if (id == mkvmuxer::kMkvChapters) { + } else if (id == libwebm::kMkvChapters) { if (m_pChapters == NULL) { m_pChapters = new (std::nothrow) Chapters(this, pos, size, element_start, element_size); @@ -992,7 +991,7 @@ long long Segment::ParseHeaders() { if (status) return status; } - } else if (id == mkvmuxer::kMkvTags) { + } else if (id == libwebm::kMkvTags) { if (m_pTags == NULL) { m_pTags = new (std::nothrow) Tags(this, pos, size, element_start, element_size); @@ -1131,7 +1130,7 @@ long Segment::DoLoadCluster(long long& pos, long& len) { return E_FILE_FORMAT_INVALID; } - if (id == mkvmuxer::kMkvCues) { + if (id == libwebm::kMkvCues) { if (size == unknown_size) { // Cues element of unknown size: Not supported. return E_FILE_FORMAT_INVALID; @@ -1149,7 +1148,7 @@ long Segment::DoLoadCluster(long long& pos, long& len) { continue; } - if (id != mkvmuxer::kMkvCluster) { + if (id != libwebm::kMkvCluster) { // Besides the Segment, Libwebm allows only cluster elements of unknown // size. Fail the parse upon encountering a non-cluster element reporting // unknown size. @@ -1466,7 +1465,7 @@ long Segment::Load() { return E_FILE_FORMAT_INVALID; for (;;) { - const int status = LoadCluster(); + const long status = LoadCluster(); if (status < 0) // error return status; @@ -1512,9 +1511,9 @@ long SeekHead::Parse() { if (status < 0) // error return status; - if (id == mkvmuxer::kMkvSeek) + if (id == libwebm::kMkvSeek) ++entry_count; - else if (id == mkvmuxer::kMkvVoid) + else if (id == libwebm::kMkvVoid) ++void_element_count; pos += size; // consume payload @@ -1553,14 +1552,14 @@ long SeekHead::Parse() { if (status < 0) // error return status; - if (id == mkvmuxer::kMkvSeek) { + if (id == libwebm::kMkvSeek) { if (ParseEntry(pReader, pos, size, pEntry)) { Entry& e = *pEntry++; e.element_start = idpos; e.element_size = (pos + size) - idpos; } - } else if (id == mkvmuxer::kMkvVoid) { + } else if (id == libwebm::kMkvVoid) { VoidElement& e = *pVoidElement++; e.element_start = idpos; @@ -1664,7 +1663,7 @@ long Segment::ParseCues(long long off, long long& pos, long& len) { const long long id = ReadID(m_pReader, idpos, len); - if (id != mkvmuxer::kMkvCues) + if (id != libwebm::kMkvCues) return E_FILE_FORMAT_INVALID; pos += len; // consume ID @@ -1746,7 +1745,7 @@ bool SeekHead::ParseEntry(IMkvReader* pReader, long long start, long long size_, if (seekIdId < 0) return false; - if (seekIdId != mkvmuxer::kMkvSeekID) + if (seekIdId != libwebm::kMkvSeekID) return false; if ((pos + len) > stop) @@ -1790,7 +1789,7 @@ bool SeekHead::ParseEntry(IMkvReader* pReader, long long start, long long size_, const long long seekPosId = ReadID(pReader, pos, len); - if (seekPosId != mkvmuxer::kMkvSeekPosition) + if (seekPosId != libwebm::kMkvSeekPosition) return false; if ((pos + len) > stop) @@ -1900,7 +1899,7 @@ bool Cues::Init() const { return false; } - if (id == mkvmuxer::kMkvCuePoint) { + if (id == libwebm::kMkvCuePoint) { if (!PreloadCuePoint(cue_points_size, idpos)) return false; } @@ -1975,7 +1974,7 @@ bool Cues::LoadCuePoint() const { if ((m_pos + size) > stop) return false; - if (id != mkvmuxer::kMkvCuePoint) { + if (id != libwebm::kMkvCuePoint) { m_pos += size; // consume payload if (m_pos > stop) return false; @@ -2105,8 +2104,8 @@ const CuePoint* Cues::GetLast() const { } const CuePoint* Cues::GetNext(const CuePoint* pCurr) const { - if (pCurr == NULL || pCurr->GetTimeCode() < 0 || - m_cue_points == NULL || m_count < 1) { + if (pCurr == NULL || pCurr->GetTimeCode() < 0 || m_cue_points == NULL || + m_count < 1) { return NULL; } @@ -2286,7 +2285,7 @@ bool CuePoint::Load(IMkvReader* pReader) { long len; const long long id = ReadID(pReader, pos_, len); - if (id != mkvmuxer::kMkvCuePoint) + if (id != libwebm::kMkvCuePoint) return false; pos_ += len; // consume ID @@ -2326,10 +2325,10 @@ bool CuePoint::Load(IMkvReader* pReader) { return false; } - if (id == mkvmuxer::kMkvCueTime) + if (id == libwebm::kMkvCueTime) m_timecode = UnserializeUInt(pReader, pos, size); - else if (id == mkvmuxer::kMkvCueTrackPositions) + else if (id == libwebm::kMkvCueTrackPositions) ++m_track_positions_count; pos += size; // consume payload @@ -2368,7 +2367,7 @@ bool CuePoint::Load(IMkvReader* pReader) { pos += len; // consume Size field assert((pos + size) <= stop); - if (id == mkvmuxer::kMkvCueTrackPositions) { + if (id == libwebm::kMkvCueTrackPositions) { TrackPosition& tp = *p++; if (!tp.Parse(pReader, pos, size)) { return false; @@ -2417,11 +2416,11 @@ bool CuePoint::TrackPosition::Parse(IMkvReader* pReader, long long start_, return false; } - if (id == mkvmuxer::kMkvCueTrack) + if (id == libwebm::kMkvCueTrack) m_track = UnserializeUInt(pReader, pos, size); - else if (id == mkvmuxer::kMkvCueClusterPosition) + else if (id == libwebm::kMkvCueClusterPosition) m_pos = UnserializeUInt(pReader, pos, size); - else if (id == mkvmuxer::kMkvCueBlockNumber) + else if (id == libwebm::kMkvCueBlockNumber) m_block = UnserializeUInt(pReader, pos, size); pos += size; // consume payload @@ -2555,7 +2554,7 @@ const Cluster* Segment::GetNext(const Cluster* pCurr) { return NULL; const long long id = ReadID(m_pReader, pos, len); - if (id != mkvmuxer::kMkvCluster) + if (id != libwebm::kMkvCluster) return NULL; pos += len; // consume ID @@ -2612,7 +2611,7 @@ const Cluster* Segment::GetNext(const Cluster* pCurr) { if (size == 0) // weird continue; - if (id == mkvmuxer::kMkvCluster) { + if (id == libwebm::kMkvCluster) { const long long off_next_ = idpos - m_start; long long pos_; @@ -2762,7 +2761,7 @@ long Segment::ParseNext(const Cluster* pCurr, const Cluster*& pResult, const long long id = ReadUInt(m_pReader, pos, len); - if (id != mkvmuxer::kMkvCluster) + if (id != libwebm::kMkvCluster) return -1; pos += len; // consume ID @@ -2927,7 +2926,7 @@ long Segment::DoParseNext(const Cluster*& pResult, long long& pos, long& len) { return E_FILE_FORMAT_INVALID; } - if (id == mkvmuxer::kMkvCues) { + if (id == libwebm::kMkvCues) { if (size == unknown_size) return E_FILE_FORMAT_INVALID; @@ -2953,7 +2952,7 @@ long Segment::DoParseNext(const Cluster*& pResult, long long& pos, long& len) { continue; } - if (id != mkvmuxer::kMkvCluster) { // not a Cluster ID + if (id != libwebm::kMkvCluster) { // not a Cluster ID if (size == unknown_size) return E_FILE_FORMAT_INVALID; @@ -3091,7 +3090,7 @@ long Segment::DoParseNext(const Cluster*& pResult, long long& pos, long& len) { // that we have exhausted the sub-element's inside the cluster // whose ID we parsed earlier. - if (id == mkvmuxer::kMkvCluster || id == mkvmuxer::kMkvCues) + if (id == libwebm::kMkvCluster || id == libwebm::kMkvCues) break; pos += len; // consume ID (of sub-element) @@ -3259,7 +3258,7 @@ long Chapters::Parse() { if (size == 0) // weird continue; - if (id == mkvmuxer::kMkvEditionEntry) { + if (id == libwebm::kMkvEditionEntry) { status = ParseEdition(pos, size); if (status < 0) // error @@ -3375,7 +3374,7 @@ long Chapters::Edition::Parse(IMkvReader* pReader, long long pos, if (size == 0) continue; - if (id == mkvmuxer::kMkvChapterAtom) { + if (id == libwebm::kMkvChapterAtom) { status = ParseAtom(pReader, pos, size); if (status < 0) // error @@ -3508,17 +3507,17 @@ long Chapters::Atom::Parse(IMkvReader* pReader, long long pos, long long size) { if (size == 0) // 0 length payload, skip. continue; - if (id == mkvmuxer::kMkvChapterDisplay) { + if (id == libwebm::kMkvChapterDisplay) { status = ParseDisplay(pReader, pos, size); if (status < 0) // error return status; - } else if (id == mkvmuxer::kMkvChapterStringUID) { + } else if (id == libwebm::kMkvChapterStringUID) { status = UnserializeString(pReader, pos, size, m_string_uid); if (status < 0) // error return status; - } else if (id == mkvmuxer::kMkvChapterUID) { + } else if (id == libwebm::kMkvChapterUID) { long long val; status = UnserializeInt(pReader, pos, size, val); @@ -3526,14 +3525,14 @@ long Chapters::Atom::Parse(IMkvReader* pReader, long long pos, long long size) { return status; m_uid = static_cast<unsigned long long>(val); - } else if (id == mkvmuxer::kMkvChapterTimeStart) { + } else if (id == libwebm::kMkvChapterTimeStart) { const long long val = UnserializeUInt(pReader, pos, size); if (val < 0) // error return static_cast<long>(val); m_start_timecode = val; - } else if (id == mkvmuxer::kMkvChapterTimeEnd) { + } else if (id == libwebm::kMkvChapterTimeEnd) { const long long val = UnserializeUInt(pReader, pos, size); if (val < 0) // error @@ -3661,17 +3660,17 @@ long Chapters::Display::Parse(IMkvReader* pReader, long long pos, if (size == 0) // No payload. continue; - if (id == mkvmuxer::kMkvChapString) { + if (id == libwebm::kMkvChapString) { status = UnserializeString(pReader, pos, size, m_string); if (status) return status; - } else if (id == mkvmuxer::kMkvChapLanguage) { + } else if (id == libwebm::kMkvChapLanguage) { status = UnserializeString(pReader, pos, size, m_language); if (status) return status; - } else if (id == mkvmuxer::kMkvChapCountry) { + } else if (id == libwebm::kMkvChapCountry) { status = UnserializeString(pReader, pos, size, m_country); if (status) @@ -3724,7 +3723,7 @@ long Tags::Parse() { if (size == 0) // 0 length tag, read another continue; - if (id == mkvmuxer::kMkvTag) { + if (id == libwebm::kMkvTag) { status = ParseTag(pos, size); if (status < 0) @@ -3840,7 +3839,7 @@ long Tags::Tag::Parse(IMkvReader* pReader, long long pos, long long size) { if (size == 0) // 0 length tag, read another continue; - if (id == mkvmuxer::kMkvSimpleTag) { + if (id == libwebm::kMkvSimpleTag) { status = ParseSimpleTag(pReader, pos, size); if (status < 0) @@ -3931,12 +3930,12 @@ long Tags::SimpleTag::Parse(IMkvReader* pReader, long long pos, if (size == 0) // weird continue; - if (id == mkvmuxer::kMkvTagName) { + if (id == libwebm::kMkvTagName) { status = UnserializeString(pReader, pos, size, m_tag_name); if (status) return status; - } else if (id == mkvmuxer::kMkvTagString) { + } else if (id == libwebm::kMkvTagString) { status = UnserializeString(pReader, pos, size, m_tag_string); if (status) @@ -3996,12 +3995,12 @@ long SegmentInfo::Parse() { if (status < 0) // error return status; - if (id == mkvmuxer::kMkvTimecodeScale) { + if (id == libwebm::kMkvTimecodeScale) { m_timecodeScale = UnserializeUInt(pReader, pos, size); if (m_timecodeScale <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvDuration) { + } else if (id == libwebm::kMkvDuration) { const long status = UnserializeFloat(pReader, pos, size, m_duration); if (status < 0) @@ -4009,19 +4008,19 @@ long SegmentInfo::Parse() { if (m_duration < 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvMuxingApp) { + } else if (id == libwebm::kMkvMuxingApp) { const long status = UnserializeString(pReader, pos, size, m_pMuxingAppAsUTF8); if (status) return status; - } else if (id == mkvmuxer::kMkvWritingApp) { + } else if (id == libwebm::kMkvWritingApp) { const long status = UnserializeString(pReader, pos, size, m_pWritingAppAsUTF8); if (status) return status; - } else if (id == mkvmuxer::kMkvTitle) { + } else if (id == libwebm::kMkvTitle) { const long status = UnserializeString(pReader, pos, size, m_pTitleAsUTF8); if (status) @@ -4176,7 +4175,7 @@ long ContentEncoding::ParseContentEncAESSettingsEntry( if (status < 0) // error return status; - if (id == mkvmuxer::kMkvAESSettingsCipherMode) { + if (id == libwebm::kMkvAESSettingsCipherMode) { aes->cipher_mode = UnserializeUInt(pReader, pos, size); if (aes->cipher_mode != 1) return E_FILE_FORMAT_INVALID; @@ -4207,10 +4206,10 @@ long ContentEncoding::ParseContentEncodingEntry(long long start, long long size, if (status < 0) // error return status; - if (id == mkvmuxer::kMkvContentCompression) + if (id == libwebm::kMkvContentCompression) ++compression_count; - if (id == mkvmuxer::kMkvContentEncryption) + if (id == libwebm::kMkvContentEncryption) ++encryption_count; pos += size; // consume payload @@ -4246,15 +4245,15 @@ long ContentEncoding::ParseContentEncodingEntry(long long start, long long size, if (status < 0) // error return status; - if (id == mkvmuxer::kMkvContentEncodingOrder) { + if (id == libwebm::kMkvContentEncodingOrder) { encoding_order_ = UnserializeUInt(pReader, pos, size); - } else if (id == mkvmuxer::kMkvContentEncodingScope) { + } else if (id == libwebm::kMkvContentEncodingScope) { encoding_scope_ = UnserializeUInt(pReader, pos, size); if (encoding_scope_ < 1) return -1; - } else if (id == mkvmuxer::kMkvContentEncodingType) { + } else if (id == libwebm::kMkvContentEncodingType) { encoding_type_ = UnserializeUInt(pReader, pos, size); - } else if (id == mkvmuxer::kMkvContentCompression) { + } else if (id == libwebm::kMkvContentCompression) { ContentCompression* const compression = new (std::nothrow) ContentCompression(); if (!compression) @@ -4266,7 +4265,7 @@ long ContentEncoding::ParseContentEncodingEntry(long long start, long long size, return status; } *compression_entries_end_++ = compression; - } else if (id == mkvmuxer::kMkvContentEncryption) { + } else if (id == libwebm::kMkvContentEncryption) { ContentEncryption* const encryption = new (std::nothrow) ContentEncryption(); if (!encryption) @@ -4307,13 +4306,13 @@ long ContentEncoding::ParseCompressionEntry(long long start, long long size, if (status < 0) // error return status; - if (id == mkvmuxer::kMkvContentCompAlgo) { + if (id == libwebm::kMkvContentCompAlgo) { long long algo = UnserializeUInt(pReader, pos, size); if (algo < 0) return E_FILE_FORMAT_INVALID; compression->algo = algo; valid = true; - } else if (id == mkvmuxer::kMkvContentCompSettings) { + } else if (id == libwebm::kMkvContentCompSettings) { if (size <= 0) return E_FILE_FORMAT_INVALID; @@ -4360,11 +4359,11 @@ long ContentEncoding::ParseEncryptionEntry(long long start, long long size, if (status < 0) // error return status; - if (id == mkvmuxer::kMkvContentEncAlgo) { + if (id == libwebm::kMkvContentEncAlgo) { encryption->algo = UnserializeUInt(pReader, pos, size); if (encryption->algo != 5) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvContentEncKeyID) { + } else if (id == libwebm::kMkvContentEncKeyID) { delete[] encryption->key_id; encryption->key_id = NULL; encryption->key_id_len = 0; @@ -4386,7 +4385,7 @@ long ContentEncoding::ParseEncryptionEntry(long long start, long long size, encryption->key_id = buf; encryption->key_id_len = buflen; - } else if (id == mkvmuxer::kMkvContentSignature) { + } else if (id == libwebm::kMkvContentSignature) { delete[] encryption->signature; encryption->signature = NULL; encryption->signature_len = 0; @@ -4408,7 +4407,7 @@ long ContentEncoding::ParseEncryptionEntry(long long start, long long size, encryption->signature = buf; encryption->signature_len = buflen; - } else if (id == mkvmuxer::kMkvContentSigKeyID) { + } else if (id == libwebm::kMkvContentSigKeyID) { delete[] encryption->sig_key_id; encryption->sig_key_id = NULL; encryption->sig_key_id_len = 0; @@ -4430,11 +4429,11 @@ long ContentEncoding::ParseEncryptionEntry(long long start, long long size, encryption->sig_key_id = buf; encryption->sig_key_id_len = buflen; - } else if (id == mkvmuxer::kMkvContentSigAlgo) { + } else if (id == libwebm::kMkvContentSigAlgo) { encryption->sig_algo = UnserializeUInt(pReader, pos, size); - } else if (id == mkvmuxer::kMkvContentSigHashAlgo) { + } else if (id == libwebm::kMkvContentSigHashAlgo) { encryption->sig_hash_algo = UnserializeUInt(pReader, pos, size); - } else if (id == mkvmuxer::kMkvContentEncAESSettings) { + } else if (id == libwebm::kMkvContentEncAESSettings) { const long status = ParseContentEncAESSettingsEntry( pos, size, pReader, &encryption->aes_settings); if (status) @@ -4921,7 +4920,7 @@ long Track::ParseContentEncodingsEntry(long long start, long long size) { return status; // pos now designates start of element - if (id == mkvmuxer::kMkvContentEncoding) + if (id == libwebm::kMkvContentEncoding) ++count; pos += size; // consume payload @@ -4946,7 +4945,7 @@ long Track::ParseContentEncodingsEntry(long long start, long long size) { return status; // pos now designates start of element - if (id == mkvmuxer::kMkvContentEncoding) { + if (id == libwebm::kMkvContentEncoding) { ContentEncoding* const content_encoding = new (std::nothrow) ContentEncoding(); if (!content_encoding) @@ -4978,9 +4977,222 @@ BlockEntry::Kind Track::EOSBlock::GetKind() const { return kBlockEOS; } const Block* Track::EOSBlock::GetBlock() const { return NULL; } +bool PrimaryChromaticity::Parse(IMkvReader* reader, long long read_pos, + long long value_size, bool is_x, + PrimaryChromaticity** chromaticity) { + if (!reader) + return false; + + std::auto_ptr<PrimaryChromaticity> chromaticity_ptr; + + if (!*chromaticity) { + chromaticity_ptr.reset(new PrimaryChromaticity()); + } else { + chromaticity_ptr.reset(*chromaticity); + } + + if (!chromaticity_ptr.get()) + return false; + + float* value = is_x ? &chromaticity_ptr->x : &chromaticity_ptr->y; + + double parser_value = 0; + const long long value_parse_status = + UnserializeFloat(reader, read_pos, value_size, parser_value); + + *value = static_cast<float>(parser_value); + + if (value_parse_status < 0 || *value < 0.0 || *value > 1.0) + return false; + + *chromaticity = chromaticity_ptr.release(); + return true; +} + +bool MasteringMetadata::Parse(IMkvReader* reader, long long mm_start, + long long mm_size, MasteringMetadata** mm) { + if (!reader || *mm) + return false; + + std::auto_ptr<MasteringMetadata> mm_ptr(new MasteringMetadata()); + if (!mm_ptr.get()) + return false; + + const long long mm_end = mm_start + mm_size; + long long read_pos = mm_start; + + while (read_pos < mm_end) { + long long child_id = 0; + long long child_size = 0; + + const long long status = + ParseElementHeader(reader, read_pos, mm_end, child_id, child_size); + if (status < 0) + return false; + + if (child_id == libwebm::kMkvLuminanceMax) { + double value = 0; + const long long value_parse_status = + UnserializeFloat(reader, read_pos, child_size, value); + mm_ptr->luminance_max = static_cast<float>(value); + if (value_parse_status < 0 || mm_ptr->luminance_max < 0.0 || + mm_ptr->luminance_max > 9999.99) { + return false; + } + } else if (child_id == libwebm::kMkvLuminanceMin) { + double value = 0; + const long long value_parse_status = + UnserializeFloat(reader, read_pos, child_size, value); + mm_ptr->luminance_min = static_cast<float>(value); + if (value_parse_status < 0 || mm_ptr->luminance_min < 0.0 || + mm_ptr->luminance_min > 999.9999) { + return false; + } + } else { + bool is_x = false; + PrimaryChromaticity** chromaticity; + switch (child_id) { + case libwebm::kMkvPrimaryRChromaticityX: + case libwebm::kMkvPrimaryRChromaticityY: + is_x = child_id == libwebm::kMkvPrimaryRChromaticityX; + chromaticity = &mm_ptr->r; + break; + case libwebm::kMkvPrimaryGChromaticityX: + case libwebm::kMkvPrimaryGChromaticityY: + is_x = child_id == libwebm::kMkvPrimaryGChromaticityX; + chromaticity = &mm_ptr->g; + break; + case libwebm::kMkvPrimaryBChromaticityX: + case libwebm::kMkvPrimaryBChromaticityY: + is_x = child_id == libwebm::kMkvPrimaryBChromaticityX; + chromaticity = &mm_ptr->b; + break; + case libwebm::kMkvWhitePointChromaticityX: + case libwebm::kMkvWhitePointChromaticityY: + is_x = child_id == libwebm::kMkvWhitePointChromaticityX; + chromaticity = &mm_ptr->white_point; + break; + default: + return false; + } + const bool value_parse_status = PrimaryChromaticity::Parse( + reader, read_pos, child_size, is_x, chromaticity); + if (!value_parse_status) + return false; + } + + read_pos += child_size; + if (read_pos > mm_end) + return false; + } + + *mm = mm_ptr.release(); + return true; +} + +bool Colour::Parse(IMkvReader* reader, long long colour_start, + long long colour_size, Colour** colour) { + if (!reader || *colour) + return false; + + std::auto_ptr<Colour> colour_ptr(new Colour()); + if (!colour_ptr.get()) + return false; + + const long long colour_end = colour_start + colour_size; + long long read_pos = colour_start; + + while (read_pos < colour_end) { + long long child_id = 0; + long long child_size = 0; + + const long status = + ParseElementHeader(reader, read_pos, colour_end, child_id, child_size); + if (status < 0) + return false; + + if (child_id == libwebm::kMkvMatrixCoefficients) { + colour_ptr->matrix_coefficients = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->matrix_coefficients < 0) + return false; + } else if (child_id == libwebm::kMkvBitsPerChannel) { + colour_ptr->bits_per_channel = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->bits_per_channel < 0) + return false; + } else if (child_id == libwebm::kMkvChromaSubsamplingHorz) { + colour_ptr->chroma_subsampling_horz = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->chroma_subsampling_horz < 0) + return false; + } else if (child_id == libwebm::kMkvChromaSubsamplingVert) { + colour_ptr->chroma_subsampling_vert = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->chroma_subsampling_vert < 0) + return false; + } else if (child_id == libwebm::kMkvCbSubsamplingHorz) { + colour_ptr->cb_subsampling_horz = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->cb_subsampling_horz < 0) + return false; + } else if (child_id == libwebm::kMkvCbSubsamplingVert) { + colour_ptr->cb_subsampling_vert = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->cb_subsampling_vert < 0) + return false; + } else if (child_id == libwebm::kMkvChromaSitingHorz) { + colour_ptr->chroma_siting_horz = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->chroma_siting_horz < 0) + return false; + } else if (child_id == libwebm::kMkvChromaSitingVert) { + colour_ptr->chroma_siting_vert = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->chroma_siting_vert < 0) + return false; + } else if (child_id == libwebm::kMkvRange) { + colour_ptr->range = UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->range < 0) + return false; + } else if (child_id == libwebm::kMkvTransferCharacteristics) { + colour_ptr->transfer_characteristics = + UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->transfer_characteristics < 0) + return false; + } else if (child_id == libwebm::kMkvPrimaries) { + colour_ptr->primaries = UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->primaries < 0) + return false; + } else if (child_id == libwebm::kMkvMaxCLL) { + colour_ptr->max_cll = UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->max_cll < 0) + return false; + } else if (child_id == libwebm::kMkvMaxFALL) { + colour_ptr->max_fall = UnserializeUInt(reader, read_pos, child_size); + if (colour_ptr->max_fall < 0) + return false; + } else if (child_id == libwebm::kMkvMasteringMetadata) { + if (!MasteringMetadata::Parse(reader, read_pos, child_size, + &colour_ptr->mastering_metadata)) + return false; + } else { + return false; + } + + read_pos += child_size; + if (read_pos > colour_end) + return false; + } + *colour = colour_ptr.release(); + return true; +} + VideoTrack::VideoTrack(Segment* pSegment, long long element_start, long long element_size) - : Track(pSegment, element_start, element_size) {} + : Track(pSegment, element_start, element_size), m_colour(NULL) {} + +VideoTrack::~VideoTrack() { delete m_colour; } long VideoTrack::Parse(Segment* pSegment, const Info& info, long long element_start, long long element_size, @@ -5011,6 +5223,8 @@ long VideoTrack::Parse(Segment* pSegment, const Info& info, const long long stop = pos + s.size; + Colour* colour = NULL; + while (pos < stop) { long long id, size; @@ -5019,37 +5233,37 @@ long VideoTrack::Parse(Segment* pSegment, const Info& info, if (status < 0) // error return status; - if (id == mkvmuxer::kMkvPixelWidth) { + if (id == libwebm::kMkvPixelWidth) { width = UnserializeUInt(pReader, pos, size); if (width <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvPixelHeight) { + } else if (id == libwebm::kMkvPixelHeight) { height = UnserializeUInt(pReader, pos, size); if (height <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvDisplayWidth) { + } else if (id == libwebm::kMkvDisplayWidth) { display_width = UnserializeUInt(pReader, pos, size); if (display_width <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvDisplayHeight) { + } else if (id == libwebm::kMkvDisplayHeight) { display_height = UnserializeUInt(pReader, pos, size); if (display_height <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvDisplayUnit) { + } else if (id == libwebm::kMkvDisplayUnit) { display_unit = UnserializeUInt(pReader, pos, size); if (display_unit < 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvStereoMode) { + } else if (id == libwebm::kMkvStereoMode) { stereo_mode = UnserializeUInt(pReader, pos, size); if (stereo_mode < 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvFrameRate) { + } else if (id == libwebm::kMkvFrameRate) { const long status = UnserializeFloat(pReader, pos, size, rate); if (status < 0) @@ -5057,6 +5271,9 @@ long VideoTrack::Parse(Segment* pSegment, const Info& info, if (rate <= 0) return E_FILE_FORMAT_INVALID; + } else if (id == libwebm::kMkvColour) { + if (!Colour::Parse(pReader, pos, size, &colour)) + return E_FILE_FORMAT_INVALID; } pos += size; // consume payload @@ -5087,6 +5304,7 @@ long VideoTrack::Parse(Segment* pSegment, const Info& info, pTrack->m_display_unit = display_unit; pTrack->m_stereo_mode = stereo_mode; pTrack->m_rate = rate; + pTrack->m_colour = colour; pResult = pTrack; return 0; // success @@ -5185,6 +5403,8 @@ long VideoTrack::Seek(long long time_ns, const BlockEntry*& pResult) const { return 0; } +Colour* VideoTrack::GetColour() const { return m_colour; } + long long VideoTrack::GetWidth() const { return m_width; } long long VideoTrack::GetHeight() const { return m_height; } @@ -5239,7 +5459,7 @@ long AudioTrack::Parse(Segment* pSegment, const Info& info, if (status < 0) // error return status; - if (id == mkvmuxer::kMkvSamplingFrequency) { + if (id == libwebm::kMkvSamplingFrequency) { status = UnserializeFloat(pReader, pos, size, rate); if (status < 0) @@ -5247,12 +5467,12 @@ long AudioTrack::Parse(Segment* pSegment, const Info& info, if (rate <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvChannels) { + } else if (id == libwebm::kMkvChannels) { channels = UnserializeUInt(pReader, pos, size); if (channels <= 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvBitDepth) { + } else if (id == libwebm::kMkvBitDepth) { bit_depth = UnserializeUInt(pReader, pos, size); if (bit_depth <= 0) @@ -5325,7 +5545,7 @@ long Tracks::Parse() { if (size == 0) // weird continue; - if (id == mkvmuxer::kMkvTrackEntry) + if (id == libwebm::kMkvTrackEntry) ++count; pos += size; // consume payload @@ -5367,7 +5587,7 @@ long Tracks::Parse() { const long long element_size = payload_stop - element_start; - if (id == mkvmuxer::kMkvTrackEntry) { + if (id == libwebm::kMkvTrackEntry) { Track*& pTrack = *m_trackEntriesEnd; pTrack = NULL; @@ -5443,16 +5663,16 @@ long Tracks::ParseTrackEntry(long long track_start, long long track_size, const long long start = pos; - if (id == mkvmuxer::kMkvVideo) { + if (id == libwebm::kMkvVideo) { v.start = start; v.size = size; - } else if (id == mkvmuxer::kMkvAudio) { + } else if (id == libwebm::kMkvAudio) { a.start = start; a.size = size; - } else if (id == mkvmuxer::kMkvContentEncodings) { + } else if (id == libwebm::kMkvContentEncodings) { e.start = start; e.size = size; - } else if (id == mkvmuxer::kMkvTrackUID) { + } else if (id == libwebm::kMkvTrackUID) { if (size > 8) return E_FILE_FORMAT_INVALID; @@ -5474,49 +5694,49 @@ long Tracks::ParseTrackEntry(long long track_start, long long track_size, ++pos_; } - } else if (id == mkvmuxer::kMkvTrackNumber) { + } else if (id == libwebm::kMkvTrackNumber) { const long long num = UnserializeUInt(pReader, pos, size); if ((num <= 0) || (num > 127)) return E_FILE_FORMAT_INVALID; info.number = static_cast<long>(num); - } else if (id == mkvmuxer::kMkvTrackType) { + } else if (id == libwebm::kMkvTrackType) { const long long type = UnserializeUInt(pReader, pos, size); if ((type <= 0) || (type > 254)) return E_FILE_FORMAT_INVALID; info.type = static_cast<long>(type); - } else if (id == mkvmuxer::kMkvName) { + } else if (id == libwebm::kMkvName) { const long status = UnserializeString(pReader, pos, size, info.nameAsUTF8); if (status) return status; - } else if (id == mkvmuxer::kMkvLanguage) { + } else if (id == libwebm::kMkvLanguage) { const long status = UnserializeString(pReader, pos, size, info.language); if (status) return status; - } else if (id == mkvmuxer::kMkvDefaultDuration) { + } else if (id == libwebm::kMkvDefaultDuration) { const long long duration = UnserializeUInt(pReader, pos, size); if (duration < 0) return E_FILE_FORMAT_INVALID; info.defaultDuration = static_cast<unsigned long long>(duration); - } else if (id == mkvmuxer::kMkvCodecID) { + } else if (id == libwebm::kMkvCodecID) { const long status = UnserializeString(pReader, pos, size, info.codecId); if (status) return status; - } else if (id == mkvmuxer::kMkvFlagLacing) { + } else if (id == libwebm::kMkvFlagLacing) { lacing = UnserializeUInt(pReader, pos, size); if ((lacing < 0) || (lacing > 1)) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvCodecPrivate) { + } else if (id == libwebm::kMkvCodecPrivate) { delete[] info.codecPrivate; info.codecPrivate = NULL; info.codecPrivateSize = 0; @@ -5539,15 +5759,15 @@ long Tracks::ParseTrackEntry(long long track_start, long long track_size, info.codecPrivate = buf; info.codecPrivateSize = buflen; } - } else if (id == mkvmuxer::kMkvCodecName) { + } else if (id == libwebm::kMkvCodecName) { const long status = UnserializeString(pReader, pos, size, info.codecNameAsUTF8); if (status) return status; - } else if (id == mkvmuxer::kMkvCodecDelay) { + } else if (id == libwebm::kMkvCodecDelay) { info.codecDelay = UnserializeUInt(pReader, pos, size); - } else if (id == mkvmuxer::kMkvSeekPreRoll) { + } else if (id == libwebm::kMkvSeekPreRoll) { info.seekPreRoll = UnserializeUInt(pReader, pos, size); } @@ -5730,7 +5950,7 @@ long Cluster::Load(long long& pos, long& len) const { if (id_ < 0) // error return static_cast<long>(id_); - if (id_ != mkvmuxer::kMkvCluster) + if (id_ != libwebm::kMkvCluster) return E_FILE_FORMAT_INVALID; pos += len; // consume id @@ -5812,10 +6032,10 @@ long Cluster::Load(long long& pos, long& len) const { // that we have exhausted the sub-element's inside the cluster // whose ID we parsed earlier. - if (id == mkvmuxer::kMkvCluster) + if (id == libwebm::kMkvCluster) break; - if (id == mkvmuxer::kMkvCues) + if (id == libwebm::kMkvCues) break; pos += len; // consume ID field @@ -5864,7 +6084,7 @@ long Cluster::Load(long long& pos, long& len) const { if ((cluster_stop >= 0) && ((pos + size) > cluster_stop)) return E_FILE_FORMAT_INVALID; - if (id == mkvmuxer::kMkvTimecode) { + if (id == libwebm::kMkvTimecode) { len = static_cast<long>(size); if ((pos + size) > avail) @@ -5879,10 +6099,10 @@ long Cluster::Load(long long& pos, long& len) const { if (bBlock) break; - } else if (id == mkvmuxer::kMkvBlockGroup) { + } else if (id == libwebm::kMkvBlockGroup) { bBlock = true; break; - } else if (id == mkvmuxer::kMkvSimpleBlock) { + } else if (id == libwebm::kMkvSimpleBlock) { bBlock = true; break; } @@ -5980,7 +6200,7 @@ long Cluster::Parse(long long& pos, long& len) const { // that we have exhausted the sub-element's inside the cluster // whose ID we parsed earlier. - if ((id == mkvmuxer::kMkvCluster) || (id == mkvmuxer::kMkvCues)) { + if ((id == libwebm::kMkvCluster) || (id == libwebm::kMkvCues)) { if (m_element_size < 0) m_element_size = pos - m_element_start; @@ -6035,8 +6255,7 @@ long Cluster::Parse(long long& pos, long& len) const { if (cluster_stop >= 0) { if (block_stop > cluster_stop) { - if (id == mkvmuxer::kMkvBlockGroup || - id == mkvmuxer::kMkvSimpleBlock) { + if (id == libwebm::kMkvBlockGroup || id == libwebm::kMkvSimpleBlock) { return E_FILE_FORMAT_INVALID; } @@ -6054,10 +6273,10 @@ long Cluster::Parse(long long& pos, long& len) const { Cluster* const this_ = const_cast<Cluster*>(this); - if (id == mkvmuxer::kMkvBlockGroup) + if (id == libwebm::kMkvBlockGroup) return this_->ParseBlockGroup(size, pos, len); - if (id == mkvmuxer::kMkvSimpleBlock) + if (id == libwebm::kMkvSimpleBlock) return this_->ParseSimpleBlock(size, pos, len); pos += size; // consume payload @@ -6188,8 +6407,7 @@ long Cluster::ParseSimpleBlock(long long block_size, long long& pos, return E_BUFFER_NOT_FULL; } - status = CreateBlock(mkvmuxer::kMkvSimpleBlock, - block_start, block_size, + status = CreateBlock(libwebm::kMkvSimpleBlock, block_start, block_size, 0); // DiscardPadding if (status != 0) @@ -6299,14 +6517,14 @@ long Cluster::ParseBlockGroup(long long payload_size, long long& pos, if (size == unknown_size) return E_FILE_FORMAT_INVALID; - if (id == mkvmuxer::kMkvDiscardPadding) { + if (id == libwebm::kMkvDiscardPadding) { status = UnserializeInt(pReader, pos, size, discard_padding); if (status < 0) // error return status; } - if (id != mkvmuxer::kMkvBlock) { + if (id != libwebm::kMkvBlock) { pos += size; // consume sub-part of block group if (pos > payload_stop) @@ -6399,8 +6617,8 @@ long Cluster::ParseBlockGroup(long long payload_size, long long& pos, if (pos != payload_stop) return E_FILE_FORMAT_INVALID; - status = CreateBlock(mkvmuxer::kMkvBlockGroup, - payload_start, payload_size, discard_padding); + status = CreateBlock(libwebm::kMkvBlockGroup, payload_start, payload_size, + discard_padding); if (status != 0) return status; @@ -6565,7 +6783,7 @@ long Cluster::HasBlockEntries( if (id < 0) // error return static_cast<long>(id); - if (id != mkvmuxer::kMkvCluster) + if (id != libwebm::kMkvCluster) return E_PARSE_FAILED; pos += len; // consume Cluster ID field @@ -6653,10 +6871,10 @@ long Cluster::HasBlockEntries( // that we have exhausted the sub-element's inside the cluster // whose ID we parsed earlier. - if (id == mkvmuxer::kMkvCluster) + if (id == libwebm::kMkvCluster) return 0; // no entries found - if (id == mkvmuxer::kMkvCues) + if (id == libwebm::kMkvCues) return 0; // no entries found pos += len; // consume id field @@ -6708,10 +6926,10 @@ long Cluster::HasBlockEntries( if ((cluster_stop >= 0) && ((pos + size) > cluster_stop)) return E_FILE_FORMAT_INVALID; - if (id == mkvmuxer::kMkvBlockGroup) + if (id == libwebm::kMkvBlockGroup) return 1; // have at least one entry - if (id == mkvmuxer::kMkvSimpleBlock) + if (id == libwebm::kMkvSimpleBlock) return 1; // have at least one entry pos += size; // consume payload @@ -6786,7 +7004,7 @@ long long Cluster::GetLastTime() const { long Cluster::CreateBlock(long long id, long long pos, // absolute pos of payload long long size, long long discard_padding) { - if (id != mkvmuxer::kMkvBlockGroup && id != mkvmuxer::kMkvSimpleBlock) + if (id != libwebm::kMkvBlockGroup && id != libwebm::kMkvSimpleBlock) return E_PARSE_FAILED; if (m_entries_count < 0) { // haven't parsed anything yet @@ -6826,7 +7044,7 @@ long Cluster::CreateBlock(long long id, } } - if (id == mkvmuxer::kMkvBlockGroup) + if (id == libwebm::kMkvBlockGroup) return CreateBlockGroup(pos, size, discard_padding); else return CreateSimpleBlock(pos, size); @@ -6871,12 +7089,12 @@ long Cluster::CreateBlockGroup(long long start_offset, long long size, pos += len; // consume size - if (id == mkvmuxer::kMkvBlock) { + if (id == libwebm::kMkvBlock) { if (bpos < 0) { // Block ID bpos = pos; bsize = size; } - } else if (id == mkvmuxer::kMkvBlockDuration) { + } else if (id == libwebm::kMkvBlockDuration) { if (size > 8) return E_FILE_FORMAT_INVALID; @@ -6884,7 +7102,7 @@ long Cluster::CreateBlockGroup(long long start_offset, long long size, if (duration < 0) return E_FILE_FORMAT_INVALID; - } else if (id == mkvmuxer::kMkvReferenceBlock) { + } else if (id == libwebm::kMkvReferenceBlock) { if (size > 8 || size <= 0) return E_FILE_FORMAT_INVALID; const long size_ = static_cast<long>(size); @@ -7231,7 +7449,6 @@ const BlockEntry* Cluster::GetEntry(const CuePoint& cp, BlockEntry::BlockEntry(Cluster* p, long idx) : m_pCluster(p), m_index(idx) {} BlockEntry::~BlockEntry() {} -bool BlockEntry::EOS() const { return (GetKind() == kBlockEOS); } const Cluster* BlockEntry::GetCluster() const { return m_pCluster; } long BlockEntry::GetIndex() const { return m_index; } @@ -7555,7 +7772,6 @@ long Block::Parse(const Cluster* pCluster) { if (pf >= pf_end) return E_FILE_FORMAT_INVALID; - const Frame& prev = *pf++; assert(prev.len == frame_size); if (prev.len != frame_size) @@ -7581,7 +7797,7 @@ long Block::Parse(const Cluster* pCluster) { if (pos > stop) return E_FILE_FORMAT_INVALID; - const int exp = 7 * len - 1; + const long exp = 7 * len - 1; const long long bias = (1LL << exp) - 1LL; const long long delta_size = delta_size_ - bias; @@ -7721,4 +7937,4 @@ long Block::Frame::Read(IMkvReader* pReader, unsigned char* buf) const { long long Block::GetDiscardPadding() const { return m_discard_padding; } -} // end namespace mkvparser +} // namespace mkvparser diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser.hpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser/mkvparser.h index 75ef69d76d1..42e6e88ab46 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser.hpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser/mkvparser.h @@ -5,13 +5,10 @@ // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. - -#ifndef MKVPARSER_HPP -#define MKVPARSER_HPP +#ifndef MKVPARSER_MKVPARSER_H_ +#define MKVPARSER_MKVPARSER_H_ #include <cstddef> -#include <cstdio> -#include <cstdlib> namespace mkvparser { @@ -28,8 +25,9 @@ class IMkvReader { virtual ~IMkvReader(); }; -template<typename Type> Type* SafeArrayAlloc(unsigned long long num_elements, - unsigned long long element_size); +template <typename Type> +Type* SafeArrayAlloc(unsigned long long num_elements, + unsigned long long element_size); long long GetUIntLength(IMkvReader*, long long, long&); long long ReadUInt(IMkvReader*, long long, long&); long long ReadID(IMkvReader* pReader, long long pos, long& len); @@ -128,7 +126,7 @@ class BlockEntry { public: virtual ~BlockEntry(); - bool EOS() const; + bool EOS() const { return (GetKind() == kBlockEOS); } const Cluster* GetCluster() const; long GetIndex() const; virtual const Block* GetBlock() const = 0; @@ -391,6 +389,90 @@ class Track { ContentEncoding** content_encoding_entries_end_; }; +struct PrimaryChromaticity { + PrimaryChromaticity() : x(0), y(0) {} + ~PrimaryChromaticity() {} + static bool Parse(IMkvReader* reader, long long read_pos, + long long value_size, bool is_x, + PrimaryChromaticity** chromaticity); + float x; + float y; +}; + +struct MasteringMetadata { + static const float kValueNotPresent; + + MasteringMetadata() + : r(NULL), + g(NULL), + b(NULL), + white_point(NULL), + luminance_max(kValueNotPresent), + luminance_min(kValueNotPresent) {} + ~MasteringMetadata() { + delete r; + delete g; + delete b; + delete white_point; + } + + static bool Parse(IMkvReader* reader, long long element_start, + long long element_size, + MasteringMetadata** mastering_metadata); + + PrimaryChromaticity* r; + PrimaryChromaticity* g; + PrimaryChromaticity* b; + PrimaryChromaticity* white_point; + float luminance_max; + float luminance_min; +}; + +struct Colour { + static const long long kValueNotPresent; + + // Unless otherwise noted all values assigned upon construction are the + // equivalent of unspecified/default. + Colour() + : matrix_coefficients(kValueNotPresent), + bits_per_channel(kValueNotPresent), + chroma_subsampling_horz(kValueNotPresent), + chroma_subsampling_vert(kValueNotPresent), + cb_subsampling_horz(kValueNotPresent), + cb_subsampling_vert(kValueNotPresent), + chroma_siting_horz(kValueNotPresent), + chroma_siting_vert(kValueNotPresent), + range(kValueNotPresent), + transfer_characteristics(kValueNotPresent), + primaries(kValueNotPresent), + max_cll(kValueNotPresent), + max_fall(kValueNotPresent), + mastering_metadata(NULL) {} + ~Colour() { + delete mastering_metadata; + mastering_metadata = NULL; + } + + static bool Parse(IMkvReader* reader, long long element_start, + long long element_size, Colour** colour); + + long long matrix_coefficients; + long long bits_per_channel; + long long chroma_subsampling_horz; + long long chroma_subsampling_vert; + long long cb_subsampling_horz; + long long cb_subsampling_vert; + long long chroma_siting_horz; + long long chroma_siting_vert; + long long range; + long long transfer_characteristics; + long long primaries; + long long max_cll; + long long max_fall; + + MasteringMetadata* mastering_metadata; +}; + class VideoTrack : public Track { VideoTrack(const VideoTrack&); VideoTrack& operator=(const VideoTrack&); @@ -398,6 +480,7 @@ class VideoTrack : public Track { VideoTrack(Segment*, long long element_start, long long element_size); public: + virtual ~VideoTrack(); static long Parse(Segment*, const Info&, long long element_start, long long element_size, VideoTrack*&); @@ -412,6 +495,8 @@ class VideoTrack : public Track { bool VetEntry(const BlockEntry*) const; long Seek(long long time_ns, const BlockEntry*&) const; + Colour* GetColour() const; + private: long long m_width; long long m_height; @@ -421,6 +506,8 @@ class VideoTrack : public Track { long long m_stereo_mode; double m_rate; + + Colour* m_colour; }; class AudioTrack : public Track { @@ -1013,7 +1100,7 @@ class Segment { const BlockEntry* GetBlock(const CuePoint&, const CuePoint::TrackPosition&); }; -} // end namespace mkvparser +} // namespace mkvparser inline long mkvparser::Segment::LoadCluster() { long long pos; @@ -1022,4 +1109,4 @@ inline long mkvparser::Segment::LoadCluster() { return LoadCluster(pos, size); } -#endif // MKVPARSER_HPP +#endif // MKVPARSER_MKVPARSER_H_ diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvreader.cpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser/mkvreader.cc index eaf9e0a799f..9f90d8c4f86 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvreader.cpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser/mkvreader.cc @@ -5,8 +5,7 @@ // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. - -#include "mkvreader.hpp" +#include "mkvparser/mkvreader.h" #include <cassert> @@ -129,4 +128,4 @@ int MkvReader::Read(long long offset, long len, unsigned char* buffer) { return 0; // success } -} // end namespace mkvparser +} // namespace mkvparser
\ No newline at end of file diff --git a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvreader.hpp b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser/mkvreader.h index 82ebad54444..9831ecf6458 100644 --- a/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvreader.hpp +++ b/chromium/third_party/libvpx/source/libvpx/third_party/libwebm/mkvparser/mkvreader.h @@ -5,13 +5,13 @@ // tree. An additional intellectual property rights grant can be found // in the file PATENTS. All contributing project authors may // be found in the AUTHORS file in the root of the source tree. +#ifndef MKVPARSER_MKVREADER_H_ +#define MKVPARSER_MKVREADER_H_ -#ifndef MKVREADER_HPP -#define MKVREADER_HPP - -#include "mkvparser.hpp" #include <cstdio> +#include "mkvparser/mkvparser.h" + namespace mkvparser { class MkvReader : public IMkvReader { @@ -40,6 +40,6 @@ class MkvReader : public IMkvReader { bool reader_owns_file_; }; -} // end namespace mkvparser +} // namespace mkvparser -#endif // MKVREADER_HPP +#endif // MKVPARSER_MKVREADER_H_ diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/common/postproc.c b/chromium/third_party/libvpx/source/libvpx/vp10/common/postproc.c index a6ea9c0eff0..e8a9f8131b6 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/common/postproc.c +++ b/chromium/third_party/libvpx/source/libvpx/vp10/common/postproc.c @@ -13,6 +13,7 @@ #include <stdio.h> #include "./vpx_config.h" +#include "./vpx_dsp_rtcd.h" #include "./vpx_scale_rtcd.h" #include "./vp10_rtcd.h" @@ -587,32 +588,6 @@ static void fillrd(struct postproc_state *state, int q, int a) { state->last_noise = a; } -void vp10_plane_add_noise_c(uint8_t *start, char *noise, - char blackclamp[16], - char whiteclamp[16], - char bothclamp[16], - unsigned int width, unsigned int height, int pitch) { - unsigned int i, j; - - // TODO(jbb): why does simd code use both but c doesn't, normalize and - // fix.. - (void) bothclamp; - for (i = 0; i < height; i++) { - uint8_t *pos = start + i * pitch; - char *ref = (char *)(noise + (rand() & 0xff)); // NOLINT - - for (j = 0; j < width; j++) { - if (pos[j] < blackclamp[0]) - pos[j] = blackclamp[0]; - - if (pos[j] > 255 + whiteclamp[0]) - pos[j] = 255 + whiteclamp[0]; - - pos[j] += ref[j]; - } - } -} - static void swap_mi_and_prev_mi(VP10_COMMON *cm) { // Current mip will be the prev_mip for the next frame. MODE_INFO *temp = cm->postproc_state.prev_mip; @@ -727,7 +702,7 @@ int vp10_post_proc_frame(struct VP10Common *cm, fillrd(ppstate, 63 - q, noise_level); } - vp10_plane_add_noise(ppbuf->y_buffer, ppstate->noise, ppstate->blackclamp, + vpx_plane_add_noise(ppbuf->y_buffer, ppstate->noise, ppstate->blackclamp, ppstate->whiteclamp, ppstate->bothclamp, ppbuf->y_width, ppbuf->y_height, ppbuf->y_stride); } diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/common/scan.c b/chromium/third_party/libvpx/source/libvpx/vp10/common/scan.c index 7217f6d0459..a04f649f71e 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/common/scan.c +++ b/chromium/third_party/libvpx/source/libvpx/vp10/common/scan.c @@ -229,10 +229,8 @@ DECLARE_ALIGNED(16, static const int16_t, default_scan_32x32[1024]) = { 990, 959, 1022, 991, 1023, }; -// Neighborhood 5-tuples for various scans and blocksizes, -// in {top, left, topleft, topright, bottomleft} order -// for each position in raster scan order. -// -1 indicates the neighbor does not exist. +// Neighborhood 2-tuples for various scans and blocksizes, +// in {top, left} order for each position in corresponding scan order. DECLARE_ALIGNED(16, static const int16_t, default_scan_4x4_neighbors[17 * MAX_NEIGHBORS]) = { 0, 0, 0, 0, 0, 0, 1, 4, 4, 4, 1, 1, 8, 8, 5, 8, 2, 2, 2, 5, 9, 12, 6, 9, diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/common/vp10_rtcd_defs.pl b/chromium/third_party/libvpx/source/libvpx/vp10/common/vp10_rtcd_defs.pl index 9860baedfe8..f2414f8115d 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/common/vp10_rtcd_defs.pl +++ b/chromium/third_party/libvpx/source/libvpx/vp10/common/vp10_rtcd_defs.pl @@ -70,10 +70,6 @@ add_proto qw/void vp10_post_proc_down_and_across/, "const uint8_t *src_ptr, uint specialize qw/vp10_post_proc_down_and_across sse2/; $vp10_post_proc_down_and_across_sse2=vp10_post_proc_down_and_across_xmm; -add_proto qw/void vp10_plane_add_noise/, "uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch"; -specialize qw/vp10_plane_add_noise sse2/; -$vp10_plane_add_noise_sse2=vp10_plane_add_noise_wmt; - add_proto qw/void vp10_filter_by_weight16x16/, "const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, int src_weight"; specialize qw/vp10_filter_by_weight16x16 sse2 msa/; @@ -326,9 +322,6 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") { add_proto qw/void vp10_highbd_post_proc_down_and_across/, "const uint16_t *src_ptr, uint16_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit"; specialize qw/vp10_highbd_post_proc_down_and_across/; - - add_proto qw/void vp10_highbd_plane_add_noise/, "uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch"; - specialize qw/vp10_highbd_plane_add_noise/; } # diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/common/x86/postproc_sse2.asm b/chromium/third_party/libvpx/source/libvpx/vp10/common/x86/postproc_sse2.asm index d5f8e927b18..d477a65c293 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/common/x86/postproc_sse2.asm +++ b/chromium/third_party/libvpx/source/libvpx/vp10/common/x86/postproc_sse2.asm @@ -624,68 +624,6 @@ sym(vp10_mbpost_proc_across_ip_xmm): %undef flimit4 -;void vp10_plane_add_noise_wmt (unsigned char *start, unsigned char *noise, -; unsigned char blackclamp[16], -; unsigned char whiteclamp[16], -; unsigned char bothclamp[16], -; unsigned int width, unsigned int height, int pitch) -global sym(vp10_plane_add_noise_wmt) PRIVATE -sym(vp10_plane_add_noise_wmt): - push rbp - mov rbp, rsp - SHADOW_ARGS_TO_STACK 8 - GET_GOT rbx - push rsi - push rdi - ; end prolog - -.addnoise_loop: - call sym(LIBVPX_RAND) WRT_PLT - mov rcx, arg(1) ;noise - and rax, 0xff - add rcx, rax - - ; we rely on the fact that the clamping vectors are stored contiguously - ; in black/white/both order. Note that we have to reload this here because - ; rdx could be trashed by rand() - mov rdx, arg(2) ; blackclamp - - - mov rdi, rcx - movsxd rcx, dword arg(5) ;[Width] - mov rsi, arg(0) ;Pos - xor rax,rax - -.addnoise_nextset: - movdqu xmm1,[rsi+rax] ; get the source - - psubusb xmm1, [rdx] ;blackclamp ; clamp both sides so we don't outrange adding noise - paddusb xmm1, [rdx+32] ;bothclamp - psubusb xmm1, [rdx+16] ;whiteclamp - - movdqu xmm2,[rdi+rax] ; get the noise for this line - paddb xmm1,xmm2 ; add it in - movdqu [rsi+rax],xmm1 ; store the result - - add rax,16 ; move to the next line - - cmp rax, rcx - jl .addnoise_nextset - - movsxd rax, dword arg(7) ; Pitch - add arg(0), rax ; Start += Pitch - sub dword arg(6), 1 ; Height -= 1 - jg .addnoise_loop - - ; begin epilog - pop rdi - pop rsi - RESTORE_GOT - UNSHADOW_ARGS - pop rbp - ret - - SECTION_RODATA align 16 rd42: diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/encodemb.c b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/encodemb.c index 92ba4ddb443..fb11e466ace 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/encodemb.c +++ b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/encodemb.c @@ -57,7 +57,7 @@ typedef struct vp10_token_state { int error; int next; int16_t token; - short qc; + tran_low_t qc; } vp10_token_state; // TODO(jimbankoski): experiment to find optimal RD numbers. diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/encoder.h b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/encoder.h index bd6a00932f6..2cd1d3c4f37 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/encoder.h +++ b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/encoder.h @@ -129,7 +129,7 @@ typedef struct VP10EncoderConfig { int height; // height of data passed to the compressor unsigned int input_bit_depth; // Input bit depth. double init_framerate; // set to passed in framerate - int64_t target_bandwidth; // bandwidth to be used in kilobits per second + int64_t target_bandwidth; // bandwidth to be used in bits per second int noise_sensitivity; // pre processing blur: recommendation 0 int sharpness; // sharpening output: recommendation 0: diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/lookahead.c b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/lookahead.c index dce01390385..3185cb69141 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/lookahead.c +++ b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/lookahead.c @@ -20,8 +20,8 @@ /* Return the buffer at the given absolute index and increment the index */ static struct lookahead_entry *pop(struct lookahead_ctx *ctx, - unsigned int *idx) { - unsigned int index = *idx; + int *idx) { + int index = *idx; struct lookahead_entry *buf = ctx->buf + index; assert(index < ctx->max_sz); @@ -35,7 +35,7 @@ static struct lookahead_entry *pop(struct lookahead_ctx *ctx, void vp10_lookahead_destroy(struct lookahead_ctx *ctx) { if (ctx) { if (ctx->buf) { - unsigned int i; + int i; for (i = 0; i < ctx->max_sz; i++) vpx_free_frame_buffer(&ctx->buf[i].img); @@ -221,9 +221,9 @@ struct lookahead_entry *vp10_lookahead_peek(struct lookahead_ctx *ctx, if (index >= 0) { // Forward peek - if (index < (int)ctx->sz) { + if (index < ctx->sz) { index += ctx->read_idx; - if (index >= (int)ctx->max_sz) + if (index >= ctx->max_sz) index -= ctx->max_sz; buf = ctx->buf + index; } diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/lookahead.h b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/lookahead.h index 22429aeeb00..f650f8028e4 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/lookahead.h +++ b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/lookahead.h @@ -31,10 +31,10 @@ struct lookahead_entry { #define MAX_PRE_FRAMES 1 struct lookahead_ctx { - unsigned int max_sz; /* Absolute size of the queue */ - unsigned int sz; /* Number of buffers currently in the queue */ - unsigned int read_idx; /* Read index */ - unsigned int write_idx; /* Write index */ + int max_sz; /* Absolute size of the queue */ + int sz; /* Number of buffers currently in the queue */ + int read_idx; /* Read index */ + int write_idx; /* Write index */ struct lookahead_entry *buf; /* Buffer list */ }; diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/quantize.c b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/quantize.c index 86b324f1a13..136efe34acf 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/quantize.c +++ b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/quantize.c @@ -219,12 +219,12 @@ void vp10_regular_quantize_b_4x4(MACROBLOCK *x, int plane, int block, static void invert_quant(int16_t *quant, int16_t *shift, int d) { unsigned t; - int l; + int l, m; t = d; for (l = 0; t > 1; l++) t >>= 1; - t = 1 + (1 << (16 + l)) / d; - *quant = (int16_t)(t - (1 << 16)); + m = 1 + (1 << (16 + l)) / d; + *quant = (int16_t)(m - (1 << 16)); *shift = 1 << (16 - l); } diff --git a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/resize.c b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/resize.c index e339fa363b5..353e513f359 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp10/encoder/resize.c +++ b/chromium/third_party/libvpx/source/libvpx/vp10/encoder/resize.c @@ -445,7 +445,7 @@ static void resize_multistep(const uint8_t *const input, int length, uint8_t *output, int olength, - uint8_t *buf) { + uint8_t *otmp) { int steps; if (length == olength) { memcpy(output, input, sizeof(output[0]) * length); @@ -456,16 +456,10 @@ static void resize_multistep(const uint8_t *const input, if (steps > 0) { int s; uint8_t *out = NULL; - uint8_t *tmpbuf = NULL; - uint8_t *otmp, *otmp2; + uint8_t *otmp2; int filteredlength = length; - if (!tmpbuf) { - tmpbuf = (uint8_t *)malloc(sizeof(uint8_t) * length); - if (tmpbuf == NULL) return; - otmp = tmpbuf; - } else { - otmp = buf; - } + + assert(otmp != NULL); otmp2 = otmp + get_down2_length(length, 1); for (s = 0; s < steps; ++s) { const int proj_filteredlength = get_down2_length(filteredlength, 1); @@ -483,8 +477,6 @@ static void resize_multistep(const uint8_t *const input, if (filteredlength != olength) { interpolate(out, filteredlength, output, olength); } - if (tmpbuf) - free(tmpbuf); } else { interpolate(input, length, output, olength); } @@ -520,8 +512,11 @@ void vp10_resize_plane(const uint8_t *const input, uint8_t *intbuf = (uint8_t *)malloc(sizeof(uint8_t) * width2 * height); uint8_t *tmpbuf = (uint8_t *)malloc(sizeof(uint8_t) * (width < height ? height : width)); - uint8_t *arrbuf = (uint8_t *)malloc(sizeof(uint8_t) * (height + height2)); - if (intbuf == NULL || tmpbuf == NULL || arrbuf == NULL) goto Error; + uint8_t *arrbuf = (uint8_t *)malloc(sizeof(uint8_t) * height); + uint8_t *arrbuf2 = (uint8_t *)malloc(sizeof(uint8_t) * height2); + if (intbuf == NULL || tmpbuf == NULL || + arrbuf == NULL || arrbuf2 == NULL) + goto Error; assert(width > 0); assert(height > 0); assert(width2 > 0); @@ -531,14 +526,15 @@ void vp10_resize_plane(const uint8_t *const input, intbuf + width2 * i, width2, tmpbuf); for (i = 0; i < width2; ++i) { fill_col_to_arr(intbuf + i, width2, height, arrbuf); - resize_multistep(arrbuf, height, arrbuf + height, height2, tmpbuf); - fill_arr_to_col(output + i, out_stride, height2, arrbuf + height); + resize_multistep(arrbuf, height, arrbuf2, height2, tmpbuf); + fill_arr_to_col(output + i, out_stride, height2, arrbuf2); } Error: free(intbuf); free(tmpbuf); free(arrbuf); + free(arrbuf2); } #if CONFIG_VP9_HIGHBITDEPTH @@ -741,7 +737,7 @@ static void highbd_resize_multistep(const uint16_t *const input, int length, uint16_t *output, int olength, - uint16_t *buf, + uint16_t *otmp, int bd) { int steps; if (length == olength) { @@ -753,16 +749,10 @@ static void highbd_resize_multistep(const uint16_t *const input, if (steps > 0) { int s; uint16_t *out = NULL; - uint16_t *tmpbuf = NULL; - uint16_t *otmp, *otmp2; + uint16_t *otmp2; int filteredlength = length; - if (!tmpbuf) { - tmpbuf = (uint16_t *)malloc(sizeof(uint16_t) * length); - if (tmpbuf == NULL) return; - otmp = tmpbuf; - } else { - otmp = buf; - } + + assert(otmp != NULL); otmp2 = otmp + get_down2_length(length, 1); for (s = 0; s < steps; ++s) { const int proj_filteredlength = get_down2_length(filteredlength, 1); @@ -780,8 +770,6 @@ static void highbd_resize_multistep(const uint16_t *const input, if (filteredlength != olength) { highbd_interpolate(out, filteredlength, output, olength, bd); } - if (tmpbuf) - free(tmpbuf); } else { highbd_interpolate(input, length, output, olength, bd); } @@ -820,24 +808,27 @@ void vp10_highbd_resize_plane(const uint8_t *const input, uint16_t *intbuf = (uint16_t *)malloc(sizeof(uint16_t) * width2 * height); uint16_t *tmpbuf = (uint16_t *)malloc(sizeof(uint16_t) * (width < height ? height : width)); - uint16_t *arrbuf = (uint16_t *)malloc(sizeof(uint16_t) * (height + height2)); - if (intbuf == NULL || tmpbuf == NULL || arrbuf == NULL) goto Error; + uint16_t *arrbuf = (uint16_t *)malloc(sizeof(uint16_t) * height); + uint16_t *arrbuf2 = (uint16_t *)malloc(sizeof(uint16_t) * height2); + if (intbuf == NULL || tmpbuf == NULL || + arrbuf == NULL || arrbuf2 == NULL) goto Error; for (i = 0; i < height; ++i) { highbd_resize_multistep(CONVERT_TO_SHORTPTR(input + in_stride * i), width, intbuf + width2 * i, width2, tmpbuf, bd); } for (i = 0; i < width2; ++i) { highbd_fill_col_to_arr(intbuf + i, width2, height, arrbuf); - highbd_resize_multistep(arrbuf, height, arrbuf + height, height2, tmpbuf, + highbd_resize_multistep(arrbuf, height, arrbuf2, height2, tmpbuf, bd); highbd_fill_arr_to_col(CONVERT_TO_SHORTPTR(output + i), out_stride, height2, - arrbuf + height); + arrbuf2); } Error: free(intbuf); free(tmpbuf); free(arrbuf); + free(arrbuf2); } #endif // CONFIG_VP9_HIGHBITDEPTH diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/common/arm/neon/bilinearpredict_neon.c b/chromium/third_party/libvpx/source/libvpx/vp8/common/arm/neon/bilinearpredict_neon.c index 9824a319368..bb6ea76ba47 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/common/arm/neon/bilinearpredict_neon.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/common/arm/neon/bilinearpredict_neon.c @@ -21,114 +21,6 @@ static const uint8_t bifilter4_coeff[8][2] = { { 16, 112} }; -void vp8_bilinear_predict4x4_neon( - unsigned char *src_ptr, - int src_pixels_per_line, - int xoffset, - int yoffset, - unsigned char *dst_ptr, - int dst_pitch) { - uint8x8_t d0u8, d1u8, d2u8, d3u8, d4u8, d5u8, d6u8; - uint8x8_t d26u8, d27u8, d28u8, d29u8, d30u8; - uint8x16_t q1u8, q2u8; - uint16x8_t q1u16, q2u16; - uint16x8_t q7u16, q8u16, q9u16; - uint64x2_t q4u64, q5u64; - uint64x1_t d12u64; - uint32x2x2_t d0u32x2, d1u32x2, d2u32x2, d3u32x2; - - if (xoffset == 0) { // skip_1stpass_filter - uint32x2_t d28u32 = vdup_n_u32(0); - uint32x2_t d29u32 = vdup_n_u32(0); - uint32x2_t d30u32 = vdup_n_u32(0); - - d28u32 = vld1_lane_u32((const uint32_t *)src_ptr, d28u32, 0); - src_ptr += src_pixels_per_line; - d28u32 = vld1_lane_u32((const uint32_t *)src_ptr, d28u32, 1); - src_ptr += src_pixels_per_line; - d29u32 = vld1_lane_u32((const uint32_t *)src_ptr, d29u32, 0); - src_ptr += src_pixels_per_line; - d29u32 = vld1_lane_u32((const uint32_t *)src_ptr, d29u32, 1); - src_ptr += src_pixels_per_line; - d30u32 = vld1_lane_u32((const uint32_t *)src_ptr, d30u32, 0); - d28u8 = vreinterpret_u8_u32(d28u32); - d29u8 = vreinterpret_u8_u32(d29u32); - d30u8 = vreinterpret_u8_u32(d30u32); - } else { - d2u8 = vld1_u8(src_ptr); src_ptr += src_pixels_per_line; - d3u8 = vld1_u8(src_ptr); src_ptr += src_pixels_per_line; - d4u8 = vld1_u8(src_ptr); src_ptr += src_pixels_per_line; - d5u8 = vld1_u8(src_ptr); src_ptr += src_pixels_per_line; - d6u8 = vld1_u8(src_ptr); - - q1u8 = vcombine_u8(d2u8, d3u8); - q2u8 = vcombine_u8(d4u8, d5u8); - - d0u8 = vdup_n_u8(bifilter4_coeff[xoffset][0]); - d1u8 = vdup_n_u8(bifilter4_coeff[xoffset][1]); - - q4u64 = vshrq_n_u64(vreinterpretq_u64_u8(q1u8), 8); - q5u64 = vshrq_n_u64(vreinterpretq_u64_u8(q2u8), 8); - d12u64 = vshr_n_u64(vreinterpret_u64_u8(d6u8), 8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u8(vget_low_u8(q1u8)), - vreinterpret_u32_u8(vget_high_u8(q1u8))); - d1u32x2 = vzip_u32(vreinterpret_u32_u8(vget_low_u8(q2u8)), - vreinterpret_u32_u8(vget_high_u8(q2u8))); - d2u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q4u64)), - vreinterpret_u32_u64(vget_high_u64(q4u64))); - d3u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q5u64)), - vreinterpret_u32_u64(vget_high_u64(q5u64))); - - q7u16 = vmull_u8(vreinterpret_u8_u32(d0u32x2.val[0]), d0u8); - q8u16 = vmull_u8(vreinterpret_u8_u32(d1u32x2.val[0]), d0u8); - q9u16 = vmull_u8(d6u8, d0u8); - - q7u16 = vmlal_u8(q7u16, vreinterpret_u8_u32(d2u32x2.val[0]), d1u8); - q8u16 = vmlal_u8(q8u16, vreinterpret_u8_u32(d3u32x2.val[0]), d1u8); - q9u16 = vmlal_u8(q9u16, vreinterpret_u8_u64(d12u64), d1u8); - - d28u8 = vqrshrn_n_u16(q7u16, 7); - d29u8 = vqrshrn_n_u16(q8u16, 7); - d30u8 = vqrshrn_n_u16(q9u16, 7); - } - - // secondpass_filter - if (yoffset == 0) { // skip_2ndpass_filter - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d28u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d28u8), 1); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d29u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d29u8), 1); - } else { - d0u8 = vdup_n_u8(bifilter4_coeff[yoffset][0]); - d1u8 = vdup_n_u8(bifilter4_coeff[yoffset][1]); - - q1u16 = vmull_u8(d28u8, d0u8); - q2u16 = vmull_u8(d29u8, d0u8); - - d26u8 = vext_u8(d28u8, d29u8, 4); - d27u8 = vext_u8(d29u8, d30u8, 4); - - q1u16 = vmlal_u8(q1u16, d26u8, d1u8); - q2u16 = vmlal_u8(q2u16, d27u8, d1u8); - - d2u8 = vqrshrn_n_u16(q1u16, 7); - d3u8 = vqrshrn_n_u16(q2u16, 7); - - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d2u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d2u8), 1); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d3u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d3u8), 1); - } - return; -} - void vp8_bilinear_predict8x4_neon( unsigned char *src_ptr, int src_pixels_per_line, diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/common/arm/neon/sixtappredict_neon.c b/chromium/third_party/libvpx/source/libvpx/vp8/common/arm/neon/sixtappredict_neon.c index 4c2efc92b13..49d8d221fc7 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/common/arm/neon/sixtappredict_neon.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/common/arm/neon/sixtappredict_neon.c @@ -22,383 +22,6 @@ static const int8_t vp8_sub_pel_filters[8][8] = { {0, -1, 12, 123, -6, 0, 0, 0}, }; -void vp8_sixtap_predict4x4_neon( - unsigned char *src_ptr, - int src_pixels_per_line, - int xoffset, - int yoffset, - unsigned char *dst_ptr, - int dst_pitch) { - unsigned char *src; - uint8x8_t d0u8, d1u8, d2u8, d3u8, d4u8, d5u8, d18u8, d19u8, d20u8, d21u8; - uint8x8_t d23u8, d24u8, d25u8, d26u8, d27u8, d28u8, d29u8, d30u8, d31u8; - int8x8_t dtmps8, d0s8, d1s8, d2s8, d3s8, d4s8, d5s8; - uint16x8_t q3u16, q4u16, q5u16, q6u16, q7u16; - uint16x8_t q8u16, q9u16, q10u16, q11u16, q12u16; - int16x8_t q3s16, q4s16, q5s16, q6s16, q7s16; - int16x8_t q8s16, q9s16, q10s16, q11s16, q12s16; - uint8x16_t q3u8, q4u8, q5u8, q6u8, q11u8; - uint64x2_t q3u64, q4u64, q5u64, q6u64, q9u64, q10u64; - uint32x2x2_t d0u32x2, d1u32x2; - - if (xoffset == 0) { // secondpass_filter4x4_only - uint32x2_t d27u32 = vdup_n_u32(0); - uint32x2_t d28u32 = vdup_n_u32(0); - uint32x2_t d29u32 = vdup_n_u32(0); - uint32x2_t d30u32 = vdup_n_u32(0); - uint32x2_t d31u32 = vdup_n_u32(0); - - // load second_pass filter - dtmps8 = vld1_s8(vp8_sub_pel_filters[yoffset]); - d0s8 = vdup_lane_s8(dtmps8, 0); - d1s8 = vdup_lane_s8(dtmps8, 1); - d2s8 = vdup_lane_s8(dtmps8, 2); - d3s8 = vdup_lane_s8(dtmps8, 3); - d4s8 = vdup_lane_s8(dtmps8, 4); - d5s8 = vdup_lane_s8(dtmps8, 5); - d0u8 = vreinterpret_u8_s8(vabs_s8(d0s8)); - d1u8 = vreinterpret_u8_s8(vabs_s8(d1s8)); - d2u8 = vreinterpret_u8_s8(vabs_s8(d2s8)); - d3u8 = vreinterpret_u8_s8(vabs_s8(d3s8)); - d4u8 = vreinterpret_u8_s8(vabs_s8(d4s8)); - d5u8 = vreinterpret_u8_s8(vabs_s8(d5s8)); - - // load src data - src = src_ptr - src_pixels_per_line * 2; - d27u32 = vld1_lane_u32((const uint32_t *)src, d27u32, 0); - src += src_pixels_per_line; - d27u32 = vld1_lane_u32((const uint32_t *)src, d27u32, 1); - src += src_pixels_per_line; - d28u32 = vld1_lane_u32((const uint32_t *)src, d28u32, 0); - src += src_pixels_per_line; - d28u32 = vld1_lane_u32((const uint32_t *)src, d28u32, 1); - src += src_pixels_per_line; - d29u32 = vld1_lane_u32((const uint32_t *)src, d29u32, 0); - src += src_pixels_per_line; - d29u32 = vld1_lane_u32((const uint32_t *)src, d29u32, 1); - src += src_pixels_per_line; - d30u32 = vld1_lane_u32((const uint32_t *)src, d30u32, 0); - src += src_pixels_per_line; - d30u32 = vld1_lane_u32((const uint32_t *)src, d30u32, 1); - src += src_pixels_per_line; - d31u32 = vld1_lane_u32((const uint32_t *)src, d31u32, 0); - - d27u8 = vreinterpret_u8_u32(d27u32); - d28u8 = vreinterpret_u8_u32(d28u32); - d29u8 = vreinterpret_u8_u32(d29u32); - d30u8 = vreinterpret_u8_u32(d30u32); - d31u8 = vreinterpret_u8_u32(d31u32); - - d23u8 = vext_u8(d27u8, d28u8, 4); - d24u8 = vext_u8(d28u8, d29u8, 4); - d25u8 = vext_u8(d29u8, d30u8, 4); - d26u8 = vext_u8(d30u8, d31u8, 4); - - q3u16 = vmull_u8(d27u8, d0u8); - q4u16 = vmull_u8(d28u8, d0u8); - q5u16 = vmull_u8(d25u8, d5u8); - q6u16 = vmull_u8(d26u8, d5u8); - - q3u16 = vmlsl_u8(q3u16, d29u8, d4u8); - q4u16 = vmlsl_u8(q4u16, d30u8, d4u8); - q5u16 = vmlsl_u8(q5u16, d23u8, d1u8); - q6u16 = vmlsl_u8(q6u16, d24u8, d1u8); - - q3u16 = vmlal_u8(q3u16, d28u8, d2u8); - q4u16 = vmlal_u8(q4u16, d29u8, d2u8); - q5u16 = vmlal_u8(q5u16, d24u8, d3u8); - q6u16 = vmlal_u8(q6u16, d25u8, d3u8); - - q3s16 = vreinterpretq_s16_u16(q3u16); - q4s16 = vreinterpretq_s16_u16(q4u16); - q5s16 = vreinterpretq_s16_u16(q5u16); - q6s16 = vreinterpretq_s16_u16(q6u16); - - q5s16 = vqaddq_s16(q5s16, q3s16); - q6s16 = vqaddq_s16(q6s16, q4s16); - - d3u8 = vqrshrun_n_s16(q5s16, 7); - d4u8 = vqrshrun_n_s16(q6s16, 7); - - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d3u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d3u8), 1); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d4u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d4u8), 1); - return; - } - - // load first_pass filter - dtmps8 = vld1_s8(vp8_sub_pel_filters[xoffset]); - d0s8 = vdup_lane_s8(dtmps8, 0); - d1s8 = vdup_lane_s8(dtmps8, 1); - d2s8 = vdup_lane_s8(dtmps8, 2); - d3s8 = vdup_lane_s8(dtmps8, 3); - d4s8 = vdup_lane_s8(dtmps8, 4); - d5s8 = vdup_lane_s8(dtmps8, 5); - d0u8 = vreinterpret_u8_s8(vabs_s8(d0s8)); - d1u8 = vreinterpret_u8_s8(vabs_s8(d1s8)); - d2u8 = vreinterpret_u8_s8(vabs_s8(d2s8)); - d3u8 = vreinterpret_u8_s8(vabs_s8(d3s8)); - d4u8 = vreinterpret_u8_s8(vabs_s8(d4s8)); - d5u8 = vreinterpret_u8_s8(vabs_s8(d5s8)); - - // First pass: output_height lines x output_width columns (9x4) - - if (yoffset == 0) // firstpass_filter4x4_only - src = src_ptr - 2; - else - src = src_ptr - 2 - (src_pixels_per_line * 2); - - q3u8 = vld1q_u8(src); - src += src_pixels_per_line; - q4u8 = vld1q_u8(src); - src += src_pixels_per_line; - q5u8 = vld1q_u8(src); - src += src_pixels_per_line; - q6u8 = vld1q_u8(src); - src += src_pixels_per_line; - - d18u8 = vext_u8(vget_low_u8(q3u8), vget_high_u8(q3u8), 5); - d19u8 = vext_u8(vget_low_u8(q4u8), vget_high_u8(q4u8), 5); - d20u8 = vext_u8(vget_low_u8(q5u8), vget_high_u8(q5u8), 5); - d21u8 = vext_u8(vget_low_u8(q6u8), vget_high_u8(q6u8), 5); - - // vswp here - q3u8 = vcombine_u8(vget_low_u8(q3u8), vget_low_u8(q4u8)); - q5u8 = vcombine_u8(vget_low_u8(q5u8), vget_low_u8(q6u8)); - - d0u32x2 = vzip_u32(vreinterpret_u32_u8(d18u8), // d18 d19 - vreinterpret_u32_u8(d19u8)); - d1u32x2 = vzip_u32(vreinterpret_u32_u8(d20u8), // d20 d21 - vreinterpret_u32_u8(d21u8)); - q7u16 = vmull_u8(vreinterpret_u8_u32(d0u32x2.val[0]), d5u8); - q8u16 = vmull_u8(vreinterpret_u8_u32(d1u32x2.val[0]), d5u8); - - // keep original src data in q4 q6 - q4u64 = vreinterpretq_u64_u8(q3u8); - q6u64 = vreinterpretq_u64_u8(q5u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u8(vget_low_u8(q3u8)), // d6 d7 - vreinterpret_u32_u8(vget_high_u8(q3u8))); - d1u32x2 = vzip_u32(vreinterpret_u32_u8(vget_low_u8(q5u8)), // d10 d11 - vreinterpret_u32_u8(vget_high_u8(q5u8))); - q9u64 = vshrq_n_u64(q4u64, 8); - q10u64 = vshrq_n_u64(q6u64, 8); - q7u16 = vmlal_u8(q7u16, vreinterpret_u8_u32(d0u32x2.val[0]), d0u8); - q8u16 = vmlal_u8(q8u16, vreinterpret_u8_u32(d1u32x2.val[0]), d0u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q9u64)), // d18 d19 - vreinterpret_u32_u64(vget_high_u64(q9u64))); - d1u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q10u64)), // d20 d211 - vreinterpret_u32_u64(vget_high_u64(q10u64))); - q3u64 = vshrq_n_u64(q4u64, 32); - q5u64 = vshrq_n_u64(q6u64, 32); - q7u16 = vmlsl_u8(q7u16, vreinterpret_u8_u32(d0u32x2.val[0]), d1u8); - q8u16 = vmlsl_u8(q8u16, vreinterpret_u8_u32(d1u32x2.val[0]), d1u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q3u64)), // d6 d7 - vreinterpret_u32_u64(vget_high_u64(q3u64))); - d1u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q5u64)), // d10 d11 - vreinterpret_u32_u64(vget_high_u64(q5u64))); - q9u64 = vshrq_n_u64(q4u64, 16); - q10u64 = vshrq_n_u64(q6u64, 16); - q7u16 = vmlsl_u8(q7u16, vreinterpret_u8_u32(d0u32x2.val[0]), d4u8); - q8u16 = vmlsl_u8(q8u16, vreinterpret_u8_u32(d1u32x2.val[0]), d4u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q9u64)), // d18 d19 - vreinterpret_u32_u64(vget_high_u64(q9u64))); - d1u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q10u64)), // d20 d211 - vreinterpret_u32_u64(vget_high_u64(q10u64))); - q3u64 = vshrq_n_u64(q4u64, 24); - q5u64 = vshrq_n_u64(q6u64, 24); - q7u16 = vmlal_u8(q7u16, vreinterpret_u8_u32(d0u32x2.val[0]), d2u8); - q8u16 = vmlal_u8(q8u16, vreinterpret_u8_u32(d1u32x2.val[0]), d2u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q3u64)), // d6 d7 - vreinterpret_u32_u64(vget_high_u64(q3u64))); - d1u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q5u64)), // d10 d11 - vreinterpret_u32_u64(vget_high_u64(q5u64))); - q9u16 = vmull_u8(vreinterpret_u8_u32(d0u32x2.val[0]), d3u8); - q10u16 = vmull_u8(vreinterpret_u8_u32(d1u32x2.val[0]), d3u8); - - q7s16 = vreinterpretq_s16_u16(q7u16); - q8s16 = vreinterpretq_s16_u16(q8u16); - q9s16 = vreinterpretq_s16_u16(q9u16); - q10s16 = vreinterpretq_s16_u16(q10u16); - q7s16 = vqaddq_s16(q7s16, q9s16); - q8s16 = vqaddq_s16(q8s16, q10s16); - - d27u8 = vqrshrun_n_s16(q7s16, 7); - d28u8 = vqrshrun_n_s16(q8s16, 7); - - if (yoffset == 0) { // firstpass_filter4x4_only - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d27u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d27u8), 1); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d28u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d28u8), 1); - return; - } - - // First Pass on rest 5-line data - q3u8 = vld1q_u8(src); - src += src_pixels_per_line; - q4u8 = vld1q_u8(src); - src += src_pixels_per_line; - q5u8 = vld1q_u8(src); - src += src_pixels_per_line; - q6u8 = vld1q_u8(src); - src += src_pixels_per_line; - q11u8 = vld1q_u8(src); - - d18u8 = vext_u8(vget_low_u8(q3u8), vget_high_u8(q3u8), 5); - d19u8 = vext_u8(vget_low_u8(q4u8), vget_high_u8(q4u8), 5); - d20u8 = vext_u8(vget_low_u8(q5u8), vget_high_u8(q5u8), 5); - d21u8 = vext_u8(vget_low_u8(q6u8), vget_high_u8(q6u8), 5); - - // vswp here - q3u8 = vcombine_u8(vget_low_u8(q3u8), vget_low_u8(q4u8)); - q5u8 = vcombine_u8(vget_low_u8(q5u8), vget_low_u8(q6u8)); - - d0u32x2 = vzip_u32(vreinterpret_u32_u8(d18u8), // d18 d19 - vreinterpret_u32_u8(d19u8)); - d1u32x2 = vzip_u32(vreinterpret_u32_u8(d20u8), // d20 d21 - vreinterpret_u32_u8(d21u8)); - d31u8 = vext_u8(vget_low_u8(q11u8), vget_high_u8(q11u8), 5); - q7u16 = vmull_u8(vreinterpret_u8_u32(d0u32x2.val[0]), d5u8); - q8u16 = vmull_u8(vreinterpret_u8_u32(d1u32x2.val[0]), d5u8); - q12u16 = vmull_u8(d31u8, d5u8); - - q4u64 = vreinterpretq_u64_u8(q3u8); - q6u64 = vreinterpretq_u64_u8(q5u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u8(vget_low_u8(q3u8)), // d6 d7 - vreinterpret_u32_u8(vget_high_u8(q3u8))); - d1u32x2 = vzip_u32(vreinterpret_u32_u8(vget_low_u8(q5u8)), // d10 d11 - vreinterpret_u32_u8(vget_high_u8(q5u8))); - q9u64 = vshrq_n_u64(q4u64, 8); - q10u64 = vshrq_n_u64(q6u64, 8); - q7u16 = vmlal_u8(q7u16, vreinterpret_u8_u32(d0u32x2.val[0]), d0u8); - q8u16 = vmlal_u8(q8u16, vreinterpret_u8_u32(d1u32x2.val[0]), d0u8); - q12u16 = vmlal_u8(q12u16, vget_low_u8(q11u8), d0u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q9u64)), // d18 d19 - vreinterpret_u32_u64(vget_high_u64(q9u64))); - d1u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q10u64)), // d20 d211 - vreinterpret_u32_u64(vget_high_u64(q10u64))); - q3u64 = vshrq_n_u64(q4u64, 32); - q5u64 = vshrq_n_u64(q6u64, 32); - d31u8 = vext_u8(vget_low_u8(q11u8), vget_high_u8(q11u8), 1); - q7u16 = vmlsl_u8(q7u16, vreinterpret_u8_u32(d0u32x2.val[0]), d1u8); - q8u16 = vmlsl_u8(q8u16, vreinterpret_u8_u32(d1u32x2.val[0]), d1u8); - q12u16 = vmlsl_u8(q12u16, d31u8, d1u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q3u64)), // d6 d7 - vreinterpret_u32_u64(vget_high_u64(q3u64))); - d1u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q5u64)), // d10 d11 - vreinterpret_u32_u64(vget_high_u64(q5u64))); - q9u64 = vshrq_n_u64(q4u64, 16); - q10u64 = vshrq_n_u64(q6u64, 16); - d31u8 = vext_u8(vget_low_u8(q11u8), vget_high_u8(q11u8), 4); - q7u16 = vmlsl_u8(q7u16, vreinterpret_u8_u32(d0u32x2.val[0]), d4u8); - q8u16 = vmlsl_u8(q8u16, vreinterpret_u8_u32(d1u32x2.val[0]), d4u8); - q12u16 = vmlsl_u8(q12u16, d31u8, d4u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q9u64)), // d18 d19 - vreinterpret_u32_u64(vget_high_u64(q9u64))); - d1u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q10u64)), // d20 d211 - vreinterpret_u32_u64(vget_high_u64(q10u64))); - q3u64 = vshrq_n_u64(q4u64, 24); - q5u64 = vshrq_n_u64(q6u64, 24); - d31u8 = vext_u8(vget_low_u8(q11u8), vget_high_u8(q11u8), 2); - q7u16 = vmlal_u8(q7u16, vreinterpret_u8_u32(d0u32x2.val[0]), d2u8); - q8u16 = vmlal_u8(q8u16, vreinterpret_u8_u32(d1u32x2.val[0]), d2u8); - q12u16 = vmlal_u8(q12u16, d31u8, d2u8); - - d0u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q3u64)), // d6 d7 - vreinterpret_u32_u64(vget_high_u64(q3u64))); - d1u32x2 = vzip_u32(vreinterpret_u32_u64(vget_low_u64(q5u64)), // d10 d11 - vreinterpret_u32_u64(vget_high_u64(q5u64))); - d31u8 = vext_u8(vget_low_u8(q11u8), vget_high_u8(q11u8), 3); - q9u16 = vmull_u8(vreinterpret_u8_u32(d0u32x2.val[0]), d3u8); - q10u16 = vmull_u8(vreinterpret_u8_u32(d1u32x2.val[0]), d3u8); - q11u16 = vmull_u8(d31u8, d3u8); - - q7s16 = vreinterpretq_s16_u16(q7u16); - q8s16 = vreinterpretq_s16_u16(q8u16); - q9s16 = vreinterpretq_s16_u16(q9u16); - q10s16 = vreinterpretq_s16_u16(q10u16); - q11s16 = vreinterpretq_s16_u16(q11u16); - q12s16 = vreinterpretq_s16_u16(q12u16); - q7s16 = vqaddq_s16(q7s16, q9s16); - q8s16 = vqaddq_s16(q8s16, q10s16); - q12s16 = vqaddq_s16(q12s16, q11s16); - - d29u8 = vqrshrun_n_s16(q7s16, 7); - d30u8 = vqrshrun_n_s16(q8s16, 7); - d31u8 = vqrshrun_n_s16(q12s16, 7); - - // Second pass: 4x4 - dtmps8 = vld1_s8(vp8_sub_pel_filters[yoffset]); - d0s8 = vdup_lane_s8(dtmps8, 0); - d1s8 = vdup_lane_s8(dtmps8, 1); - d2s8 = vdup_lane_s8(dtmps8, 2); - d3s8 = vdup_lane_s8(dtmps8, 3); - d4s8 = vdup_lane_s8(dtmps8, 4); - d5s8 = vdup_lane_s8(dtmps8, 5); - d0u8 = vreinterpret_u8_s8(vabs_s8(d0s8)); - d1u8 = vreinterpret_u8_s8(vabs_s8(d1s8)); - d2u8 = vreinterpret_u8_s8(vabs_s8(d2s8)); - d3u8 = vreinterpret_u8_s8(vabs_s8(d3s8)); - d4u8 = vreinterpret_u8_s8(vabs_s8(d4s8)); - d5u8 = vreinterpret_u8_s8(vabs_s8(d5s8)); - - d23u8 = vext_u8(d27u8, d28u8, 4); - d24u8 = vext_u8(d28u8, d29u8, 4); - d25u8 = vext_u8(d29u8, d30u8, 4); - d26u8 = vext_u8(d30u8, d31u8, 4); - - q3u16 = vmull_u8(d27u8, d0u8); - q4u16 = vmull_u8(d28u8, d0u8); - q5u16 = vmull_u8(d25u8, d5u8); - q6u16 = vmull_u8(d26u8, d5u8); - - q3u16 = vmlsl_u8(q3u16, d29u8, d4u8); - q4u16 = vmlsl_u8(q4u16, d30u8, d4u8); - q5u16 = vmlsl_u8(q5u16, d23u8, d1u8); - q6u16 = vmlsl_u8(q6u16, d24u8, d1u8); - - q3u16 = vmlal_u8(q3u16, d28u8, d2u8); - q4u16 = vmlal_u8(q4u16, d29u8, d2u8); - q5u16 = vmlal_u8(q5u16, d24u8, d3u8); - q6u16 = vmlal_u8(q6u16, d25u8, d3u8); - - q3s16 = vreinterpretq_s16_u16(q3u16); - q4s16 = vreinterpretq_s16_u16(q4u16); - q5s16 = vreinterpretq_s16_u16(q5u16); - q6s16 = vreinterpretq_s16_u16(q6u16); - - q5s16 = vqaddq_s16(q5s16, q3s16); - q6s16 = vqaddq_s16(q6s16, q4s16); - - d3u8 = vqrshrun_n_s16(q5s16, 7); - d4u8 = vqrshrun_n_s16(q6s16, 7); - - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d3u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d3u8), 1); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d4u8), 0); - dst_ptr += dst_pitch; - vst1_lane_u32((uint32_t *)dst_ptr, vreinterpret_u32_u8(d4u8), 1); - return; -} - void vp8_sixtap_predict8x4_neon( unsigned char *src_ptr, int src_pixels_per_line, diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/common/mips/msa/postproc_msa.c b/chromium/third_party/libvpx/source/libvpx/vp8/common/mips/msa/postproc_msa.c index c88f30238b7..23dcde2eb3f 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/common/mips/msa/postproc_msa.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/common/mips/msa/postproc_msa.c @@ -10,6 +10,7 @@ #include <stdlib.h> #include "./vp8_rtcd.h" +#include "./vpx_dsp_rtcd.h" #include "vp8/common/mips/msa/vp8_macros_msa.h" static const int16_t vp8_rv_msa[] = @@ -798,54 +799,3 @@ void vp8_mbpost_proc_down_msa(uint8_t *dst_ptr, int32_t pitch, int32_t rows, } } } - -void vp8_plane_add_noise_msa(uint8_t *start_ptr, char *noise, - char blackclamp[16], char whiteclamp[16], - char bothclamp[16], - uint32_t width, uint32_t height, - int32_t pitch) -{ - uint32_t i, j; - - for (i = 0; i < height / 2; ++i) - { - uint8_t *pos0_ptr = start_ptr + (2 * i) * pitch; - int8_t *ref0_ptr = (int8_t *) (noise + (rand() & 0xff)); - uint8_t *pos1_ptr = start_ptr + (2 * i + 1) * pitch; - int8_t *ref1_ptr = (int8_t *) (noise + (rand() & 0xff)); - for (j = width / 16; j--;) - { - v16i8 temp00_s, temp01_s; - v16u8 temp00, temp01, black_clamp, white_clamp; - v16u8 pos0, ref0, pos1, ref1; - v16i8 const127 = __msa_ldi_b(127); - - pos0 = LD_UB(pos0_ptr); - ref0 = LD_UB(ref0_ptr); - pos1 = LD_UB(pos1_ptr); - ref1 = LD_UB(ref1_ptr); - black_clamp = (v16u8)__msa_fill_b(blackclamp[0]); - white_clamp = (v16u8)__msa_fill_b(whiteclamp[0]); - temp00 = (pos0 < black_clamp); - pos0 = __msa_bmnz_v(pos0, black_clamp, temp00); - temp01 = (pos1 < black_clamp); - pos1 = __msa_bmnz_v(pos1, black_clamp, temp01); - XORI_B2_128_UB(pos0, pos1); - temp00_s = __msa_adds_s_b((v16i8)white_clamp, const127); - temp00 = (v16u8)(temp00_s < pos0); - pos0 = (v16u8)__msa_bmnz_v((v16u8)pos0, (v16u8)temp00_s, temp00); - temp01_s = __msa_adds_s_b((v16i8)white_clamp, const127); - temp01 = (temp01_s < pos1); - pos1 = (v16u8)__msa_bmnz_v((v16u8)pos1, (v16u8)temp01_s, temp01); - XORI_B2_128_UB(pos0, pos1); - pos0 += ref0; - ST_UB(pos0, pos0_ptr); - pos1 += ref1; - ST_UB(pos1, pos1_ptr); - pos0_ptr += 16; - pos1_ptr += 16; - ref0_ptr += 16; - ref1_ptr += 16; - } - } -} diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/common/postproc.c b/chromium/third_party/libvpx/source/libvpx/vp8/common/postproc.c index 322b61383b5..6baf00f1eac 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/common/postproc.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/common/postproc.c @@ -10,6 +10,7 @@ #include "vpx_config.h" +#include "vpx_dsp_rtcd.h" #include "vp8_rtcd.h" #include "vpx_scale_rtcd.h" #include "vpx_scale/yv12config.h" @@ -490,54 +491,6 @@ static void fillrd(struct postproc_state *state, int q, int a) state->last_noise = a; } -/**************************************************************************** - * - * ROUTINE : plane_add_noise_c - * - * INPUTS : unsigned char *Start starting address of buffer to add gaussian - * noise to - * unsigned int Width width of plane - * unsigned int Height height of plane - * int Pitch distance between subsequent lines of frame - * int q quantizer used to determine amount of noise - * to add - * - * OUTPUTS : None. - * - * RETURNS : void. - * - * FUNCTION : adds gaussian noise to a plane of pixels - * - * SPECIAL NOTES : None. - * - ****************************************************************************/ -void vp8_plane_add_noise_c(unsigned char *Start, char *noise, - char blackclamp[16], - char whiteclamp[16], - char bothclamp[16], - unsigned int Width, unsigned int Height, int Pitch) -{ - unsigned int i, j; - (void)bothclamp; - - for (i = 0; i < Height; i++) - { - unsigned char *Pos = Start + i * Pitch; - char *Ref = (char *)(noise + (rand() & 0xff)); - - for (j = 0; j < Width; j++) - { - if (Pos[j] < blackclamp[0]) - Pos[j] = blackclamp[0]; - - if (Pos[j] > 255 + whiteclamp[0]) - Pos[j] = 255 + whiteclamp[0]; - - Pos[j] += Ref[j]; - } - } -} - /* Blend the macro block with a solid colored square. Leave the * edges unblended to give distinction to macro blocks in areas * filled with the same color block. @@ -828,7 +781,7 @@ int vp8_post_proc_frame(VP8_COMMON *oci, YV12_BUFFER_CONFIG *dest, vp8_ppflags_t fillrd(&oci->postproc_state, 63 - q, noise_level); } - vp8_plane_add_noise + vpx_plane_add_noise (oci->post_proc_buffer.y_buffer, oci->postproc_state.noise, oci->postproc_state.blackclamp, diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/common/rtcd_defs.pl b/chromium/third_party/libvpx/source/libvpx/vp8/common/rtcd_defs.pl index 6799c2787a3..856ede1891f 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/common/rtcd_defs.pl +++ b/chromium/third_party/libvpx/source/libvpx/vp8/common/rtcd_defs.pl @@ -167,10 +167,6 @@ if (vpx_config("CONFIG_POSTPROC") eq "yes") { add_proto qw/void vp8_post_proc_down_and_across_mb_row/, "unsigned char *src, unsigned char *dst, int src_pitch, int dst_pitch, int cols, unsigned char *flimits, int size"; specialize qw/vp8_post_proc_down_and_across_mb_row sse2 msa/; - add_proto qw/void vp8_plane_add_noise/, "unsigned char *s, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int w, unsigned int h, int pitch"; - specialize qw/vp8_plane_add_noise mmx sse2 msa/; - $vp8_plane_add_noise_sse2=vp8_plane_add_noise_wmt; - add_proto qw/void vp8_blend_mb_inner/, "unsigned char *y, unsigned char *u, unsigned char *v, int y1, int u1, int v1, int alpha, int stride"; # no asm yet @@ -209,7 +205,6 @@ $vp8_sixtap_predict8x4_media=vp8_sixtap_predict8x4_armv6; $vp8_sixtap_predict8x4_dspr2=vp8_sixtap_predict8x4_dspr2; add_proto qw/void vp8_sixtap_predict4x4/, "unsigned char *src, int src_pitch, int xofst, int yofst, unsigned char *dst, int dst_pitch"; -#TODO(johannkoenig): fix the neon version https://code.google.com/p/webm/issues/detail?id=817 specialize qw/vp8_sixtap_predict4x4 mmx ssse3 media dspr2 msa/; $vp8_sixtap_predict4x4_media=vp8_sixtap_predict4x4_armv6; $vp8_sixtap_predict4x4_dspr2=vp8_sixtap_predict4x4_dspr2; @@ -227,7 +222,6 @@ specialize qw/vp8_bilinear_predict8x4 mmx media neon msa/; $vp8_bilinear_predict8x4_media=vp8_bilinear_predict8x4_armv6; add_proto qw/void vp8_bilinear_predict4x4/, "unsigned char *src, int src_pitch, int xofst, int yofst, unsigned char *dst, int dst_pitch"; -#TODO(johannkoenig): fix the neon version https://code.google.com/p/webm/issues/detail?id=892 specialize qw/vp8_bilinear_predict4x4 mmx media msa/; $vp8_bilinear_predict4x4_media=vp8_bilinear_predict4x4_armv6; diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/common/x86/postproc_mmx.asm b/chromium/third_party/libvpx/source/libvpx/vp8/common/x86/postproc_mmx.asm index a2b16327f08..1a89e7eadfc 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/common/x86/postproc_mmx.asm +++ b/chromium/third_party/libvpx/source/libvpx/vp8/common/x86/postproc_mmx.asm @@ -241,68 +241,6 @@ sym(vp8_mbpost_proc_down_mmx): %undef flimit2 -;void vp8_plane_add_noise_mmx (unsigned char *Start, unsigned char *noise, -; unsigned char blackclamp[16], -; unsigned char whiteclamp[16], -; unsigned char bothclamp[16], -; unsigned int Width, unsigned int Height, int Pitch) -global sym(vp8_plane_add_noise_mmx) PRIVATE -sym(vp8_plane_add_noise_mmx): - push rbp - mov rbp, rsp - SHADOW_ARGS_TO_STACK 8 - GET_GOT rbx - push rsi - push rdi - ; end prolog - -.addnoise_loop: - call sym(LIBVPX_RAND) WRT_PLT - mov rcx, arg(1) ;noise - and rax, 0xff - add rcx, rax - - ; we rely on the fact that the clamping vectors are stored contiguously - ; in black/white/both order. Note that we have to reload this here because - ; rdx could be trashed by rand() - mov rdx, arg(2) ; blackclamp - - - mov rdi, rcx - movsxd rcx, dword arg(5) ;[Width] - mov rsi, arg(0) ;Pos - xor rax,rax - -.addnoise_nextset: - movq mm1,[rsi+rax] ; get the source - - psubusb mm1, [rdx] ;blackclamp ; clamp both sides so we don't outrange adding noise - paddusb mm1, [rdx+32] ;bothclamp - psubusb mm1, [rdx+16] ;whiteclamp - - movq mm2,[rdi+rax] ; get the noise for this line - paddb mm1,mm2 ; add it in - movq [rsi+rax],mm1 ; store the result - - add rax,8 ; move to the next line - - cmp rax, rcx - jl .addnoise_nextset - - movsxd rax, dword arg(7) ; Pitch - add arg(0), rax ; Start += Pitch - sub dword arg(6), 1 ; Height -= 1 - jg .addnoise_loop - - ; begin epilog - pop rdi - pop rsi - RESTORE_GOT - UNSHADOW_ARGS - pop rbp - ret - - SECTION_RODATA align 16 Blur: diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/common/x86/postproc_sse2.asm b/chromium/third_party/libvpx/source/libvpx/vp8/common/x86/postproc_sse2.asm index fed4ee5ccf8..de17afa5c14 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/common/x86/postproc_sse2.asm +++ b/chromium/third_party/libvpx/source/libvpx/vp8/common/x86/postproc_sse2.asm @@ -655,68 +655,6 @@ sym(vp8_mbpost_proc_across_ip_xmm): %undef flimit4 -;void vp8_plane_add_noise_wmt (unsigned char *Start, unsigned char *noise, -; unsigned char blackclamp[16], -; unsigned char whiteclamp[16], -; unsigned char bothclamp[16], -; unsigned int Width, unsigned int Height, int Pitch) -global sym(vp8_plane_add_noise_wmt) PRIVATE -sym(vp8_plane_add_noise_wmt): - push rbp - mov rbp, rsp - SHADOW_ARGS_TO_STACK 8 - GET_GOT rbx - push rsi - push rdi - ; end prolog - -.addnoise_loop: - call sym(LIBVPX_RAND) WRT_PLT - mov rcx, arg(1) ;noise - and rax, 0xff - add rcx, rax - - ; we rely on the fact that the clamping vectors are stored contiguously - ; in black/white/both order. Note that we have to reload this here because - ; rdx could be trashed by rand() - mov rdx, arg(2) ; blackclamp - - - mov rdi, rcx - movsxd rcx, dword arg(5) ;[Width] - mov rsi, arg(0) ;Pos - xor rax,rax - -.addnoise_nextset: - movdqu xmm1,[rsi+rax] ; get the source - - psubusb xmm1, [rdx] ;blackclamp ; clamp both sides so we don't outrange adding noise - paddusb xmm1, [rdx+32] ;bothclamp - psubusb xmm1, [rdx+16] ;whiteclamp - - movdqu xmm2,[rdi+rax] ; get the noise for this line - paddb xmm1,xmm2 ; add it in - movdqu [rsi+rax],xmm1 ; store the result - - add rax,16 ; move to the next line - - cmp rax, rcx - jl .addnoise_nextset - - movsxd rax, dword arg(7) ; Pitch - add arg(0), rax ; Start += Pitch - sub dword arg(6), 1 ; Height -= 1 - jg .addnoise_loop - - ; begin epilog - pop rdi - pop rsi - RESTORE_GOT - UNSHADOW_ARGS - pop rbp - ret - - SECTION_RODATA align 16 four8s: diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.c index 5ae44e82e1c..cff99c01229 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.c @@ -497,7 +497,8 @@ void vp8_denoiser_denoise_mb(VP8_DENOISER *denoiser, loop_filter_info_n *lfi_n, int mb_row, int mb_col, - int block_index) + int block_index, + int consec_zero_last) { int mv_row; @@ -571,58 +572,69 @@ void vp8_denoiser_denoise_mb(VP8_DENOISER *denoiser, best_sse = zero_mv_sse; } - saved_pre = filter_xd->pre; - saved_dst = filter_xd->dst; - - /* Compensate the running average. */ - filter_xd->pre.y_buffer = src->y_buffer + recon_yoffset; - filter_xd->pre.u_buffer = src->u_buffer + recon_uvoffset; - filter_xd->pre.v_buffer = src->v_buffer + recon_uvoffset; - /* Write the compensated running average to the destination buffer. */ - filter_xd->dst.y_buffer = dst->y_buffer + recon_yoffset; - filter_xd->dst.u_buffer = dst->u_buffer + recon_uvoffset; - filter_xd->dst.v_buffer = dst->v_buffer + recon_uvoffset; - - if (!x->skip) - { - vp8_build_inter_predictors_mb(filter_xd); - } - else - { - vp8_build_inter16x16_predictors_mb(filter_xd, - filter_xd->dst.y_buffer, - filter_xd->dst.u_buffer, - filter_xd->dst.v_buffer, - filter_xd->dst.y_stride, - filter_xd->dst.uv_stride); + mv_row = x->best_sse_mv.as_mv.row; + mv_col = x->best_sse_mv.as_mv.col; + motion_magnitude2 = mv_row * mv_row + mv_col * mv_col; + motion_threshold = denoiser->denoise_pars.scale_motion_thresh * + NOISE_MOTION_THRESHOLD; + + if (motion_magnitude2 < + denoiser->denoise_pars.scale_increase_filter * NOISE_MOTION_THRESHOLD) + x->increase_denoising = 1; + + sse_thresh = denoiser->denoise_pars.scale_sse_thresh * SSE_THRESHOLD; + if (x->increase_denoising) + sse_thresh = + denoiser->denoise_pars.scale_sse_thresh * SSE_THRESHOLD_HIGH; + + if (best_sse > sse_thresh || motion_magnitude2 > motion_threshold) + decision = COPY_BLOCK; + + // If block is considered skin, don't denoise if the block + // (1) is selected as non-zero motion for current frame, or + // (2) has not been selected as ZERO_LAST mode at least x past frames + // in a row. + // TODO(marpan): Parameter "x" should be varied with framerate. + // In particualar, should be reduced for layers (base layer/LAST). + if (x->is_skin && (consec_zero_last < 2 || motion_magnitude2 > 0)) + decision = COPY_BLOCK; + + if (decision == FILTER_BLOCK) { + saved_pre = filter_xd->pre; + saved_dst = filter_xd->dst; + + /* Compensate the running average. */ + filter_xd->pre.y_buffer = src->y_buffer + recon_yoffset; + filter_xd->pre.u_buffer = src->u_buffer + recon_uvoffset; + filter_xd->pre.v_buffer = src->v_buffer + recon_uvoffset; + /* Write the compensated running average to the destination buffer. */ + filter_xd->dst.y_buffer = dst->y_buffer + recon_yoffset; + filter_xd->dst.u_buffer = dst->u_buffer + recon_uvoffset; + filter_xd->dst.v_buffer = dst->v_buffer + recon_uvoffset; + + if (!x->skip) + { + vp8_build_inter_predictors_mb(filter_xd); + } + else + { + vp8_build_inter16x16_predictors_mb(filter_xd, + filter_xd->dst.y_buffer, + filter_xd->dst.u_buffer, + filter_xd->dst.v_buffer, + filter_xd->dst.y_stride, + filter_xd->dst.uv_stride); + } + filter_xd->pre = saved_pre; + filter_xd->dst = saved_dst; + *mbmi = saved_mbmi; } - filter_xd->pre = saved_pre; - filter_xd->dst = saved_dst; - *mbmi = saved_mbmi; - - } - - mv_row = x->best_sse_mv.as_mv.row; - mv_col = x->best_sse_mv.as_mv.col; - motion_magnitude2 = mv_row * mv_row + mv_col * mv_col; - motion_threshold = denoiser->denoise_pars.scale_motion_thresh * - NOISE_MOTION_THRESHOLD; - - // If block is considered to be skin area, lower the motion threshold. - // In current version set threshold = 0, so only denoise zero mv on skin. - if (x->is_skin) - motion_threshold = 0; - - if (motion_magnitude2 < - denoiser->denoise_pars.scale_increase_filter * NOISE_MOTION_THRESHOLD) - x->increase_denoising = 1; - - sse_thresh = denoiser->denoise_pars.scale_sse_thresh * SSE_THRESHOLD; - if (x->increase_denoising) - sse_thresh = denoiser->denoise_pars.scale_sse_thresh * SSE_THRESHOLD_HIGH; - - if (best_sse > sse_thresh || motion_magnitude2 > motion_threshold) + } else { + // zero_frame should always be 1 for real-time mode, as the + // ZEROMV mode is always checked, so we should never go into this branch. + // If case ZEROMV is not checked, then we will force no denoise (COPY). decision = COPY_BLOCK; + } if (decision == FILTER_BLOCK) { diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.h b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.h index 148ccdafe4e..8c126c1cb1b 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.h +++ b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/denoising.h @@ -18,8 +18,8 @@ extern "C" { #endif -#define SUM_DIFF_THRESHOLD 448 -#define SUM_DIFF_THRESHOLD_HIGH 512 +#define SUM_DIFF_THRESHOLD 512 +#define SUM_DIFF_THRESHOLD_HIGH 600 #define MOTION_MAGNITUDE_THRESHOLD (8*3) #define SUM_DIFF_THRESHOLD_UV (96) // (8 * 8 * 1.5) @@ -108,7 +108,8 @@ void vp8_denoiser_denoise_mb(VP8_DENOISER *denoiser, loop_filter_info_n *lfi_n, int mb_row, int mb_col, - int block_index); + int block_index, + int consec_zero_last); #ifdef __cplusplus } // extern "C" diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.c index 768c764ceb3..e20c1ea7b74 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/mcomp.c @@ -1591,7 +1591,6 @@ int vp8_full_search_sadx8(MACROBLOCK *x, BLOCK *b, BLOCKD *d, int_mv *ref_mv, int col_min = ref_col - distance; int col_max = ref_col + distance; - // TODO(johannkoenig): check if this alignment is necessary. DECLARE_ALIGNED(16, unsigned int, sad_array8[8]); unsigned int sad_array[3]; diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.c index 51fbe541c77..24b332dcdb0 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/pickinter.c @@ -36,7 +36,7 @@ extern unsigned int cnt_pm; #endif -#define MODEL_MODE 0 +#define MODEL_MODE 1 extern const int vp8_ref_frame_order[MAX_MODES]; extern const MB_PREDICTION_MODE vp8_mode_order[MAX_MODES]; @@ -90,7 +90,7 @@ static int is_skin_color(int y, int cb, int cr, int consec_zeromv) { int i = 0; // No skin if block has been zero motion for long consecutive time. - if (consec_zeromv > 80) + if (consec_zeromv > 60) return 0; // Exit on grey. if (cb == 128 && cr == 128) @@ -103,7 +103,7 @@ static int is_skin_color(int y, int cb, int cr, int consec_zeromv) if (skin_color_diff < skin_threshold[i + 1]) { if (y < 60 && skin_color_diff > 3 * (skin_threshold[i + 1] >> 2)) return 0; - else if (consec_zeromv > 30 && + else if (consec_zeromv > 25 && skin_color_diff > (skin_threshold[i + 1] >> 1)) return 0; else @@ -1477,7 +1477,8 @@ void vp8_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse, recon_yoffset, recon_uvoffset, &cpi->common.lf_info, mb_row, mb_col, - block_index); + block_index, + cpi->consec_zero_last_mvbias[block_index]); // Reevaluate ZEROMV after denoising: for large noise content // (i.e., cpi->mse_source_denoised is above threshold), do this for all diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.c index ab0ad15990b..9063cea7663 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/rdopt.c @@ -2530,7 +2530,7 @@ void vp8_rd_pick_inter_mode(VP8_COMP *cpi, MACROBLOCK *x, int recon_yoffset, vp8_denoiser_denoise_mb(&cpi->denoiser, x, best_sse, zero_mv_sse, recon_yoffset, recon_uvoffset, &cpi->common.lf_info, mb_row, mb_col, - block_index); + block_index, 0); /* Reevaluate ZEROMV after denoising. */ if (best_mode.mbmode.ref_frame == INTRA_FRAME && diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/vp8_quantize.c b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/vp8_quantize.c index ee922c9d697..0d101ba5ab5 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/encoder/vp8_quantize.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/encoder/vp8_quantize.c @@ -227,12 +227,12 @@ static void invert_quant(int improved_quant, short *quant, if(improved_quant) { unsigned t; - int l; + int l, m; t = d; for(l = 0; t > 1; l++) t>>=1; - t = 1 + (1<<(16+l))/d; - *quant = (short)(t - (1<<16)); + m = 1 + (1<<(16+l))/d; + *quant = (short)(m - (1<<16)); *shift = l; /* use multiplication and constant shift by 16 */ *shift = 1 << (16 - *shift); diff --git a/chromium/third_party/libvpx/source/libvpx/vp8/vp8_dx_iface.c b/chromium/third_party/libvpx/source/libvpx/vp8/vp8_dx_iface.c index 9b58f818637..9c78de19845 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp8/vp8_dx_iface.c +++ b/chromium/third_party/libvpx/source/libvpx/vp8/vp8_dx_iface.c @@ -9,6 +9,7 @@ */ +#include <assert.h> #include <stdlib.h> #include <string.h> #include "./vp8_rtcd.h" @@ -154,6 +155,8 @@ static vpx_codec_err_t vp8_peek_si_internal(const uint8_t *data, { vpx_codec_err_t res = VPX_CODEC_OK; + assert(data != NULL); + if(data + data_sz <= data) { res = VPX_CODEC_INVALID_PARAM; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_blockd.h b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_blockd.h index ae2f66a4a7a..3d26fb2b5d0 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_blockd.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_blockd.h @@ -158,8 +158,8 @@ typedef struct macroblockd { MODE_INFO *left_mi; MODE_INFO *above_mi; - int up_available; - int left_available; + unsigned int max_blocks_wide; + unsigned int max_blocks_high; const vpx_prob (*partition_probs)[PARTITION_TYPES - 1]; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_loopfilter.c b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_loopfilter.c index aca69bd0fce..461462552ad 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_loopfilter.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_loopfilter.c @@ -700,7 +700,6 @@ static void highbd_filter_selectively_horiz(uint16_t *s, int pitch, // whether there were any coefficients encoded, and the loop filter strength // block we are currently looking at. Shift is used to position the // 1's we produce. -// TODO(JBB) Need another function for different resolution color.. static void build_masks(const loop_filter_info_n *const lfi_n, const MODE_INFO *mi, const int shift_y, const int shift_uv, @@ -935,7 +934,6 @@ void vp9_adjust_mask(VP9_COMMON *const cm, const int mi_row, // This function sets up the bit masks for the entire 64x64 region represented // by mi_row, mi_col. -// TODO(JBB): This function only works for yv12. void vp9_setup_mask(VP9_COMMON *const cm, const int mi_row, const int mi_col, MODE_INFO **mi, const int mode_info_stride, LOOP_FILTER_MASK *lfm) { @@ -971,9 +969,6 @@ void vp9_setup_mask(VP9_COMMON *const cm, const int mi_row, const int mi_col, vp9_zero(*lfm); assert(mip[0] != NULL); - // TODO(jimbankoski): Try moving most of the following code into decode - // loop and storing lfm in the mbmi structure so that we don't have to go - // through the recursive loop structure multiple times. switch (mip[0]->sb_type) { case BLOCK_64X64: build_masks(lfi_n, mip[0] , 0, 0, lfm); @@ -1077,8 +1072,6 @@ void vp9_setup_mask(VP9_COMMON *const cm, const int mi_row, const int mi_col, } break; } - - vp9_adjust_mask(cm, mi_row, mi_col, lfm); } static void filter_selectively_vert(uint8_t *s, int pitch, @@ -1552,7 +1545,7 @@ static void loop_filter_rows(YV12_BUFFER_CONFIG *frame_buffer, VP9_COMMON *cm, vp9_setup_dst_planes(planes, frame_buffer, mi_row, mi_col); - // TODO(JBB): Make setup_mask work for non 420. + // TODO(jimbankoski): For 444 only need to do y mask. vp9_adjust_mask(cm, mi_row, mi_col, lfm); vp9_filter_block_plane_ss00(cm, &planes[0], mi_row, lfm); @@ -1592,6 +1585,8 @@ void vp9_loop_filter_frame(YV12_BUFFER_CONFIG *frame, } // Used by the encoder to build the loopfilter masks. +// TODO(slavarnway): Do the encoder the same way the decoder does it and +// build the masks in line as part of the encode process. void vp9_build_mask_frame(VP9_COMMON *cm, int frame_filter_level, int partial_frame) { int start_mi_row, end_mi_row, mi_rows_to_filter; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_onyxc_int.h b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_onyxc_int.h index fd674cbc6fc..3fd935e628b 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_onyxc_int.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_onyxc_int.h @@ -404,20 +404,8 @@ static INLINE void set_mi_row_col(MACROBLOCKD *xd, const TileInfo *const tile, xd->mb_to_right_edge = ((mi_cols - bw - mi_col) * MI_SIZE) * 8; // Are edges available for intra prediction? - xd->up_available = (mi_row != 0); - xd->left_available = (mi_col > tile->mi_col_start); - // TODO(slavarnway): eliminate up/left available ??? - if (xd->up_available) { - xd->above_mi = xd->mi[-xd->mi_stride]; - } else { - xd->above_mi = NULL; - } - - if (xd->left_available) { - xd->left_mi = xd->mi[-1]; - } else { - xd->left_mi = NULL; - } + xd->above_mi = (mi_row != 0) ? xd->mi[-xd->mi_stride] : NULL; + xd->left_mi = (mi_col > tile->mi_col_start) ? xd->mi[-1] : NULL; } static INLINE void update_partition_context(MACROBLOCKD *xd, diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_postproc.c b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_postproc.c index b685d813b7d..c04cc8f05c0 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_postproc.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_postproc.c @@ -12,6 +12,7 @@ #include <stdlib.h> #include <stdio.h> +#include "./vpx_dsp_rtcd.h" #include "./vpx_config.h" #include "./vpx_scale_rtcd.h" #include "./vp9_rtcd.h" @@ -587,32 +588,6 @@ static void fillrd(struct postproc_state *state, int q, int a) { state->last_noise = a; } -void vp9_plane_add_noise_c(uint8_t *start, char *noise, - char blackclamp[16], - char whiteclamp[16], - char bothclamp[16], - unsigned int width, unsigned int height, int pitch) { - unsigned int i, j; - - // TODO(jbb): why does simd code use both but c doesn't, normalize and - // fix.. - (void) bothclamp; - for (i = 0; i < height; i++) { - uint8_t *pos = start + i * pitch; - char *ref = (char *)(noise + (rand() & 0xff)); // NOLINT - - for (j = 0; j < width; j++) { - if (pos[j] < blackclamp[0]) - pos[j] = blackclamp[0]; - - if (pos[j] > 255 + whiteclamp[0]) - pos[j] = 255 + whiteclamp[0]; - - pos[j] += ref[j]; - } - } -} - static void swap_mi_and_prev_mi(VP9_COMMON *cm) { // Current mip will be the prev_mip for the next frame. MODE_INFO *temp = cm->postproc_state.prev_mip; @@ -726,8 +701,7 @@ int vp9_post_proc_frame(struct VP9Common *cm, ppstate->last_noise != noise_level) { fillrd(ppstate, 63 - q, noise_level); } - - vp9_plane_add_noise(ppbuf->y_buffer, ppstate->noise, ppstate->blackclamp, + vpx_plane_add_noise(ppbuf->y_buffer, ppstate->noise, ppstate->blackclamp, ppstate->whiteclamp, ppstate->bothclamp, ppbuf->y_width, ppbuf->y_height, ppbuf->y_stride); } diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_pred_common.c b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_pred_common.c index c201890a8b7..b5751fc626a 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_pred_common.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_pred_common.c @@ -20,10 +20,10 @@ int vp9_get_pred_context_switchable_interp(const MACROBLOCKD *xd) { // left of the entries corresponding to real macroblocks. // The prediction flags in these dummy entries are initialized to 0. const MODE_INFO *const left_mi = xd->left_mi; - const int left_type = xd->left_available && is_inter_block(left_mi) ? + const int left_type = left_mi && is_inter_block(left_mi) ? left_mi->interp_filter : SWITCHABLE_FILTERS; const MODE_INFO *const above_mi = xd->above_mi; - const int above_type = xd->up_available && is_inter_block(above_mi) ? + const int above_type = above_mi && is_inter_block(above_mi) ? above_mi->interp_filter : SWITCHABLE_FILTERS; if (left_type == above_type) @@ -36,38 +36,13 @@ int vp9_get_pred_context_switchable_interp(const MACROBLOCKD *xd) { return SWITCHABLE_FILTERS; } -// The mode info data structure has a one element border above and to the -// left of the entries corresponding to real macroblocks. -// The prediction flags in these dummy entries are initialized to 0. -// 0 - inter/inter, inter/--, --/inter, --/-- -// 1 - intra/inter, inter/intra -// 2 - intra/--, --/intra -// 3 - intra/intra -int vp9_get_intra_inter_context(const MACROBLOCKD *xd) { - const MODE_INFO *const above_mi = xd->above_mi; - const MODE_INFO *const left_mi = xd->left_mi; - const int has_above = xd->up_available; - const int has_left = xd->left_available; - - if (has_above && has_left) { // both edges available - const int above_intra = !is_inter_block(above_mi); - const int left_intra = !is_inter_block(left_mi); - return left_intra && above_intra ? 3 - : left_intra || above_intra; - } else if (has_above || has_left) { // one edge available - return 2 * !is_inter_block(has_above ? above_mi : left_mi); - } else { - return 0; - } -} - int vp9_get_reference_mode_context(const VP9_COMMON *cm, const MACROBLOCKD *xd) { int ctx; const MODE_INFO *const above_mi = xd->above_mi; const MODE_INFO *const left_mi = xd->left_mi; - const int has_above = xd->up_available; - const int has_left = xd->left_available; + const int has_above = !!above_mi; + const int has_left = !!left_mi; // Note: // The mode info data structure has a one element border above and to the // left of the entries corresponding to real macroblocks. @@ -109,8 +84,8 @@ int vp9_get_pred_context_comp_ref_p(const VP9_COMMON *cm, int pred_context; const MODE_INFO *const above_mi = xd->above_mi; const MODE_INFO *const left_mi = xd->left_mi; - const int above_in_image = xd->up_available; - const int left_in_image = xd->left_available; + const int above_in_image = !!above_mi; + const int left_in_image = !!left_mi; // Note: // The mode info data structure has a one element border above and to the @@ -190,8 +165,8 @@ int vp9_get_pred_context_single_ref_p1(const MACROBLOCKD *xd) { int pred_context; const MODE_INFO *const above_mi = xd->above_mi; const MODE_INFO *const left_mi = xd->left_mi; - const int has_above = xd->up_available; - const int has_left = xd->left_available; + const int has_above = !!above_mi; + const int has_left = !!left_mi; // Note: // The mode info data structure has a one element border above and to the // left of the entries corresponding to real macroblocks. @@ -256,8 +231,8 @@ int vp9_get_pred_context_single_ref_p2(const MACROBLOCKD *xd) { int pred_context; const MODE_INFO *const above_mi = xd->above_mi; const MODE_INFO *const left_mi = xd->left_mi; - const int has_above = xd->up_available; - const int has_left = xd->left_available; + const int has_above = !!above_mi; + const int has_left = !!left_mi; // Note: // The mode info data structure has a one element border above and to the diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_pred_common.h b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_pred_common.h index 254cb8b7496..f3c676e953d 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_pred_common.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_pred_common.h @@ -68,11 +68,32 @@ static INLINE vpx_prob vp9_get_skip_prob(const VP9_COMMON *cm, int vp9_get_pred_context_switchable_interp(const MACROBLOCKD *xd); -int vp9_get_intra_inter_context(const MACROBLOCKD *xd); +// The mode info data structure has a one element border above and to the +// left of the entries corresponding to real macroblocks. +// The prediction flags in these dummy entries are initialized to 0. +// 0 - inter/inter, inter/--, --/inter, --/-- +// 1 - intra/inter, inter/intra +// 2 - intra/--, --/intra +// 3 - intra/intra +static INLINE int get_intra_inter_context(const MACROBLOCKD *xd) { + const MODE_INFO *const above_mi = xd->above_mi; + const MODE_INFO *const left_mi = xd->left_mi; + const int has_above = !!above_mi; + const int has_left = !!left_mi; + + if (has_above && has_left) { // both edges available + const int above_intra = !is_inter_block(above_mi); + const int left_intra = !is_inter_block(left_mi); + return left_intra && above_intra ? 3 : left_intra || above_intra; + } else if (has_above || has_left) { // one edge available + return 2 * !is_inter_block(has_above ? above_mi : left_mi); + } + return 0; +} static INLINE vpx_prob vp9_get_intra_inter_prob(const VP9_COMMON *cm, const MACROBLOCKD *xd) { - return cm->fc->intra_inter_prob[vp9_get_intra_inter_context(xd)]; + return cm->fc->intra_inter_prob[get_intra_inter_context(xd)]; } int vp9_get_reference_mode_context(const VP9_COMMON *cm, const MACROBLOCKD *xd); @@ -113,8 +134,8 @@ static INLINE int get_tx_size_context(const MACROBLOCKD *xd) { const int max_tx_size = max_txsize_lookup[xd->mi[0]->sb_type]; const MODE_INFO *const above_mi = xd->above_mi; const MODE_INFO *const left_mi = xd->left_mi; - const int has_above = xd->up_available; - const int has_left = xd->left_available; + const int has_above = !!above_mi; + const int has_left = !!left_mi; int above_ctx = (has_above && !above_mi->skip) ? (int)above_mi->tx_size : max_tx_size; int left_ctx = (has_left && !left_mi->skip) ? (int)left_mi->tx_size diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_reconintra.c b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_reconintra.c index 13a95ae8f0e..c4d91c82505 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_reconintra.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_reconintra.c @@ -425,8 +425,8 @@ void vp9_predict_intra_block(const MACROBLOCKD *xd, int bwl_in, int aoff, int loff, int plane) { const int bw = (1 << bwl_in); const int txw = (1 << tx_size); - const int have_top = loff || xd->up_available; - const int have_left = aoff || xd->left_available; + const int have_top = loff || (xd->above_mi != NULL); + const int have_left = aoff || (xd->left_mi != NULL); const int have_right = (aoff + txw) < bw; const int x = aoff * 4; const int y = loff * 4; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_rtcd_defs.pl b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_rtcd_defs.pl index d6a0ce96d42..d7f5a2113ac 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_rtcd_defs.pl +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_rtcd_defs.pl @@ -70,10 +70,6 @@ add_proto qw/void vp9_post_proc_down_and_across/, "const uint8_t *src_ptr, uint8 specialize qw/vp9_post_proc_down_and_across sse2/; $vp9_post_proc_down_and_across_sse2=vp9_post_proc_down_and_across_xmm; -add_proto qw/void vp9_plane_add_noise/, "uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch"; -specialize qw/vp9_plane_add_noise sse2/; -$vp9_plane_add_noise_sse2=vp9_plane_add_noise_wmt; - add_proto qw/void vp9_filter_by_weight16x16/, "const uint8_t *src, int src_stride, uint8_t *dst, int dst_stride, int src_weight"; specialize qw/vp9_filter_by_weight16x16 sse2 msa/; @@ -169,9 +165,6 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") { add_proto qw/void vp9_highbd_post_proc_down_and_across/, "const uint16_t *src_ptr, uint16_t *dst_ptr, int src_pixels_per_line, int dst_pixels_per_line, int rows, int cols, int flimit"; specialize qw/vp9_highbd_post_proc_down_and_across/; - - add_proto qw/void vp9_highbd_plane_add_noise/, "uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch"; - specialize qw/vp9_highbd_plane_add_noise/; } # @@ -276,7 +269,7 @@ $vp9_full_search_sad_sse3=vp9_full_search_sadx3; $vp9_full_search_sad_sse4_1=vp9_full_search_sadx8; add_proto qw/int vp9_diamond_search_sad/, "const struct macroblock *x, const struct search_site_config *cfg, struct mv *ref_mv, struct mv *best_mv, int search_param, int sad_per_bit, int *num00, const struct vp9_variance_vtable *fn_ptr, const struct mv *center_mv"; -specialize qw/vp9_diamond_search_sad avx/; +specialize qw/vp9_diamond_search_sad/; add_proto qw/void vp9_temporal_filter_apply/, "uint8_t *frame1, unsigned int stride, uint8_t *frame2, unsigned int block_width, unsigned int block_height, int strength, int filter_weight, unsigned int *accumulator, uint16_t *count"; specialize qw/vp9_temporal_filter_apply sse2 msa/; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_scan.c b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_scan.c index d6fb8b2d7b5..8b8b09f4a33 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_scan.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_scan.c @@ -229,10 +229,8 @@ DECLARE_ALIGNED(16, static const int16_t, default_scan_32x32[1024]) = { 990, 959, 1022, 991, 1023, }; -// Neighborhood 5-tuples for various scans and blocksizes, -// in {top, left, topleft, topright, bottomleft} order -// for each position in raster scan order. -// -1 indicates the neighbor does not exist. +// Neighborhood 2-tuples for various scans and blocksizes, +// in {top, left} order for each position in corresponding scan order. DECLARE_ALIGNED(16, static const int16_t, default_scan_4x4_neighbors[17 * MAX_NEIGHBORS]) = { 0, 0, 0, 0, 0, 0, 1, 4, 4, 4, 1, 1, 8, 8, 5, 8, 2, 2, 2, 5, 9, 12, 6, 9, diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_seg_common.c b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_seg_common.c index c8ef618b776..7af61629a09 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_seg_common.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_seg_common.c @@ -28,6 +28,7 @@ static const int seg_feature_data_max[SEG_LVL_MAX] = { void vp9_clearall_segfeatures(struct segmentation *seg) { vp9_zero(seg->feature_data); vp9_zero(seg->feature_mask); + seg->aq_av_offset = 0; } void vp9_enable_segfeature(struct segmentation *seg, int segment_id, diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_seg_common.h b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_seg_common.h index 5b75d8d4ee4..7ea7c3dd73c 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_seg_common.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/vp9_seg_common.h @@ -47,6 +47,7 @@ struct segmentation { int16_t feature_data[MAX_SEGMENTS][SEG_LVL_MAX]; unsigned int feature_mask[MAX_SEGMENTS]; + int aq_av_offset; }; static INLINE int segfeature_active(const struct segmentation *seg, diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/x86/vp9_idct_intrin_sse2.c b/chromium/third_party/libvpx/source/libvpx/vp9/common/x86/vp9_idct_intrin_sse2.c index 8d312d03f94..1c77b57ff11 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/x86/vp9_idct_intrin_sse2.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/x86/vp9_idct_intrin_sse2.c @@ -8,6 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ +#include "./vp9_rtcd.h" #include "vpx_dsp/x86/inv_txfm_sse2.h" #include "vpx_dsp/x86/txfm_common_sse2.h" #include "vpx_ports/mem.h" diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/common/x86/vp9_postproc_sse2.asm b/chromium/third_party/libvpx/source/libvpx/vp9/common/x86/vp9_postproc_sse2.asm index ec8bfdb18fa..430762815b7 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/common/x86/vp9_postproc_sse2.asm +++ b/chromium/third_party/libvpx/source/libvpx/vp9/common/x86/vp9_postproc_sse2.asm @@ -624,68 +624,6 @@ sym(vp9_mbpost_proc_across_ip_xmm): %undef flimit4 -;void vp9_plane_add_noise_wmt (unsigned char *start, unsigned char *noise, -; unsigned char blackclamp[16], -; unsigned char whiteclamp[16], -; unsigned char bothclamp[16], -; unsigned int width, unsigned int height, int pitch) -global sym(vp9_plane_add_noise_wmt) PRIVATE -sym(vp9_plane_add_noise_wmt): - push rbp - mov rbp, rsp - SHADOW_ARGS_TO_STACK 8 - GET_GOT rbx - push rsi - push rdi - ; end prolog - -.addnoise_loop: - call sym(LIBVPX_RAND) WRT_PLT - mov rcx, arg(1) ;noise - and rax, 0xff - add rcx, rax - - ; we rely on the fact that the clamping vectors are stored contiguously - ; in black/white/both order. Note that we have to reload this here because - ; rdx could be trashed by rand() - mov rdx, arg(2) ; blackclamp - - - mov rdi, rcx - movsxd rcx, dword arg(5) ;[Width] - mov rsi, arg(0) ;Pos - xor rax,rax - -.addnoise_nextset: - movdqu xmm1,[rsi+rax] ; get the source - - psubusb xmm1, [rdx] ;blackclamp ; clamp both sides so we don't outrange adding noise - paddusb xmm1, [rdx+32] ;bothclamp - psubusb xmm1, [rdx+16] ;whiteclamp - - movdqu xmm2,[rdi+rax] ; get the noise for this line - paddb xmm1,xmm2 ; add it in - movdqu [rsi+rax],xmm1 ; store the result - - add rax,16 ; move to the next line - - cmp rax, rcx - jl .addnoise_nextset - - movsxd rax, dword arg(7) ; Pitch - add arg(0), rax ; Start += Pitch - sub dword arg(6), 1 ; Height -= 1 - jg .addnoise_loop - - ; begin epilog - pop rdi - pop rsi - RESTORE_GOT - UNSHADOW_ARGS - pop rbp - ret - - SECTION_RODATA align 16 rd42: diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decodeframe.c b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decodeframe.c index 32c72194d9b..84c757cc7dc 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decodeframe.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decodeframe.c @@ -883,6 +883,9 @@ static void decode_block(VP9Decoder *const pbi, MACROBLOCKD *const xd, const int max_blocks_high = num_4x4_h + (xd->mb_to_bottom_edge >= 0 ? 0 : xd->mb_to_bottom_edge >> (5 + pd->subsampling_y)); + xd->max_blocks_wide = xd->mb_to_right_edge >= 0 ? 0 : max_blocks_wide; + xd->max_blocks_high = xd->mb_to_bottom_edge >= 0 ? 0 : max_blocks_high; + for (row = 0; row < max_blocks_high; row += step) for (col = 0; col < max_blocks_wide; col += step) predict_and_reconstruct_intra_block(xd, r, mi, plane, @@ -911,6 +914,9 @@ static void decode_block(VP9Decoder *const pbi, MACROBLOCKD *const xd, const int max_blocks_high = num_4x4_h + (xd->mb_to_bottom_edge >= 0 ? 0 : xd->mb_to_bottom_edge >> (5 + pd->subsampling_y)); + xd->max_blocks_wide = xd->mb_to_right_edge >= 0 ? 0 : max_blocks_wide; + xd->max_blocks_high = xd->mb_to_bottom_edge >= 0 ? 0 : max_blocks_high; + for (row = 0; row < max_blocks_high; row += step) for (col = 0; col < max_blocks_wide; col += step) eobtotal += reconstruct_inter_block(xd, r, mi, plane, row, col, @@ -1328,22 +1334,23 @@ static void setup_frame_size_with_refs(VP9_COMMON *cm, // has valid dimensions. for (i = 0; i < REFS_PER_FRAME; ++i) { RefBuffer *const ref_frame = &cm->frame_refs[i]; - has_valid_ref_frame |= valid_ref_frame_size(ref_frame->buf->y_crop_width, - ref_frame->buf->y_crop_height, - width, height); + has_valid_ref_frame |= (ref_frame->idx != INVALID_IDX && + valid_ref_frame_size(ref_frame->buf->y_crop_width, + ref_frame->buf->y_crop_height, + width, height)); } if (!has_valid_ref_frame) vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME, "Referenced frame has invalid size"); for (i = 0; i < REFS_PER_FRAME; ++i) { RefBuffer *const ref_frame = &cm->frame_refs[i]; - if (!valid_ref_frame_img_fmt( - ref_frame->buf->bit_depth, - ref_frame->buf->subsampling_x, - ref_frame->buf->subsampling_y, - cm->bit_depth, - cm->subsampling_x, - cm->subsampling_y)) + if (ref_frame->idx == INVALID_IDX || + !valid_ref_frame_img_fmt(ref_frame->buf->bit_depth, + ref_frame->buf->subsampling_x, + ref_frame->buf->subsampling_y, + cm->bit_depth, + cm->subsampling_x, + cm->subsampling_y)) vpx_internal_error(&cm->error, VPX_CODEC_CORRUPT_FRAME, "Referenced frame has incompatible color format"); } @@ -1462,7 +1469,7 @@ static const uint8_t *decode_tiles(VP9Decoder *pbi, TileBuffer tile_buffers[4][1 << 6]; int tile_row, tile_col; int mi_row, mi_col; - TileData *tile_data = NULL; + TileWorkerData *tile_data = NULL; if (cm->lf.filter_level && !cm->skip_loop_filter && pbi->lf_worker.data1 == NULL) { @@ -1498,28 +1505,17 @@ static const uint8_t *decode_tiles(VP9Decoder *pbi, get_tile_buffers(pbi, data, data_end, tile_cols, tile_rows, tile_buffers); - if (pbi->tile_data == NULL || - (tile_cols * tile_rows) != pbi->total_tiles) { - vpx_free(pbi->tile_data); - CHECK_MEM_ERROR( - cm, - pbi->tile_data, - vpx_memalign(32, tile_cols * tile_rows * (sizeof(*pbi->tile_data)))); - pbi->total_tiles = tile_rows * tile_cols; - } - // Load all tile information into tile_data. for (tile_row = 0; tile_row < tile_rows; ++tile_row) { for (tile_col = 0; tile_col < tile_cols; ++tile_col) { const TileBuffer *const buf = &tile_buffers[tile_row][tile_col]; - tile_data = pbi->tile_data + tile_cols * tile_row + tile_col; - tile_data->cm = cm; + tile_data = pbi->tile_worker_data + tile_cols * tile_row + tile_col; tile_data->xd = pbi->mb; tile_data->xd.corrupted = 0; - tile_data->xd.counts = cm->frame_parallel_decoding_mode ? - NULL : &cm->counts; + tile_data->xd.counts = + cm->frame_parallel_decoding_mode ? NULL : &cm->counts; vp9_zero(tile_data->dqcoeff); - vp9_tile_init(&tile_data->xd.tile, tile_data->cm, tile_row, tile_col); + vp9_tile_init(&tile_data->xd.tile, cm, tile_row, tile_col); setup_token_decoder(buf->data, data_end, buf->size, &cm->error, &tile_data->bit_reader, pbi->decrypt_cb, pbi->decrypt_state); @@ -1535,8 +1531,8 @@ static const uint8_t *decode_tiles(VP9Decoder *pbi, for (tile_col = 0; tile_col < tile_cols; ++tile_col) { const int col = pbi->inv_tile_order ? tile_cols - tile_col - 1 : tile_col; - tile_data = pbi->tile_data + tile_cols * tile_row + col; - vp9_tile_set_col(&tile, tile_data->cm, col); + tile_data = pbi->tile_worker_data + tile_cols * tile_row + col; + vp9_tile_set_col(&tile, cm, col); vp9_zero(tile_data->xd.left_context); vp9_zero(tile_data->xd.left_seg_context); for (mi_col = tile.mi_col_start; mi_col < tile.mi_col_end; @@ -1588,7 +1584,7 @@ static const uint8_t *decode_tiles(VP9Decoder *pbi, } // Get last tile data. - tile_data = pbi->tile_data + tile_cols * tile_rows - 1; + tile_data = pbi->tile_worker_data + tile_cols * tile_rows - 1; if (pbi->frame_parallel_decode) vp9_frameworker_broadcast(pbi->cur_buf, INT_MAX); @@ -1673,12 +1669,6 @@ static const uint8_t *decode_tiles_mt(VP9Decoder *pbi, const int num_threads = pbi->max_threads; CHECK_MEM_ERROR(cm, pbi->tile_workers, vpx_malloc(num_threads * sizeof(*pbi->tile_workers))); - // Ensure tile data offsets will be properly aligned. This may fail on - // platforms without DECLARE_ALIGNED(). - assert((sizeof(*pbi->tile_worker_data) % 16) == 0); - CHECK_MEM_ERROR(cm, pbi->tile_worker_data, - vpx_memalign(32, num_threads * - sizeof(*pbi->tile_worker_data))); for (n = 0; n < num_threads; ++n) { VPxWorker *const worker = &pbi->tile_workers[n]; ++pbi->num_tile_workers; @@ -1694,7 +1684,8 @@ static const uint8_t *decode_tiles_mt(VP9Decoder *pbi, // Reset tile decoding hook for (n = 0; n < num_workers; ++n) { VPxWorker *const worker = &pbi->tile_workers[n]; - TileWorkerData *const tile_data = &pbi->tile_worker_data[n]; + TileWorkerData *const tile_data = + &pbi->tile_worker_data[n + pbi->total_tiles]; winterface->sync(worker); tile_data->xd = pbi->mb; tile_data->xd.counts = @@ -2223,6 +2214,19 @@ void vp9_decode_frame(VP9Decoder *pbi, vp9_frameworker_unlock_stats(worker); } + if (pbi->tile_worker_data == NULL || + (tile_cols * tile_rows) != pbi->total_tiles) { + const int num_tile_workers = tile_cols * tile_rows + + ((pbi->max_threads > 1) ? pbi->max_threads : 0); + const size_t twd_size = num_tile_workers * sizeof(*pbi->tile_worker_data); + // Ensure tile data offsets will be properly aligned. This may fail on + // platforms without DECLARE_ALIGNED(). + assert((sizeof(*pbi->tile_worker_data) % 16) == 0); + vpx_free(pbi->tile_worker_data); + CHECK_MEM_ERROR(cm, pbi->tile_worker_data, vpx_memalign(32, twd_size)); + pbi->total_tiles = tile_rows * tile_cols; + } + if (pbi->max_threads > 1 && tile_rows == 1 && tile_cols > 1) { // Multi-threaded tile decoder *p_data_end = decode_tiles_mt(pbi, data + first_partition_size, data_end); diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decodemv.c b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decodemv.c index 596427c1ea1..8831de9b1ad 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decodemv.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decodemv.c @@ -353,11 +353,36 @@ static void read_ref_frames(VP9_COMMON *const cm, MACROBLOCKD *const xd, } } +// TODO(slavarnway): Move this decoder version of +// vp9_get_pred_context_switchable_interp() to vp9_pred_common.h and update the +// encoder. +// +// Returns a context number for the given MB prediction signal +static int dec_get_pred_context_switchable_interp(const MACROBLOCKD *xd) { + // Note: + // The mode info data structure has a one element border above and to the + // left of the entries corresponding to real macroblocks. + // The prediction flags in these dummy entries are initialized to 0. + const MODE_INFO *const left_mi = xd->left_mi; + const int left_type = left_mi ? left_mi->interp_filter : SWITCHABLE_FILTERS; + const MODE_INFO *const above_mi = xd->above_mi; + const int above_type = above_mi ? above_mi->interp_filter + : SWITCHABLE_FILTERS; + + if (left_type == above_type) + return left_type; + else if (left_type == SWITCHABLE_FILTERS && above_type != SWITCHABLE_FILTERS) + return above_type; + else if (left_type != SWITCHABLE_FILTERS && above_type == SWITCHABLE_FILTERS) + return left_type; + else + return SWITCHABLE_FILTERS; +} static INLINE INTERP_FILTER read_switchable_interp_filter( VP9_COMMON *const cm, MACROBLOCKD *const xd, vpx_reader *r) { - const int ctx = vp9_get_pred_context_switchable_interp(xd); + const int ctx = dec_get_pred_context_switchable_interp(xd); const INTERP_FILTER type = (INTERP_FILTER)vpx_read_tree(r, vp9_switchable_interp_tree, cm->fc->switchable_interp_prob[ctx]); @@ -373,9 +398,6 @@ static void read_intra_block_mode_info(VP9_COMMON *const cm, const BLOCK_SIZE bsize = mi->sb_type; int i; - mi->ref_frame[0] = INTRA_FRAME; - mi->ref_frame[1] = NONE; - switch (bsize) { case BLOCK_4X4: for (i = 0; i < 4; ++i) @@ -399,6 +421,13 @@ static void read_intra_block_mode_info(VP9_COMMON *const cm, } mi->uv_mode = read_intra_mode_uv(cm, xd, r, mi->mode); + + // Initialize interp_filter here so we do not have to check for inter block + // modes in dec_get_pred_context_switchable_interp() + mi->interp_filter = SWITCHABLE_FILTERS; + + mi->ref_frame[0] = INTRA_FRAME; + mi->ref_frame[1] = NONE; } static INLINE int is_mv_valid(const MV *mv) { @@ -454,7 +483,7 @@ static int read_is_inter_block(VP9_COMMON *const cm, MACROBLOCKD *const xd, if (segfeature_active(&cm->seg, segment_id, SEG_LVL_REF_FRAME)) { return get_segdata(&cm->seg, segment_id, SEG_LVL_REF_FRAME) != INTRA_FRAME; } else { - const int ctx = vp9_get_intra_inter_context(xd); + const int ctx = get_intra_inter_context(xd); const int is_inter = vpx_read(r, cm->fc->intra_inter_prob[ctx]); FRAME_COUNTS *counts = xd->counts; if (counts) diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decoder.c b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decoder.c index 6c9c0f73a29..ea018d052f2 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decoder.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decoder.c @@ -131,11 +131,12 @@ void vp9_decoder_remove(VP9Decoder *pbi) { vpx_get_worker_interface()->end(&pbi->lf_worker); vpx_free(pbi->lf_worker.data1); - vpx_free(pbi->tile_data); + for (i = 0; i < pbi->num_tile_workers; ++i) { VPxWorker *const worker = &pbi->tile_workers[i]; vpx_get_worker_interface()->end(worker); } + vpx_free(pbi->tile_worker_data); vpx_free(pbi->tile_workers); diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decoder.h b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decoder.h index afa400941d9..7111a36d370 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decoder.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_decoder.h @@ -27,15 +27,6 @@ extern "C" { #endif -// TODO(hkuang): combine this with TileWorkerData. -typedef struct TileData { - VP9_COMMON *cm; - vpx_reader bit_reader; - DECLARE_ALIGNED(16, MACROBLOCKD, xd); - /* dqcoeff are shared by all the planes. So planes must be decoded serially */ - DECLARE_ALIGNED(16, tran_low_t, dqcoeff[32 * 32]); -} TileData; - typedef struct TileBuffer { const uint8_t *data; size_t size; @@ -74,8 +65,6 @@ typedef struct VP9Decoder { TileWorkerData *tile_worker_data; TileBuffer tile_buffers[64]; int num_tile_workers; - - TileData *tile_data; int total_tiles; VP9LfSync lf_row_sync; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_detokenize.c b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_detokenize.c index dcc75b9d2d9..47dc107fe21 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_detokenize.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/decoder/vp9_detokenize.c @@ -152,65 +152,73 @@ static int decode_coefs(const MACROBLOCKD *xd, return c; } -// TODO(slavarnway): Decode version of vp9_set_context. Modify vp9_set_context -// after testing is complete, then delete this version. -static -void dec_set_contexts(const MACROBLOCKD *xd, struct macroblockd_plane *pd, - TX_SIZE tx_size, int has_eob, - int aoff, int loff) { - ENTROPY_CONTEXT *const a = pd->above_context + aoff; - ENTROPY_CONTEXT *const l = pd->left_context + loff; - const int tx_size_in_blocks = 1 << tx_size; - - // above - if (has_eob && xd->mb_to_right_edge < 0) { - int i; - const int blocks_wide = pd->n4_w + - (xd->mb_to_right_edge >> (5 + pd->subsampling_x)); - int above_contexts = tx_size_in_blocks; - if (above_contexts + aoff > blocks_wide) - above_contexts = blocks_wide - aoff; - - for (i = 0; i < above_contexts; ++i) - a[i] = has_eob; - for (i = above_contexts; i < tx_size_in_blocks; ++i) - a[i] = 0; - } else { - memset(a, has_eob, sizeof(ENTROPY_CONTEXT) * tx_size_in_blocks); +static void get_ctx_shift(MACROBLOCKD *xd, int *ctx_shift_a, int *ctx_shift_l, + int x, int y, unsigned int tx_size_in_blocks) { + if (xd->max_blocks_wide) { + if (tx_size_in_blocks + x > xd->max_blocks_wide) + *ctx_shift_a = (tx_size_in_blocks - (xd->max_blocks_wide - x)) * 8; } - - // left - if (has_eob && xd->mb_to_bottom_edge < 0) { - int i; - const int blocks_high = pd->n4_h + - (xd->mb_to_bottom_edge >> (5 + pd->subsampling_y)); - int left_contexts = tx_size_in_blocks; - if (left_contexts + loff > blocks_high) - left_contexts = blocks_high - loff; - - for (i = 0; i < left_contexts; ++i) - l[i] = has_eob; - for (i = left_contexts; i < tx_size_in_blocks; ++i) - l[i] = 0; - } else { - memset(l, has_eob, sizeof(ENTROPY_CONTEXT) * tx_size_in_blocks); + if (xd->max_blocks_high) { + if (tx_size_in_blocks + y > xd->max_blocks_high) + *ctx_shift_l = (tx_size_in_blocks - (xd->max_blocks_high - y)) * 8; } } -int vp9_decode_block_tokens(MACROBLOCKD *xd, - int plane, const scan_order *sc, - int x, int y, - TX_SIZE tx_size, vpx_reader *r, +int vp9_decode_block_tokens(MACROBLOCKD *xd, int plane, const scan_order *sc, + int x, int y, TX_SIZE tx_size, vpx_reader *r, int seg_id) { struct macroblockd_plane *const pd = &xd->plane[plane]; const int16_t *const dequant = pd->seg_dequant[seg_id]; - const int ctx = get_entropy_context(tx_size, pd->above_context + x, - pd->left_context + y); - const int eob = decode_coefs(xd, get_plane_type(plane), - pd->dqcoeff, tx_size, - dequant, ctx, sc->scan, sc->neighbors, r); - dec_set_contexts(xd, pd, tx_size, eob > 0, x, y); + int eob; + ENTROPY_CONTEXT *a = pd->above_context + x; + ENTROPY_CONTEXT *l = pd->left_context + y; + int ctx; + int ctx_shift_a = 0; + int ctx_shift_l = 0; + + switch (tx_size) { + case TX_4X4: + ctx = a[0] != 0; + ctx += l[0] != 0; + eob = decode_coefs(xd, get_plane_type(plane), pd->dqcoeff, tx_size, + dequant, ctx, sc->scan, sc->neighbors, r); + a[0] = l[0] = (eob > 0); + break; + case TX_8X8: + get_ctx_shift(xd, &ctx_shift_a, &ctx_shift_l, x, y, 1 << TX_8X8); + ctx = !!*(const uint16_t *)a; + ctx += !!*(const uint16_t *)l; + eob = decode_coefs(xd, get_plane_type(plane), pd->dqcoeff, tx_size, + dequant, ctx, sc->scan, sc->neighbors, r); + *(uint16_t *)a = ((eob > 0) * 0x0101) >> ctx_shift_a; + *(uint16_t *)l = ((eob > 0) * 0x0101) >> ctx_shift_l; + break; + case TX_16X16: + get_ctx_shift(xd, &ctx_shift_a, &ctx_shift_l, x, y, 1 << TX_16X16); + ctx = !!*(const uint32_t *)a; + ctx += !!*(const uint32_t *)l; + eob = decode_coefs(xd, get_plane_type(plane), pd->dqcoeff, tx_size, + dequant, ctx, sc->scan, sc->neighbors, r); + *(uint32_t *)a = ((eob > 0) * 0x01010101) >> ctx_shift_a; + *(uint32_t *)l = ((eob > 0) * 0x01010101) >> ctx_shift_l; + break; + case TX_32X32: + get_ctx_shift(xd, &ctx_shift_a, &ctx_shift_l, x, y, 1 << TX_32X32); + // NOTE: casting to uint64_t here is safe because the default memory + // alignment is at least 8 bytes and the TX_32X32 is aligned on 8 byte + // boundaries. + ctx = !!*(const uint64_t *)a; + ctx += !!*(const uint64_t *)l; + eob = decode_coefs(xd, get_plane_type(plane), pd->dqcoeff, tx_size, + dequant, ctx, sc->scan, sc->neighbors, r); + *(uint64_t *)a = ((eob > 0) * 0x0101010101010101ULL) >> ctx_shift_a; + *(uint64_t *)l = ((eob > 0) * 0x0101010101010101ULL) >> ctx_shift_l; + break; + default: + assert(0 && "Invalid transform size."); + eob = 0; + break; + } + return eob; } - - diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c index f8c187cc5d4..7d411f65d2f 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_360.c @@ -13,6 +13,7 @@ #include "vpx_ports/mem.h" #include "vpx_ports/system_state.h" +#include "vp9/encoder/vp9_aq_360.h" #include "vp9/encoder/vp9_aq_variance.h" #include "vp9/common/vp9_seg_common.h" diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c index 1c8d2b45d3d..3e1a0a52271 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.c @@ -23,7 +23,6 @@ CYCLIC_REFRESH *vp9_cyclic_refresh_alloc(int mi_rows, int mi_cols) { size_t last_coded_q_map_size; - size_t consec_zero_mv_size; CYCLIC_REFRESH *const cr = vpx_calloc(1, sizeof(*cr)); if (cr == NULL) return NULL; @@ -41,21 +40,12 @@ CYCLIC_REFRESH *vp9_cyclic_refresh_alloc(int mi_rows, int mi_cols) { } assert(MAXQ <= 255); memset(cr->last_coded_q_map, MAXQ, last_coded_q_map_size); - - consec_zero_mv_size = mi_rows * mi_cols * sizeof(*cr->consec_zero_mv); - cr->consec_zero_mv = vpx_malloc(consec_zero_mv_size); - if (cr->consec_zero_mv == NULL) { - vp9_cyclic_refresh_free(cr); - return NULL; - } - memset(cr->consec_zero_mv, 0, consec_zero_mv_size); return cr; } void vp9_cyclic_refresh_free(CYCLIC_REFRESH *cr) { vpx_free(cr->map); vpx_free(cr->last_coded_q_map); - vpx_free(cr->consec_zero_mv); vpx_free(cr); } @@ -245,7 +235,6 @@ void vp9_cyclic_refresh_update_sb_postencode(VP9_COMP *const cpi, BLOCK_SIZE bsize) { const VP9_COMMON *const cm = &cpi->common; CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; - MV mv = mi->mv[0].as_mv; const int bw = num_8x8_blocks_wide_lookup[bsize]; const int bh = num_8x8_blocks_high_lookup[bsize]; const int xmis = VPXMIN(cm->mi_cols - mi_col, bw); @@ -269,15 +258,8 @@ void vp9_cyclic_refresh_update_sb_postencode(VP9_COMP *const cpi, clamp(cm->base_qindex + cr->qindex_delta[mi->segment_id], 0, MAXQ), cr->last_coded_q_map[map_offset]); - // Update the consecutive zero/low_mv count. - if (is_inter_block(mi) && (abs(mv.row) < 8 && abs(mv.col) < 8)) { - if (cr->consec_zero_mv[map_offset] < 255) - cr->consec_zero_mv[map_offset]++; - } else { - cr->consec_zero_mv[map_offset] = 0; } } - } } // Update the actual number of blocks that were applied the segment delta q. @@ -411,13 +393,18 @@ static void cyclic_refresh_update_map(VP9_COMP *const cpi) { cr->target_num_seg_blocks = 0; if (cpi->oxcf.content != VP9E_CONTENT_SCREEN) { consec_zero_mv_thresh = 100; - if (cpi->noise_estimate.enabled && cpi->noise_estimate.level >= kMedium) - consec_zero_mv_thresh = 80; } qindex_thresh = cpi->oxcf.content == VP9E_CONTENT_SCREEN ? vp9_get_qindex(&cm->seg, CR_SEGMENT_ID_BOOST2, cm->base_qindex) : vp9_get_qindex(&cm->seg, CR_SEGMENT_ID_BOOST1, cm->base_qindex); + // More aggressive settings for noisy content. + if (cpi->noise_estimate.enabled && cpi->noise_estimate.level >= kMedium) { + consec_zero_mv_thresh = 80; + qindex_thresh = + VPXMAX(vp9_get_qindex(&cm->seg, CR_SEGMENT_ID_BOOST1, cm->base_qindex), + 7 * cm->base_qindex >> 3); + } do { int sum_map = 0; // Get the mi_row/mi_col corresponding to superblock index i. @@ -442,7 +429,7 @@ static void cyclic_refresh_update_map(VP9_COMP *const cpi) { if (cr->map[bl_index2] == 0) { count_tot++; if (cr->last_coded_q_map[bl_index2] > qindex_thresh || - cr->consec_zero_mv[bl_index2] < consec_zero_mv_thresh) { + cpi->consec_zero_mv[bl_index2] < consec_zero_mv_thresh) { sum_map++; count_sel++; } @@ -481,6 +468,8 @@ void vp9_cyclic_refresh_update_parameters(VP9_COMP *const cpi) { cr->percent_refresh = 5; cr->max_qdelta_perc = 50; cr->time_for_refresh = 0; + cr->motion_thresh = 32; + cr->rate_boost_fac = 15; // Use larger delta-qp (increase rate_ratio_qdelta) for first few (~4) // periods of the refresh cycle, after a key frame. // Account for larger interval on base layer for temporal layers. @@ -490,9 +479,11 @@ void vp9_cyclic_refresh_update_parameters(VP9_COMP *const cpi) { cr->rate_ratio_qdelta = 3.0; } else { cr->rate_ratio_qdelta = 2.0; - if (cpi->noise_estimate.enabled && cpi->noise_estimate.level >= kMedium) - // Reduce the delta-qp if the estimated source noise is above threshold. - cr->rate_ratio_qdelta = 1.5; + if (cpi->noise_estimate.enabled && cpi->noise_estimate.level >= kMedium) { + // Reduce the delta-qp if the estimated source noise is above threshold. + cr->rate_ratio_qdelta = 1.7; + cr->rate_boost_fac = 13; + } } // Adjust some parameters for low resolutions at low bitrates. if (cm->width <= 352 && @@ -500,9 +491,6 @@ void vp9_cyclic_refresh_update_parameters(VP9_COMP *const cpi) { rc->avg_frame_bandwidth < 3400) { cr->motion_thresh = 4; cr->rate_boost_fac = 10; - } else { - cr->motion_thresh = 32; - cr->rate_boost_fac = 15; } if (cpi->svc.spatial_layer_id > 0) { cr->motion_thresh = 4; @@ -545,8 +533,6 @@ void vp9_cyclic_refresh_setup(VP9_COMP *const cpi) { if (cm->frame_type == KEY_FRAME) { memset(cr->last_coded_q_map, MAXQ, cm->mi_rows * cm->mi_cols * sizeof(*cr->last_coded_q_map)); - memset(cr->consec_zero_mv, 0, - cm->mi_rows * cm->mi_cols * sizeof(*cr->consec_zero_mv)); cr->sb_index = 0; } return; @@ -621,7 +607,6 @@ void vp9_cyclic_refresh_reset_resize(VP9_COMP *const cpi) { CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; memset(cr->map, 0, cm->mi_rows * cm->mi_cols); memset(cr->last_coded_q_map, MAXQ, cm->mi_rows * cm->mi_cols); - memset(cr->consec_zero_mv, 0, cm->mi_rows * cm->mi_cols); cr->sb_index = 0; cpi->refresh_golden_frame = 1; cpi->refresh_alt_ref_frame = 1; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h index 095b9283f9a..35eea182f12 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_cyclicrefresh.h @@ -53,8 +53,6 @@ struct CYCLIC_REFRESH { signed char *map; // Map of the last q a block was coded at. uint8_t *last_coded_q_map; - // Count on how many consecutive times a block uses ZER0MV for encoding. - uint8_t *consec_zero_mv; // Thresholds applied to the projected rate/distortion of the coding block, // when deciding whether block should be refreshed. int64_t thresh_rate_sb; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c index d8f7d07213d..59ef5faa6fe 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_aq_variance.c @@ -167,7 +167,7 @@ static unsigned int block_variance(VP9_COMP *cpi, MACROBLOCK *x, vp9_64_zeros, 0, bw, bh, &sse, &avg); #endif // CONFIG_VP9_HIGHBITDEPTH var = sse - (((int64_t)avg * avg) / (bw * bh)); - return (256 * var) / (bw * bh); + return (unsigned int)(((uint64_t)256 * var) / (bw * bh)); } else { #if CONFIG_VP9_HIGHBITDEPTH if (xd->cur_buf->flags & YV12_FLAG_HIGHBITDEPTH) { @@ -185,7 +185,7 @@ static unsigned int block_variance(VP9_COMP *cpi, MACROBLOCK *x, x->plane[0].src.stride, vp9_64_zeros, 0, &sse); #endif // CONFIG_VP9_HIGHBITDEPTH - return (256 * var) >> num_pels_log2_lookup[bs]; + return (unsigned int)(((uint64_t)256 * var) >> num_pels_log2_lookup[bs]); } } diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_denoiser.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_denoiser.c index 9eca2a22960..42d456e8998 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_denoiser.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_denoiser.c @@ -21,12 +21,6 @@ #include "vp9/encoder/vp9_denoiser.h" #include "vp9/encoder/vp9_encoder.h" -/* The VP9 denoiser is similar to that of the VP8 denoiser. While - * choosing the motion vectors / reference frames, the denoiser is run, and if - * it did not modify the signal to much, the denoised block is copied to the - * signal. - */ - #ifdef OUTPUT_YUV_DENOISED static void make_grayscale(YV12_BUFFER_CONFIG *yuv); #endif @@ -49,16 +43,19 @@ static int noise_motion_thresh(BLOCK_SIZE bs, int increase_denoising) { } static unsigned int sse_thresh(BLOCK_SIZE bs, int increase_denoising) { - return (1 << num_pels_log2_lookup[bs]) * (increase_denoising ? 60 : 40); + return (1 << num_pels_log2_lookup[bs]) * (increase_denoising ? 80 : 40); } static int sse_diff_thresh(BLOCK_SIZE bs, int increase_denoising, int motion_magnitude) { if (motion_magnitude > noise_motion_thresh(bs, increase_denoising)) { - return 0; + if (increase_denoising) + return (1 << num_pels_log2_lookup[bs]) << 2; + else + return 0; } else { - return (1 << num_pels_log2_lookup[bs]) * 20; + return (1 << num_pels_log2_lookup[bs]) << 4; } } @@ -183,7 +180,7 @@ int vp9_denoiser_filter_c(const uint8_t *sig, int sig_stride, static uint8_t *block_start(uint8_t *framebuf, int stride, int mi_row, int mi_col) { - return framebuf + (stride * mi_row * 8) + (mi_col * 8); + return framebuf + (stride * mi_row << 3) + (mi_col << 3); } static VP9_DENOISER_DECISION perform_motion_compensation(VP9_DENOISER *denoiser, @@ -195,29 +192,34 @@ static VP9_DENOISER_DECISION perform_motion_compensation(VP9_DENOISER *denoiser, PICK_MODE_CONTEXT *ctx, int motion_magnitude, int is_skin, - int *zeromv_filter) { - int mv_col, mv_row; + int *zeromv_filter, + int consec_zeromv) { int sse_diff = ctx->zeromv_sse - ctx->newmv_sse; MV_REFERENCE_FRAME frame; MACROBLOCKD *filter_mbd = &mb->e_mbd; MODE_INFO *mi = filter_mbd->mi[0]; MODE_INFO saved_mi; - int i, j; + int i; struct buf_2d saved_dst[MAX_MB_PLANE]; - struct buf_2d saved_pre[MAX_MB_PLANE][2]; // 2 pre buffers + struct buf_2d saved_pre[MAX_MB_PLANE]; - mv_col = ctx->best_sse_mv.as_mv.col; - mv_row = ctx->best_sse_mv.as_mv.row; frame = ctx->best_reference_frame; - saved_mi = *mi; - if (is_skin && motion_magnitude > 0) + if (is_skin && (motion_magnitude > 0 || consec_zeromv < 4)) + return COPY_BLOCK; + + // Avoid denoising for small block (unless motion is small). + // Small blocks are selected in variance partition (before encoding) and + // will typically lie on moving areas. + if (denoiser->denoising_level < kDenHigh && + motion_magnitude > 16 && bs <= BLOCK_8X8) return COPY_BLOCK; // If the best reference frame uses inter-prediction and there is enough of a // difference in sum-squared-error, use it. if (frame != INTRA_FRAME && + ctx->newmv_sse != UINT_MAX && sse_diff > sse_diff_thresh(bs, increase_denoising, motion_magnitude)) { mi->ref_frame[0] = ctx->best_reference_frame; mi->mode = ctx->best_sse_inter_mode; @@ -239,6 +241,9 @@ static VP9_DENOISER_DECISION perform_motion_compensation(VP9_DENOISER *denoiser, ctx->best_sse_inter_mode = ZEROMV; ctx->best_sse_mv.as_int = 0; *zeromv_filter = 1; + if (denoiser->denoising_level > kDenMedium) { + motion_magnitude = 0; + } } if (ctx->newmv_sse > sse_thresh(bs, increase_denoising)) { @@ -255,34 +260,31 @@ static VP9_DENOISER_DECISION perform_motion_compensation(VP9_DENOISER *denoiser, // We will restore these after motion compensation. for (i = 0; i < MAX_MB_PLANE; ++i) { - for (j = 0; j < 2; ++j) { - saved_pre[i][j] = filter_mbd->plane[i].pre[j]; - } + saved_pre[i] = filter_mbd->plane[i].pre[0]; saved_dst[i] = filter_mbd->plane[i].dst; } // Set the pointers in the MACROBLOCKD to point to the buffers in the denoiser // struct. - for (j = 0; j < 2; ++j) { - filter_mbd->plane[0].pre[j].buf = - block_start(denoiser->running_avg_y[frame].y_buffer, - denoiser->running_avg_y[frame].y_stride, - mi_row, mi_col); - filter_mbd->plane[0].pre[j].stride = - denoiser->running_avg_y[frame].y_stride; - filter_mbd->plane[1].pre[j].buf = - block_start(denoiser->running_avg_y[frame].u_buffer, - denoiser->running_avg_y[frame].uv_stride, - mi_row, mi_col); - filter_mbd->plane[1].pre[j].stride = - denoiser->running_avg_y[frame].uv_stride; - filter_mbd->plane[2].pre[j].buf = - block_start(denoiser->running_avg_y[frame].v_buffer, - denoiser->running_avg_y[frame].uv_stride, - mi_row, mi_col); - filter_mbd->plane[2].pre[j].stride = - denoiser->running_avg_y[frame].uv_stride; - } + filter_mbd->plane[0].pre[0].buf = + block_start(denoiser->running_avg_y[frame].y_buffer, + denoiser->running_avg_y[frame].y_stride, + mi_row, mi_col); + filter_mbd->plane[0].pre[0].stride = + denoiser->running_avg_y[frame].y_stride; + filter_mbd->plane[1].pre[0].buf = + block_start(denoiser->running_avg_y[frame].u_buffer, + denoiser->running_avg_y[frame].uv_stride, + mi_row, mi_col); + filter_mbd->plane[1].pre[0].stride = + denoiser->running_avg_y[frame].uv_stride; + filter_mbd->plane[2].pre[0].buf = + block_start(denoiser->running_avg_y[frame].v_buffer, + denoiser->running_avg_y[frame].uv_stride, + mi_row, mi_col); + filter_mbd->plane[2].pre[0].stride = + denoiser->running_avg_y[frame].uv_stride; + filter_mbd->plane[0].dst.buf = block_start(denoiser->mc_running_avg_y.y_buffer, denoiser->mc_running_avg_y.y_stride, @@ -299,20 +301,15 @@ static VP9_DENOISER_DECISION perform_motion_compensation(VP9_DENOISER *denoiser, mi_row, mi_col); filter_mbd->plane[2].dst.stride = denoiser->mc_running_avg_y.uv_stride; - vp9_build_inter_predictors_sby(filter_mbd, mv_row, mv_col, bs); + vp9_build_inter_predictors_sby(filter_mbd, mi_row, mi_col, bs); // Restore everything to its original state *mi = saved_mi; for (i = 0; i < MAX_MB_PLANE; ++i) { - for (j = 0; j < 2; ++j) { - filter_mbd->plane[i].pre[j] = saved_pre[i][j]; - } + filter_mbd->plane[i].pre[0] = saved_pre[i]; filter_mbd->plane[i].dst = saved_dst[i]; } - mv_row = ctx->best_sse_mv.as_mv.row; - mv_col = ctx->best_sse_mv.as_mv.col; - return FILTER_BLOCK; } @@ -332,20 +329,20 @@ void vp9_denoiser_denoise(VP9_COMP *cpi, MACROBLOCK *mb, mi_row, mi_col); struct buf_2d src = mb->plane[0].src; int is_skin = 0; + int consec_zeromv = 0; mv_col = ctx->best_sse_mv.as_mv.col; mv_row = ctx->best_sse_mv.as_mv.row; motion_magnitude = mv_row * mv_row + mv_col * mv_col; if (cpi->use_skin_detection && bs <= BLOCK_32X32 && - denoiser->denoising_level >= kDenLow) { + denoiser->denoising_level < kDenHigh) { int motion_level = (motion_magnitude < 16) ? 0 : 1; // If motion for current block is small/zero, compute consec_zeromv for // skin detection (early exit in skin detection is done for large // consec_zeromv when current block has small/zero motion). - int consec_zeromv = 0; + consec_zeromv = 0; if (motion_level == 0) { - CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; VP9_COMMON * const cm = &cpi->common; int j, i; // Loop through the 8x8 sub-blocks. @@ -358,11 +355,11 @@ void vp9_denoiser_denoise(VP9_COMP *cpi, MACROBLOCK *mb, for (i = 0; i < ymis; i++) { for (j = 0; j < xmis; j++) { int bl_index = block_index + i * cm->mi_cols + j; - consec_zeromv = VPXMIN(cr->consec_zero_mv[bl_index], consec_zeromv); + consec_zeromv = VPXMIN(cpi->consec_zero_mv[bl_index], consec_zeromv); // No need to keep checking 8x8 blocks if any of the sub-blocks // has small consec_zeromv (since threshold for no_skin based on - // zero/small motion in skin detection is high, i.e, > 5). - if (consec_zeromv < 5) { + // zero/small motion in skin detection is high, i.e, > 4). + if (consec_zeromv < 4) { i = ymis; j = xmis; } @@ -380,8 +377,7 @@ void vp9_denoiser_denoise(VP9_COMP *cpi, MACROBLOCK *mb, motion_level); } if (!is_skin && - denoiser->denoising_level == kDenHigh && - motion_magnitude < 16) { + denoiser->denoising_level == kDenHigh) { denoiser->increase_denoising = 1; } else { denoiser->increase_denoising = 0; @@ -393,7 +389,8 @@ void vp9_denoiser_denoise(VP9_COMP *cpi, MACROBLOCK *mb, mi_row, mi_col, ctx, motion_magnitude, is_skin, - &zeromv_filter); + &zeromv_filter, + consec_zeromv); if (decision == FILTER_BLOCK) { decision = vp9_denoiser_filter(src.buf, src.stride, @@ -453,11 +450,12 @@ void vp9_denoiser_update_frame_info(VP9_DENOISER *denoiser, int resized) { // Copy source into denoised reference buffers on KEY_FRAME or // if the just encoded frame was resized. - if (frame_type == KEY_FRAME || resized != 0) { + if (frame_type == KEY_FRAME || resized != 0 || denoiser->reset) { int i; // Start at 1 so as not to overwrite the INTRA_FRAME for (i = 1; i < MAX_REF_FRAMES; ++i) copy_frame(&denoiser->running_avg_y[i], &src); + denoiser->reset = 0; return; } @@ -496,12 +494,12 @@ void vp9_denoiser_reset_frame_stats(PICK_MODE_CONTEXT *ctx) { ctx->zeromv_sse = UINT_MAX; ctx->newmv_sse = UINT_MAX; ctx->zeromv_lastref_sse = UINT_MAX; + ctx->best_sse_mv.as_int = 0; } void vp9_denoiser_update_frame_stats(MODE_INFO *mi, unsigned int sse, PREDICTION_MODE mode, PICK_MODE_CONTEXT *ctx) { - // TODO(tkopp): Use both MVs if possible if (mi->mv[0].as_int == 0 && sse < ctx->zeromv_sse) { ctx->zeromv_sse = sse; ctx->best_zeromv_reference_frame = mi->ref_frame[0]; @@ -570,6 +568,8 @@ int vp9_denoiser_alloc(VP9_DENOISER *denoiser, int width, int height, denoiser->increase_denoising = 0; denoiser->frame_buffer_initialized = 1; denoiser->denoising_level = kDenLow; + denoiser->prev_denoising_level = kDenLow; + denoiser->reset = 0; return 0; } @@ -589,6 +589,12 @@ void vp9_denoiser_free(VP9_DENOISER *denoiser) { void vp9_denoiser_set_noise_level(VP9_DENOISER *denoiser, int noise_level) { denoiser->denoising_level = noise_level; + if (denoiser->denoising_level > kDenLowLow && + denoiser->prev_denoising_level == kDenLowLow) + denoiser->reset = 1; + else + denoiser->reset = 0; + denoiser->prev_denoising_level = denoiser->denoising_level; } #ifdef OUTPUT_YUV_DENOISED diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_denoiser.h b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_denoiser.h index a0e201781fb..84189b4fd75 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_denoiser.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_denoiser.h @@ -40,7 +40,9 @@ typedef struct vp9_denoiser { YV12_BUFFER_CONFIG last_source; int increase_denoising; int frame_buffer_initialized; + int reset; VP9_DENOISER_LEVEL denoising_level; + VP9_DENOISER_LEVEL prev_denoising_level; } VP9_DENOISER; struct VP9_COMP; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodeframe.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodeframe.c index 40b332ac8f5..e96c96cde09 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodeframe.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodeframe.c @@ -662,12 +662,79 @@ static void fill_variance_8x8avg(const uint8_t *s, int sp, const uint8_t *d, } } +#if !CONFIG_VP9_HIGHBITDEPTH +// Check if most of the superblock is skin content, and if so, force split to +// 32x32, and set x->sb_is_skin for use in mode selection. +static int skin_sb_split(VP9_COMP *cpi, MACROBLOCK *x, const int low_res, + int mi_row, int mi_col, int *force_split) { + VP9_COMMON * const cm = &cpi->common; + // Avoid checking superblocks on/near boundary and avoid low resolutions. + // Note superblock may still pick 64X64 if y_sad is very small + // (i.e., y_sad < cpi->vbp_threshold_sad) below. For now leave this as is. + if (!low_res && (mi_col >= 8 && mi_col + 8 < cm->mi_cols && mi_row >= 8 && + mi_row + 8 < cm->mi_rows)) { + int num_16x16_skin = 0; + int num_16x16_nonskin = 0; + uint8_t *ysignal = x->plane[0].src.buf; + uint8_t *usignal = x->plane[1].src.buf; + uint8_t *vsignal = x->plane[2].src.buf; + int sp = x->plane[0].src.stride; + int spuv = x->plane[1].src.stride; + const int block_index = mi_row * cm->mi_cols + mi_col; + const int bw = num_8x8_blocks_wide_lookup[BLOCK_64X64]; + const int bh = num_8x8_blocks_high_lookup[BLOCK_64X64]; + const int xmis = VPXMIN(cm->mi_cols - mi_col, bw); + const int ymis = VPXMIN(cm->mi_rows - mi_row, bh); + // Loop through the 16x16 sub-blocks. + int i, j; + for (i = 0; i < ymis; i+=2) { + for (j = 0; j < xmis; j+=2) { + int bl_index = block_index + i * cm->mi_cols + j; + int bl_index1 = bl_index + 1; + int bl_index2 = bl_index + cm->mi_cols; + int bl_index3 = bl_index2 + 1; + int consec_zeromv = VPXMIN(cpi->consec_zero_mv[bl_index], + VPXMIN(cpi->consec_zero_mv[bl_index1], + VPXMIN(cpi->consec_zero_mv[bl_index2], + cpi->consec_zero_mv[bl_index3]))); + int is_skin = vp9_compute_skin_block(ysignal, + usignal, + vsignal, + sp, + spuv, + BLOCK_16X16, + consec_zeromv, + 0); + num_16x16_skin += is_skin; + num_16x16_nonskin += (1 - is_skin); + if (num_16x16_nonskin > 3) { + // Exit loop if at least 4 of the 16x16 blocks are not skin. + i = ymis; + break; + } + ysignal += 16; + usignal += 8; + vsignal += 8; + } + ysignal += (sp << 4) - 64; + usignal += (spuv << 3) - 32; + vsignal += (spuv << 3) - 32; + } + if (num_16x16_skin > 12) { + *force_split = 1; + return 1; + } + } + return 0; +} +#endif + // This function chooses partitioning based on the variance between source and // reconstructed last, where variance is computed for down-sampled inputs. static int choose_partitioning(VP9_COMP *cpi, - const TileInfo *const tile, - MACROBLOCK *x, - int mi_row, int mi_col) { + const TileInfo *const tile, + MACROBLOCK *x, + int mi_row, int mi_col) { VP9_COMMON * const cm = &cpi->common; MACROBLOCKD *xd = &x->e_mbd; int i, j, k, m; @@ -771,71 +838,13 @@ static int choose_partitioning(VP9_COMP *cpi, set_ref_ptrs(cm, xd, mi->ref_frame[0], mi->ref_frame[1]); vp9_build_inter_predictors_sb(xd, mi_row, mi_col, BLOCK_64X64); - // Check if most of the superblock is skin content, and if so, force split - // to 32x32, and set x->sb_is_skin for use in mode selection. - // Avoid checking superblocks on/near boundary and avoid low resolutions. - // Note superblock may still pick 64X64 if y_sad is very small - // (i.e., y_sad < cpi->vbp_threshold_sad) below. For now leave this as is. x->sb_is_skin = 0; #if !CONFIG_VP9_HIGHBITDEPTH - if (cpi->use_skin_detection && !low_res && (mi_col >= 8 && - mi_col + 8 < cm->mi_cols && mi_row >= 8 && mi_row + 8 < cm->mi_rows)) { - CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; - int bl_index1, bl_index2, bl_index3; - int num_16x16_skin = 0; - int num_16x16_nonskin = 0; - int is_skin = 0; - int consec_zeromv = 0; - uint8_t *ysignal = x->plane[0].src.buf; - uint8_t *usignal = x->plane[1].src.buf; - uint8_t *vsignal = x->plane[2].src.buf; - int spuv = x->plane[1].src.stride; - const int block_index = mi_row * cm->mi_cols + mi_col; - const int bw = num_8x8_blocks_wide_lookup[BLOCK_64X64]; - const int bh = num_8x8_blocks_high_lookup[BLOCK_64X64]; - const int xmis = VPXMIN(cm->mi_cols - mi_col, bw); - const int ymis = VPXMIN(cm->mi_rows - mi_row, bh); - // Loop through the 16x16 sub-blocks. - int j, i; - for (i = 0; i < ymis; i+=2) { - for (j = 0; j < xmis; j+=2) { - int bl_index = block_index + i * cm->mi_cols + j; - bl_index1 = bl_index + 1; - bl_index2 = bl_index + cm->mi_cols; - bl_index3 = bl_index2 + 1; - consec_zeromv = VPXMIN(cr->consec_zero_mv[bl_index], - VPXMIN(cr->consec_zero_mv[bl_index1], - VPXMIN(cr->consec_zero_mv[bl_index2], - cr->consec_zero_mv[bl_index3]))); - is_skin = vp9_compute_skin_block(ysignal, - usignal, - vsignal, - sp, - spuv, - BLOCK_16X16, - consec_zeromv, - 0); - num_16x16_skin += is_skin; - num_16x16_nonskin += (1 - is_skin); - if (num_16x16_nonskin > 3) { - // Exit loop if at least 4 of the 16x16 blocks are not skin. - i = ymis; - j = xmis; - } - ysignal += 16; - usignal += 8; - vsignal += 8; - } - ysignal += (sp << 4) - 64; - usignal += (spuv << 3) - 32; - vsignal += (spuv << 3) - 32; - } - if (num_16x16_skin > 12) { - x->sb_is_skin = 1; - force_split[0] = 1; - } - } + if (cpi->use_skin_detection) + x->sb_is_skin = skin_sb_split(cpi, x, low_res, mi_row, mi_col, + &force_split[0]); #endif + for (i = 1; i <= 2; ++i) { struct macroblock_plane *p = &x->plane[i]; struct macroblockd_plane *pd = &xd->plane[i]; @@ -1228,10 +1237,10 @@ static void set_mode_info_seg_skip(MACROBLOCK *x, TX_MODE tx_mode, MODE_INFO *const mi = xd->mi[0]; INTERP_FILTER filter_ref; - if (xd->up_available) - filter_ref = xd->mi[-xd->mi_stride]->interp_filter; - else if (xd->left_available) - filter_ref = xd->mi[-1]->interp_filter; + if (xd->above_mi) + filter_ref = xd->above_mi->interp_filter; + else if (xd->left_mi) + filter_ref = xd->left_mi->interp_filter; else filter_ref = EIGHTTAP; @@ -1404,7 +1413,7 @@ static void update_stats(VP9_COMMON *cm, ThreadData *td) { const int seg_ref_active = segfeature_active(&cm->seg, mi->segment_id, SEG_LVL_REF_FRAME); if (!seg_ref_active) { - counts->intra_inter[vp9_get_intra_inter_context(xd)][inter_block]++; + counts->intra_inter[get_intra_inter_context(xd)][inter_block]++; // If the segment reference feature is enabled we have only a single // reference frame allowed for the segment so exclude it from // the reference frame counts used to work out probabilities. @@ -2266,8 +2275,8 @@ static void rd_auto_partition_range(VP9_COMP *cpi, const TileInfo *const tile, BLOCK_SIZE *max_block_size) { VP9_COMMON *const cm = &cpi->common; MODE_INFO **mi = xd->mi; - const int left_in_image = xd->left_available && mi[-1]; - const int above_in_image = xd->up_available && mi[-xd->mi_stride]; + const int left_in_image = !!xd->left_mi; + const int above_in_image = !!xd->above_mi; const int row8x8_remaining = tile->mi_row_end - mi_row; const int col8x8_remaining = tile->mi_col_end - mi_col; int bh, bw; @@ -2362,7 +2371,7 @@ static void set_partition_range(VP9_COMMON *cm, MACROBLOCKD *xd, } } - if (xd->left_available) { + if (xd->left_mi) { for (idy = 0; idy < mi_height; ++idy) { mi = xd->mi[idy * cm->mi_stride - 1]; bs = mi ? mi->sb_type : bsize; @@ -2371,7 +2380,7 @@ static void set_partition_range(VP9_COMMON *cm, MACROBLOCKD *xd, } } - if (xd->up_available) { + if (xd->above_mi) { for (idx = 0; idx < mi_width; ++idx) { mi = xd->mi[idx - cm->mi_stride]; bs = mi ? mi->sb_type : bsize; @@ -4138,6 +4147,31 @@ static INTERP_FILTER get_interp_filter( } } +static int compute_frame_aq_offset(struct VP9_COMP *cpi) { + VP9_COMMON *const cm = &cpi->common; + MODE_INFO **mi_8x8_ptr = cm->mi_grid_visible; + struct segmentation *const seg = &cm->seg; + + int mi_row, mi_col; + int sum_delta = 0; + int map_index = 0; + int qdelta_index; + int segment_id; + + for (mi_row = 0; mi_row < cm->mi_rows; mi_row++) { + MODE_INFO **mi_8x8 = mi_8x8_ptr; + for (mi_col = 0; mi_col < cm->mi_cols; mi_col++, mi_8x8++) { + segment_id = mi_8x8[0]->segment_id; + qdelta_index = get_segdata(seg, segment_id, SEG_LVL_ALT_Q); + sum_delta += qdelta_index; + map_index++; + } + mi_8x8_ptr += cm->mi_stride; + } + + return sum_delta / (cm->mi_rows * cm->mi_cols); +} + void vp9_encode_frame(VP9_COMP *cpi) { VP9_COMMON *const cm = &cpi->common; @@ -4260,8 +4294,13 @@ void vp9_encode_frame(VP9_COMP *cpi) { cm->reference_mode = SINGLE_REFERENCE; encode_frame_internal(cpi); } -} + // If segmentated AQ is enabled compute the average AQ weighting. + if (cm->seg.enabled && (cpi->oxcf.aq_mode != NO_AQ) && + (cm->seg.update_map || cm->seg.update_data)) { + cm->seg.aq_av_offset = compute_frame_aq_offset(cpi); + } +} static void sum_intra_stats(FRAME_COUNTS *counts, const MODE_INFO *mi) { const PREDICTION_MODE y_mode = mi->mode; const PREDICTION_MODE uv_mode = mi->uv_mode; @@ -4281,6 +4320,32 @@ static void sum_intra_stats(FRAME_COUNTS *counts, const MODE_INFO *mi) { ++counts->uv_mode[y_mode][uv_mode]; } +static void update_zeromv_cnt(VP9_COMP *const cpi, + const MODE_INFO *const mi, + int mi_row, int mi_col, + BLOCK_SIZE bsize) { + const VP9_COMMON *const cm = &cpi->common; + MV mv = mi->mv[0].as_mv; + const int bw = num_8x8_blocks_wide_lookup[bsize]; + const int bh = num_8x8_blocks_high_lookup[bsize]; + const int xmis = VPXMIN(cm->mi_cols - mi_col, bw); + const int ymis = VPXMIN(cm->mi_rows - mi_row, bh); + const int block_index = mi_row * cm->mi_cols + mi_col; + int x, y; + for (y = 0; y < ymis; y++) + for (x = 0; x < xmis; x++) { + int map_offset = block_index + y * cm->mi_cols + x; + if (is_inter_block(mi) && mi->segment_id <= CR_SEGMENT_ID_BOOST2) { + if (abs(mv.row) < 8 && abs(mv.col) < 8) { + if (cpi->consec_zero_mv[map_offset] < 255) + cpi->consec_zero_mv[map_offset]++; + } else { + cpi->consec_zero_mv[map_offset] = 0; + } + } + } +} + static void encode_superblock(VP9_COMP *cpi, ThreadData *td, TOKENEXTRA **t, int output_enabled, int mi_row, int mi_col, BLOCK_SIZE bsize, @@ -4313,10 +4378,11 @@ static void encode_superblock(VP9_COMP *cpi, ThreadData *td, int plane; mi->skip = 1; for (plane = 0; plane < MAX_MB_PLANE; ++plane) - vp9_encode_intra_block_plane(x, VPXMAX(bsize, BLOCK_8X8), plane); + vp9_encode_intra_block_plane(x, VPXMAX(bsize, BLOCK_8X8), plane, 1); if (output_enabled) sum_intra_stats(td->counts, mi); - vp9_tokenize_sb(cpi, td, t, !output_enabled, VPXMAX(bsize, BLOCK_8X8)); + vp9_tokenize_sb(cpi, td, t, !output_enabled, seg_skip, + VPXMAX(bsize, BLOCK_8X8)); } else { int ref; const int is_compound = has_second_ref(mi); @@ -4336,7 +4402,8 @@ static void encode_superblock(VP9_COMP *cpi, ThreadData *td, VPXMAX(bsize, BLOCK_8X8)); vp9_encode_sb(x, VPXMAX(bsize, BLOCK_8X8)); - vp9_tokenize_sb(cpi, td, t, !output_enabled, VPXMAX(bsize, BLOCK_8X8)); + vp9_tokenize_sb(cpi, td, t, !output_enabled, seg_skip, + VPXMAX(bsize, BLOCK_8X8)); } if (output_enabled) { @@ -4359,5 +4426,7 @@ static void encode_superblock(VP9_COMP *cpi, ThreadData *td, ++td->counts->tx.tx_totals[get_uv_tx_size(mi, &xd->plane[1])]; if (cm->seg.enabled && cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) vp9_cyclic_refresh_update_sb_postencode(cpi, mi, mi_row, mi_col, bsize); + if (cpi->oxcf.pass == 0 && cpi->svc.temporal_layer_id == 0) + update_zeromv_cnt(cpi, mi, mi_row, mi_col, bsize); } } diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodemb.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodemb.c index 689e8c0d9c9..d53bddb1ca5 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodemb.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodemb.c @@ -59,11 +59,10 @@ typedef struct vp9_token_state { int error; int next; int16_t token; - int16_t qc; + tran_low_t qc; } vp9_token_state; -// TODO(jimbankoski): experiment to find optimal RD numbers. -static const int plane_rd_mult[PLANE_TYPES] = { 4, 2 }; +static const int plane_rd_mult[REF_TYPES][PLANE_TYPES] ={ {10, 6}, {8, 7}, }; #define UPDATE_RD_COST()\ {\ @@ -110,7 +109,8 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block, const int16_t *const scan = so->scan; const int16_t *const nb = so->neighbors; int next = eob, sz = 0; - int64_t rdmult = mb->rdmult * plane_rd_mult[type], rddiv = mb->rddiv; + const int64_t rdmult = (mb->rdmult * plane_rd_mult[ref][type]) >> 1; + const int64_t rddiv = mb->rddiv; int64_t rd_cost0, rd_cost1; int rate0, rate1, error0, error1; int16_t t0, t1; @@ -126,9 +126,6 @@ static int optimize_b(MACROBLOCK *mb, int plane, int block, assert(eob <= default_eob); /* Now set up a Viterbi trellis to evaluate alternative roundings. */ - if (!ref) - rdmult = (rdmult * 9) >> 4; - /* Initialize the sentinel node of the trellis. */ tokens[eob][0].rate = 0; tokens[eob][0].error = 0; @@ -785,10 +782,19 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, const int src_stride = p->src.stride; const int dst_stride = pd->dst.stride; int i, j; + struct optimize_ctx *const ctx = args->ctx; + ENTROPY_CONTEXT *a = NULL; + ENTROPY_CONTEXT *l = NULL; + int entropy_ctx = 0; txfrm_block_to_raster_xy(plane_bsize, tx_size, block, &i, &j); dst = &pd->dst.buf[4 * (j * dst_stride + i)]; src = &p->src.buf[4 * (j * src_stride + i)]; src_diff = &p->src_diff[4 * (j * diff_stride + i)]; + if (args->ctx != NULL) { + a = &ctx->ta[plane][i]; + l = &ctx->tl[plane][j]; + entropy_ctx = combine_entropy_contexts(*a, *l); + } if (tx_size == TX_4X4) { tx_type = get_tx_type_4x4(get_plane_type(plane), xd, block); @@ -907,6 +913,9 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, pd->dequant, eob, scan_order->scan, scan_order->iscan); } + if (args->ctx != NULL) { + *a = *l = optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; + } if (!x->skip_encode && *eob) vp9_idct32x32_add(dqcoeff, dst, dst_stride, *eob); break; @@ -920,6 +929,9 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, pd->dequant, eob, scan_order->scan, scan_order->iscan); } + if (args->ctx != NULL) { + *a = *l = optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; + } if (!x->skip_encode && *eob) vp9_iht16x16_add(tx_type, dqcoeff, dst, dst_stride, *eob); break; @@ -933,6 +945,9 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, pd->dequant, eob, scan_order->scan, scan_order->iscan); } + if (args->ctx != NULL) { + *a = *l = optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; + } if (!x->skip_encode && *eob) vp9_iht8x8_add(tx_type, dqcoeff, dst, dst_stride, *eob); break; @@ -949,7 +964,9 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, pd->dequant, eob, scan_order->scan, scan_order->iscan); } - + if (args->ctx != NULL) { + *a = *l = optimize_b(x, plane, block, tx_size, entropy_ctx) > 0; + } if (!x->skip_encode && *eob) { if (tx_type == DCT_DCT) // this is like vp9_short_idct4x4 but has a special case around eob<=1 @@ -968,10 +985,21 @@ void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, *(args->skip) = 0; } -void vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { +void vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane, + int enable_optimize_b) { const MACROBLOCKD *const xd = &x->e_mbd; + struct optimize_ctx ctx; struct encode_b_args arg = {x, NULL, &xd->mi[0]->skip}; + if (enable_optimize_b && x->optimize && + (!x->skip_recode || !x->skip_optimize)) { + const struct macroblockd_plane* const pd = &xd->plane[plane]; + const TX_SIZE tx_size = plane ? get_uv_tx_size(xd->mi[0], pd) : + xd->mi[0]->tx_size; + vp9_get_entropy_contexts(bsize, tx_size, pd, ctx.ta[plane], ctx.tl[plane]); + arg.ctx = &ctx; + } + vp9_foreach_transformed_block_in_plane(xd, bsize, plane, vp9_encode_block_intra, &arg); } diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodemb.h b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodemb.h index 97df8a66be7..25b0b23e0dd 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodemb.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encodemb.h @@ -37,7 +37,8 @@ void vp9_subtract_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane); void vp9_encode_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg); -void vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane); +void vp9_encode_intra_block_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane, + int enable_optimize_b); #ifdef __cplusplus } // extern "C" diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encoder.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encoder.c index 547c1628d0c..4be043df5a7 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encoder.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encoder.c @@ -375,6 +375,9 @@ static void dealloc_compressor_data(VP9_COMP *cpi) { vpx_free(cpi->active_map.map); cpi->active_map.map = NULL; + vpx_free(cpi->consec_zero_mv); + cpi->consec_zero_mv = NULL; + vp9_free_ref_frame_buffers(cm->buffer_pool); #if CONFIG_VP9_POSTPROC vp9_free_postproc_buffers(cm); @@ -1549,9 +1552,12 @@ void vp9_change_config(struct VP9_COMP *cpi, const VP9EncoderConfig *oxcf) { update_frame_size(cpi); - if ((last_w != cpi->oxcf.width || last_h != cpi->oxcf.height) && - cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) - vp9_cyclic_refresh_reset_resize(cpi); + if (last_w != cpi->oxcf.width || last_h != cpi->oxcf.height) { + memset(cpi->consec_zero_mv, 0, + cm->mi_rows * cm->mi_cols * sizeof(*cpi->consec_zero_mv)); + if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) + vp9_cyclic_refresh_reset_resize(cpi); + } if ((cpi->svc.number_temporal_layers > 1 && cpi->oxcf.rc_mode == VPX_CBR) || @@ -1686,8 +1692,6 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf, cpi->use_skin_detection = 0; cpi->common.buffer_pool = pool; - cpi->rc.high_source_sad = 0; - init_config(cpi, oxcf); vp9_rc_init(&cpi->oxcf, oxcf->pass, &cpi->rc); @@ -1697,6 +1701,10 @@ VP9_COMP *vp9_create_compressor(VP9EncoderConfig *oxcf, realloc_segmentation_maps(cpi); + CHECK_MEM_ERROR(cm, cpi->consec_zero_mv, + vpx_calloc(cm->mi_rows * cm->mi_cols, + sizeof(*cpi->consec_zero_mv))); + CHECK_MEM_ERROR(cm, cpi->nmvcosts[0], vpx_calloc(MV_VALS, sizeof(*cpi->nmvcosts[0]))); CHECK_MEM_ERROR(cm, cpi->nmvcosts[1], @@ -2839,7 +2847,8 @@ void vp9_update_reference_frames(VP9_COMP *cpi) { sizeof(cpi->interp_filter_selected[0])); } #if CONFIG_VP9_TEMPORAL_DENOISING - if (cpi->oxcf.noise_sensitivity > 0) { + if (cpi->oxcf.noise_sensitivity > 0 && + cpi->denoiser.denoising_level > kDenLowLow) { vp9_denoiser_update_frame_info(&cpi->denoiser, *cpi->Source, cpi->common.frame_type, @@ -3125,7 +3134,7 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) { "%7.2lf %7.2lf %7.2lf %7.2lf %7.2lf" "%6d %6d %5d %5d %5d " "%10"PRId64" %10.3lf" - "%10lf %8u %10"PRId64" %10d %10d %10d %10d\n", + "%10lf %8u %10"PRId64" %10d %10d %10d %10d %10d\n", cpi->common.current_video_frame, cm->width, cm->height, cpi->td.rd_counts.m_search_count, @@ -3159,7 +3168,8 @@ static void output_frame_level_debug_stats(VP9_COMP *cpi) { cpi->tot_recode_hits, recon_err, cpi->rc.kf_boost, cpi->twopass.kf_zeromotion_pct, cpi->twopass.fr_content_type, - cm->lf.filter_level); + cm->lf.filter_level, + cm->seg.aq_av_offset); } fclose(f); @@ -3428,6 +3438,12 @@ static void encode_without_recode_loop(VP9_COMP *cpi, cpi->unscaled_last_source, &cpi->scaled_last_source, (cpi->oxcf.pass == 0)); + + if (cm->frame_type == KEY_FRAME || cpi->resize_pending != 0) { + memset(cpi->consec_zero_mv, 0, + cm->mi_rows * cm->mi_cols * sizeof(*cpi->consec_zero_mv)); + } + vp9_update_noise_estimate(cpi); if (cpi->oxcf.pass == 0 && diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encoder.h b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encoder.h index 2def941efa4..add4102d646 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encoder.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_encoder.h @@ -129,7 +129,7 @@ typedef struct VP9EncoderConfig { int height; // height of data passed to the compressor unsigned int input_bit_depth; // Input bit depth. double init_framerate; // set to passed in framerate - int64_t target_bandwidth; // bandwidth to be used in kilobits per second + int64_t target_bandwidth; // bandwidth to be used in bits per second int noise_sensitivity; // pre processing blur: recommendation 0 int sharpness; // sharpening output: recommendation 0: @@ -499,6 +499,9 @@ typedef struct VP9_COMP { NOISE_ESTIMATE noise_estimate; + // Count on how many consecutive times a block uses small/zeromv for encoding. + uint8_t *consec_zero_mv; + // VAR_BASED_PARTITION thresholds // 0 - threshold_64x64; 1 - threshold_32x32; // 2 - threshold_16x16; 3 - vbp_threshold_8x8; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c index 10fd6c02c2d..14ddaa2fb57 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.c @@ -65,7 +65,7 @@ #define NCOUNT_INTRA_THRESH 8192 #define NCOUNT_INTRA_FACTOR 3 -#define NCOUNT_FRAME_II_THRESH 5.0 + #define DOUBLE_DIVIDE_CHECK(x) ((x) < 0 ? (x) - 0.000001 : (x) + 0.000001) @@ -115,7 +115,7 @@ static void output_stats(FIRSTPASS_STATS *stats, fprintf(fpfile, "%12.0lf %12.4lf %12.0lf %12.0lf %12.0lf %12.4lf %12.4lf" "%12.4lf %12.4lf %12.4lf %12.4lf %12.4lf %12.4lf %12.4lf %12.4lf" - "%12.4lf %12.4lf %12.0lf %12.0lf %12.0lf %12.4lf\n", + "%12.4lf %12.4lf %12.4lf %12.0lf %12.0lf %12.0lf %12.4lf\n", stats->frame, stats->weight, stats->intra_error, @@ -126,6 +126,7 @@ static void output_stats(FIRSTPASS_STATS *stats, stats->pcnt_second_ref, stats->pcnt_neutral, stats->intra_skip_pct, + stats->intra_smooth_pct, stats->inactive_zone_rows, stats->inactive_zone_cols, stats->MVr, @@ -165,6 +166,7 @@ static void zero_stats(FIRSTPASS_STATS *section) { section->pcnt_second_ref = 0.0; section->pcnt_neutral = 0.0; section->intra_skip_pct = 0.0; + section->intra_smooth_pct = 0.0; section->inactive_zone_rows = 0.0; section->inactive_zone_cols = 0.0; section->MVr = 0.0; @@ -193,6 +195,7 @@ static void accumulate_stats(FIRSTPASS_STATS *section, section->pcnt_second_ref += frame->pcnt_second_ref; section->pcnt_neutral += frame->pcnt_neutral; section->intra_skip_pct += frame->intra_skip_pct; + section->intra_smooth_pct += frame->intra_smooth_pct; section->inactive_zone_rows += frame->inactive_zone_rows; section->inactive_zone_cols += frame->inactive_zone_cols; section->MVr += frame->MVr; @@ -219,6 +222,7 @@ static void subtract_stats(FIRSTPASS_STATS *section, section->pcnt_second_ref -= frame->pcnt_second_ref; section->pcnt_neutral -= frame->pcnt_neutral; section->intra_skip_pct -= frame->intra_skip_pct; + section->intra_smooth_pct -= frame->intra_smooth_pct; section->inactive_zone_rows -= frame->inactive_zone_rows; section->inactive_zone_cols -= frame->inactive_zone_cols; section->MVr -= frame->MVr; @@ -493,12 +497,12 @@ static void set_first_pass_params(VP9_COMP *cpi) { // This threshold is used to track blocks where to all intents and purposes // the intra prediction error 0. Though the metric we test against // is technically a sse we are mainly interested in blocks where all the pixels -// int he 8 bit domain have an error of <= 1 (where error = sse) so a +// in the 8 bit domain have an error of <= 1 (where error = sse) so a // linear scaling for 10 and 12 bit gives similar results. #define UL_INTRA_THRESH 50 -#if CONFIG_VP9_HIGHBITDEPTH static int get_ul_intra_threshold(VP9_COMMON *cm) { int ret_val = UL_INTRA_THRESH; +#if CONFIG_VP9_HIGHBITDEPTH if (cm->use_highbitdepth) { switch (cm->bit_depth) { case VPX_BITS_8: @@ -515,9 +519,37 @@ static int get_ul_intra_threshold(VP9_COMMON *cm) { "VPX_BITS_10 or VPX_BITS_12"); } } +#else + (void) cm; +#endif // CONFIG_VP9_HIGHBITDEPTH return ret_val; } + +#define SMOOTH_INTRA_THRESH 4000 +static int get_smooth_intra_threshold(VP9_COMMON *cm) { + int ret_val = SMOOTH_INTRA_THRESH; +#if CONFIG_VP9_HIGHBITDEPTH + if (cm->use_highbitdepth) { + switch (cm->bit_depth) { + case VPX_BITS_8: + ret_val = SMOOTH_INTRA_THRESH; + break; + case VPX_BITS_10: + ret_val = SMOOTH_INTRA_THRESH >> 2; + break; + case VPX_BITS_12: + ret_val = SMOOTH_INTRA_THRESH >> 4; + break; + default: + assert(0 && "cm->bit_depth should be VPX_BITS_8, " + "VPX_BITS_10 or VPX_BITS_12"); + } + } +#else + (void) cm; #endif // CONFIG_VP9_HIGHBITDEPTH + return ret_val; +} #define INVALID_ROW -1 void vp9_first_pass(VP9_COMP *cpi, const struct lookahead_entry *source) { @@ -545,6 +577,7 @@ void vp9_first_pass(VP9_COMP *cpi, const struct lookahead_entry *source) { const int intrapenalty = INTRA_MODE_PENALTY; double neutral_count; int intra_skip_count = 0; + int intra_smooth_count = 0; int image_data_start_row = INVALID_ROW; int new_mv_count = 0; int sum_in_vectors = 0; @@ -563,6 +596,7 @@ void vp9_first_pass(VP9_COMP *cpi, const struct lookahead_entry *source) { double intra_factor; double brightness_factor; BufferPool *const pool = cm->buffer_pool; + MODE_INFO mi_above, mi_left; // First pass code requires valid last and new frame buffers. assert(new_yv12 != NULL); @@ -695,13 +729,19 @@ void vp9_first_pass(VP9_COMP *cpi, const struct lookahead_entry *source) { mb_row << 1, num_8x8_blocks_high_lookup[bsize], mb_col << 1, num_8x8_blocks_wide_lookup[bsize], cm->mi_rows, cm->mi_cols); + // Are edges available for intra prediction? + // Since the firstpass does not populate the mi_grid_visible, + // above_mi/left_mi must be overwritten with a nonzero value when edges + // are available. Required by vp9_predict_intra_block(). + xd->above_mi = (mb_row != 0) ? &mi_above : NULL; + xd->left_mi = (mb_col > tile.mi_col_start) ? &mi_left : NULL; // Do intra 16x16 prediction. x->skip_encode = 0; xd->mi[0]->mode = DC_PRED; xd->mi[0]->tx_size = use_dc_pred ? (bsize >= BLOCK_16X16 ? TX_16X16 : TX_8X8) : TX_4X4; - vp9_encode_intra_block_plane(x, bsize, 0); + vp9_encode_intra_block_plane(x, bsize, 0, 0); this_error = vpx_get_mb_ss(x->plane[0].src_diff); // Keep a record of blocks that have almost no intra error residual @@ -709,15 +749,14 @@ void vp9_first_pass(VP9_COMP *cpi, const struct lookahead_entry *source) { // domain). In natural videos this is uncommon, but it is much more // common in animations, graphics and screen content, so may be used // as a signal to detect these types of content. -#if CONFIG_VP9_HIGHBITDEPTH if (this_error < get_ul_intra_threshold(cm)) { -#else - if (this_error < UL_INTRA_THRESH) { -#endif ++intra_skip_count; } else if ((mb_col > 0) && (image_data_start_row == INVALID_ROW)) { image_data_start_row = mb_row; } + if (this_error < get_smooth_intra_threshold(cm)) { + ++intra_smooth_count; + } #if CONFIG_VP9_HIGHBITDEPTH if (cm->use_highbitdepth) { @@ -1083,8 +1122,10 @@ void vp9_first_pass(VP9_COMP *cpi, const struct lookahead_entry *source) { fps.pcnt_second_ref = (double)second_ref_count / num_mbs; fps.pcnt_neutral = (double)neutral_count / num_mbs; fps.intra_skip_pct = (double)intra_skip_count / num_mbs; + fps.intra_smooth_pct = (double)intra_smooth_count / num_mbs; fps.inactive_zone_rows = (double)image_data_start_row; - fps.inactive_zone_cols = (double)0; // TODO(paulwilkins): fix + // Currently set to 0 as most issues relate to letter boxing. + fps.inactive_zone_cols = (double)0; if (mvcount > 0) { fps.MVr = (double)sum_mvr / mvcount; @@ -1110,10 +1151,9 @@ void vp9_first_pass(VP9_COMP *cpi, const struct lookahead_entry *source) { fps.pcnt_motion = 0.0; } - // TODO(paulwilkins): Handle the case when duration is set to 0, or - // something less than the full time between subsequent values of - // cpi->source_time_stamp. - fps.duration = (double)(source->ts_end - source->ts_start); + // Dont allow a value of 0 for duration. + // (Section duration is also defaulted to minimum of 1.0). + fps.duration = VPXMAX(1.0, (double)(source->ts_end - source->ts_start)); // Don't want to do output stats with a stack variable! twopass->this_frame_stats = fps; @@ -1371,11 +1411,12 @@ void vp9_init_second_pass(VP9_COMP *cpi) { } #define SR_DIFF_PART 0.0015 -#define MOTION_AMP_PART 0.003 #define INTRA_PART 0.005 #define DEFAULT_DECAY_LIMIT 0.75 #define LOW_SR_DIFF_TRHESH 0.1 #define SR_DIFF_MAX 128.0 +#define LOW_CODED_ERR_PER_MB 10.0 +#define NCOUNT_FRAME_II_THRESH 6.0 static double get_sr_decay_rate(const VP9_COMP *cpi, const FIRSTPASS_STATS *frame) { @@ -1386,12 +1427,15 @@ static double get_sr_decay_rate(const VP9_COMP *cpi, double sr_decay = 1.0; double modified_pct_inter; double modified_pcnt_intra; - const double motion_amplitude_factor = - frame->pcnt_motion * ((frame->mvc_abs + frame->mvr_abs) / 2); + const double motion_amplitude_part = + frame->pcnt_motion * + ((frame->mvc_abs + frame->mvr_abs) / + (cpi->initial_height + cpi->initial_width)); modified_pct_inter = frame->pcnt_inter; - if ((frame->intra_error / DOUBLE_DIVIDE_CHECK(frame->coded_error)) < - (double)NCOUNT_FRAME_II_THRESH) { + if (((frame->coded_error / num_mbs) > LOW_CODED_ERR_PER_MB) && + ((frame->intra_error / DOUBLE_DIVIDE_CHECK(frame->coded_error)) < + (double)NCOUNT_FRAME_II_THRESH)) { modified_pct_inter = frame->pcnt_inter - frame->pcnt_neutral; } modified_pcnt_intra = 100 * (1.0 - modified_pct_inter); @@ -1400,7 +1444,7 @@ static double get_sr_decay_rate(const VP9_COMP *cpi, if ((sr_diff > LOW_SR_DIFF_TRHESH)) { sr_diff = VPXMIN(sr_diff, SR_DIFF_MAX); sr_decay = 1.0 - (SR_DIFF_PART * sr_diff) - - (MOTION_AMP_PART * motion_amplitude_factor) - + motion_amplitude_part - (INTRA_PART * modified_pcnt_intra); } return VPXMAX(sr_decay, VPXMIN(DEFAULT_DECAY_LIMIT, modified_pct_inter)); @@ -1957,7 +2001,8 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { int int_lbq = (int)(vp9_convert_qindex_to_q(rc->last_boosted_qindex, cpi->common.bit_depth)); - active_min_gf_interval = rc->min_gf_interval + VPXMIN(2, int_max_q / 200); + active_min_gf_interval = + rc->min_gf_interval + arf_active_or_kf + VPXMIN(2, int_max_q / 200); if (active_min_gf_interval > rc->max_gf_interval) active_min_gf_interval = rc->max_gf_interval; @@ -1968,13 +2013,20 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { // bits to spare and are better with a smaller interval and smaller boost. // At high Q when there are few bits to spare we are better with a longer // interval to spread the cost of the GF. - active_max_gf_interval = 12 + VPXMIN(4, (int_lbq / 6)); + active_max_gf_interval = + 12 + arf_active_or_kf + VPXMIN(4, (int_lbq / 6)); // We have: active_min_gf_interval <= rc->max_gf_interval if (active_max_gf_interval < active_min_gf_interval) active_max_gf_interval = active_min_gf_interval; else if (active_max_gf_interval > rc->max_gf_interval) active_max_gf_interval = rc->max_gf_interval; + + // Would the active max drop us out just before the near the next kf? + if ((active_max_gf_interval <= rc->frames_to_key) && + (active_max_gf_interval >= + (rc->frames_to_key - rc->min_gf_interval))) + active_max_gf_interval = rc->frames_to_key / 2; } } @@ -2032,11 +2084,13 @@ static void define_gf_group(VP9_COMP *cpi, FIRSTPASS_STATS *this_frame) { // Break out conditions. if ( // Break at active_max_gf_interval unless almost totally static. - (i >= (active_max_gf_interval + arf_active_or_kf) && - zero_motion_accumulator < 0.995) || + ((i >= active_max_gf_interval) && + (zero_motion_accumulator < 0.995)) || ( // Don't break out with a very short interval. - (i >= active_min_gf_interval + arf_active_or_kf) && + (i >= active_min_gf_interval) && + // If possible dont break very close to a kf + ((rc->frames_to_key - i) >= rc->min_gf_interval) && (!flash_detected) && ((mv_ratio_accumulator > mv_ratio_accumulator_thresh) || (abs_mv_in_out_accumulator > 3.0) || @@ -2782,6 +2836,7 @@ void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { // applied when combining MB error values for the frame. twopass->mb_av_energy = log(((this_frame.intra_error * 256.0) / num_mbs) + 1.0); + twopass->mb_smooth_pct = this_frame.intra_smooth_pct; } // Update the total stats remaining structure. @@ -2794,6 +2849,7 @@ void vp9_rc_get_second_pass_params(VP9_COMP *cpi) { void vp9_twopass_postencode_update(VP9_COMP *cpi) { TWO_PASS *const twopass = &cpi->twopass; RATE_CONTROL *const rc = &cpi->rc; + VP9_COMMON *const cm = &cpi->common; const int bits_used = rc->base_frame_target; // VBR correction is done through rc->vbr_bits_off_target. Based on the @@ -2831,6 +2887,22 @@ void vp9_twopass_postencode_update(VP9_COMP *cpi) { rc->worst_quality - twopass->active_worst_quality; const int minq_adj_limit = (cpi->oxcf.rc_mode == VPX_CQ ? MINQ_ADJ_LIMIT_CQ : MINQ_ADJ_LIMIT); + int aq_extend_min = 0; + int aq_extend_max = 0; + + // Extend min or Max Q range to account for imbalance from the base + // value when using AQ. + if (cpi->oxcf.aq_mode != NO_AQ) { + if (cm->seg.aq_av_offset < 0) { + // The balance of the AQ map tends towarda lowering the average Q. + aq_extend_min = 0; + aq_extend_max = VPXMIN(maxq_adj_limit, -cm->seg.aq_av_offset); + } else { + // The balance of the AQ map tends towards raising the average Q. + aq_extend_min = VPXMIN(minq_adj_limit, cm->seg.aq_av_offset); + aq_extend_max = 0; + } + } // Undershoot. if (rc->rate_error_estimate > cpi->oxcf.under_shoot_pct) { @@ -2855,8 +2927,10 @@ void vp9_twopass_postencode_update(VP9_COMP *cpi) { --twopass->extend_maxq; } - twopass->extend_minq = clamp(twopass->extend_minq, 0, minq_adj_limit); - twopass->extend_maxq = clamp(twopass->extend_maxq, 0, maxq_adj_limit); + twopass->extend_minq = + clamp(twopass->extend_minq, aq_extend_min, minq_adj_limit); + twopass->extend_maxq = + clamp(twopass->extend_maxq, aq_extend_max, maxq_adj_limit); // If there is a big and undexpected undershoot then feed the extra // bits back in quickly. One situation where this may happen is if a diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h index 5875a7b9b5c..7eb44fa13ac 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_firstpass.h @@ -52,6 +52,7 @@ typedef struct { double pcnt_second_ref; double pcnt_neutral; double intra_skip_pct; + double intra_smooth_pct; // % of blocks that are smooth double inactive_zone_rows; // Image mask rows top and bottom. double inactive_zone_cols; // Image mask columns at left and right edges. double MVr; @@ -107,6 +108,7 @@ typedef struct { double modified_error_max; double modified_error_left; double mb_av_energy; + double mb_smooth_pct; #if CONFIG_FP_MB_STATS uint8_t *frame_mb_stats_buf; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c index def9b8c1db0..441280cb1ea 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.c @@ -20,8 +20,8 @@ /* Return the buffer at the given absolute index and increment the index */ static struct lookahead_entry *pop(struct lookahead_ctx *ctx, - unsigned int *idx) { - unsigned int index = *idx; + int *idx) { + int index = *idx; struct lookahead_entry *buf = ctx->buf + index; assert(index < ctx->max_sz); @@ -35,7 +35,7 @@ static struct lookahead_entry *pop(struct lookahead_ctx *ctx, void vp9_lookahead_destroy(struct lookahead_ctx *ctx) { if (ctx) { if (ctx->buf) { - unsigned int i; + int i; for (i = 0; i < ctx->max_sz; i++) vpx_free_frame_buffer(&ctx->buf[i].img); @@ -221,9 +221,9 @@ struct lookahead_entry *vp9_lookahead_peek(struct lookahead_ctx *ctx, if (index >= 0) { // Forward peek - if (index < (int)ctx->sz) { + if (index < ctx->sz) { index += ctx->read_idx; - if (index >= (int)ctx->max_sz) + if (index >= ctx->max_sz) index -= ctx->max_sz; buf = ctx->buf + index; } diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h index 13820380ff4..db0fd1cdea8 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_lookahead.h @@ -36,10 +36,10 @@ struct lookahead_entry { #define MAX_PRE_FRAMES 1 struct lookahead_ctx { - unsigned int max_sz; /* Absolute size of the queue */ - unsigned int sz; /* Number of buffers currently in the queue */ - unsigned int read_idx; /* Read index */ - unsigned int write_idx; /* Write index */ + int max_sz; /* Absolute size of the queue */ + int sz; /* Number of buffers currently in the queue */ + int read_idx; /* Read index */ + int write_idx; /* Write index */ struct lookahead_entry *buf; /* Buffer list */ }; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_mbgraph.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_mbgraph.c index 7ce86b45dc7..3ae5b21a9ff 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_mbgraph.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_mbgraph.c @@ -243,13 +243,16 @@ static void update_mbgraph_frame_stats(VP9_COMP *cpi, int mb_y_offset = 0, arf_y_offset = 0, gld_y_offset = 0; MV gld_top_mv = {0, 0}; MODE_INFO mi_local; + MODE_INFO mi_above, mi_left; vp9_zero(mi_local); // Set up limit values for motion vectors to prevent them extending outside // the UMV borders. x->mv_row_min = -BORDER_MV_PIXELS_B16; x->mv_row_max = (cm->mb_rows - 1) * 8 + BORDER_MV_PIXELS_B16; - xd->up_available = 0; + // Signal to vp9_predict_intra_block() that above is not available + xd->above_mi = NULL; + xd->plane[0].dst.stride = buf->y_stride; xd->plane[0].pre[0].stride = buf->y_stride; xd->plane[1].dst.stride = buf->uv_stride; @@ -268,7 +271,8 @@ static void update_mbgraph_frame_stats(VP9_COMP *cpi, // the UMV borders. x->mv_col_min = -BORDER_MV_PIXELS_B16; x->mv_col_max = (cm->mb_cols - 1) * 8 + BORDER_MV_PIXELS_B16; - xd->left_available = 0; + // Signal to vp9_predict_intra_block() that left is not available + xd->left_mi = NULL; for (mb_col = 0; mb_col < cm->mb_cols; mb_col++) { MBGRAPH_MB_STATS *mb_stats = &stats->mb_stats[offset + mb_col]; @@ -280,14 +284,19 @@ static void update_mbgraph_frame_stats(VP9_COMP *cpi, if (mb_col == 0) { gld_top_mv = gld_left_mv; } - xd->left_available = 1; + // Signal to vp9_predict_intra_block() that left is available + xd->left_mi = &mi_left; + mb_y_in_offset += 16; gld_y_in_offset += 16; arf_y_in_offset += 16; x->mv_col_min -= 16; x->mv_col_max -= 16; } - xd->up_available = 1; + + // Signal to vp9_predict_intra_block() that above is available + xd->above_mi = &mi_above; + mb_y_offset += buf->y_stride * 16; gld_y_offset += golden_ref->y_stride * 16; if (alt_ref) diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_noise_estimate.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_noise_estimate.c index d505629a5b8..4b43b3879d6 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_noise_estimate.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_noise_estimate.c @@ -39,12 +39,10 @@ void vp9_noise_estimate_init(NOISE_ESTIMATE *const ne, ne->num_frames_estimate = 20; } -int enable_noise_estimation(VP9_COMP *const cpi) { - // Enable noise estimation if denoising is on (and cyclic refresh, since - // noise estimate is currently using a struct defined in cyclic refresh). +static int enable_noise_estimation(VP9_COMP *const cpi) { + // Enable noise estimation if denoising is on. #if CONFIG_VP9_TEMPORAL_DENOISING - if (cpi->oxcf.noise_sensitivity > 0 && - cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ) + if (cpi->oxcf.noise_sensitivity > 0) return 1; #endif // Only allow noise estimate under certain encoding mode. @@ -91,7 +89,7 @@ NOISE_LEVEL vp9_noise_estimate_extract_level(NOISE_ESTIMATE *const ne) { } else { if (ne->value > ne->thresh) noise_level = kMedium; - else if (ne->value > (ne->thresh >> 1)) + else if (ne->value > ((9 * ne->thresh) >> 4)) noise_level = kLow; else noise_level = kLowLow; @@ -101,11 +99,10 @@ NOISE_LEVEL vp9_noise_estimate_extract_level(NOISE_ESTIMATE *const ne) { void vp9_update_noise_estimate(VP9_COMP *const cpi) { const VP9_COMMON *const cm = &cpi->common; - CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; NOISE_ESTIMATE *const ne = &cpi->noise_estimate; // Estimate of noise level every frame_period frames. - int frame_period = 10; - int thresh_consec_zeromv = 8; + int frame_period = 8; + int thresh_consec_zeromv = 6; unsigned int thresh_sum_diff = 100; unsigned int thresh_sum_spatial = (200 * 200) << 8; unsigned int thresh_spatial_var = (32 * 32) << 8; @@ -131,6 +128,14 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) { ne->last_h = cm->height; } return; + } else if (cpi->rc.avg_frame_low_motion < 50) { + // Force noise estimation to 0 and denoiser off if content has high motion. + ne->level = kLowLow; +#if CONFIG_VP9_TEMPORAL_DENOISING + if (cpi->oxcf.noise_sensitivity > 0) + vp9_denoiser_set_noise_level(&cpi->denoiser, ne->level); +#endif + return; } else { int num_samples = 0; uint64_t avg_est = 0; @@ -153,7 +158,7 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) { for (mi_row = 0; mi_row < cm->mi_rows; mi_row++) { for (mi_col = 0; mi_col < cm->mi_cols; mi_col++) { int bl_index = mi_row * cm->mi_cols + mi_col; - if (cr->consec_zero_mv[bl_index] > thresh_consec_zeromv) + if (cpi->consec_zero_mv[bl_index] > thresh_consec_zeromv) num_low_motion++; } } @@ -173,23 +178,26 @@ void vp9_update_noise_estimate(VP9_COMP *const cpi) { // been encoded as zero/low motion x (= thresh_consec_zeromv) frames // in a row. consec_zero_mv[] defined for 8x8 blocks, so consider all // 4 sub-blocks for 16x16 block. Also, avoid skin blocks. - int consec_zeromv = VPXMIN(cr->consec_zero_mv[bl_index], - VPXMIN(cr->consec_zero_mv[bl_index1], - VPXMIN(cr->consec_zero_mv[bl_index2], - cr->consec_zero_mv[bl_index3]))); - int is_skin = vp9_compute_skin_block(src_y, - src_u, - src_v, - src_ystride, - src_uvstride, - bsize, - consec_zeromv, - 0); + int consec_zeromv = VPXMIN(cpi->consec_zero_mv[bl_index], + VPXMIN(cpi->consec_zero_mv[bl_index1], + VPXMIN(cpi->consec_zero_mv[bl_index2], + cpi->consec_zero_mv[bl_index3]))); + int is_skin = 0; + if (cpi->use_skin_detection) { + is_skin = vp9_compute_skin_block(src_y, + src_u, + src_v, + src_ystride, + src_uvstride, + bsize, + consec_zeromv, + 0); + } if (frame_low_motion && - cr->consec_zero_mv[bl_index] > thresh_consec_zeromv && - cr->consec_zero_mv[bl_index1] > thresh_consec_zeromv && - cr->consec_zero_mv[bl_index2] > thresh_consec_zeromv && - cr->consec_zero_mv[bl_index3] > thresh_consec_zeromv && + cpi->consec_zero_mv[bl_index] > thresh_consec_zeromv && + cpi->consec_zero_mv[bl_index1] > thresh_consec_zeromv && + cpi->consec_zero_mv[bl_index2] > thresh_consec_zeromv && + cpi->consec_zero_mv[bl_index3] > thresh_consec_zeromv && !is_skin) { // Compute variance. unsigned int sse; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_pickmode.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_pickmode.c index 8b2e9854983..d2ecafc0aa0 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_pickmode.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_pickmode.c @@ -244,7 +244,7 @@ static void block_variance(const uint8_t *src, int src_stride, &sse8x8[k], &sum8x8[k]); *sse += sse8x8[k]; *sum += sum8x8[k]; - var8x8[k] = sse8x8[k] - (((unsigned int)sum8x8[k] * sum8x8[k]) >> 6); + var8x8[k] = sse8x8[k] - (uint32_t)(((int64_t)sum8x8[k] * sum8x8[k]) >> 6); k++; } } @@ -265,7 +265,7 @@ static void calculate_variance(int bw, int bh, TX_SIZE tx_size, sse_i[(i + 1) * nw + j] + sse_i[(i + 1) * nw + j + 1]; sum_o[k] = sum_i[i * nw + j] + sum_i[i * nw + j + 1] + sum_i[(i + 1) * nw + j] + sum_i[(i + 1) * nw + j + 1]; - var_o[k] = sse_o[k] - (((unsigned int)sum_o[k] * sum_o[k]) >> + var_o[k] = sse_o[k] - (uint32_t)(((int64_t)sum_o[k] * sum_o[k]) >> (b_width_log2_lookup[unit_size] + b_height_log2_lookup[unit_size] + 6)); k++; @@ -701,10 +701,9 @@ static void block_yrd(VP9_COMP *cpi, MACROBLOCK *x, int *rate, int64_t *dist, } } - if (*skippable == 0) { - *rate <<= (2 + VP9_PROB_COST_SHIFT); - *rate += (eob_cost << VP9_PROB_COST_SHIFT); - } + // If skippable is set, rate gets clobbered later. + *rate <<= (2 + VP9_PROB_COST_SHIFT); + *rate += (eob_cost << VP9_PROB_COST_SHIFT); } #endif @@ -906,6 +905,7 @@ struct estimate_block_intra_args { VP9_COMP *cpi; MACROBLOCK *x; PREDICTION_MODE mode; + int skippable; int rate; int64_t dist; }; @@ -941,13 +941,9 @@ static void estimate_block_intra(int plane, int block, BLOCK_SIZE plane_bsize, if (plane == 0) { int64_t this_sse = INT64_MAX; - int is_skippable; // TODO(jingning): This needs further refactoring. - block_yrd(cpi, x, &rate, &dist, &is_skippable, &this_sse, 0, + block_yrd(cpi, x, &rate, &dist, &args->skippable, &this_sse, 0, bsize_tx, VPXMIN(tx_size, TX_16X16)); - x->skip_txfm[0] = is_skippable; - // TODO(jingning): Skip is signalled per prediciton block not per tx block. - rate += vp9_cost_bit(vp9_get_skip_prob(&cpi->common, xd), is_skippable); } else { unsigned int var = 0; unsigned int sse = 0; @@ -1011,14 +1007,14 @@ void vp9_pick_intra_mode(VP9_COMP *cpi, MACROBLOCK *x, RD_COST *rd_cost, MODE_INFO *const mi = xd->mi[0]; RD_COST this_rdc, best_rdc; PREDICTION_MODE this_mode; - struct estimate_block_intra_args args = { cpi, x, DC_PRED, 0, 0 }; + struct estimate_block_intra_args args = { cpi, x, DC_PRED, 1, 0, 0 }; const TX_SIZE intra_tx_size = VPXMIN(max_txsize_lookup[bsize], tx_mode_to_biggest_tx_size[cpi->common.tx_mode]); MODE_INFO *const mic = xd->mi[0]; int *bmode_costs; - const MODE_INFO *above_mi = xd->mi[-xd->mi_stride]; - const MODE_INFO *left_mi = xd->left_available ? xd->mi[-1] : NULL; + const MODE_INFO *above_mi = xd->above_mi; + const MODE_INFO *left_mi = xd->left_mi; const PREDICTION_MODE A = vp9_above_block_mode(mic, above_mi, 0); const PREDICTION_MODE L = vp9_left_block_mode(mic, left_mi, 0); bmode_costs = cpi->y_mode_costs[A][L]; @@ -1036,11 +1032,19 @@ void vp9_pick_intra_mode(VP9_COMP *cpi, MACROBLOCK *x, RD_COST *rd_cost, // mode tests. for (this_mode = DC_PRED; this_mode <= H_PRED; ++this_mode) { args.mode = this_mode; + args.skippable = 1; args.rate = 0; args.dist = 0; mi->tx_size = intra_tx_size; vp9_foreach_transformed_block_in_plane(xd, bsize, 0, estimate_block_intra, &args); + if (args.skippable) { + x->skip_txfm[0] = SKIP_TXFM_AC_DC; + args.rate = vp9_cost_bit(vp9_get_skip_prob(&cpi->common, xd), 1); + } else { + x->skip_txfm[0] = SKIP_TXFM_NONE; + args.rate += vp9_cost_bit(vp9_get_skip_prob(&cpi->common, xd), 0); + } this_rdc.rate = args.rate; this_rdc.dist = args.dist; this_rdc.rate += bmode_costs[this_mode]; @@ -1101,7 +1105,7 @@ static const REF_MODE ref_mode_set_svc[RT_INTER_MODES] = { {GOLDEN_FRAME, NEWMV} }; -int set_intra_cost_penalty(const VP9_COMP *const cpi, BLOCK_SIZE bsize) { +static int set_intra_cost_penalty(const VP9_COMP *const cpi, BLOCK_SIZE bsize) { const VP9_COMMON *const cm = &cpi->common; // Reduce the intra cost penalty for small blocks (<=16x16). int reduction_fac = @@ -1242,10 +1246,10 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, x->skip_encode = cpi->sf.skip_encode_frame && x->q_index < QIDX_SKIP_THRESH; x->skip = 0; - if (xd->up_available) - filter_ref = xd->mi[-xd->mi_stride]->interp_filter; - else if (xd->left_available) - filter_ref = xd->mi[-1]->interp_filter; + if (xd->above_mi) + filter_ref = xd->above_mi->interp_filter; + else if (xd->left_mi) + filter_ref = xd->left_mi->interp_filter; else filter_ref = cm->interp_filter; @@ -1270,7 +1274,10 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, } #if CONFIG_VP9_TEMPORAL_DENOISING - vp9_denoiser_reset_frame_stats(ctx); + if (cpi->oxcf.noise_sensitivity > 0 && + cpi->denoiser.denoising_level > kDenLowLow) { + vp9_denoiser_reset_frame_stats(ctx); + } #endif if (cpi->rc.frames_since_golden == 0 && !cpi->use_svc) { @@ -1642,7 +1649,8 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, } #if CONFIG_VP9_TEMPORAL_DENOISING - if (cpi->oxcf.noise_sensitivity > 0) { + if (cpi->oxcf.noise_sensitivity > 0 && + cpi->denoiser.denoising_level > kDenLowLow) { vp9_denoiser_update_frame_stats(mi, sse_y, this_mode, ctx); // Keep track of zero_last cost. if (ref_frame == LAST_FRAME && frame_mv[this_mode][ref_frame].as_int == 0) @@ -1706,7 +1714,7 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, ((best_rdc.rdcost == INT64_MAX || (!x->skip && best_rdc.rdcost > inter_mode_thresh && bsize <= cpi->sf.max_intra_bsize)))) { - struct estimate_block_intra_args args = { cpi, x, DC_PRED, 0, 0 }; + struct estimate_block_intra_args args = { cpi, x, DC_PRED, 1, 0, 0 }; int i; TX_SIZE best_intra_tx_size = TX_SIZES; TX_SIZE intra_tx_size = @@ -1756,11 +1764,21 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, mi->mode = this_mode; mi->ref_frame[0] = INTRA_FRAME; args.mode = this_mode; + args.skippable = 1; args.rate = 0; args.dist = 0; mi->tx_size = intra_tx_size; vp9_foreach_transformed_block_in_plane(xd, bsize, 0, estimate_block_intra, &args); + // Check skip cost here since skippable is not set for for uv, this + // mirrors the behavior used by inter + if (args.skippable) { + x->skip_txfm[0] = SKIP_TXFM_AC_DC; + args.rate = vp9_cost_bit(vp9_get_skip_prob(&cpi->common, xd), 1); + } else { + x->skip_txfm[0] = SKIP_TXFM_NONE; + args.rate += vp9_cost_bit(vp9_get_skip_prob(&cpi->common, xd), 0); + } // Inter and intra RD will mismatch in scale for non-screen content. if (cpi->oxcf.content == VP9E_CONTENT_SCREEN) { if (x->color_sensitivity[0]) @@ -1823,10 +1841,11 @@ void vp9_pick_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, #if CONFIG_VP9_TEMPORAL_DENOISING if (cpi->oxcf.noise_sensitivity > 0 && - cpi->resize_pending == 0) { + cpi->resize_pending == 0 && + cpi->denoiser.denoising_level > kDenLowLow && + cpi->denoiser.reset == 0) { VP9_DENOISER_DECISION decision = COPY_BLOCK; - vp9_denoiser_denoise(cpi, x, mi_row, mi_col, VPXMAX(BLOCK_8X8, bsize), - ctx, &decision); + vp9_denoiser_denoise(cpi, x, mi_row, mi_col, bsize, ctx, &decision); // If INTRA or GOLDEN reference was selected, re-evaluate ZEROMV on denoised // result. Only do this under noise conditions, and if rdcost of ZEROMV on // original source is not significantly higher than rdcost of best mode. diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_quantize.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_quantize.c index 91f877ed7ee..9766c059cf4 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_quantize.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_quantize.c @@ -219,12 +219,12 @@ void vp9_regular_quantize_b_4x4(MACROBLOCK *x, int plane, int block, static void invert_quant(int16_t *quant, int16_t *shift, int d) { unsigned t; - int l; + int l, m; t = d; for (l = 0; t > 1; l++) t >>= 1; - t = 1 + (1 << (16 + l)) / d; - *quant = (int16_t)(t - (1 << 16)); + m = 1 + (1 << (16 + l)) / d; + *quant = (int16_t)(m - (1 << 16)); *shift = 1 << (16 - l); } diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_ratectrl.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_ratectrl.c index 9dd73947430..1e6c152392f 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_ratectrl.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_ratectrl.c @@ -337,6 +337,11 @@ void vp9_rc_init(const VP9EncoderConfig *oxcf, int pass, RATE_CONTROL *rc) { rc->total_actual_bits = 0; rc->total_target_bits = 0; rc->total_target_vs_actual = 0; + rc->avg_intersize_gfint = 0; + rc->avg_frame_low_motion = 0; + rc->high_source_sad = 0; + rc->count_last_scene_change = 0; + rc->avg_source_sad = 0; rc->frames_since_key = 8; // Sensible default for first frame. rc->this_key_frame_forced = 0; @@ -621,15 +626,16 @@ static int calc_active_worst_quality_one_pass_vbr(const VP9_COMP *cpi) { if (cpi->common.frame_type == KEY_FRAME) { active_worst_quality = curr_frame == 0 ? rc->worst_quality - : rc->last_q[KEY_FRAME] * 2; + : rc->last_q[KEY_FRAME] << 1; } else { if (!rc->is_src_frame_alt_ref && (cpi->refresh_golden_frame || cpi->refresh_alt_ref_frame)) { - active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 5 / 4 + active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 5 >> 2 : rc->last_q[INTER_FRAME]; } else { - active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] * 2 - : rc->last_q[INTER_FRAME] * 2; + active_worst_quality = curr_frame == 1 ? rc->last_q[KEY_FRAME] << 1 : + VPXMIN(rc->last_q[INTER_FRAME] << 1, + (rc->avg_frame_qindex[INTER_FRAME] * 3 >> 1)); } } return VPXMIN(active_worst_quality, rc->worst_quality); @@ -662,7 +668,7 @@ static int calc_active_worst_quality_one_pass_cbr(const VP9_COMP *cpi) { VPXMIN(rc->avg_frame_qindex[INTER_FRAME], rc->avg_frame_qindex[KEY_FRAME]) : rc->avg_frame_qindex[INTER_FRAME]; - active_worst_quality = VPXMIN(rc->worst_quality, ambient_qp * 5 / 4); + active_worst_quality = VPXMIN(rc->worst_quality, ambient_qp * 5 >> 2); if (rc->buffer_level > rc->optimal_buffer_level) { // Adjust down. // Maximum limit for down adjustment, ~30%. @@ -811,8 +817,8 @@ static int rc_pick_q_and_bounds_one_pass_cbr(const VP9_COMP *cpi, return q; } -static int get_active_cq_level(const RATE_CONTROL *rc, - const VP9EncoderConfig *const oxcf) { +static int get_active_cq_level_one_pass( + const RATE_CONTROL *rc, const VP9EncoderConfig *const oxcf) { static const double cq_adjust_threshold = 0.1; int active_cq_level = oxcf->cq_level; if (oxcf->rc_mode == VPX_CQ && @@ -825,13 +831,36 @@ static int get_active_cq_level(const RATE_CONTROL *rc, return active_cq_level; } +#define SMOOTH_PCT_MIN 0.1 +#define SMOOTH_PCT_DIV 0.05 +static int get_active_cq_level_two_pass( + const TWO_PASS *twopass, const RATE_CONTROL *rc, + const VP9EncoderConfig *const oxcf) { + static const double cq_adjust_threshold = 0.1; + int active_cq_level = oxcf->cq_level; + if (oxcf->rc_mode == VPX_CQ) { + if (twopass->mb_smooth_pct > SMOOTH_PCT_MIN) { + active_cq_level -= (int)((twopass->mb_smooth_pct - SMOOTH_PCT_MIN) / + SMOOTH_PCT_DIV); + active_cq_level = VPXMAX(active_cq_level, 0); + } + if (rc->total_target_bits > 0) { + const double x = (double)rc->total_actual_bits / rc->total_target_bits; + if (x < cq_adjust_threshold) { + active_cq_level = (int)(active_cq_level * x / cq_adjust_threshold); + } + } + } + return active_cq_level; +} + static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi, int *bottom_index, int *top_index) { const VP9_COMMON *const cm = &cpi->common; const RATE_CONTROL *const rc = &cpi->rc; const VP9EncoderConfig *const oxcf = &cpi->oxcf; - const int cq_level = get_active_cq_level(rc, oxcf); + const int cq_level = get_active_cq_level_one_pass(rc, oxcf); int active_best_quality; int active_worst_quality = calc_active_worst_quality_one_pass_vbr(cpi); int q; @@ -881,9 +910,12 @@ static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi, // Use the lower of active_worst_quality and recent // average Q as basis for GF/ARF best Q limit unless last frame was // a key frame. - if (rc->frames_since_key > 1 && - rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { - q = rc->avg_frame_qindex[INTER_FRAME]; + if (rc->frames_since_key > 1) { + if (rc->avg_frame_qindex[INTER_FRAME] < active_worst_quality) { + q = rc->avg_frame_qindex[INTER_FRAME]; + } else { + q = active_worst_quality; + } } else { q = rc->avg_frame_qindex[KEY_FRAME]; } @@ -921,11 +953,15 @@ static int rc_pick_q_and_bounds_one_pass_vbr(const VP9_COMP *cpi, FIXED_GF_INTERVAL], cm->bit_depth); active_best_quality = VPXMAX(qindex + delta_qindex, rc->best_quality); } else { - // Use the lower of active_worst_quality and recent/average Q. - if (cm->current_video_frame > 1) - active_best_quality = inter_minq[rc->avg_frame_qindex[INTER_FRAME]]; - else + // Use the min of the average Q (with some increase) and + // active_worst_quality as basis for active_best. + if (cm->current_video_frame > 1) { + q = VPXMIN(((17 * rc->avg_frame_qindex[INTER_FRAME]) >> 4), + active_worst_quality); + active_best_quality = inter_minq[q]; + } else { active_best_quality = inter_minq[rc->avg_frame_qindex[KEY_FRAME]]; + } // For the constrained quality mode we don't want // q to fall below the cq level. if ((oxcf->rc_mode == VPX_CQ) && @@ -1017,7 +1053,7 @@ static int rc_pick_q_and_bounds_two_pass(const VP9_COMP *cpi, const RATE_CONTROL *const rc = &cpi->rc; const VP9EncoderConfig *const oxcf = &cpi->oxcf; const GF_GROUP *gf_group = &cpi->twopass.gf_group; - const int cq_level = get_active_cq_level(rc, oxcf); + const int cq_level = get_active_cq_level_two_pass(&cpi->twopass, rc, oxcf); int active_best_quality; int active_worst_quality = cpi->twopass.active_worst_quality; int q; @@ -1302,6 +1338,26 @@ static void update_golden_frame_stats(VP9_COMP *cpi) { } } +static void compute_frame_low_motion(VP9_COMP *const cpi) { + VP9_COMMON *const cm = &cpi->common; + int mi_row, mi_col; + MODE_INFO **mi = cm->mi_grid_visible; + RATE_CONTROL *const rc = &cpi->rc; + const int rows = cm->mi_rows, cols = cm->mi_cols; + int cnt_zeromv = 0; + for (mi_row = 0; mi_row < rows; mi_row++) { + for (mi_col = 0; mi_col < cols; mi_col++) { + if (abs(mi[0]->mv[0].as_mv.row) < 16 && + abs(mi[0]->mv[0].as_mv.col) < 16) + cnt_zeromv++; + mi++; + } + mi += 8; + } + cnt_zeromv = 100 * cnt_zeromv / (rows * cols); + rc->avg_frame_low_motion = (3 * rc->avg_frame_low_motion + cnt_zeromv) >> 2; +} + void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) { const VP9_COMMON *const cm = &cpi->common; const VP9EncoderConfig *const oxcf = &cpi->oxcf; @@ -1411,6 +1467,13 @@ void vp9_rc_postencode_update(VP9_COMP *cpi, uint64_t bytes_used) { rc->next_frame_size_selector != rc->frame_size_selector; rc->frame_size_selector = rc->next_frame_size_selector; } + + if (oxcf->pass == 0) { + if (cm->frame_type != KEY_FRAME) + compute_frame_low_motion(cpi); + if (!cpi->refresh_golden_frame && !cpi->refresh_alt_ref_frame) + rc->avg_intersize_gfint += rc->projected_frame_size; + } } void vp9_rc_postencode_update_drop_frame(VP9_COMP *cpi) { @@ -1449,6 +1512,22 @@ static int calc_iframe_target_size_one_pass_vbr(const VP9_COMP *const cpi) { return vp9_rc_clamp_iframe_target_size(cpi, target); } +static void adjust_gf_key_frame(VP9_COMP *cpi) { + RATE_CONTROL *const rc = &cpi->rc; + rc->constrained_gf_group = 0; + // Reset gf interval to make more equal spacing for up-coming key frame. + if ((rc->frames_to_key <= 7 * rc->baseline_gf_interval >> 2) && + (rc->frames_to_key > rc->baseline_gf_interval)) { + rc->baseline_gf_interval = rc->frames_to_key >> 1; + rc->constrained_gf_group = 1; + } else { + // Reset since frames_till_gf_update_due must be <= frames_to_key. + if (rc->baseline_gf_interval > rc->frames_to_key) { + rc->baseline_gf_interval = rc->frames_to_key; + rc->constrained_gf_group = 1; + } + } +} void vp9_rc_get_one_pass_vbr_params(VP9_COMP *cpi) { VP9_COMMON *const cm = &cpi->common; RATE_CONTROL *const rc = &cpi->rc; @@ -1469,23 +1548,31 @@ void vp9_rc_get_one_pass_vbr_params(VP9_COMP *cpi) { cm->frame_type = INTER_FRAME; } if (rc->frames_till_gf_update_due == 0) { + rc->avg_intersize_gfint = + rc->avg_intersize_gfint / (rc->baseline_gf_interval + 1); + rc->gfu_boost = DEFAULT_GF_BOOST; if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cpi->oxcf.pass == 0) { vp9_cyclic_refresh_set_golden_update(cpi); } else { rc->baseline_gf_interval = (rc->min_gf_interval + rc->max_gf_interval) / 2; } - rc->frames_till_gf_update_due = rc->baseline_gf_interval; - // NOTE: frames_till_gf_update_due must be <= frames_to_key. - if (rc->frames_till_gf_update_due > rc->frames_to_key) { - rc->frames_till_gf_update_due = rc->frames_to_key; - rc->constrained_gf_group = 1; - } else { - rc->constrained_gf_group = 0; + // Increase gf interval at high Q and high overshoot. + if (cm->current_video_frame > 30 && + rc->avg_frame_qindex[INTER_FRAME] > (7 * rc->worst_quality) >> 3 && + rc->avg_intersize_gfint > (5 * rc->avg_frame_bandwidth) >> 1) { + rc->baseline_gf_interval = (3 * rc->baseline_gf_interval) >> 1; + } else if (cm->current_video_frame > 30 && + rc->avg_frame_low_motion < 20) { + // Decrease boost and gf interval for high motion case. + rc->gfu_boost = DEFAULT_GF_BOOST >> 1; + rc->baseline_gf_interval = VPXMIN(6, rc->baseline_gf_interval >> 1); } + adjust_gf_key_frame(cpi); + rc->frames_till_gf_update_due = rc->baseline_gf_interval; cpi->refresh_golden_frame = 1; rc->source_alt_ref_pending = USE_ALTREF_FOR_ONE_PASS; - rc->gfu_boost = DEFAULT_GF_BOOST; + rc->avg_intersize_gfint = 0; } if (cm->frame_type == KEY_FRAME) target = calc_iframe_target_size_one_pass_vbr(cpi); @@ -2047,8 +2134,8 @@ void vp9_avg_source_sad(VP9_COMP *cpi) { // for cases where there is small change from content that is completely // static. if (cpi->oxcf.rc_mode == VPX_VBR) { - min_thresh = 30000; - thresh = 2.0f; + min_thresh = 60000; + thresh = 2.1f; } if (avg_sad > VPXMAX(min_thresh, (unsigned int)(rc->avg_source_sad * thresh)) && @@ -2057,20 +2144,26 @@ void vp9_avg_source_sad(VP9_COMP *cpi) { else rc->high_source_sad = 0; if (avg_sad > 0 || cpi->oxcf.rc_mode == VPX_CBR) - rc->avg_source_sad = (rc->avg_source_sad + avg_sad) >> 1; + rc->avg_source_sad = (3 * rc->avg_source_sad + avg_sad) >> 2; // For VBR, under scene change/high content change, force golden refresh. if (cpi->oxcf.rc_mode == VPX_VBR && rc->high_source_sad && - cpi->refresh_golden_frame == 0 && + rc->frames_to_key > 3 && + rc->count_last_scene_change > 4 && cpi->ext_refresh_frame_flags_pending == 0) { int target; cpi->refresh_golden_frame = 1; + rc->gfu_boost = DEFAULT_GF_BOOST >> 1; + rc->baseline_gf_interval = VPXMIN(20, + VPXMAX(10, rc->baseline_gf_interval)); + adjust_gf_key_frame(cpi); rc->frames_till_gf_update_due = rc->baseline_gf_interval; - if (rc->frames_till_gf_update_due > rc->frames_to_key) - rc->frames_till_gf_update_due = rc->frames_to_key; - rc->gfu_boost = DEFAULT_GF_BOOST; target = calc_pframe_target_size_one_pass_vbr(cpi); vp9_rc_set_frame_target(cpi, target); + rc->count_last_scene_change = 0; + rc->avg_intersize_gfint = 0; + } else { + rc->count_last_scene_change++; } } } diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_ratectrl.h b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_ratectrl.h index 3df909cb181..eef19401e7e 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_ratectrl.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_ratectrl.h @@ -161,6 +161,9 @@ typedef struct { uint64_t avg_source_sad; int high_source_sad; + int count_last_scene_change; + int avg_intersize_gfint; + int avg_frame_low_motion; } RATE_CONTROL; struct VP9_COMP; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_rdopt.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_rdopt.c index 508c59663ad..a3041828675 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_rdopt.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_rdopt.c @@ -2460,10 +2460,10 @@ static int64_t handle_inter_mode(VP9_COMP *cpi, MACROBLOCK *x, if (pred_filter_search) { INTERP_FILTER af = SWITCHABLE, lf = SWITCHABLE; - if (xd->up_available) - af = xd->mi[-xd->mi_stride]->interp_filter; - if (xd->left_available) - lf = xd->mi[-1]->interp_filter; + if (xd->above_mi) + af = xd->above_mi->interp_filter; + if (xd->left_mi) + lf = xd->left_mi->interp_filter; if ((this_mode != NEWMV) || (af == lf)) best_filter = af; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_resize.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_resize.c index 63f0ce2137b..307a1123a74 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_resize.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_resize.c @@ -446,7 +446,7 @@ static void resize_multistep(const uint8_t *const input, int length, uint8_t *output, int olength, - uint8_t *buf) { + uint8_t *otmp) { int steps; if (length == olength) { memcpy(output, input, sizeof(output[0]) * length); @@ -457,16 +457,10 @@ static void resize_multistep(const uint8_t *const input, if (steps > 0) { int s; uint8_t *out = NULL; - uint8_t *tmpbuf = NULL; - uint8_t *otmp, *otmp2; + uint8_t *otmp2; int filteredlength = length; - if (!tmpbuf) { - tmpbuf = (uint8_t *)malloc(sizeof(uint8_t) * length); - if (tmpbuf == NULL) return; - otmp = tmpbuf; - } else { - otmp = buf; - } + + assert(otmp != NULL); otmp2 = otmp + get_down2_length(length, 1); for (s = 0; s < steps; ++s) { const int proj_filteredlength = get_down2_length(filteredlength, 1); @@ -484,8 +478,6 @@ static void resize_multistep(const uint8_t *const input, if (filteredlength != olength) { interpolate(out, filteredlength, output, olength); } - if (tmpbuf) - free(tmpbuf); } else { interpolate(input, length, output, olength); } @@ -521,25 +513,29 @@ void vp9_resize_plane(const uint8_t *const input, uint8_t *intbuf = (uint8_t *)malloc(sizeof(uint8_t) * width2 * height); uint8_t *tmpbuf = (uint8_t *)malloc(sizeof(uint8_t) * (width < height ? height : width)); - uint8_t *arrbuf = (uint8_t *)malloc(sizeof(uint8_t) * (height + height2)); - if (intbuf == NULL || tmpbuf == NULL || arrbuf == NULL) goto Error; + uint8_t *arrbuf = (uint8_t *)malloc(sizeof(uint8_t) * height); + uint8_t *arrbuf2 = (uint8_t *)malloc(sizeof(uint8_t) * height2); + if (intbuf == NULL || tmpbuf == NULL || + arrbuf == NULL || arrbuf2 == NULL) + goto Error; assert(width > 0); assert(height > 0); assert(width2 > 0); assert(height2 > 0); for (i = 0; i < height; ++i) resize_multistep(input + in_stride * i, width, - intbuf + width2 * i, width2, tmpbuf); + intbuf + width2 * i, width2, tmpbuf); for (i = 0; i < width2; ++i) { fill_col_to_arr(intbuf + i, width2, height, arrbuf); - resize_multistep(arrbuf, height, arrbuf + height, height2, tmpbuf); - fill_arr_to_col(output + i, out_stride, height2, arrbuf + height); + resize_multistep(arrbuf, height, arrbuf2, height2, tmpbuf); + fill_arr_to_col(output + i, out_stride, height2, arrbuf2); } Error: free(intbuf); free(tmpbuf); free(arrbuf); + free(arrbuf2); } #if CONFIG_VP9_HIGHBITDEPTH @@ -742,7 +738,7 @@ static void highbd_resize_multistep(const uint16_t *const input, int length, uint16_t *output, int olength, - uint16_t *buf, + uint16_t *otmp, int bd) { int steps; if (length == olength) { @@ -754,16 +750,10 @@ static void highbd_resize_multistep(const uint16_t *const input, if (steps > 0) { int s; uint16_t *out = NULL; - uint16_t *tmpbuf = NULL; - uint16_t *otmp, *otmp2; + uint16_t *otmp2; int filteredlength = length; - if (!tmpbuf) { - tmpbuf = (uint16_t *)malloc(sizeof(uint16_t) * length); - if (tmpbuf == NULL) return; - otmp = tmpbuf; - } else { - otmp = buf; - } + + assert(otmp != NULL); otmp2 = otmp + get_down2_length(length, 1); for (s = 0; s < steps; ++s) { const int proj_filteredlength = get_down2_length(filteredlength, 1); @@ -781,8 +771,6 @@ static void highbd_resize_multistep(const uint16_t *const input, if (filteredlength != olength) { highbd_interpolate(out, filteredlength, output, olength, bd); } - if (tmpbuf) - free(tmpbuf); } else { highbd_interpolate(input, length, output, olength, bd); } @@ -821,24 +809,28 @@ void vp9_highbd_resize_plane(const uint8_t *const input, uint16_t *intbuf = (uint16_t *)malloc(sizeof(uint16_t) * width2 * height); uint16_t *tmpbuf = (uint16_t *)malloc(sizeof(uint16_t) * (width < height ? height : width)); - uint16_t *arrbuf = (uint16_t *)malloc(sizeof(uint16_t) * (height + height2)); - if (intbuf == NULL || tmpbuf == NULL || arrbuf == NULL) goto Error; + uint16_t *arrbuf = (uint16_t *)malloc(sizeof(uint16_t) * height); + uint16_t *arrbuf2 = (uint16_t *)malloc(sizeof(uint16_t) * height2); + if (intbuf == NULL || tmpbuf == NULL || + arrbuf == NULL || arrbuf2 == NULL) + goto Error; for (i = 0; i < height; ++i) { highbd_resize_multistep(CONVERT_TO_SHORTPTR(input + in_stride * i), width, intbuf + width2 * i, width2, tmpbuf, bd); } for (i = 0; i < width2; ++i) { highbd_fill_col_to_arr(intbuf + i, width2, height, arrbuf); - highbd_resize_multistep(arrbuf, height, arrbuf + height, height2, tmpbuf, + highbd_resize_multistep(arrbuf, height, arrbuf2, height2, tmpbuf, bd); highbd_fill_arr_to_col(CONVERT_TO_SHORTPTR(output + i), out_stride, height2, - arrbuf + height); + arrbuf2); } Error: free(intbuf); free(tmpbuf); free(arrbuf); + free(arrbuf2); } #endif // CONFIG_VP9_HIGHBITDEPTH diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_skin_detection.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_skin_detection.c index ff0dfce6790..23a5fc775ea 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_skin_detection.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_skin_detection.c @@ -88,7 +88,7 @@ int vp9_compute_skin_block(const uint8_t *y, const uint8_t *u, const uint8_t *v, int stride, int strideuv, int bsize, int consec_zeromv, int curr_motion_magn) { // No skin if block has been zero/small motion for long consecutive time. - if (consec_zeromv > 80 && curr_motion_magn == 0) { + if (consec_zeromv > 60 && curr_motion_magn == 0) { return 0; } else { int motion = 1; @@ -100,7 +100,7 @@ int vp9_compute_skin_block(const uint8_t *y, const uint8_t *u, const uint8_t *v, const uint8_t ysource = y[y_height_shift * stride + y_width_shift]; const uint8_t usource = u[uv_height_shift * strideuv + uv_width_shift]; const uint8_t vsource = v[uv_height_shift * strideuv + uv_width_shift]; - if (consec_zeromv > 30 && curr_motion_magn == 0) + if (consec_zeromv > 25 && curr_motion_magn == 0) motion = 0; return vp9_skin_pixel(ysource, usource, vsource, motion); } @@ -112,7 +112,6 @@ int vp9_compute_skin_block(const uint8_t *y, const uint8_t *u, const uint8_t *v, void vp9_compute_skin_map(VP9_COMP *const cpi, FILE *yuv_skinmap_file) { int i, j, mi_row, mi_col, num_bl; VP9_COMMON *const cm = &cpi->common; - CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; uint8_t *y; const uint8_t *src_y = cpi->Source->y_buffer; const uint8_t *src_u = cpi->Source->u_buffer; @@ -166,19 +165,17 @@ void vp9_compute_skin_map(VP9_COMP *const cpi, FILE *yuv_skinmap_file) { } else { int block_size = BLOCK_8X8; int consec_zeromv = 0; - if (cpi->oxcf.aq_mode == CYCLIC_REFRESH_AQ && cm->seg.enabled) { - int bl_index = mi_row * cm->mi_cols + mi_col; - int bl_index1 = bl_index + 1; - int bl_index2 = bl_index + cm->mi_cols; - int bl_index3 = bl_index2 + 1; - if (y_bsize == 8) - consec_zeromv = cr->consec_zero_mv[bl_index]; - else - consec_zeromv = VPXMIN(cr->consec_zero_mv[bl_index], - VPXMIN(cr->consec_zero_mv[bl_index1], - VPXMIN(cr->consec_zero_mv[bl_index2], - cr->consec_zero_mv[bl_index3]))); - } + int bl_index = mi_row * cm->mi_cols + mi_col; + int bl_index1 = bl_index + 1; + int bl_index2 = bl_index + cm->mi_cols; + int bl_index3 = bl_index2 + 1; + if (y_bsize == 8) + consec_zeromv = cpi->consec_zero_mv[bl_index]; + else + consec_zeromv = VPXMIN(cpi->consec_zero_mv[bl_index], + VPXMIN(cpi->consec_zero_mv[bl_index1], + VPXMIN(cpi->consec_zero_mv[bl_index2], + cpi->consec_zero_mv[bl_index3]))); if (y_bsize == 16) block_size = BLOCK_16X16; is_skin = vp9_compute_skin_block(src_y, src_u, src_v, src_ystride, diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_svc_layercontext.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_svc_layercontext.c index 73048f8425b..1814a32c974 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_svc_layercontext.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_svc_layercontext.c @@ -327,12 +327,12 @@ void vp9_restore_layer_context(VP9_COMP *const cpi) { CYCLIC_REFRESH *const cr = cpi->cyclic_refresh; signed char *temp = cr->map; uint8_t *temp2 = cr->last_coded_q_map; - uint8_t *temp3 = cr->consec_zero_mv; + uint8_t *temp3 = cpi->consec_zero_mv; cr->map = lc->map; lc->map = temp; cr->last_coded_q_map = lc->last_coded_q_map; lc->last_coded_q_map = temp2; - cr->consec_zero_mv = lc->consec_zero_mv; + cpi->consec_zero_mv = lc->consec_zero_mv; lc->consec_zero_mv = temp3; cr->sb_index = lc->sb_index; } @@ -360,8 +360,8 @@ void vp9_save_layer_context(VP9_COMP *const cpi) { cr->map = temp; lc->last_coded_q_map = cr->last_coded_q_map; cr->last_coded_q_map = temp2; - lc->consec_zero_mv = cr->consec_zero_mv; - cr->consec_zero_mv = temp3; + lc->consec_zero_mv = cpi->consec_zero_mv; + cpi->consec_zero_mv = temp3; lc->sb_index = cr->sb_index; } } diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_temporal_filter.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_temporal_filter.c index ebe28b8bf6f..2ba2750e429 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_temporal_filter.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_temporal_filter.c @@ -143,8 +143,8 @@ void vp9_temporal_filter_apply_c(uint8_t *frame1, for (idy = -1; idy <= 1; ++idy) { for (idx = -1; idx <= 1; ++idx) { - int row = i + idy; - int col = j + idx; + int row = (int)i + idy; + int col = (int)j + idx; if (row >= 0 && row < (int)block_height && col >= 0 && col < (int)block_width) { @@ -211,8 +211,8 @@ void vp9_highbd_temporal_filter_apply_c(uint8_t *frame1_8, for (idy = -1; idy <= 1; ++idy) { for (idx = -1; idx <= 1; ++idx) { - int row = i + idy; - int col = j + idx; + int row = (int)i + idy; + int col = (int)j + idx; if (row >= 0 && row < (int)block_height && col >= 0 && col < (int)block_width) { diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_tokenize.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_tokenize.c index ee1d08adcde..edec755ddb7 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_tokenize.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_tokenize.c @@ -18,7 +18,6 @@ #include "vp9/common/vp9_entropy.h" #include "vp9/common/vp9_pred_common.h" #include "vp9/common/vp9_scan.h" -#include "vp9/common/vp9_seg_common.h" #include "vp9/encoder/vp9_cost.h" #include "vp9/encoder/vp9_encoder.h" @@ -354,12 +353,6 @@ static INLINE void add_token_no_extra(TOKENEXTRA **t, ++counts[token]; } -static INLINE int get_tx_eob(const struct segmentation *seg, int segment_id, - TX_SIZE tx_size) { - const int eob_max = 16 << (tx_size << 1); - return segfeature_active(seg, segment_id, SEG_LVL_SKIP) ? 0 : eob_max; -} - static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize, TX_SIZE tx_size, void *arg) { struct tokenize_b_args* const args = arg; @@ -378,7 +371,6 @@ static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize, int eob = p->eobs[block]; const PLANE_TYPE type = get_plane_type(plane); const tran_low_t *qcoeff = BLOCK_OFFSET(p->qcoeff, block); - const int segment_id = mi->segment_id; const int16_t *scan, *nb; const scan_order *so; const int ref = is_inter_block(mi); @@ -389,7 +381,7 @@ static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize, unsigned int (*const eob_branch)[COEFF_CONTEXTS] = td->counts->eob_branch[tx_size][type][ref]; const uint8_t *const band = get_band_translate(tx_size); - const int seg_eob = get_tx_eob(&cpi->common.seg, segment_id, tx_size); + const int tx_eob = 16 << (tx_size << 1); int16_t token; EXTRABIT extra; int aoff, loff; @@ -426,7 +418,7 @@ static void tokenize_b(int plane, int block, BLOCK_SIZE plane_bsize, ++c; pt = get_coef_context(nb, token_cache, c); } - if (c < seg_eob) { + if (c < tx_eob) { ++eob_branch[band[c]][pt]; add_token_no_extra(&t, coef_probs[band[c]][pt], EOB_TOKEN, counts[band[c]][pt]); @@ -481,24 +473,26 @@ int vp9_has_high_freq_in_plane(MACROBLOCK *x, BLOCK_SIZE bsize, int plane) { } void vp9_tokenize_sb(VP9_COMP *cpi, ThreadData *td, TOKENEXTRA **t, - int dry_run, BLOCK_SIZE bsize) { - VP9_COMMON *const cm = &cpi->common; + int dry_run, int seg_skip, BLOCK_SIZE bsize) { MACROBLOCK *const x = &td->mb; MACROBLOCKD *const xd = &x->e_mbd; MODE_INFO *const mi = xd->mi[0]; const int ctx = vp9_get_skip_context(xd); - const int skip_inc = !segfeature_active(&cm->seg, mi->segment_id, - SEG_LVL_SKIP); struct tokenize_b_args arg = {cpi, td, t}; + + if (seg_skip) { + assert(mi->skip); + } + if (mi->skip) { - if (!dry_run) - td->counts->skip[ctx][1] += skip_inc; + if (!dry_run && !seg_skip) + ++td->counts->skip[ctx][1]; reset_skip_context(xd, bsize); return; } if (!dry_run) { - td->counts->skip[ctx][0] += skip_inc; + ++td->counts->skip[ctx][0]; vp9_foreach_transformed_block(xd, bsize, tokenize_b, &arg); } else { vp9_foreach_transformed_block(xd, bsize, set_entropy_context_b, &arg); diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_tokenize.h b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_tokenize.h index fad79888612..1caab2ac189 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_tokenize.h +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/vp9_tokenize.h @@ -51,7 +51,8 @@ struct VP9_COMP; struct ThreadData; void vp9_tokenize_sb(struct VP9_COMP *cpi, struct ThreadData *td, - TOKENEXTRA **t, int dry_run, BLOCK_SIZE bsize); + TOKENEXTRA **t, int dry_run, int seg_skip, + BLOCK_SIZE bsize); typedef struct { const vpx_prob *prob; diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_denoiser_sse2.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_denoiser_sse2.c index bf7c7af7707..883507af348 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_denoiser_sse2.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_denoiser_sse2.c @@ -125,7 +125,7 @@ static INLINE __m128i vp9_denoiser_adj_16x1_sse2( return acc_diff; } -// Denoiser for 4xM and 8xM blocks. +// Denoise 8x8 and 8x16 blocks. static int vp9_denoiser_NxM_sse2_small( const uint8_t *sig, int sig_stride, const uint8_t *mc_running_avg_y, int mc_avg_y_stride, uint8_t *running_avg_y, int avg_y_stride, @@ -147,9 +147,9 @@ static int vp9_denoiser_NxM_sse2_small( const __m128i l32 = _mm_set1_epi8(2); // Difference between level 2 and level 1 is 1. const __m128i l21 = _mm_set1_epi8(1); - const uint8_t shift = (width == 4) ? 2 : 1; + const int b_height = (4 << b_height_log2_lookup[bs]) >> 1; - for (r = 0; r < ((4 << b_height_log2_lookup[bs]) >> shift); ++r) { + for (r = 0; r < b_height; ++r) { memcpy(sig_buffer[r], sig, width); memcpy(sig_buffer[r] + width, sig + sig_stride, width); memcpy(mc_running_buffer[r], mc_running_avg_y, width); @@ -157,18 +157,6 @@ static int vp9_denoiser_NxM_sse2_small( mc_running_avg_y + mc_avg_y_stride, width); memcpy(running_buffer[r], running_avg_y, width); memcpy(running_buffer[r] + width, running_avg_y + avg_y_stride, width); - if (width == 4) { - memcpy(sig_buffer[r] + width * 2, sig + sig_stride * 2, width); - memcpy(sig_buffer[r] + width * 3, sig + sig_stride * 3, width); - memcpy(mc_running_buffer[r] + width * 2, - mc_running_avg_y + mc_avg_y_stride * 2, width); - memcpy(mc_running_buffer[r] + width * 3, - mc_running_avg_y + mc_avg_y_stride * 3, width); - memcpy(running_buffer[r] + width * 2, - running_avg_y + avg_y_stride * 2, width); - memcpy(running_buffer[r] + width * 3, - running_avg_y + avg_y_stride * 3, width); - } acc_diff = vp9_denoiser_16x1_sse2(sig_buffer[r], mc_running_buffer[r], running_buffer[r], @@ -176,16 +164,10 @@ static int vp9_denoiser_NxM_sse2_small( &l3, &l32, &l21, acc_diff); memcpy(running_avg_y, running_buffer[r], width); memcpy(running_avg_y + avg_y_stride, running_buffer[r] + width, width); - if (width == 4) { - memcpy(running_avg_y + avg_y_stride * 2, - running_buffer[r] + width * 2, width); - memcpy(running_avg_y + avg_y_stride * 3, - running_buffer[r] + width * 3, width); - } // Update pointers for next iteration. - sig += (sig_stride << shift); - mc_running_avg_y += (mc_avg_y_stride << shift); - running_avg_y += (avg_y_stride << shift); + sig += (sig_stride << 1); + mc_running_avg_y += (mc_avg_y_stride << 1); + running_avg_y += (avg_y_stride << 1); } { @@ -207,22 +189,16 @@ static int vp9_denoiser_NxM_sse2_small( // Only apply the adjustment for max delta up to 3. if (delta < 4) { const __m128i k_delta = _mm_set1_epi8(delta); - running_avg_y -= avg_y_stride * (4 << b_height_log2_lookup[bs]); - for (r = 0; r < ((4 << b_height_log2_lookup[bs]) >> shift); ++r) { + running_avg_y -= avg_y_stride * (b_height << 1); + for (r = 0; r < b_height; ++r) { acc_diff = vp9_denoiser_adj_16x1_sse2( sig_buffer[r], mc_running_buffer[r], running_buffer[r], k_0, k_delta, acc_diff); memcpy(running_avg_y, running_buffer[r], width); memcpy(running_avg_y + avg_y_stride, running_buffer[r] + width, width); - if (width == 4) { - memcpy(running_avg_y + avg_y_stride * 2, - running_buffer[r] + width * 2, width); - memcpy(running_avg_y + avg_y_stride * 3, - running_buffer[r] + width * 3, width); - } // Update pointers for next iteration. - running_avg_y += (avg_y_stride << shift); + running_avg_y += (avg_y_stride << 1); } sum_diff = sum_diff_16x1(acc_diff); if (abs(sum_diff) > sum_diff_thresh) { @@ -236,7 +212,7 @@ static int vp9_denoiser_NxM_sse2_small( return FILTER_BLOCK; } -// Denoiser for 16xM, 32xM and 64xM blocks +// Denoise 16x16, 16x32, 32x16, 32x32, 32x64, 64x32 and 64x64 blocks. static int vp9_denoiser_NxM_sse2_big(const uint8_t *sig, int sig_stride, const uint8_t *mc_running_avg_y, int mc_avg_y_stride, @@ -260,38 +236,37 @@ static int vp9_denoiser_NxM_sse2_big(const uint8_t *sig, int sig_stride, const __m128i l32 = _mm_set1_epi8(2); // Difference between level 2 and level 1 is 1. const __m128i l21 = _mm_set1_epi8(1); + const int b_width = (4 << b_width_log2_lookup[bs]); + const int b_height = (4 << b_height_log2_lookup[bs]); + const int b_width_shift4 = b_width >> 4; - for (c = 0; c < 4; ++c) { - for (r = 0; r < 4; ++r) { + for (r = 0; r < 4; ++r) { + for (c = 0; c < b_width_shift4; ++c) { acc_diff[c][r] = _mm_setzero_si128(); } } - for (r = 0; r < (4 << b_height_log2_lookup[bs]); ++r) { - for (c = 0; c < (4 << b_width_log2_lookup[bs]); c += 16) { - acc_diff[c>>4][r>>4] = vp9_denoiser_16x1_sse2( + for (r = 0; r < b_height; ++r) { + for (c = 0; c < b_width_shift4; ++c) { + acc_diff[c][r>>4] = vp9_denoiser_16x1_sse2( sig, mc_running_avg_y, running_avg_y, &k_0, &k_4, - &k_8, &k_16, &l3, &l32, &l21, acc_diff[c>>4][r>>4]); + &k_8, &k_16, &l3, &l32, &l21, acc_diff[c][r>>4]); // Update pointers for next iteration. sig += 16; mc_running_avg_y += 16; running_avg_y += 16; } - if ((r + 1) % 16 == 0 || (bs == BLOCK_16X8 && r == 7)) { - for (c = 0; c < (4 << b_width_log2_lookup[bs]); c += 16) { - sum_diff += sum_diff_16x1(acc_diff[c>>4][r>>4]); + if ((r & 0xf) == 0xf || (bs == BLOCK_16X8 && r == 7)) { + for (c = 0; c < b_width_shift4; ++c) { + sum_diff += sum_diff_16x1(acc_diff[c][r>>4]); } } // Update pointers for next iteration. - sig = sig - 16 * ((4 << b_width_log2_lookup[bs]) >> 4) + sig_stride; - mc_running_avg_y = mc_running_avg_y - - 16 * ((4 << b_width_log2_lookup[bs]) >> 4) + - mc_avg_y_stride; - running_avg_y = running_avg_y - - 16 * ((4 << b_width_log2_lookup[bs]) >> 4) + - avg_y_stride; + sig = sig - b_width + sig_stride; + mc_running_avg_y = mc_running_avg_y - b_width + mc_avg_y_stride; + running_avg_y = running_avg_y - b_width + avg_y_stride; } { @@ -303,33 +278,29 @@ static int vp9_denoiser_NxM_sse2_big(const uint8_t *sig, int sig_stride, // Only apply the adjustment for max delta up to 3. if (delta < 4) { const __m128i k_delta = _mm_set1_epi8(delta); - sig -= sig_stride * (4 << b_height_log2_lookup[bs]); - mc_running_avg_y -= mc_avg_y_stride * (4 << b_height_log2_lookup[bs]); - running_avg_y -= avg_y_stride * (4 << b_height_log2_lookup[bs]); + sig -= sig_stride * b_height; + mc_running_avg_y -= mc_avg_y_stride * b_height; + running_avg_y -= avg_y_stride * b_height; sum_diff = 0; - for (r = 0; r < (4 << b_height_log2_lookup[bs]); ++r) { - for (c = 0; c < (4 << b_width_log2_lookup[bs]); c += 16) { - acc_diff[c>>4][r>>4] = vp9_denoiser_adj_16x1_sse2( + for (r = 0; r < b_height; ++r) { + for (c = 0; c < b_width_shift4; ++c) { + acc_diff[c][r>>4] = vp9_denoiser_adj_16x1_sse2( sig, mc_running_avg_y, running_avg_y, k_0, - k_delta, acc_diff[c>>4][r>>4]); + k_delta, acc_diff[c][r>>4]); // Update pointers for next iteration. sig += 16; mc_running_avg_y += 16; running_avg_y += 16; } - if ((r + 1) % 16 == 0 || (bs == BLOCK_16X8 && r == 7)) { - for (c = 0; c < (4 << b_width_log2_lookup[bs]); c += 16) { - sum_diff += sum_diff_16x1(acc_diff[c>>4][r>>4]); + if ((r & 0xf) == 0xf || (bs == BLOCK_16X8 && r == 7)) { + for (c = 0; c < b_width_shift4; ++c) { + sum_diff += sum_diff_16x1(acc_diff[c][r>>4]); } } - sig = sig - 16 * ((4 << b_width_log2_lookup[bs]) >> 4) + sig_stride; - mc_running_avg_y = mc_running_avg_y - - 16 * ((4 << b_width_log2_lookup[bs]) >> 4) + - mc_avg_y_stride; - running_avg_y = running_avg_y - - 16 * ((4 << b_width_log2_lookup[bs]) >> 4) + - avg_y_stride; + sig = sig - b_width + sig_stride; + mc_running_avg_y = mc_running_avg_y - b_width + mc_avg_y_stride; + running_avg_y = running_avg_y - b_width + avg_y_stride; } if (abs(sum_diff) > sum_diff_thresh) { return COPY_BLOCK; @@ -349,26 +320,21 @@ int vp9_denoiser_filter_sse2(const uint8_t *sig, int sig_stride, int increase_denoising, BLOCK_SIZE bs, int motion_magnitude) { - if (bs == BLOCK_4X4 || bs == BLOCK_4X8) { - return vp9_denoiser_NxM_sse2_small(sig, sig_stride, - mc_avg, mc_avg_stride, - avg, avg_stride, - increase_denoising, - bs, motion_magnitude, 4); - } else if (bs == BLOCK_8X4 || bs == BLOCK_8X8 || bs == BLOCK_8X16) { - return vp9_denoiser_NxM_sse2_small(sig, sig_stride, - mc_avg, mc_avg_stride, - avg, avg_stride, - increase_denoising, - bs, motion_magnitude, 8); - } else if (bs == BLOCK_16X8 || bs == BLOCK_16X16 || bs == BLOCK_16X32 || - bs == BLOCK_32X16|| bs == BLOCK_32X32 || bs == BLOCK_32X64 || - bs == BLOCK_64X32 || bs == BLOCK_64X64) { + // Rank by frequency of the block type to have an early termination. + if (bs == BLOCK_16X16 || bs == BLOCK_32X32 || bs == BLOCK_64X64 || + bs == BLOCK_16X32 || bs == BLOCK_16X8 || bs == BLOCK_32X16 || + bs == BLOCK_32X64 || bs == BLOCK_64X32) { return vp9_denoiser_NxM_sse2_big(sig, sig_stride, mc_avg, mc_avg_stride, avg, avg_stride, increase_denoising, bs, motion_magnitude); + } else if (bs == BLOCK_8X8 || bs == BLOCK_8X16) { + return vp9_denoiser_NxM_sse2_small(sig, sig_stride, + mc_avg, mc_avg_stride, + avg, avg_stride, + increase_denoising, + bs, motion_magnitude, 8); } else { return COPY_BLOCK; } diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_frame_scale_ssse3.c b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_frame_scale_ssse3.c index de903fa332c..38af3b13a25 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_frame_scale_ssse3.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/encoder/x86/vp9_frame_scale_ssse3.c @@ -23,9 +23,9 @@ extern void vp9_scale_and_extend_frame_c(const YV12_BUFFER_CONFIG *src, YV12_BUFFER_CONFIG *dst); -void downsample_2_to_1_ssse3(const uint8_t *src, ptrdiff_t src_stride, - uint8_t *dst, ptrdiff_t dst_stride, - int w, int h) { +static void downsample_2_to_1_ssse3(const uint8_t *src, ptrdiff_t src_stride, + uint8_t *dst, ptrdiff_t dst_stride, + int w, int h) { const __m128i mask = _mm_set1_epi16(0x00FF); const int max_width = w & ~15; int y; @@ -92,9 +92,9 @@ static void eight_tap_row_ssse3(const uint8_t *src, uint8_t *dst, int w) { } } -void upsample_1_to_2_ssse3(const uint8_t *src, ptrdiff_t src_stride, - uint8_t *dst, ptrdiff_t dst_stride, - int dst_w, int dst_h) { +static void upsample_1_to_2_ssse3(const uint8_t *src, ptrdiff_t src_stride, + uint8_t *dst, ptrdiff_t dst_stride, + int dst_w, int dst_h) { dst_w /= 2; dst_h /= 2; { diff --git a/chromium/third_party/libvpx/source/libvpx/vp9/vp9_dx_iface.c b/chromium/third_party/libvpx/source/libvpx/vp9/vp9_dx_iface.c index be5d1600a5b..6531e2c618f 100644 --- a/chromium/third_party/libvpx/source/libvpx/vp9/vp9_dx_iface.c +++ b/chromium/third_party/libvpx/source/libvpx/vp9/vp9_dx_iface.c @@ -127,7 +127,7 @@ static vpx_codec_err_t decoder_peek_si_internal(const uint8_t *data, vpx_decrypt_cb decrypt_cb, void *decrypt_state) { int intra_only_flag = 0; - uint8_t clear_buffer[9]; + uint8_t clear_buffer[10]; if (data + data_sz <= data) return VPX_CODEC_INVALID_PARAM; @@ -141,6 +141,11 @@ static vpx_codec_err_t decoder_peek_si_internal(const uint8_t *data, data = clear_buffer; } + // A maximum of 6 bits are needed to read the frame marker, profile and + // show_existing_frame. + if (data_sz < 1) + return VPX_CODEC_UNSUP_BITSTREAM; + { int show_frame; int error_resilient; @@ -154,15 +159,19 @@ static vpx_codec_err_t decoder_peek_si_internal(const uint8_t *data, if (profile >= MAX_PROFILES) return VPX_CODEC_UNSUP_BITSTREAM; - if ((profile >= 2 && data_sz <= 1) || data_sz < 1) - return VPX_CODEC_UNSUP_BITSTREAM; - if (vpx_rb_read_bit(&rb)) { // show an existing frame + // If profile is > 2 and show_existing_frame is true, then at least 1 more + // byte (6+3=9 bits) is needed. + if (profile > 2 && data_sz < 2) + return VPX_CODEC_UNSUP_BITSTREAM; vpx_rb_read_literal(&rb, 3); // Frame buffer to show. return VPX_CODEC_OK; } - if (data_sz <= 8) + // For the rest of the function, a maximum of 9 more bytes are needed + // (computed by taking the maximum possible bits needed in each case). Note + // that this has to be updated if we read any more bits in this function. + if (data_sz < 10) return VPX_CODEC_UNSUP_BITSTREAM; si->is_kf = !vpx_rb_read_bit(&rb); diff --git a/chromium/third_party/libvpx/source/libvpx/vpx/exports_enc b/chromium/third_party/libvpx/source/libvpx/vpx/exports_enc index e4707ba1082..914e36cd4c1 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx/exports_enc +++ b/chromium/third_party/libvpx/source/libvpx/vpx/exports_enc @@ -7,9 +7,3 @@ text vpx_codec_get_cx_data text vpx_codec_get_global_headers text vpx_codec_get_preview_frame text vpx_codec_set_cx_data_buf -text vpx_svc_dump_statistics -text vpx_svc_encode -text vpx_svc_get_message -text vpx_svc_init -text vpx_svc_release -text vpx_svc_set_options diff --git a/chromium/third_party/libvpx/source/libvpx/vpx/exports_spatial_svc b/chromium/third_party/libvpx/source/libvpx/vpx/exports_spatial_svc new file mode 100644 index 00000000000..d258a1d6181 --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/vpx/exports_spatial_svc @@ -0,0 +1,6 @@ +text vpx_svc_dump_statistics +text vpx_svc_encode +text vpx_svc_get_message +text vpx_svc_init +text vpx_svc_release +text vpx_svc_set_options diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c new file mode 100644 index 00000000000..682b4441992 --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/add_noise.c @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2015 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include <stdlib.h> + +#include "./vpx_config.h" +#include "./vpx_dsp_rtcd.h" + +#include "vpx/vpx_integer.h" +#include "vpx_ports/mem.h" + +void vpx_plane_add_noise_c(uint8_t *start, char *noise, + char blackclamp[16], + char whiteclamp[16], + char bothclamp[16], + unsigned int width, unsigned int height, int pitch) { + unsigned int i, j; + + for (i = 0; i < height; i++) { + uint8_t *pos = start + i * pitch; + char *ref = (char *)(noise + (rand() & 0xff)); // NOLINT + + for (j = 0; j < width; j++) { + int v = pos[j]; + + v = clamp(v - blackclamp[0], 0, 255); + v = clamp(v + bothclamp[0], 0, 255); + v = clamp(v - whiteclamp[0], 0, 255); + + pos[j] = v + ref[j]; + } + } +} diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/arm/avg_neon.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/arm/avg_neon.c index d054c4185f0..e52958c547f 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/arm/avg_neon.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/arm/avg_neon.c @@ -197,3 +197,60 @@ int vpx_vector_var_neon(int16_t const *ref, int16_t const *src, const int bwl) { return s - ((t * t) >> shift_factor); } } + +void vpx_minmax_8x8_neon(const uint8_t *a, int a_stride, + const uint8_t *b, int b_stride, + int *min, int *max) { + // Load and concatenate. + const uint8x16_t a01 = vcombine_u8(vld1_u8(a), + vld1_u8(a + a_stride)); + const uint8x16_t a23 = vcombine_u8(vld1_u8(a + 2 * a_stride), + vld1_u8(a + 3 * a_stride)); + const uint8x16_t a45 = vcombine_u8(vld1_u8(a + 4 * a_stride), + vld1_u8(a + 5 * a_stride)); + const uint8x16_t a67 = vcombine_u8(vld1_u8(a + 6 * a_stride), + vld1_u8(a + 7 * a_stride)); + + const uint8x16_t b01 = vcombine_u8(vld1_u8(b), + vld1_u8(b + b_stride)); + const uint8x16_t b23 = vcombine_u8(vld1_u8(b + 2 * b_stride), + vld1_u8(b + 3 * b_stride)); + const uint8x16_t b45 = vcombine_u8(vld1_u8(b + 4 * b_stride), + vld1_u8(b + 5 * b_stride)); + const uint8x16_t b67 = vcombine_u8(vld1_u8(b + 6 * b_stride), + vld1_u8(b + 7 * b_stride)); + + // Absolute difference. + const uint8x16_t ab01_diff = vabdq_u8(a01, b01); + const uint8x16_t ab23_diff = vabdq_u8(a23, b23); + const uint8x16_t ab45_diff = vabdq_u8(a45, b45); + const uint8x16_t ab67_diff = vabdq_u8(a67, b67); + + // Max values between the Q vectors. + const uint8x16_t ab0123_max = vmaxq_u8(ab01_diff, ab23_diff); + const uint8x16_t ab4567_max = vmaxq_u8(ab45_diff, ab67_diff); + const uint8x16_t ab0123_min = vminq_u8(ab01_diff, ab23_diff); + const uint8x16_t ab4567_min = vminq_u8(ab45_diff, ab67_diff); + + const uint8x16_t ab07_max = vmaxq_u8(ab0123_max, ab4567_max); + const uint8x16_t ab07_min = vminq_u8(ab0123_min, ab4567_min); + + // Split to D and start doing pairwise. + uint8x8_t ab_max = vmax_u8(vget_high_u8(ab07_max), vget_low_u8(ab07_max)); + uint8x8_t ab_min = vmin_u8(vget_high_u8(ab07_min), vget_low_u8(ab07_min)); + + // Enough runs of vpmax/min propogate the max/min values to every position. + ab_max = vpmax_u8(ab_max, ab_max); + ab_min = vpmin_u8(ab_min, ab_min); + + ab_max = vpmax_u8(ab_max, ab_max); + ab_min = vpmin_u8(ab_min, ab_min); + + ab_max = vpmax_u8(ab_max, ab_max); + ab_min = vpmin_u8(ab_min, ab_min); + + *min = *max = 0; // Clear high bits + // Store directly to avoid costly neon->gpr transfer. + vst1_lane_u8((uint8_t *)max, ab_max, 0); + vst1_lane_u8((uint8_t *)min, ab_min, 0); +} diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/avg.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/avg.c index 26fe7859a5c..a8c996663d9 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/avg.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/avg.c @@ -62,7 +62,9 @@ static void hadamard_col8(const int16_t *src_diff, int src_stride, coeff[5] = c3 - c7; } -void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, +// The order of the output coeff of the hadamard is not important. For +// optimization purposes the final transpose may be skipped. +void vpx_hadamard_8x8_c(const int16_t *src_diff, int src_stride, int16_t *coeff) { int idx; int16_t buffer[64]; @@ -85,12 +87,12 @@ void vpx_hadamard_8x8_c(int16_t const *src_diff, int src_stride, } // In place 16x16 2D Hadamard transform -void vpx_hadamard_16x16_c(int16_t const *src_diff, int src_stride, +void vpx_hadamard_16x16_c(const int16_t *src_diff, int src_stride, int16_t *coeff) { int idx; for (idx = 0; idx < 4; ++idx) { // src_diff: 9 bit, dynamic range [-255, 255] - int16_t const *src_ptr = src_diff + (idx >> 1) * 8 * src_stride + const int16_t *src_ptr = src_diff + (idx >> 1) * 8 * src_stride + (idx & 0x01) * 8; vpx_hadamard_8x8_c(src_ptr, src_stride, coeff + idx * 64); } @@ -130,7 +132,7 @@ int vpx_satd_c(const int16_t *coeff, int length) { // Integer projection onto row vectors. // height: value range {16, 32, 64}. -void vpx_int_pro_row_c(int16_t hbuf[16], uint8_t const *ref, +void vpx_int_pro_row_c(int16_t hbuf[16], const uint8_t *ref, const int ref_stride, const int height) { int idx; const int norm_factor = height >> 1; @@ -147,7 +149,7 @@ void vpx_int_pro_row_c(int16_t hbuf[16], uint8_t const *ref, } // width: value range {16, 32, 64}. -int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width) { +int16_t vpx_int_pro_col_c(const uint8_t *ref, const int width) { int idx; int16_t sum = 0; // sum: 14 bit, dynamic range [0, 16320] @@ -159,7 +161,7 @@ int16_t vpx_int_pro_col_c(uint8_t const *ref, const int width) { // ref: [0 - 510] // src: [0 - 510] // bwl: {2, 3, 4} -int vpx_vector_var_c(int16_t const *ref, int16_t const *src, +int vpx_vector_var_c(const int16_t *ref, const int16_t *src, const int bwl) { int i; int width = 4 << bwl; diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c index 6ad806ac3f5..8140e78e70e 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/bitreader.c @@ -69,7 +69,7 @@ void vpx_reader_fill(vpx_reader *r) { buffer += (bits >> 3); value = r->value | (nv << (shift & 0x7)); } else { - const int bits_over = (int)(shift + CHAR_BIT - bits_left); + const int bits_over = (int)(shift + CHAR_BIT - (int)bits_left); int loop_end = 0; if (bits_over >= 0) { count += LOTS_OF_BITS; diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/fwd_txfm.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/fwd_txfm.c index 7baaa8b0d04..4c0d5db8376 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/fwd_txfm.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/fwd_txfm.c @@ -8,6 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ +#include "./vpx_dsp_rtcd.h" #include "vpx_dsp/fwd_txfm.h" void vpx_fdct4x4_c(const int16_t *input, tran_low_t *output, int stride) { @@ -85,7 +86,6 @@ void vpx_fdct4x4_1_c(const int16_t *input, tran_low_t *output, int stride) { sum += input[r * stride + c]; output[0] = sum << 1; - output[1] = 0; } void vpx_fdct8x8_c(const int16_t *input, tran_low_t *final_output, int stride) { @@ -182,7 +182,6 @@ void vpx_fdct8x8_1_c(const int16_t *input, tran_low_t *output, int stride) { sum += input[r * stride + c]; output[0] = sum; - output[1] = 0; } void vpx_fdct16x16_c(const int16_t *input, tran_low_t *output, int stride) { @@ -367,13 +366,12 @@ void vpx_fdct16x16_c(const int16_t *input, tran_low_t *output, int stride) { void vpx_fdct16x16_1_c(const int16_t *input, tran_low_t *output, int stride) { int r, c; - tran_low_t sum = 0; + int sum = 0; for (r = 0; r < 16; ++r) for (c = 0; c < 16; ++c) sum += input[r * stride + c]; - output[0] = sum >> 1; - output[1] = 0; + output[0] = (tran_low_t)(sum >> 1); } static INLINE tran_high_t dct_32_round(tran_high_t input) { @@ -771,13 +769,12 @@ void vpx_fdct32x32_rd_c(const int16_t *input, tran_low_t *out, int stride) { void vpx_fdct32x32_1_c(const int16_t *input, tran_low_t *output, int stride) { int r, c; - tran_low_t sum = 0; + int sum = 0; for (r = 0; r < 32; ++r) for (c = 0; c < 32; ++c) sum += input[r * stride + c]; - output[0] = sum >> 3; - output[1] = 0; + output[0] = (tran_low_t)(sum >> 3); } #if CONFIG_VP9_HIGHBITDEPTH diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/inv_txfm.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/inv_txfm.c index a0f59bf7571..ff75337456b 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/inv_txfm.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/inv_txfm.c @@ -11,6 +11,7 @@ #include <math.h> #include <string.h> +#include "./vpx_dsp_rtcd.h" #include "vpx_dsp/inv_txfm.h" void vpx_iwht4x4_16_add_c(const tran_low_t *input, uint8_t *dest, int stride) { diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/loopfilter.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/loopfilter.c index 46ef646173e..645a1ab95ee 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/loopfilter.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/loopfilter.c @@ -11,6 +11,7 @@ #include <stdlib.h> #include "./vpx_config.h" +#include "./vpx_dsp_rtcd.h" #include "vpx_dsp/vpx_dsp_common.h" #include "vpx_ports/mem.h" diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/add_noise_msa.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/add_noise_msa.c new file mode 100644 index 00000000000..366770c0d52 --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/add_noise_msa.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2015 The WebM project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +#include <stdlib.h> +#include "./macros_msa.h" + +void vpx_plane_add_noise_msa(uint8_t *start_ptr, char *noise, + char blackclamp[16], char whiteclamp[16], + char bothclamp[16], uint32_t width, + uint32_t height, int32_t pitch) { + uint32_t i, j; + + for (i = 0; i < height / 2; ++i) { + uint8_t *pos0_ptr = start_ptr + (2 * i) * pitch; + int8_t *ref0_ptr = (int8_t *)(noise + (rand() & 0xff)); + uint8_t *pos1_ptr = start_ptr + (2 * i + 1) * pitch; + int8_t *ref1_ptr = (int8_t *)(noise + (rand() & 0xff)); + for (j = width / 16; j--;) { + v16i8 temp00_s, temp01_s; + v16u8 temp00, temp01, black_clamp, white_clamp; + v16u8 pos0, ref0, pos1, ref1; + v16i8 const127 = __msa_ldi_b(127); + + pos0 = LD_UB(pos0_ptr); + ref0 = LD_UB(ref0_ptr); + pos1 = LD_UB(pos1_ptr); + ref1 = LD_UB(ref1_ptr); + black_clamp = (v16u8)__msa_fill_b(blackclamp[0]); + white_clamp = (v16u8)__msa_fill_b(whiteclamp[0]); + temp00 = (pos0 < black_clamp); + pos0 = __msa_bmnz_v(pos0, black_clamp, temp00); + temp01 = (pos1 < black_clamp); + pos1 = __msa_bmnz_v(pos1, black_clamp, temp01); + XORI_B2_128_UB(pos0, pos1); + temp00_s = __msa_adds_s_b((v16i8)white_clamp, const127); + temp00 = (v16u8)(temp00_s < pos0); + pos0 = (v16u8)__msa_bmnz_v((v16u8)pos0, (v16u8)temp00_s, temp00); + temp01_s = __msa_adds_s_b((v16i8)white_clamp, const127); + temp01 = (temp01_s < pos1); + pos1 = (v16u8)__msa_bmnz_v((v16u8)pos1, (v16u8)temp01_s, temp01); + XORI_B2_128_UB(pos0, pos1); + pos0 += ref0; + ST_UB(pos0, pos0_ptr); + pos1 += ref1; + ST_UB(pos1, pos1_ptr); + pos0_ptr += 16; + pos1_ptr += 16; + ref0_ptr += 16; + ref1_ptr += 16; + } + } +} diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/fwd_dct32x32_msa.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/fwd_dct32x32_msa.c index 2115a348c2e..f29c14b3d0e 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/fwd_dct32x32_msa.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/fwd_dct32x32_msa.c @@ -933,23 +933,21 @@ void vpx_fdct32x32_rd_msa(const int16_t *input, int16_t *out, } void vpx_fdct32x32_1_msa(const int16_t *input, int16_t *out, int32_t stride) { - out[1] = 0; - - out[0] = LD_HADD(input, stride); - out[0] += LD_HADD(input + 8, stride); - out[0] += LD_HADD(input + 16, stride); - out[0] += LD_HADD(input + 24, stride); - out[0] += LD_HADD(input + 32 * 8, stride); - out[0] += LD_HADD(input + 32 * 8 + 8, stride); - out[0] += LD_HADD(input + 32 * 8 + 16, stride); - out[0] += LD_HADD(input + 32 * 8 + 24, stride); - out[0] += LD_HADD(input + 32 * 16, stride); - out[0] += LD_HADD(input + 32 * 16 + 8, stride); - out[0] += LD_HADD(input + 32 * 16 + 16, stride); - out[0] += LD_HADD(input + 32 * 16 + 24, stride); - out[0] += LD_HADD(input + 32 * 24, stride); - out[0] += LD_HADD(input + 32 * 24 + 8, stride); - out[0] += LD_HADD(input + 32 * 24 + 16, stride); - out[0] += LD_HADD(input + 32 * 24 + 24, stride); - out[0] >>= 3; + int sum = LD_HADD(input, stride); + sum += LD_HADD(input + 8, stride); + sum += LD_HADD(input + 16, stride); + sum += LD_HADD(input + 24, stride); + sum += LD_HADD(input + 32 * 8, stride); + sum += LD_HADD(input + 32 * 8 + 8, stride); + sum += LD_HADD(input + 32 * 8 + 16, stride); + sum += LD_HADD(input + 32 * 8 + 24, stride); + sum += LD_HADD(input + 32 * 16, stride); + sum += LD_HADD(input + 32 * 16 + 8, stride); + sum += LD_HADD(input + 32 * 16 + 16, stride); + sum += LD_HADD(input + 32 * 16 + 24, stride); + sum += LD_HADD(input + 32 * 24, stride); + sum += LD_HADD(input + 32 * 24 + 8, stride); + sum += LD_HADD(input + 32 * 24 + 16, stride); + sum += LD_HADD(input + 32 * 24 + 24, stride); + out[0] = (int16_t)(sum >> 3); } diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/fwd_txfm_msa.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/fwd_txfm_msa.c index f66dd5fce28..0dd141f4196 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/fwd_txfm_msa.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/mips/fwd_txfm_msa.c @@ -237,11 +237,9 @@ void vpx_fdct16x16_msa(const int16_t *input, int16_t *output, } void vpx_fdct16x16_1_msa(const int16_t *input, int16_t *out, int32_t stride) { - out[1] = 0; - - out[0] = LD_HADD(input, stride); - out[0] += LD_HADD(input + 8, stride); - out[0] += LD_HADD(input + 16 * 8, stride); - out[0] += LD_HADD(input + 16 * 8 + 8, stride); - out[0] >>= 1; + int sum = LD_HADD(input, stride); + sum += LD_HADD(input + 8, stride); + sum += LD_HADD(input + 16 * 8, stride); + sum += LD_HADD(input + 16 * 8 + 8, stride); + out[0] = (int16_t)(sum >> 1); } diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/quantize.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/quantize.c index e4e741a9089..6426cccc733 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/quantize.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/quantize.c @@ -8,6 +8,7 @@ * be found in the AUTHORS file in the root of the source tree. */ +#include "./vpx_dsp_rtcd.h" #include "vpx_dsp/quantize.h" #include "vpx_mem/vpx_mem.h" diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/sad.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/sad.c index c0c3ff99645..f1f951f1462 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/sad.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/sad.c @@ -33,47 +33,6 @@ static INLINE unsigned int sad(const uint8_t *a, int a_stride, return sad; } -// TODO(johannkoenig): this moved to vpx_dsp, should be able to clean this up. -/* Remove dependency on vp9 variance function by duplicating vp9_comp_avg_pred. - * The function averages every corresponding element of the buffers and stores - * the value in a third buffer, comp_pred. - * pred and comp_pred are assumed to have stride = width - * In the usage below comp_pred is a local array. - */ -static INLINE void avg_pred(uint8_t *comp_pred, const uint8_t *pred, int width, - int height, const uint8_t *ref, int ref_stride) { - int i, j; - - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) { - const int tmp = pred[j] + ref[j]; - comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1); - } - comp_pred += width; - pred += width; - ref += ref_stride; - } -} - -#if CONFIG_VP9_HIGHBITDEPTH -static INLINE void highbd_avg_pred(uint16_t *comp_pred, const uint8_t *pred8, - int width, int height, const uint8_t *ref8, - int ref_stride) { - int i, j; - uint16_t *pred = CONVERT_TO_SHORTPTR(pred8); - uint16_t *ref = CONVERT_TO_SHORTPTR(ref8); - for (i = 0; i < height; i++) { - for (j = 0; j < width; j++) { - const int tmp = pred[j] + ref[j]; - comp_pred[j] = ROUND_POWER_OF_TWO(tmp, 1); - } - comp_pred += width; - pred += width; - ref += ref_stride; - } -} -#endif // CONFIG_VP9_HIGHBITDEPTH - #define sadMxN(m, n) \ unsigned int vpx_sad##m##x##n##_c(const uint8_t *src, int src_stride, \ const uint8_t *ref, int ref_stride) { \ @@ -83,7 +42,7 @@ unsigned int vpx_sad##m##x##n##_avg_c(const uint8_t *src, int src_stride, \ const uint8_t *ref, int ref_stride, \ const uint8_t *second_pred) { \ uint8_t comp_pred[m * n]; \ - avg_pred(comp_pred, second_pred, m, n, ref, ref_stride); \ + vpx_comp_avg_pred_c(comp_pred, second_pred, m, n, ref, ref_stride); \ return sad(src, src_stride, comp_pred, m, m, n); \ } @@ -221,7 +180,7 @@ unsigned int vpx_highbd_sad##m##x##n##_avg_c(const uint8_t *src, \ int ref_stride, \ const uint8_t *second_pred) { \ uint16_t comp_pred[m * n]; \ - highbd_avg_pred(comp_pred, second_pred, m, n, ref, ref_stride); \ + vpx_highbd_comp_avg_pred_c(comp_pred, second_pred, m, n, ref, ref_stride); \ return highbd_sadb(src, src_stride, comp_pred, m, m, n); \ } diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp.mk b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp.mk index 581ec3a286e..dd8c6e831e2 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp.mk +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp.mk @@ -53,6 +53,13 @@ DSP_SRCS-$(HAVE_SSE2) += x86/highbd_intrapred_sse2.asm endif # CONFIG_USE_X86INC endif # CONFIG_VP9_HIGHBITDEPTH +ifneq ($(filter yes,$(CONFIG_POSTPROC) $(CONFIG_VP9_POSTPROC)),) +DSP_SRCS-yes += add_noise.c +DSP_SRCS-$(HAVE_MSA) += mips/add_noise_msa.c +DSP_SRCS-$(HAVE_MMX) += x86/add_noise_mmx.asm +DSP_SRCS-$(HAVE_SSE2) += x86/add_noise_sse2.asm +endif # CONFIG_POSTPROC + DSP_SRCS-$(HAVE_NEON_ASM) += arm/intrapred_neon_asm$(ASM) DSP_SRCS-$(HAVE_NEON) += arm/intrapred_neon.c DSP_SRCS-$(HAVE_MSA) += mips/intrapred_msa.c diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp_common.h b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp_common.h index a9e180e7934..a1d0a51ef56 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp_common.h +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp_common.h @@ -8,12 +8,11 @@ * be found in the AUTHORS file in the root of the source tree. */ -#ifndef VPX_DSP_COMMON_H_ -#define VPX_DSP_COMMON_H_ +#ifndef VPX_DSP_VPX_DSP_COMMON_H_ +#define VPX_DSP_VPX_DSP_COMMON_H_ #include "./vpx_config.h" #include "vpx/vpx_integer.h" -#include "vpx_dsp/vpx_dsp_common.h" #include "vpx_ports/mem.h" #ifdef __cplusplus @@ -67,4 +66,4 @@ static INLINE uint16_t clip_pixel_highbd(int val, int bd) { } // extern "C" #endif -#endif // VPX_DSP_COMMON_H_ +#endif // VPX_DSP_VPX_DSP_COMMON_H_ diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp_rtcd_defs.pl b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp_rtcd_defs.pl index 34dd0bc85c4..f883ce553b7 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp_rtcd_defs.pl +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/vpx_dsp_rtcd_defs.pl @@ -919,9 +919,9 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") { $vpx_idct32x32_135_add_msa=vpx_idct32x32_1024_add_msa; add_proto qw/void vpx_idct32x32_34_add/, "const tran_low_t *input, uint8_t *dest, int dest_stride"; - specialize qw/vpx_idct32x32_34_add sse2 neon_asm dspr2 msa/, "$ssse3_x86_64_x86inc"; + specialize qw/vpx_idct32x32_34_add sse2 neon dspr2 msa/, "$ssse3_x86_64_x86inc"; # Need to add 34 eob idct32x32 neon implementation. - $vpx_idct32x32_34_add_neon_asm=vpx_idct32x32_1024_add_neon; + $vpx_idct32x32_34_add_neon=vpx_idct32x32_1024_add_neon; add_proto qw/void vpx_idct32x32_1_add/, "const tran_low_t *input, uint8_t *dest, int dest_stride"; specialize qw/vpx_idct32x32_1_add sse2 neon dspr2 msa/; @@ -1014,24 +1014,24 @@ if ((vpx_config("CONFIG_VP9_ENCODER") eq "yes") || (vpx_config("CONFIG_VP10_ENCO specialize qw/vpx_avg_4x4 sse2 neon msa/; add_proto qw/void vpx_minmax_8x8/, "const uint8_t *s, int p, const uint8_t *d, int dp, int *min, int *max"; - specialize qw/vpx_minmax_8x8 sse2/; + specialize qw/vpx_minmax_8x8 sse2 neon/; - add_proto qw/void vpx_hadamard_8x8/, "int16_t const *src_diff, int src_stride, int16_t *coeff"; + add_proto qw/void vpx_hadamard_8x8/, "const int16_t *src_diff, int src_stride, int16_t *coeff"; specialize qw/vpx_hadamard_8x8 sse2/, "$ssse3_x86_64_x86inc"; - add_proto qw/void vpx_hadamard_16x16/, "int16_t const *src_diff, int src_stride, int16_t *coeff"; + add_proto qw/void vpx_hadamard_16x16/, "const int16_t *src_diff, int src_stride, int16_t *coeff"; specialize qw/vpx_hadamard_16x16 sse2/; add_proto qw/int vpx_satd/, "const int16_t *coeff, int length"; specialize qw/vpx_satd sse2 neon/; - add_proto qw/void vpx_int_pro_row/, "int16_t *hbuf, uint8_t const *ref, const int ref_stride, const int height"; + add_proto qw/void vpx_int_pro_row/, "int16_t *hbuf, const uint8_t *ref, const int ref_stride, const int height"; specialize qw/vpx_int_pro_row sse2 neon/; - add_proto qw/int16_t vpx_int_pro_col/, "uint8_t const *ref, const int width"; + add_proto qw/int16_t vpx_int_pro_col/, "const uint8_t *ref, const int width"; specialize qw/vpx_int_pro_col sse2 neon/; - add_proto qw/int vpx_vector_var/, "int16_t const *ref, int16_t const *src, const int bwl"; + add_proto qw/int vpx_vector_var/, "const int16_t *ref, const int16_t *src, const int bwl"; specialize qw/vpx_vector_var neon sse2/; } # CONFIG_VP9_ENCODER || CONFIG_VP10_ENCODER @@ -1907,6 +1907,15 @@ if (vpx_config("CONFIG_VP9_HIGHBITDEPTH") eq "yes") { add_proto qw/uint32_t vpx_highbd_8_sub_pixel_avg_variance4x4/, "const uint8_t *src_ptr, int source_stride, int xoffset, int yoffset, const uint8_t *ref_ptr, int ref_stride, uint32_t *sse, const uint8_t *second_pred"; } # CONFIG_VP9_HIGHBITDEPTH + +# +# Post Processing +# +if (vpx_config("CONFIG_POSTPROC") eq "yes" || vpx_config("CONFIG_VP9_POSTPROC") eq "yes") { + add_proto qw/void vpx_plane_add_noise/, "uint8_t *Start, char *noise, char blackclamp[16], char whiteclamp[16], char bothclamp[16], unsigned int Width, unsigned int Height, int Pitch"; + specialize qw/vpx_plane_add_noise mmx sse2 msa/; +} + } # CONFIG_ENCODERS || CONFIG_POSTPROC || CONFIG_VP9_POSTPROC 1; diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_mmx.asm b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_mmx.asm new file mode 100644 index 00000000000..8c2623db46a --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_mmx.asm @@ -0,0 +1,86 @@ +; +; Copyright (c) 2015 The WebM project authors. All Rights Reserved. +; +; Use of this source code is governed by a BSD-style license +; that can be found in the LICENSE file in the root of the source +; tree. An additional intellectual property rights grant can be found +; in the file PATENTS. All contributing project authors may +; be found in the AUTHORS file in the root of the source tree. +; + +%include "vpx_ports/x86_abi_support.asm" + +;void vpx_plane_add_noise_mmx (unsigned char *Start, unsigned char *noise, +; unsigned char blackclamp[16], +; unsigned char whiteclamp[16], +; unsigned char bothclamp[16], +; unsigned int Width, unsigned int Height, int Pitch) +global sym(vpx_plane_add_noise_mmx) PRIVATE +sym(vpx_plane_add_noise_mmx): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 8 + GET_GOT rbx + push rsi + push rdi + ; end prolog + + ; get the clamps in registers + mov rdx, arg(2) ; blackclamp + movq mm3, [rdx] + mov rdx, arg(3) ; whiteclamp + movq mm4, [rdx] + mov rdx, arg(4) ; bothclamp + movq mm5, [rdx] + +.addnoise_loop: + call sym(LIBVPX_RAND) WRT_PLT + mov rcx, arg(1) ;noise + and rax, 0xff + add rcx, rax + + mov rdi, rcx + movsxd rcx, dword arg(5) ;[Width] + mov rsi, arg(0) ;Pos + xor rax,rax + +.addnoise_nextset: + movq mm1,[rsi+rax] ; get the source + + psubusb mm1, mm3 ; subtract black clamp + paddusb mm1, mm5 ; add both clamp + psubusb mm1, mm4 ; subtract whiteclamp + + movq mm2,[rdi+rax] ; get the noise for this line + paddb mm1,mm2 ; add it in + movq [rsi+rax],mm1 ; store the result + + add rax,8 ; move to the next line + + cmp rax, rcx + jl .addnoise_nextset + + movsxd rax, dword arg(7) ; Pitch + add arg(0), rax ; Start += Pitch + sub dword arg(6), 1 ; Height -= 1 + jg .addnoise_loop + + ; begin epilog + pop rdi + pop rsi + RESTORE_GOT + UNSHADOW_ARGS + pop rbp + ret + + +SECTION_RODATA +align 16 +Blur: + times 16 dw 16 + times 8 dw 64 + times 16 dw 16 + times 8 dw 0 + +rd: + times 4 dw 0x40 diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_sse2.asm b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_sse2.asm new file mode 100644 index 00000000000..ff61b19ba9b --- /dev/null +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/add_noise_sse2.asm @@ -0,0 +1,83 @@ +; +; Copyright (c) 2010 The WebM project authors. All Rights Reserved. +; +; Use of this source code is governed by a BSD-style license +; that can be found in the LICENSE file in the root of the source +; tree. An additional intellectual property rights grant can be found +; in the file PATENTS. All contributing project authors may +; be found in the AUTHORS file in the root of the source tree. +; + + +%include "vpx_ports/x86_abi_support.asm" + +;void vpx_plane_add_noise_sse2(unsigned char *start, unsigned char *noise, +; unsigned char blackclamp[16], +; unsigned char whiteclamp[16], +; unsigned char bothclamp[16], +; unsigned int width, unsigned int height, +; int pitch) +global sym(vpx_plane_add_noise_sse2) PRIVATE +sym(vpx_plane_add_noise_sse2): + push rbp + mov rbp, rsp + SHADOW_ARGS_TO_STACK 8 + GET_GOT rbx + push rsi + push rdi + ; end prolog + + ; get the clamps in registers + mov rdx, arg(2) ; blackclamp + movdqu xmm3, [rdx] + mov rdx, arg(3) ; whiteclamp + movdqu xmm4, [rdx] + mov rdx, arg(4) ; bothclamp + movdqu xmm5, [rdx] + +.addnoise_loop: + call sym(LIBVPX_RAND) WRT_PLT + mov rcx, arg(1) ;noise + and rax, 0xff + add rcx, rax + + mov rdi, rcx + movsxd rcx, dword arg(5) ;[Width] + mov rsi, arg(0) ;Pos + xor rax,rax + +.addnoise_nextset: + movdqu xmm1,[rsi+rax] ; get the source + + psubusb xmm1, xmm3 ; subtract black clamp + paddusb xmm1, xmm5 ; add both clamp + psubusb xmm1, xmm4 ; subtract whiteclamp + + movdqu xmm2,[rdi+rax] ; get the noise for this line + paddb xmm1,xmm2 ; add it in + movdqu [rsi+rax],xmm1 ; store the result + + add rax,16 ; move to the next line + + cmp rax, rcx + jl .addnoise_nextset + + movsxd rax, dword arg(7) ; Pitch + add arg(0), rax ; Start += Pitch + sub dword arg(6), 1 ; Height -= 1 + jg .addnoise_loop + + ; begin epilog + pop rdi + pop rsi + RESTORE_GOT + UNSHADOW_ARGS + pop rbp + ret + +SECTION_RODATA +align 16 +rd42: + times 8 dw 0x04 +four8s: + times 4 dd 8 diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/fwd_dct32x32_impl_avx2.h b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/fwd_dct32x32_impl_avx2.h index 4df39dff861..951af3a622d 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/fwd_dct32x32_impl_avx2.h +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/fwd_dct32x32_impl_avx2.h @@ -10,6 +10,7 @@ #include <immintrin.h> // AVX2 +#include "./vpx_dsp_rtcd.h" #include "vpx_dsp/txfm_common.h" #define pair256_set_epi16(a, b) \ diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/fwd_txfm_sse2.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/fwd_txfm_sse2.c index bca72e8749f..3e4f49bd952 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/fwd_txfm_sse2.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/fwd_txfm_sse2.c @@ -11,6 +11,7 @@ #include <emmintrin.h> // SSE2 #include "./vpx_config.h" +#include "./vpx_dsp_rtcd.h" #include "vpx_dsp/vpx_dsp_common.h" #include "vpx_dsp/x86/fwd_txfm_sse2.h" @@ -40,7 +41,7 @@ void vpx_fdct4x4_1_sse2(const int16_t *input, tran_low_t *output, int stride) { in1 = _mm_add_epi32(tmp, in0); in0 = _mm_slli_epi32(in1, 1); - store_output(&in0, output); + output[0] = (tran_low_t)_mm_cvtsi128_si32(in0); } void vpx_fdct8x8_1_sse2(const int16_t *input, tran_low_t *output, int stride) { @@ -80,7 +81,7 @@ void vpx_fdct8x8_1_sse2(const int16_t *input, tran_low_t *output, int stride) { in0 = _mm_srli_si128(sum, 8); in1 = _mm_add_epi32(sum, in0); - store_output(&in1, output); + output[0] = (tran_low_t)_mm_cvtsi128_si32(in1); } void vpx_fdct16x16_1_sse2(const int16_t *input, tran_low_t *output, @@ -91,40 +92,39 @@ void vpx_fdct16x16_1_sse2(const int16_t *input, tran_low_t *output, int i; for (i = 0; i < 2; ++i) { - input += 8 * i; - in0 = _mm_load_si128((const __m128i *)(input + 0 * stride)); - in1 = _mm_load_si128((const __m128i *)(input + 1 * stride)); - in2 = _mm_load_si128((const __m128i *)(input + 2 * stride)); - in3 = _mm_load_si128((const __m128i *)(input + 3 * stride)); + in0 = _mm_load_si128((const __m128i *)(input + 0 * stride + 0)); + in1 = _mm_load_si128((const __m128i *)(input + 0 * stride + 8)); + in2 = _mm_load_si128((const __m128i *)(input + 1 * stride + 0)); + in3 = _mm_load_si128((const __m128i *)(input + 1 * stride + 8)); u0 = _mm_add_epi16(in0, in1); u1 = _mm_add_epi16(in2, in3); sum = _mm_add_epi16(sum, u0); - in0 = _mm_load_si128((const __m128i *)(input + 4 * stride)); - in1 = _mm_load_si128((const __m128i *)(input + 5 * stride)); - in2 = _mm_load_si128((const __m128i *)(input + 6 * stride)); - in3 = _mm_load_si128((const __m128i *)(input + 7 * stride)); + in0 = _mm_load_si128((const __m128i *)(input + 2 * stride + 0)); + in1 = _mm_load_si128((const __m128i *)(input + 2 * stride + 8)); + in2 = _mm_load_si128((const __m128i *)(input + 3 * stride + 0)); + in3 = _mm_load_si128((const __m128i *)(input + 3 * stride + 8)); sum = _mm_add_epi16(sum, u1); u0 = _mm_add_epi16(in0, in1); u1 = _mm_add_epi16(in2, in3); sum = _mm_add_epi16(sum, u0); - in0 = _mm_load_si128((const __m128i *)(input + 8 * stride)); - in1 = _mm_load_si128((const __m128i *)(input + 9 * stride)); - in2 = _mm_load_si128((const __m128i *)(input + 10 * stride)); - in3 = _mm_load_si128((const __m128i *)(input + 11 * stride)); + in0 = _mm_load_si128((const __m128i *)(input + 4 * stride + 0)); + in1 = _mm_load_si128((const __m128i *)(input + 4 * stride + 8)); + in2 = _mm_load_si128((const __m128i *)(input + 5 * stride + 0)); + in3 = _mm_load_si128((const __m128i *)(input + 5 * stride + 8)); sum = _mm_add_epi16(sum, u1); u0 = _mm_add_epi16(in0, in1); u1 = _mm_add_epi16(in2, in3); sum = _mm_add_epi16(sum, u0); - in0 = _mm_load_si128((const __m128i *)(input + 12 * stride)); - in1 = _mm_load_si128((const __m128i *)(input + 13 * stride)); - in2 = _mm_load_si128((const __m128i *)(input + 14 * stride)); - in3 = _mm_load_si128((const __m128i *)(input + 15 * stride)); + in0 = _mm_load_si128((const __m128i *)(input + 6 * stride + 0)); + in1 = _mm_load_si128((const __m128i *)(input + 6 * stride + 8)); + in2 = _mm_load_si128((const __m128i *)(input + 7 * stride + 0)); + in3 = _mm_load_si128((const __m128i *)(input + 7 * stride + 8)); sum = _mm_add_epi16(sum, u1); u0 = _mm_add_epi16(in0, in1); @@ -132,6 +132,7 @@ void vpx_fdct16x16_1_sse2(const int16_t *input, tran_low_t *output, sum = _mm_add_epi16(sum, u0); sum = _mm_add_epi16(sum, u1); + input += 8 * stride; } u0 = _mm_setzero_si128(); @@ -149,7 +150,7 @@ void vpx_fdct16x16_1_sse2(const int16_t *input, tran_low_t *output, in1 = _mm_add_epi32(sum, in0); in1 = _mm_srai_epi32(in1, 1); - store_output(&in1, output); + output[0] = (tran_low_t)_mm_cvtsi128_si32(in1); } void vpx_fdct32x32_1_sse2(const int16_t *input, tran_low_t *output, @@ -221,7 +222,7 @@ void vpx_fdct32x32_1_sse2(const int16_t *input, tran_low_t *output, in1 = _mm_add_epi32(sum, in0); in1 = _mm_srai_epi32(in1, 3); - store_output(&in1, output); + output[0] = (tran_low_t)_mm_cvtsi128_si32(in1); } #define DCT_HIGH_BIT_DEPTH 0 diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/highbd_variance_sse2.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/highbd_variance_sse2.c index 81ec5dbdb9c..14d029c9a95 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/highbd_variance_sse2.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/highbd_variance_sse2.c @@ -255,13 +255,12 @@ unsigned int vpx_highbd_12_mse8x8_sse2(const uint8_t *src8, int src_stride, int height, \ unsigned int *sse, \ void *unused0, void *unused); -#define DECLS(opt1, opt2) \ - DECL(8, opt1); \ - DECL(16, opt1) +#define DECLS(opt) \ + DECL(8, opt); \ + DECL(16, opt) + +DECLS(sse2); -DECLS(sse2, sse); -// TODO(johannkoenig): enable the ssse3 or delete -// DECLS(ssse3, ssse3); #undef DECLS #undef DECL @@ -398,21 +397,21 @@ uint32_t vpx_highbd_12_sub_pixel_variance##w##x##h##_##opt( \ return sse - ((cast se * se) >> (wlog2 + hlog2)); \ } -#define FNS(opt1, opt2) \ -FN(64, 64, 16, 6, 6, opt1, (int64_t)); \ -FN(64, 32, 16, 6, 5, opt1, (int64_t)); \ -FN(32, 64, 16, 5, 6, opt1, (int64_t)); \ -FN(32, 32, 16, 5, 5, opt1, (int64_t)); \ -FN(32, 16, 16, 5, 4, opt1, (int64_t)); \ -FN(16, 32, 16, 4, 5, opt1, (int64_t)); \ -FN(16, 16, 16, 4, 4, opt1, (int64_t)); \ -FN(16, 8, 16, 4, 3, opt1, (int64_t)); \ -FN(8, 16, 8, 3, 4, opt1, (int64_t)); \ -FN(8, 8, 8, 3, 3, opt1, (int64_t)); \ -FN(8, 4, 8, 3, 2, opt1, (int64_t)); +#define FNS(opt) \ +FN(64, 64, 16, 6, 6, opt, (int64_t)); \ +FN(64, 32, 16, 6, 5, opt, (int64_t)); \ +FN(32, 64, 16, 5, 6, opt, (int64_t)); \ +FN(32, 32, 16, 5, 5, opt, (int64_t)); \ +FN(32, 16, 16, 5, 4, opt, (int64_t)); \ +FN(16, 32, 16, 4, 5, opt, (int64_t)); \ +FN(16, 16, 16, 4, 4, opt, (int64_t)); \ +FN(16, 8, 16, 4, 3, opt, (int64_t)); \ +FN(8, 16, 8, 3, 4, opt, (int64_t)); \ +FN(8, 8, 8, 3, 3, opt, (int64_t)); \ +FN(8, 4, 8, 3, 2, opt, (int64_t)); -FNS(sse2, sse); +FNS(sse2); #undef FNS #undef FN diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/inv_txfm_sse2.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/inv_txfm_sse2.c index ae907fd0bd2..9c0d3eb4cb1 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/inv_txfm_sse2.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/inv_txfm_sse2.c @@ -1311,24 +1311,10 @@ void vpx_idct16x16_1_add_sse2(const tran_low_t *input, uint8_t *dest, dc_value = _mm_set1_epi16(a); - for (i = 0; i < 2; ++i) { - RECON_AND_STORE(dest + 0 * stride, dc_value); - RECON_AND_STORE(dest + 1 * stride, dc_value); - RECON_AND_STORE(dest + 2 * stride, dc_value); - RECON_AND_STORE(dest + 3 * stride, dc_value); - RECON_AND_STORE(dest + 4 * stride, dc_value); - RECON_AND_STORE(dest + 5 * stride, dc_value); - RECON_AND_STORE(dest + 6 * stride, dc_value); - RECON_AND_STORE(dest + 7 * stride, dc_value); - RECON_AND_STORE(dest + 8 * stride, dc_value); - RECON_AND_STORE(dest + 9 * stride, dc_value); - RECON_AND_STORE(dest + 10 * stride, dc_value); - RECON_AND_STORE(dest + 11 * stride, dc_value); - RECON_AND_STORE(dest + 12 * stride, dc_value); - RECON_AND_STORE(dest + 13 * stride, dc_value); - RECON_AND_STORE(dest + 14 * stride, dc_value); - RECON_AND_STORE(dest + 15 * stride, dc_value); - dest += 8; + for (i = 0; i < 16; ++i) { + RECON_AND_STORE(dest + 0, dc_value); + RECON_AND_STORE(dest + 8, dc_value); + dest += stride; } } diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/variance_sse2.c b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/variance_sse2.c index e6c9365ab4d..43f4603ca3c 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/variance_sse2.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_dsp/x86/variance_sse2.c @@ -171,7 +171,7 @@ unsigned int vpx_variance4x4_sse2(const unsigned char *src, int src_stride, unsigned int *sse) { int sum; get4x4var_sse2(src, src_stride, ref, ref_stride, sse, &sum); - return *sse - (((unsigned int)sum * sum) >> 4); + return *sse - ((sum * sum) >> 4); } unsigned int vpx_variance8x4_sse2(const uint8_t *src, int src_stride, @@ -180,7 +180,7 @@ unsigned int vpx_variance8x4_sse2(const uint8_t *src, int src_stride, int sum; variance_sse2(src, src_stride, ref, ref_stride, 8, 4, sse, &sum, get4x4var_sse2, 4); - return *sse - (((unsigned int)sum * sum) >> 5); + return *sse - ((sum * sum) >> 5); } unsigned int vpx_variance4x8_sse2(const uint8_t *src, int src_stride, @@ -189,7 +189,7 @@ unsigned int vpx_variance4x8_sse2(const uint8_t *src, int src_stride, int sum; variance_sse2(src, src_stride, ref, ref_stride, 4, 8, sse, &sum, get4x4var_sse2, 4); - return *sse - (((unsigned int)sum * sum) >> 5); + return *sse - ((sum * sum) >> 5); } unsigned int vpx_variance8x8_sse2(const unsigned char *src, int src_stride, @@ -197,7 +197,7 @@ unsigned int vpx_variance8x8_sse2(const unsigned char *src, int src_stride, unsigned int *sse) { int sum; vpx_get8x8var_sse2(src, src_stride, ref, ref_stride, sse, &sum); - return *sse - (((unsigned int)sum * sum) >> 6); + return *sse - ((sum * sum) >> 6); } unsigned int vpx_variance16x8_sse2(const unsigned char *src, int src_stride, @@ -206,7 +206,7 @@ unsigned int vpx_variance16x8_sse2(const unsigned char *src, int src_stride, int sum; variance_sse2(src, src_stride, ref, ref_stride, 16, 8, sse, &sum, vpx_get8x8var_sse2, 8); - return *sse - (((unsigned int)sum * sum) >> 7); + return *sse - ((sum * sum) >> 7); } unsigned int vpx_variance8x16_sse2(const unsigned char *src, int src_stride, @@ -215,7 +215,7 @@ unsigned int vpx_variance8x16_sse2(const unsigned char *src, int src_stride, int sum; variance_sse2(src, src_stride, ref, ref_stride, 8, 16, sse, &sum, vpx_get8x8var_sse2, 8); - return *sse - (((unsigned int)sum * sum) >> 7); + return *sse - ((sum * sum) >> 7); } unsigned int vpx_variance16x16_sse2(const unsigned char *src, int src_stride, @@ -223,7 +223,7 @@ unsigned int vpx_variance16x16_sse2(const unsigned char *src, int src_stride, unsigned int *sse) { int sum; vpx_get16x16var_sse2(src, src_stride, ref, ref_stride, sse, &sum); - return *sse - (((unsigned int)sum * sum) >> 8); + return *sse - (((uint32_t)((int64_t)sum * sum)) >> 8); } unsigned int vpx_variance32x32_sse2(const uint8_t *src, int src_stride, @@ -329,7 +329,7 @@ DECLS(ssse3, ssse3); #undef DECLS #undef DECL -#define FN(w, h, wf, wlog2, hlog2, opt, cast) \ +#define FN(w, h, wf, wlog2, hlog2, opt, cast_prod, cast) \ unsigned int vpx_sub_pixel_variance##w##x##h##_##opt(const uint8_t *src, \ int src_stride, \ int x_offset, \ @@ -365,23 +365,23 @@ unsigned int vpx_sub_pixel_variance##w##x##h##_##opt(const uint8_t *src, \ } \ } \ *sse_ptr = sse; \ - return sse - ((cast se * se) >> (wlog2 + hlog2)); \ + return sse - (cast_prod (cast se * se) >> (wlog2 + hlog2)); \ } #define FNS(opt1, opt2) \ -FN(64, 64, 16, 6, 6, opt1, (int64_t)); \ -FN(64, 32, 16, 6, 5, opt1, (int64_t)); \ -FN(32, 64, 16, 5, 6, opt1, (int64_t)); \ -FN(32, 32, 16, 5, 5, opt1, (int64_t)); \ -FN(32, 16, 16, 5, 4, opt1, (int64_t)); \ -FN(16, 32, 16, 4, 5, opt1, (int64_t)); \ -FN(16, 16, 16, 4, 4, opt1, (uint32_t)); \ -FN(16, 8, 16, 4, 3, opt1, (uint32_t)); \ -FN(8, 16, 8, 3, 4, opt1, (uint32_t)); \ -FN(8, 8, 8, 3, 3, opt1, (uint32_t)); \ -FN(8, 4, 8, 3, 2, opt1, (uint32_t)); \ -FN(4, 8, 4, 2, 3, opt2, (uint32_t)); \ -FN(4, 4, 4, 2, 2, opt2, (uint32_t)) +FN(64, 64, 16, 6, 6, opt1, (int64_t), (int64_t)); \ +FN(64, 32, 16, 6, 5, opt1, (int64_t), (int64_t)); \ +FN(32, 64, 16, 5, 6, opt1, (int64_t), (int64_t)); \ +FN(32, 32, 16, 5, 5, opt1, (int64_t), (int64_t)); \ +FN(32, 16, 16, 5, 4, opt1, (int64_t), (int64_t)); \ +FN(16, 32, 16, 4, 5, opt1, (int64_t), (int64_t)); \ +FN(16, 16, 16, 4, 4, opt1, (uint32_t), (int64_t)); \ +FN(16, 8, 16, 4, 3, opt1, (int32_t), (int32_t)); \ +FN(8, 16, 8, 3, 4, opt1, (int32_t), (int32_t)); \ +FN(8, 8, 8, 3, 3, opt1, (int32_t), (int32_t)); \ +FN(8, 4, 8, 3, 2, opt1, (int32_t), (int32_t)); \ +FN(4, 8, 4, 2, 3, opt2, (int32_t), (int32_t)); \ +FN(4, 4, 4, 2, 2, opt2, (int32_t), (int32_t)) FNS(sse2, sse); FNS(ssse3, ssse3); @@ -410,7 +410,7 @@ DECLS(ssse3, ssse3); #undef DECL #undef DECLS -#define FN(w, h, wf, wlog2, hlog2, opt, cast) \ +#define FN(w, h, wf, wlog2, hlog2, opt, cast_prod, cast) \ unsigned int vpx_sub_pixel_avg_variance##w##x##h##_##opt(const uint8_t *src, \ int src_stride, \ int x_offset, \ @@ -451,23 +451,23 @@ unsigned int vpx_sub_pixel_avg_variance##w##x##h##_##opt(const uint8_t *src, \ } \ } \ *sseptr = sse; \ - return sse - ((cast se * se) >> (wlog2 + hlog2)); \ + return sse - (cast_prod (cast se * se) >> (wlog2 + hlog2)); \ } #define FNS(opt1, opt2) \ -FN(64, 64, 16, 6, 6, opt1, (int64_t)); \ -FN(64, 32, 16, 6, 5, opt1, (int64_t)); \ -FN(32, 64, 16, 5, 6, opt1, (int64_t)); \ -FN(32, 32, 16, 5, 5, opt1, (int64_t)); \ -FN(32, 16, 16, 5, 4, opt1, (int64_t)); \ -FN(16, 32, 16, 4, 5, opt1, (int64_t)); \ -FN(16, 16, 16, 4, 4, opt1, (uint32_t)); \ -FN(16, 8, 16, 4, 3, opt1, (uint32_t)); \ -FN(8, 16, 8, 3, 4, opt1, (uint32_t)); \ -FN(8, 8, 8, 3, 3, opt1, (uint32_t)); \ -FN(8, 4, 8, 3, 2, opt1, (uint32_t)); \ -FN(4, 8, 4, 2, 3, opt2, (uint32_t)); \ -FN(4, 4, 4, 2, 2, opt2, (uint32_t)) +FN(64, 64, 16, 6, 6, opt1, (int64_t), (int64_t)); \ +FN(64, 32, 16, 6, 5, opt1, (int64_t), (int64_t)); \ +FN(32, 64, 16, 5, 6, opt1, (int64_t), (int64_t)); \ +FN(32, 32, 16, 5, 5, opt1, (int64_t), (int64_t)); \ +FN(32, 16, 16, 5, 4, opt1, (int64_t), (int64_t)); \ +FN(16, 32, 16, 4, 5, opt1, (int64_t), (int64_t)); \ +FN(16, 16, 16, 4, 4, opt1, (uint32_t), (int64_t)); \ +FN(16, 8, 16, 4, 3, opt1, (uint32_t), (int32_t)); \ +FN(8, 16, 8, 3, 4, opt1, (uint32_t), (int32_t)); \ +FN(8, 8, 8, 3, 3, opt1, (uint32_t), (int32_t)); \ +FN(8, 4, 8, 3, 2, opt1, (uint32_t), (int32_t)); \ +FN(4, 8, 4, 2, 3, opt2, (uint32_t), (int32_t)); \ +FN(4, 4, 4, 2, 2, opt2, (uint32_t), (int32_t)) FNS(sse2, sse); FNS(ssse3, ssse3); diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_ports/mem_ops.h b/chromium/third_party/libvpx/source/libvpx/vpx_ports/mem_ops.h index d4a3d773f3c..1f8f914f159 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_ports/mem_ops.h +++ b/chromium/third_party/libvpx/source/libvpx/vpx_ports/mem_ops.h @@ -168,8 +168,8 @@ mem_get_s_generic(le, 32) static VPX_INLINE void mem_put_be16(void *vmem, MEM_VALUE_T val) { MAU_T *mem = (MAU_T *)vmem; - mem[0] = (val >> 8) & 0xff; - mem[1] = (val >> 0) & 0xff; + mem[0] = (MAU_T)((val >> 8) & 0xff); + mem[1] = (MAU_T)((val >> 0) & 0xff); } #undef mem_put_be24 @@ -177,9 +177,9 @@ static VPX_INLINE void mem_put_be16(void *vmem, MEM_VALUE_T val) { static VPX_INLINE void mem_put_be24(void *vmem, MEM_VALUE_T val) { MAU_T *mem = (MAU_T *)vmem; - mem[0] = (val >> 16) & 0xff; - mem[1] = (val >> 8) & 0xff; - mem[2] = (val >> 0) & 0xff; + mem[0] = (MAU_T)((val >> 16) & 0xff); + mem[1] = (MAU_T)((val >> 8) & 0xff); + mem[2] = (MAU_T)((val >> 0) & 0xff); } #undef mem_put_be32 @@ -187,10 +187,10 @@ static VPX_INLINE void mem_put_be24(void *vmem, MEM_VALUE_T val) { static VPX_INLINE void mem_put_be32(void *vmem, MEM_VALUE_T val) { MAU_T *mem = (MAU_T *)vmem; - mem[0] = (val >> 24) & 0xff; - mem[1] = (val >> 16) & 0xff; - mem[2] = (val >> 8) & 0xff; - mem[3] = (val >> 0) & 0xff; + mem[0] = (MAU_T)((val >> 24) & 0xff); + mem[1] = (MAU_T)((val >> 16) & 0xff); + mem[2] = (MAU_T)((val >> 8) & 0xff); + mem[3] = (MAU_T)((val >> 0) & 0xff); } #undef mem_put_le16 @@ -198,8 +198,8 @@ static VPX_INLINE void mem_put_be32(void *vmem, MEM_VALUE_T val) { static VPX_INLINE void mem_put_le16(void *vmem, MEM_VALUE_T val) { MAU_T *mem = (MAU_T *)vmem; - mem[0] = (val >> 0) & 0xff; - mem[1] = (val >> 8) & 0xff; + mem[0] = (MAU_T)((val >> 0) & 0xff); + mem[1] = (MAU_T)((val >> 8) & 0xff); } #undef mem_put_le24 @@ -207,9 +207,9 @@ static VPX_INLINE void mem_put_le16(void *vmem, MEM_VALUE_T val) { static VPX_INLINE void mem_put_le24(void *vmem, MEM_VALUE_T val) { MAU_T *mem = (MAU_T *)vmem; - mem[0] = (val >> 0) & 0xff; - mem[1] = (val >> 8) & 0xff; - mem[2] = (val >> 16) & 0xff; + mem[0] = (MAU_T)((val >> 0) & 0xff); + mem[1] = (MAU_T)((val >> 8) & 0xff); + mem[2] = (MAU_T)((val >> 16) & 0xff); } #undef mem_put_le32 @@ -217,10 +217,10 @@ static VPX_INLINE void mem_put_le24(void *vmem, MEM_VALUE_T val) { static VPX_INLINE void mem_put_le32(void *vmem, MEM_VALUE_T val) { MAU_T *mem = (MAU_T *)vmem; - mem[0] = (val >> 0) & 0xff; - mem[1] = (val >> 8) & 0xff; - mem[2] = (val >> 16) & 0xff; - mem[3] = (val >> 24) & 0xff; + mem[0] = (MAU_T)((val >> 0) & 0xff); + mem[1] = (MAU_T)((val >> 8) & 0xff); + mem[2] = (MAU_T)((val >> 16) & 0xff); + mem[3] = (MAU_T)((val >> 24) & 0xff); } #endif // VPX_PORTS_MEM_OPS_H_ diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_ports/mem_ops_aligned.h b/chromium/third_party/libvpx/source/libvpx/vpx_ports/mem_ops_aligned.h index c16111fec5d..46f61738ba4 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_ports/mem_ops_aligned.h +++ b/chromium/third_party/libvpx/source/libvpx/vpx_ports/mem_ops_aligned.h @@ -28,8 +28,8 @@ * could redefine these macros. */ #define swap_endian_16(val,raw) do {\ - val = ((raw>>8) & 0x00ff) \ - | ((raw<<8) & 0xff00);\ + val = (uint16_t)(((raw>>8) & 0x00ff) \ + | ((raw<<8) & 0xff00));\ } while(0) #define swap_endian_32(val,raw) do {\ val = ((raw>>24) & 0x000000ff) \ diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_ports/x86.h b/chromium/third_party/libvpx/source/libvpx/vpx_ports/x86.h index 5da346e58fc..052f6188e4e 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_ports/x86.h +++ b/chromium/third_party/libvpx/source/libvpx/vpx_ports/x86.h @@ -172,7 +172,7 @@ x86_simd_caps(void) { env = getenv("VPX_SIMD_CAPS_MASK"); if (env && *env) - mask = strtol(env, NULL, 0); + mask = (unsigned int)strtoul(env, NULL, 0); /* Ensure that the CPUID instruction supports extended features */ cpuid(0, 0, max_cpuid_val, reg_ebx, reg_ecx, reg_edx); @@ -216,6 +216,11 @@ x86_simd_caps(void) { unsigned __int64 __rdtsc(void); #pragma intrinsic(__rdtsc) #endif +// Note: +// 32-bit CPU cycle counter is light-weighted for most function performance +// measurement. For large function (CPU time > a couple of seconds), 64-bit +// counter should be used. +// 32-bit CPU cycle counter static INLINE unsigned int x86_readtsc(void) { #if defined(__GNUC__) && __GNUC__ @@ -234,7 +239,25 @@ x86_readtsc(void) { #endif #endif } - +// 64-bit CPU cycle counter +static INLINE uint64_t +x86_readtsc64(void) { +#if defined(__GNUC__) && __GNUC__ + uint32_t hi, lo; + __asm__ __volatile__("rdtsc" : "=a"(lo), "=d"(hi)); + return ((uint64_t)hi << 32) | lo; +#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC) + uint_t hi, lo; + asm volatile("rdtsc\n\t" : "=a"(lo), "=d"(hi)); + return ((uint64_t)hi << 32) | lo; +#else +#if ARCH_X86_64 + return (uint64_t)__rdtsc(); +#else + __asm rdtsc; +#endif +#endif +} #if defined(__GNUC__) && __GNUC__ #define x86_pause_hint()\ diff --git a/chromium/third_party/libvpx/source/libvpx/vpx_scale/generic/yv12extend.c b/chromium/third_party/libvpx/source/libvpx/vpx_scale/generic/yv12extend.c index 670144bc10f..3eba563e9c2 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpx_scale/generic/yv12extend.c +++ b/chromium/third_party/libvpx/source/libvpx/vpx_scale/generic/yv12extend.c @@ -211,7 +211,7 @@ void vpx_extend_frame_inner_borders_c(YV12_BUFFER_CONFIG *ybf) { } #if CONFIG_VP9_HIGHBITDEPTH -void memcpy_short_addr(uint8_t *dst8, const uint8_t *src8, int num) { +static void memcpy_short_addr(uint8_t *dst8, const uint8_t *src8, int num) { uint16_t *dst = CONVERT_TO_SHORTPTR(dst8); uint16_t *src = CONVERT_TO_SHORTPTR(src8); memcpy(dst, src, num * sizeof(uint16_t)); diff --git a/chromium/third_party/libvpx/source/libvpx/vpxdec.c b/chromium/third_party/libvpx/source/libvpx/vpxdec.c index 285d58e1e76..1bef4bd4aae 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpxdec.c +++ b/chromium/third_party/libvpx/source/libvpx/vpxdec.c @@ -257,8 +257,7 @@ static int read_frame(struct VpxDecInputContext *input, uint8_t **buf, switch (input->vpx_input_ctx->file_type) { #if CONFIG_WEBM_IO case FILE_TYPE_WEBM: - return webm_read_frame(input->webm_ctx, - buf, bytes_in_buffer, buffer_size); + return webm_read_frame(input->webm_ctx, buf, bytes_in_buffer); #endif case FILE_TYPE_RAW: return raw_read_frame(input->vpx_input_ctx->file, diff --git a/chromium/third_party/libvpx/source/libvpx/vpxenc.c b/chromium/third_party/libvpx/source/libvpx/vpxenc.c index 50e7c7fc794..a6cbbc706a7 100644 --- a/chromium/third_party/libvpx/source/libvpx/vpxenc.c +++ b/chromium/third_party/libvpx/source/libvpx/vpxenc.c @@ -790,7 +790,7 @@ static int compare_img(const vpx_image_t *const img1, #if !CONFIG_WEBM_IO typedef int stereo_format_t; -struct EbmlGlobal { int debug; }; +struct WebmOutputContext { int debug; }; #endif /* Per-stream configuration */ @@ -818,7 +818,7 @@ struct stream_state { struct stream_config config; FILE *file; struct rate_hist *rate_hist; - struct EbmlGlobal ebml; + struct WebmOutputContext webm_ctx; uint64_t psnr_sse_total; uint64_t psnr_samples_total; double psnr_totals[4]; @@ -1061,13 +1061,13 @@ static struct stream_state *new_stream(struct VpxEncoderConfig *global, stream->config.write_webm = 1; #if CONFIG_WEBM_IO stream->config.stereo_fmt = STEREO_FORMAT_MONO; - stream->ebml.last_pts_ns = -1; - stream->ebml.writer = NULL; - stream->ebml.segment = NULL; + stream->webm_ctx.last_pts_ns = -1; + stream->webm_ctx.writer = NULL; + stream->webm_ctx.segment = NULL; #endif /* Allows removal of the application version from the EBML tags */ - stream->ebml.debug = global->debug; + stream->webm_ctx.debug = global->debug; /* Default lag_in_frames is 0 in realtime mode */ if (global->deadline == VPX_DL_REALTIME) @@ -1449,8 +1449,8 @@ static void open_output_file(struct stream_state *stream, #if CONFIG_WEBM_IO if (stream->config.write_webm) { - stream->ebml.stream = stream->file; - write_webm_file_header(&stream->ebml, cfg, + stream->webm_ctx.stream = stream->file; + write_webm_file_header(&stream->webm_ctx, cfg, &global->framerate, stream->config.stereo_fmt, global->codec->fourcc, @@ -1475,7 +1475,7 @@ static void close_output_file(struct stream_state *stream, #if CONFIG_WEBM_IO if (stream->config.write_webm) { - write_webm_file_footer(&stream->ebml); + write_webm_file_footer(&stream->webm_ctx); } #endif @@ -1702,7 +1702,7 @@ static void get_cx_data(struct stream_state *stream, update_rate_histogram(stream->rate_hist, cfg, pkt); #if CONFIG_WEBM_IO if (stream->config.write_webm) { - write_webm_block(&stream->ebml, cfg, pkt); + write_webm_block(&stream->webm_ctx, cfg, pkt); } #endif if (!stream->config.write_webm) { diff --git a/chromium/third_party/libvpx/source/libvpx/webmdec.cc b/chromium/third_party/libvpx/source/libvpx/webmdec.cc index f541cfecc16..93835e1de60 100644 --- a/chromium/third_party/libvpx/source/libvpx/webmdec.cc +++ b/chromium/third_party/libvpx/source/libvpx/webmdec.cc @@ -13,8 +13,8 @@ #include <cstring> #include <cstdio> -#include "third_party/libwebm/mkvparser.hpp" -#include "third_party/libwebm/mkvreader.hpp" +#include "third_party/libwebm/mkvparser/mkvparser.h" +#include "third_party/libwebm/mkvparser/mkvreader.h" namespace { @@ -122,7 +122,6 @@ int file_is_webm(struct WebmInputContext *webm_ctx, int webm_read_frame(struct WebmInputContext *webm_ctx, uint8_t **buffer, - size_t *bytes_in_buffer, size_t *buffer_size) { // This check is needed for frame parallel decoding, in which case this // function could be called even after it has reached end of input stream. @@ -147,7 +146,7 @@ int webm_read_frame(struct WebmInputContext *webm_ctx, } else if (block_entry_eos || block_entry->EOS()) { cluster = segment->GetNext(cluster); if (cluster == NULL || cluster->EOS()) { - *bytes_in_buffer = 0; + *buffer_size = 0; webm_ctx->reached_eos = 1; return 1; } @@ -164,7 +163,7 @@ int webm_read_frame(struct WebmInputContext *webm_ctx, } get_new_block = true; } - if (status) { + if (status || block_entry == NULL) { return -1; } if (get_new_block) { @@ -187,10 +186,9 @@ int webm_read_frame(struct WebmInputContext *webm_ctx, if (*buffer == NULL) { return -1; } - *buffer_size = frame.len; webm_ctx->buffer = *buffer; } - *bytes_in_buffer = frame.len; + *buffer_size = frame.len; webm_ctx->timestamp_ns = block->GetTime(cluster); webm_ctx->is_key_frame = block->IsKey(); @@ -203,10 +201,9 @@ int webm_guess_framerate(struct WebmInputContext *webm_ctx, struct VpxInputContext *vpx_ctx) { uint32_t i = 0; uint8_t *buffer = NULL; - size_t bytes_in_buffer = 0; size_t buffer_size = 0; while (webm_ctx->timestamp_ns < 1000000000 && i < 50) { - if (webm_read_frame(webm_ctx, &buffer, &bytes_in_buffer, &buffer_size)) { + if (webm_read_frame(webm_ctx, &buffer, &buffer_size)) { break; } ++i; diff --git a/chromium/third_party/libvpx/source/libvpx/webmdec.h b/chromium/third_party/libvpx/source/libvpx/webmdec.h index 7d163803552..aa371f32122 100644 --- a/chromium/third_party/libvpx/source/libvpx/webmdec.h +++ b/chromium/third_party/libvpx/source/libvpx/webmdec.h @@ -42,22 +42,18 @@ int file_is_webm(struct WebmInputContext *webm_ctx, // Reads a WebM Video Frame. Memory for the buffer is created, owned and managed // by this function. For the first call, |buffer| should be NULL and -// |*bytes_in_buffer| should be 0. Once all the frames are read and used, +// |*buffer_size| should be 0. Once all the frames are read and used, // webm_free() should be called, otherwise there will be a leak. // Parameters: // webm_ctx - WebmInputContext object // buffer - pointer where the frame data will be filled. -// bytes_in_buffer - pointer to buffer size. -// buffer_size - unused TODO(vigneshv): remove this +// buffer_size - pointer to buffer size. // Return values: // 0 - Success // 1 - End of Stream // -1 - Error -// TODO(vigneshv): Make the return values consistent across all functions in -// this file. int webm_read_frame(struct WebmInputContext *webm_ctx, uint8_t **buffer, - size_t *bytes_in_buffer, size_t *buffer_size); // Guesses the frame rate of the input file based on the container timestamps. diff --git a/chromium/third_party/libvpx/source/libvpx/webmenc.cc b/chromium/third_party/libvpx/source/libvpx/webmenc.cc index d41e700443c..b1d32595c2d 100644 --- a/chromium/third_party/libvpx/source/libvpx/webmenc.cc +++ b/chromium/third_party/libvpx/source/libvpx/webmenc.cc @@ -11,22 +11,22 @@ #include <string> -#include "third_party/libwebm/mkvmuxer.hpp" -#include "third_party/libwebm/mkvmuxerutil.hpp" -#include "third_party/libwebm/mkvwriter.hpp" +#include "third_party/libwebm/mkvmuxer/mkvmuxer.h" +#include "third_party/libwebm/mkvmuxer/mkvmuxerutil.h" +#include "third_party/libwebm/mkvmuxer/mkvwriter.h" namespace { const uint64_t kDebugTrackUid = 0xDEADBEEF; const int kVideoTrackNumber = 1; } // namespace -void write_webm_file_header(struct EbmlGlobal *glob, +void write_webm_file_header(struct WebmOutputContext *webm_ctx, const vpx_codec_enc_cfg_t *cfg, const struct vpx_rational *fps, stereo_format_t stereo_fmt, unsigned int fourcc, const struct VpxRational *par) { - mkvmuxer::MkvWriter *const writer = new mkvmuxer::MkvWriter(glob->stream); + mkvmuxer::MkvWriter *const writer = new mkvmuxer::MkvWriter(webm_ctx->stream); mkvmuxer::Segment *const segment = new mkvmuxer::Segment(); segment->Init(writer); segment->set_mode(mkvmuxer::Segment::kFile); @@ -36,7 +36,7 @@ void write_webm_file_header(struct EbmlGlobal *glob, const uint64_t kTimecodeScale = 1000000; info->set_timecode_scale(kTimecodeScale); std::string version = "vpxenc"; - if (!glob->debug) { + if (!webm_ctx->debug) { version.append(std::string(" ") + vpx_codec_version_str()); } info->set_writing_app(version.c_str()); @@ -74,23 +74,23 @@ void write_webm_file_header(struct EbmlGlobal *glob, video_track->set_display_width(display_width); video_track->set_display_height(cfg->g_h); } - if (glob->debug) { + if (webm_ctx->debug) { video_track->set_uid(kDebugTrackUid); } - glob->writer = writer; - glob->segment = segment; + webm_ctx->writer = writer; + webm_ctx->segment = segment; } -void write_webm_block(struct EbmlGlobal *glob, +void write_webm_block(struct WebmOutputContext *webm_ctx, const vpx_codec_enc_cfg_t *cfg, const vpx_codec_cx_pkt_t *pkt) { mkvmuxer::Segment *const segment = - reinterpret_cast<mkvmuxer::Segment*>(glob->segment); + reinterpret_cast<mkvmuxer::Segment*>(webm_ctx->segment); int64_t pts_ns = pkt->data.frame.pts * 1000000000ll * cfg->g_timebase.num / cfg->g_timebase.den; - if (pts_ns <= glob->last_pts_ns) - pts_ns = glob->last_pts_ns + 1000000; - glob->last_pts_ns = pts_ns; + if (pts_ns <= webm_ctx->last_pts_ns) + pts_ns = webm_ctx->last_pts_ns + 1000000; + webm_ctx->last_pts_ns = pts_ns; segment->AddFrame(static_cast<uint8_t*>(pkt->data.frame.buf), pkt->data.frame.sz, @@ -99,14 +99,14 @@ void write_webm_block(struct EbmlGlobal *glob, pkt->data.frame.flags & VPX_FRAME_IS_KEY); } -void write_webm_file_footer(struct EbmlGlobal *glob) { +void write_webm_file_footer(struct WebmOutputContext *webm_ctx) { mkvmuxer::MkvWriter *const writer = - reinterpret_cast<mkvmuxer::MkvWriter*>(glob->writer); + reinterpret_cast<mkvmuxer::MkvWriter*>(webm_ctx->writer); mkvmuxer::Segment *const segment = - reinterpret_cast<mkvmuxer::Segment*>(glob->segment); + reinterpret_cast<mkvmuxer::Segment*>(webm_ctx->segment); segment->Finalize(); delete segment; delete writer; - glob->writer = NULL; - glob->segment = NULL; + webm_ctx->writer = NULL; + webm_ctx->segment = NULL; } diff --git a/chromium/third_party/libvpx/source/libvpx/webmenc.h b/chromium/third_party/libvpx/source/libvpx/webmenc.h index c255d3de669..ad30664e31a 100644 --- a/chromium/third_party/libvpx/source/libvpx/webmenc.h +++ b/chromium/third_party/libvpx/source/libvpx/webmenc.h @@ -20,8 +20,7 @@ extern "C" { #endif -/* TODO(vigneshv): Rename this struct */ -struct EbmlGlobal { +struct WebmOutputContext { int debug; FILE *stream; int64_t last_pts_ns; @@ -38,18 +37,18 @@ typedef enum stereo_format { STEREO_FORMAT_RIGHT_LEFT = 11 } stereo_format_t; -void write_webm_file_header(struct EbmlGlobal *glob, +void write_webm_file_header(struct WebmOutputContext *webm_ctx, const vpx_codec_enc_cfg_t *cfg, const struct vpx_rational *fps, stereo_format_t stereo_fmt, unsigned int fourcc, const struct VpxRational *par); -void write_webm_block(struct EbmlGlobal *glob, +void write_webm_block(struct WebmOutputContext *webm_ctx, const vpx_codec_enc_cfg_t *cfg, const vpx_codec_cx_pkt_t *pkt); -void write_webm_file_footer(struct EbmlGlobal *glob); +void write_webm_file_footer(struct WebmOutputContext *webm_ctx); #ifdef __cplusplus } // extern "C" |