diff --git a/media/libdav1d/moz.yaml b/media/libdav1d/moz.yaml --- a/media/libdav1d/moz.yaml +++ b/media/libdav1d/moz.yaml @@ -18,15 +18,15 @@ # Usually different from repository url url: https://code.videolan.org/videolan/dav1d # Human-readable identifier for this version/release # Generally "version NNN", "tag SSS", "bookmark SSS" - release: caef968117eb2d6d7224e8d29ec67ff79b0025f8 (2025-02-28T09:28:46.000-05:00). + release: 43f3b8d33bae5179a134d1cd7c394063b1cebfcb (2025-12-09T22:02:52.000+01:00). # Revision to pull in # Must be a long or short commit SHA (long preferred) - revision: caef968117eb2d6d7224e8d29ec67ff79b0025f8 + revision: 43f3b8d33bae5179a134d1cd7c394063b1cebfcb # The package's license, where possible using the mnemonic from # https://spdx.org/licenses/ # Multiple licenses can be specified (as a YAML list) # A "LICENSE" file must exist containing the full license text diff --git a/media/libdav1d/vcs_version.h b/media/libdav1d/vcs_version.h --- a/media/libdav1d/vcs_version.h +++ b/media/libdav1d/vcs_version.h @@ -1,2 +1,2 @@ /* auto-generated, do not edit */ -#define DAV1D_VERSION "caef968117eb2d6d7224e8d29ec67ff79b0025f8" +#define DAV1D_VERSION "43f3b8d33bae5179a134d1cd7c394063b1cebfcb" diff --git a/third_party/dav1d/COPYING b/third_party/dav1d/COPYING --- a/third_party/dav1d/COPYING +++ b/third_party/dav1d/COPYING @@ -1,6 +1,6 @@ -Copyright © 2018-2019, VideoLAN and dav1d authors +Copyright © 2018-2025, VideoLAN and dav1d authors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: diff --git a/third_party/dav1d/NEWS b/third_party/dav1d/NEWS --- a/third_party/dav1d/NEWS +++ b/third_party/dav1d/NEWS @@ -1,5 +1,17 @@ +Changes for 1.5.2 'Sonic': +-------------------------- + +1.5.2 is a minor release of dav1d, focused on maintenance: + - minor speed improvement in recon + - improvements on loongarch symboles visibility and asm + - mark C globals with small code model + - reduce the code size of the frame header parsing (OBU) + - minor fixes on tools and CI + - fix compilation with nasm 3.00 + + Changes for 1.5.1 'Sonic': -------------------------- 1.5.1 is a minor release of dav1d, focusing on optimizations and stack reduction: diff --git a/third_party/dav1d/README.md b/third_party/dav1d/README.md --- a/third_party/dav1d/README.md +++ b/third_party/dav1d/README.md @@ -77,43 +77,46 @@ ## CoC The [VideoLAN Code of Conduct](https://wiki.videolan.org/CoC) applies to this project. # Compile +## General compilation steps 1. Install [Meson](https://mesonbuild.com/) (0.49 or higher), [Ninja](https://ninja-build.org/), and, for x86\* targets, [nasm](https://nasm.us/) (2.14 or higher) 2. Run `mkdir build && cd build` to create a build directory and enter it 3. Run `meson setup ..` to configure meson, add `--default-library=static` if static linking is desired 4. Run `ninja` to compile +Following are modification of step 3 and 4, for specific purpose. + ## Cross-Compilation for 32- or 64-bit Windows, 32-bit Linux -If you're on a linux build machine trying to compile .exe for a Windows target/host machine, run +If you're on a linux build machine trying to compile .exe for a Windows target/host machine, configure meson like this ``` -meson setup build --cross-file=package/crossfiles/x86_64-w64-mingw32.meson +meson setup .. --cross-file=../package/crossfiles/x86_64-w64-mingw32.meson ``` or, for 32-bit: ``` -meson setup build --cross-file=package/crossfiles/i686-w64-mingw32.meson +meson setup .. --cross-file=../package/crossfiles/i686-w64-mingw32.meson ``` `mingw-w64` is a pre-requisite and should be installed on your linux machine via your preferred method or package manager. Note the binary name formats may differ between distributions. Verify the names, and use `alias` if certain binaries cannot be found. For 32-bit linux, run ``` -meson setup build --cross-file=package/crossfiles/i686-linux32.meson +meson setup .. --cross-file=../package/crossfiles/i686-linux32.meson ``` ## Build documentation -1. Install [doxygen](https://www.doxygen.nl/) and [graphviz](https://www.graphviz.org/) -2. Run `meson setup build -Denable_docs=true` to create the build directory -3. Run `ninja -C build doc/html` to build the docs +1. Make sure [doxygen](https://www.doxygen.nl/) and [graphviz](https://www.graphviz.org/) are installed. +2. Run `meson setup .. -Denable_docs=true` to configure meson to generate docs from the build directory. +3. Run `ninja doc/html` to build the docs The result can be found in `build/doc/html/`. An online version built from master can be found [here](https://videolan.videolan.me/dav1d/). # Run tests diff --git a/third_party/dav1d/meson.build b/third_party/dav1d/meson.build --- a/third_party/dav1d/meson.build +++ b/third_party/dav1d/meson.build @@ -21,11 +21,11 @@ # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. project('dav1d', ['c'], - version: '1.5.1', + version: '1.5.2', default_options: ['c_std=c99', 'warning_level=2', 'buildtype=release', 'b_ndebug=if-release'], meson_version: '>= 0.49.0') diff --git a/third_party/dav1d/src/arm/64/refmvs.S b/third_party/dav1d/src/arm/64/refmvs.S --- a/third_party/dav1d/src/arm/64/refmvs.S +++ b/third_party/dav1d/src/arm/64/refmvs.S @@ -384,24 +384,24 @@ mov w10, #0 // n = 0 movi v3.2s, #255 // 0x3FFF >> 6, for MV clamp movrel x1, div_mult_tbl 10: // nloop - ldr w16, [x29, x10, lsl #2] // ref2cur = rf->mfmv_ref2cur[n] - cmp w16, #-32 // instead of INT_MIN, we can use smaller constants - b.lt 9f // if (ref2cur == INT_MIN) continue + ldrsb w16, [x29, x10] // ref2cur = rf->mfmv_ref2cur[n] + cmp w16, #-32 + b.eq 9f // if (ref2cur == INVALID_REF2CUR) continue add x17, x10, #(RMVSF_MFMV_REF - RMVSF_MFMV_REF2CUR) // n - (&rf->mfmv_ref - &rf->mfmv_ref2cur) mov x20, #4 ldrb w17, [x29, x17] // ref = rf->mfmv_ref[n] ldr x13, [x29, #(RMVSF_RP_REF - RMVSF_MFMV_REF2CUR)] - mov w28, #28 // 7 * sizeof(int) + sub x21, x10, x10, lsl #3 // -(n * 7) smaddl x20, row_start8, wstride5, x20 // row_start8 * stride * sizeof(refmvs_temporal_block) + 4 mov w12, row_start8 // y = row_start8 - add x21, x29, #(RMVSF_MFMV_REF2REF - RMVSF_MFMV_REF2CUR - 4) // &rf->mfmv_ref2ref - 1 + add x28, x29, #(RMVSF_MFMV_REF2REF - RMVSF_MFMV_REF2CUR - 1) // &rf->mfmv_ref2ref - 1 ldr x13, [x13, x17, lsl #3] // rf->rp_ref[ref] - smaddl x28, w28, w10, x21 // rf->mfmv_ref2ref[n] - 1 + sub x28, x28, x21 // rf->mfmv_ref2ref[n] - 1 sub w17, w17, #4 // ref_sign = ref - 4 add x13, x13, x20 // r = &rf->rp_ref[ref][row_start8 * stride].ref dup v0.2s, w17 // ref_sign 5: // yloop @@ -416,11 +416,11 @@ 4: // xloop add x23, x13, x11, lsl #2 // partial &r[x] address ldrb w22, [x23, x11] // b_ref = rb->ref cbz w22, 6f // if (!b_ref) continue - ldr w24, [x28, x22, lsl #2] // ref2ref = rf->mfmv_ref2ref[n][b_ref - 1] + ldrb w24, [x28, x22] // ref2ref = rf->mfmv_ref2ref[n][b_ref - 1] cbz w24, 6f // if (!ref2ref) continue ldrh w20, [x1, x24, lsl #1] // div_mult[ref2ref] add x23, x23, x11 // &r[x] mul w20, w20, w16 // frac = ref2cur * div_mult[ref2ref] diff --git a/third_party/dav1d/src/arm/asm-offsets.h b/third_party/dav1d/src/arm/asm-offsets.h --- a/third_party/dav1d/src/arm/asm-offsets.h +++ b/third_party/dav1d/src/arm/asm-offsets.h @@ -45,14 +45,14 @@ #if ARCH_AARCH64 #define RMVSF_IW8 16 #define RMVSF_IH8 20 #define RMVSF_MFMV_REF 53 #define RMVSF_MFMV_REF2CUR 56 -#define RMVSF_MFMV_REF2REF 68 -#define RMVSF_N_MFMVS 152 -#define RMVSF_RP_REF 168 -#define RMVSF_RP_PROJ 176 -#define RMVSF_RP_STRIDE 184 -#define RMVSF_N_TILE_THREADS 200 +#define RMVSF_MFMV_REF2REF 59 +#define RMVSF_N_MFMVS 80 +#define RMVSF_RP_REF 96 +#define RMVSF_RP_PROJ 104 +#define RMVSF_RP_STRIDE 112 +#define RMVSF_N_TILE_THREADS 128 #endif #endif /* ARM_ASM_OFFSETS_H */ diff --git a/third_party/dav1d/src/cdf.h b/third_party/dav1d/src/cdf.h --- a/third_party/dav1d/src/cdf.h +++ b/third_party/dav1d/src/cdf.h @@ -103,11 +103,11 @@ ALIGN(uint16_t eob_bin_512[2][10 + 6], 32); ALIGN(uint16_t eob_bin_1024[2][11 + 5], 32); ALIGN(uint16_t eob_base_tok[N_TX_SIZES][2][4][4], 8); ALIGN(uint16_t base_tok[N_TX_SIZES][2][41][4], 8); ALIGN(uint16_t br_tok[4 /*5*/][2][21][4], 8); - ALIGN(uint16_t eob_hi_bit[N_TX_SIZES][2][11 /*22*/][2], 4); + ALIGN(uint16_t eob_hi_bit[N_TX_SIZES][2][9][2], 4); ALIGN(uint16_t skip[N_TX_SIZES][13][2], 4); ALIGN(uint16_t dc_sign[2][3][2], 4); } CdfCoefContext; typedef struct CdfMvComponent { diff --git a/third_party/dav1d/src/cdf.c b/third_party/dav1d/src/cdf.c --- a/third_party/dav1d/src/cdf.c +++ b/third_party/dav1d/src/cdf.c @@ -785,67 +785,57 @@ { CDF10( 1865, 1988, 2930, 4242, 10533, 16538, 21354, 27255, 28546, 31784) }, }, .eob_hi_bit = { { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(16961) }, - { CDF1(17223) }, { CDF1( 7621) }, { CDF1(16384) }, + { CDF1(16961) }, { CDF1(17223) }, { CDF1( 7621) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(19069) }, - { CDF1(22525) }, { CDF1(13377) }, { CDF1(16384) }, + { CDF1(19069) }, { CDF1(22525) }, { CDF1(13377) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(20401) }, - { CDF1(17025) }, { CDF1(12845) }, { CDF1(12873) }, - { CDF1(14094) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(20401) }, { CDF1(17025) }, { CDF1(12845) }, + { CDF1(12873) }, { CDF1(14094) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(20681) }, - { CDF1(20701) }, { CDF1(15250) }, { CDF1(15017) }, - { CDF1(14928) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(20681) }, { CDF1(20701) }, { CDF1(15250) }, + { CDF1(15017) }, { CDF1(14928) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(23905) }, - { CDF1(17194) }, { CDF1(16170) }, { CDF1(17695) }, - { CDF1(13826) }, { CDF1(15810) }, { CDF1(12036) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(23905) }, { CDF1(17194) }, { CDF1(16170) }, + { CDF1(17695) }, { CDF1(13826) }, { CDF1(15810) }, + { CDF1(12036) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(23959) }, - { CDF1(20799) }, { CDF1(19021) }, { CDF1(16203) }, - { CDF1(17886) }, { CDF1(14144) }, { CDF1(12010) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(23959) }, { CDF1(20799) }, { CDF1(19021) }, + { CDF1(16203) }, { CDF1(17886) }, { CDF1(14144) }, + { CDF1(12010) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(27399) }, - { CDF1(16327) }, { CDF1(18071) }, { CDF1(19584) }, - { CDF1(20721) }, { CDF1(18432) }, { CDF1(19560) }, - { CDF1(10150) }, { CDF1( 8805) }, + { CDF1(27399) }, { CDF1(16327) }, { CDF1(18071) }, + { CDF1(19584) }, { CDF1(20721) }, { CDF1(18432) }, + { CDF1(19560) }, { CDF1(10150) }, { CDF1( 8805) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(24932) }, - { CDF1(20833) }, { CDF1(12027) }, { CDF1(16670) }, - { CDF1(19914) }, { CDF1(15106) }, { CDF1(17662) }, - { CDF1(13783) }, { CDF1(28756) }, + { CDF1(24932) }, { CDF1(20833) }, { CDF1(12027) }, + { CDF1(16670) }, { CDF1(19914) }, { CDF1(15106) }, + { CDF1(17662) }, { CDF1(13783) }, { CDF1(28756) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(23406) }, - { CDF1(21845) }, { CDF1(18432) }, { CDF1(16384) }, - { CDF1(17096) }, { CDF1(12561) }, { CDF1(17320) }, - { CDF1(22395) }, { CDF1(21370) }, + { CDF1(23406) }, { CDF1(21845) }, { CDF1(18432) }, + { CDF1(16384) }, { CDF1(17096) }, { CDF1(12561) }, + { CDF1(17320) }, { CDF1(22395) }, { CDF1(21370) }, }, { { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, }, }, }, .eob_base_tok = { { { @@ -1598,67 +1588,57 @@ { CDF10( 2672, 3591, 9330, 17084, 22725, 24284, 26527, 28027, 28377, 30876) }, }, .eob_hi_bit = { { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(17471) }, - { CDF1(20223) }, { CDF1(11357) }, { CDF1(16384) }, + { CDF1(17471) }, { CDF1(20223) }, { CDF1(11357) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(20335) }, - { CDF1(21667) }, { CDF1(14818) }, { CDF1(16384) }, + { CDF1(20335) }, { CDF1(21667) }, { CDF1(14818) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(20430) }, - { CDF1(20662) }, { CDF1(15367) }, { CDF1(16970) }, - { CDF1(14657) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(20430) }, { CDF1(20662) }, { CDF1(15367) }, + { CDF1(16970) }, { CDF1(14657) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(22117) }, - { CDF1(22028) }, { CDF1(18650) }, { CDF1(16042) }, - { CDF1(15885) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(22117) }, { CDF1(22028) }, { CDF1(18650) }, + { CDF1(16042) }, { CDF1(15885) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(22409) }, - { CDF1(21012) }, { CDF1(15650) }, { CDF1(17395) }, - { CDF1(15469) }, { CDF1(20205) }, { CDF1(19511) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(22409) }, { CDF1(21012) }, { CDF1(15650) }, + { CDF1(17395) }, { CDF1(15469) }, { CDF1(20205) }, + { CDF1(19511) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(24220) }, - { CDF1(22480) }, { CDF1(17737) }, { CDF1(18916) }, - { CDF1(19268) }, { CDF1(18412) }, { CDF1(18844) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(24220) }, { CDF1(22480) }, { CDF1(17737) }, + { CDF1(18916) }, { CDF1(19268) }, { CDF1(18412) }, + { CDF1(18844) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(25991) }, - { CDF1(20314) }, { CDF1(17731) }, { CDF1(19678) }, - { CDF1(18649) }, { CDF1(17307) }, { CDF1(21798) }, - { CDF1(17549) }, { CDF1(15630) }, + { CDF1(25991) }, { CDF1(20314) }, { CDF1(17731) }, + { CDF1(19678) }, { CDF1(18649) }, { CDF1(17307) }, + { CDF1(21798) }, { CDF1(17549) }, { CDF1(15630) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(26585) }, - { CDF1(21469) }, { CDF1(20432) }, { CDF1(17735) }, - { CDF1(19280) }, { CDF1(15235) }, { CDF1(20297) }, - { CDF1(22471) }, { CDF1(28997) }, + { CDF1(26585) }, { CDF1(21469) }, { CDF1(20432) }, + { CDF1(17735) }, { CDF1(19280) }, { CDF1(15235) }, + { CDF1(20297) }, { CDF1(22471) }, { CDF1(28997) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(26605) }, - { CDF1(11304) }, { CDF1(16726) }, { CDF1(16560) }, - { CDF1(20866) }, { CDF1(23524) }, { CDF1(19878) }, - { CDF1(13469) }, { CDF1(23084) }, + { CDF1(26605) }, { CDF1(11304) }, { CDF1(16726) }, + { CDF1(16560) }, { CDF1(20866) }, { CDF1(23524) }, + { CDF1(19878) }, { CDF1(13469) }, { CDF1(23084) }, }, { { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, }, }, }, .eob_base_tok = { { { @@ -2411,67 +2391,57 @@ { CDF10( 9577, 12466, 17739, 20750, 22061, 23215, 24601, 25483, 25843, 32056) }, }, .eob_hi_bit = { { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(18983) }, - { CDF1(20512) }, { CDF1(14885) }, { CDF1(16384) }, + { CDF1(18983) }, { CDF1(20512) }, { CDF1(14885) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(20090) }, - { CDF1(19444) }, { CDF1(17286) }, { CDF1(16384) }, + { CDF1(20090) }, { CDF1(19444) }, { CDF1(17286) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(19139) }, - { CDF1(21487) }, { CDF1(18959) }, { CDF1(20910) }, - { CDF1(19089) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(19139) }, { CDF1(21487) }, { CDF1(18959) }, + { CDF1(20910) }, { CDF1(19089) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(20536) }, - { CDF1(20664) }, { CDF1(20625) }, { CDF1(19123) }, - { CDF1(14862) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(20536) }, { CDF1(20664) }, { CDF1(20625) }, + { CDF1(19123) }, { CDF1(14862) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(19833) }, - { CDF1(21502) }, { CDF1(17485) }, { CDF1(20267) }, - { CDF1(18353) }, { CDF1(23329) }, { CDF1(21478) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(19833) }, { CDF1(21502) }, { CDF1(17485) }, + { CDF1(20267) }, { CDF1(18353) }, { CDF1(23329) }, + { CDF1(21478) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(22041) }, - { CDF1(23434) }, { CDF1(20001) }, { CDF1(20554) }, - { CDF1(20951) }, { CDF1(20145) }, { CDF1(15562) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(22041) }, { CDF1(23434) }, { CDF1(20001) }, + { CDF1(20554) }, { CDF1(20951) }, { CDF1(20145) }, + { CDF1(15562) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(23312) }, - { CDF1(21607) }, { CDF1(16526) }, { CDF1(18957) }, - { CDF1(18034) }, { CDF1(18934) }, { CDF1(24247) }, - { CDF1(16921) }, { CDF1(17080) }, + { CDF1(23312) }, { CDF1(21607) }, { CDF1(16526) }, + { CDF1(18957) }, { CDF1(18034) }, { CDF1(18934) }, + { CDF1(24247) }, { CDF1(16921) }, { CDF1(17080) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(26579) }, - { CDF1(24910) }, { CDF1(18637) }, { CDF1(19800) }, - { CDF1(20388) }, { CDF1( 9887) }, { CDF1(15642) }, - { CDF1(30198) }, { CDF1(24721) }, + { CDF1(26579) }, { CDF1(24910) }, { CDF1(18637) }, + { CDF1(19800) }, { CDF1(20388) }, { CDF1( 9887) }, + { CDF1(15642) }, { CDF1(30198) }, { CDF1(24721) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(26998) }, - { CDF1(16737) }, { CDF1(17838) }, { CDF1(18922) }, - { CDF1(19515) }, { CDF1(18636) }, { CDF1(17333) }, - { CDF1(15776) }, { CDF1(22658) }, + { CDF1(26998) }, { CDF1(16737) }, { CDF1(17838) }, + { CDF1(18922) }, { CDF1(19515) }, { CDF1(18636) }, + { CDF1(17333) }, { CDF1(15776) }, { CDF1(22658) }, }, { { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, }, }, }, .eob_base_tok = { { { @@ -3224,67 +3194,57 @@ { CDF10(20569, 22426, 25569, 26859, 28053, 28913, 29486, 29724, 29807, 32570) }, }, .eob_hi_bit = { { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(20177) }, - { CDF1(20789) }, { CDF1(20262) }, { CDF1(16384) }, + { CDF1(20177) }, { CDF1(20789) }, { CDF1(20262) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(21416) }, - { CDF1(20855) }, { CDF1(23410) }, { CDF1(16384) }, + { CDF1(21416) }, { CDF1(20855) }, { CDF1(23410) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(20238) }, - { CDF1(21057) }, { CDF1(19159) }, { CDF1(22337) }, - { CDF1(20159) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(20238) }, { CDF1(21057) }, { CDF1(19159) }, + { CDF1(22337) }, { CDF1(20159) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(20125) }, - { CDF1(20559) }, { CDF1(21707) }, { CDF1(22296) }, - { CDF1(17333) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(20125) }, { CDF1(20559) }, { CDF1(21707) }, + { CDF1(22296) }, { CDF1(17333) }, { CDF1(16384) }, + { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(19941) }, - { CDF1(20527) }, { CDF1(21470) }, { CDF1(22487) }, - { CDF1(19558) }, { CDF1(22354) }, { CDF1(20331) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(19941) }, { CDF1(20527) }, { CDF1(21470) }, + { CDF1(22487) }, { CDF1(19558) }, { CDF1(22354) }, + { CDF1(20331) }, { CDF1(16384) }, { CDF1(16384) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(22752) }, - { CDF1(25006) }, { CDF1(22075) }, { CDF1(21576) }, - { CDF1(17740) }, { CDF1(21690) }, { CDF1(19211) }, - { CDF1(16384) }, { CDF1(16384) }, + { CDF1(22752) }, { CDF1(25006) }, { CDF1(22075) }, + { CDF1(21576) }, { CDF1(17740) }, { CDF1(21690) }, + { CDF1(19211) }, { CDF1(16384) }, { CDF1(16384) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(21442) }, - { CDF1(22358) }, { CDF1(18503) }, { CDF1(20291) }, - { CDF1(19945) }, { CDF1(21294) }, { CDF1(21178) }, - { CDF1(19400) }, { CDF1(10556) }, + { CDF1(21442) }, { CDF1(22358) }, { CDF1(18503) }, + { CDF1(20291) }, { CDF1(19945) }, { CDF1(21294) }, + { CDF1(21178) }, { CDF1(19400) }, { CDF1(10556) }, }, { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(24648) }, - { CDF1(24949) }, { CDF1(20708) }, { CDF1(23905) }, - { CDF1(20501) }, { CDF1( 9558) }, { CDF1( 9423) }, - { CDF1(30365) }, { CDF1(19253) }, + { CDF1(24648) }, { CDF1(24949) }, { CDF1(20708) }, + { CDF1(23905) }, { CDF1(20501) }, { CDF1( 9558) }, + { CDF1( 9423) }, { CDF1(30365) }, { CDF1(19253) }, }, }, { { - { CDF1(16384) }, { CDF1(16384) }, { CDF1(26064) }, - { CDF1(22098) }, { CDF1(19613) }, { CDF1(20525) }, - { CDF1(17595) }, { CDF1(16618) }, { CDF1(20497) }, - { CDF1(18989) }, { CDF1(15513) }, + { CDF1(26064) }, { CDF1(22098) }, { CDF1(19613) }, + { CDF1(20525) }, { CDF1(17595) }, { CDF1(16618) }, + { CDF1(20497) }, { CDF1(18989) }, { CDF1(15513) }, }, { { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, { CDF1(16384) }, - { CDF1(16384) }, { CDF1(16384) }, }, }, }, .eob_base_tok = { { { @@ -3977,11 +3937,11 @@ update_cdf_2d(2, 9, coef.eob_bin_512); update_cdf_2d(2, 10, coef.eob_bin_1024); update_cdf_4d(N_TX_SIZES, 2, 4, 2, coef.eob_base_tok); update_cdf_4d(N_TX_SIZES, 2, 41 /*42*/, 3, coef.base_tok); update_cdf_4d(4, 2, 21, 3, coef.br_tok); - update_cdf_4d(N_TX_SIZES, 2, 11 /*22*/, 1, coef.eob_hi_bit); + update_cdf_4d(N_TX_SIZES, 2, 9, 1, coef.eob_hi_bit); update_cdf_3d(N_TX_SIZES, 13, 1, coef.skip); update_cdf_3d(2, 3, 1, coef.dc_sign); update_cdf_3d(2, N_INTRA_PRED_MODES, N_UV_INTRA_PRED_MODES - 1 - !k, m.uv_mode); update_cdf_2d(4, N_PARTITIONS - 3, m.partition[BL_128X128]); diff --git a/third_party/dav1d/src/decode.c b/third_party/dav1d/src/decode.c --- a/third_party/dav1d/src/decode.c +++ b/third_party/dav1d/src/decode.c @@ -737,11 +737,11 @@ } } else { if (IS_INTER_OR_SWITCH(f->frame_hdr) /* not intrabc */ && b->comp_type == COMP_INTER_NONE && b->motion_mode == MM_WARP) { - if (b->matrix[0] == SHRT_MIN) { + if (b->matrix[0] == INT16_MIN) { t->warpmv.type = DAV1D_WM_TYPE_IDENTITY; } else { t->warpmv.type = DAV1D_WM_TYPE_AFFINE; t->warpmv.matrix[2] = b->matrix[0] + 0x10000; t->warpmv.matrix[3] = b->matrix[1]; @@ -1817,11 +1817,11 @@ b->matrix[0] = t->warpmv.matrix[2] - 0x10000; b->matrix[1] = t->warpmv.matrix[3]; b->matrix[2] = t->warpmv.matrix[4]; b->matrix[3] = t->warpmv.matrix[5] - 0x10000; } else { - b->matrix[0] = SHRT_MIN; + b->matrix[0] = INT16_MIN; } } } if (DEBUG_BLOCK_INFO) diff --git a/third_party/dav1d/src/env.h b/third_party/dav1d/src/env.h --- a/third_party/dav1d/src/env.h +++ b/third_party/dav1d/src/env.h @@ -241,19 +241,18 @@ const int mask = 1 << (order_hint_n_bits - 1); const int diff = poc0 - poc1; return (diff & (mask - 1)) - (diff & mask); } -static inline int get_jnt_comp_ctx(const int order_hint_n_bits, - const unsigned poc, const unsigned ref0poc, - const unsigned ref1poc, +static inline int get_jnt_comp_ctx(const int order_hint_n_bits, const int poc, + const int ref0poc, const int ref1poc, const BlockContext *const a, const BlockContext *const l, const int yb4, const int xb4) { - const unsigned d0 = abs(get_poc_diff(order_hint_n_bits, ref0poc, poc)); - const unsigned d1 = abs(get_poc_diff(order_hint_n_bits, poc, ref1poc)); + const int d0 = abs(get_poc_diff(order_hint_n_bits, ref0poc, poc)); + const int d1 = abs(get_poc_diff(order_hint_n_bits, poc, ref1poc)); const int offset = d0 == d1; const int a_ctx = a->comp_type[xb4] >= COMP_INTER_AVG || a->ref[0][xb4] == 6; const int l_ctx = l->comp_type[yb4] >= COMP_INTER_AVG || l->ref[0][yb4] == 6; diff --git a/third_party/dav1d/src/ext/x86/x86inc.asm b/third_party/dav1d/src/ext/x86/x86inc.asm --- a/third_party/dav1d/src/ext/x86/x86inc.asm +++ b/third_party/dav1d/src/ext/x86/x86inc.asm @@ -41,22 +41,30 @@ %else %define STACK_ALIGNMENT 4 %endif %endif +%define WIN32 0 %define WIN64 0 %define UNIX64 0 %if ARCH_X86_64 %ifidn __OUTPUT_FORMAT__,win32 + %define WIN32 1 %define WIN64 1 %elifidn __OUTPUT_FORMAT__,win64 + %define WIN32 1 %define WIN64 1 %elifidn __OUTPUT_FORMAT__,x64 + %define WIN32 1 %define WIN64 1 %else %define UNIX64 1 %endif +%else + %ifidn __OUTPUT_FORMAT__,win32 + %define WIN32 1 + %endif %endif %define FORMAT_ELF 0 %define FORMAT_MACHO 0 %ifidn __OUTPUT_FORMAT__,elf @@ -835,10 +843,15 @@ %elif FORMAT_MACHO && HAVE_PRIVATE_EXTERN && %1 global %2:private_extern %else global %2 %endif + %if WIN32 && !%1 + %ifdef BUILDING_DLL + export %2 + %endif + %endif align function_align %2: RESET_MM_PERMUTATION ; needed for x86-64, also makes disassembly somewhat nicer %xdefine rstk rsp ; copy of the original stack pointer, used when greater alignment than the known stack alignment is required %assign stack_offset 0 ; stack pointer offset relative to the return address diff --git a/third_party/dav1d/src/getbits.c b/third_party/dav1d/src/getbits.c --- a/third_party/dav1d/src/getbits.c +++ b/third_party/dav1d/src/getbits.c @@ -101,11 +101,11 @@ more = v & 0x80; val |= ((uint64_t) (v & 0x7F)) << i; i += 7; } while (more && i < 56); - if (val > UINT_MAX || more) { + if (val > UINT32_MAX || more) { c->error = 1; return 0; } return (unsigned) val; @@ -127,11 +127,11 @@ return 0; int n_bits = 0; do { if (++n_bits == 32) - return 0xFFFFFFFFU; + return UINT32_MAX; } while (!dav1d_get_bit(c)); return ((1U << n_bits) - 1) + dav1d_get_bits(c, n_bits); } diff --git a/third_party/dav1d/src/internal.h b/third_party/dav1d/src/internal.h --- a/third_party/dav1d/src/internal.h +++ b/third_party/dav1d/src/internal.h @@ -167,11 +167,11 @@ Dav1dMemPool *refmvs_pool; struct { Dav1dThreadPicture p; Dav1dRef *segmap; Dav1dRef *refmvs; - unsigned refpoc[7]; + uint8_t refpoc[7]; } refs[8]; Dav1dMemPool *cdf_pool; CdfThreadContext cdf[8]; Dav1dDSPContext dsp[3 /* 8, 10, 12 bits/component */]; @@ -224,11 +224,11 @@ refmvs_temporal_block *mvs, *ref_mvs[7]; Dav1dRef *ref_mvs_ref[7]; Dav1dRef *cur_segmap_ref, *prev_segmap_ref; uint8_t *cur_segmap; const uint8_t *prev_segmap; - unsigned refpoc[7], refrefpoc[7][7]; + uint8_t refpoc[7], refrefpoc[7][7]; uint8_t gmv_warp_allowed[7]; CdfThreadContext in_cdf, out_cdf; struct Dav1dTileGroup *tile; int n_tile_data_alloc; int n_tile_data; @@ -300,11 +300,11 @@ int mask_sz /* w*h */, lr_mask_sz; int cdef_buf_plane_sz[2]; /* stride*sbh*4 */ int cdef_buf_sbh; int lr_buf_plane_sz[2]; /* (stride*sbh*4) << sb128 if n_tc > 1, else stride*4 */ int re_sz /* h */; - ALIGN(Av1FilterLUT lim_lut, 16); + Av1FilterLUT lim_lut; ALIGN(uint8_t lvl[8 /* seg_id */][4 /* dir */][8 /* ref */][2 /* is_gmv */], 16); int last_sharpness; uint8_t *tx_lpf_right_edge[2]; uint8_t *cdef_line_buf, *lr_line_buf; pixel *cdef_line[2 /* pre, post */][3 /* plane */]; diff --git a/third_party/dav1d/src/lf_mask.h b/third_party/dav1d/src/lf_mask.h --- a/third_party/dav1d/src/lf_mask.h +++ b/third_party/dav1d/src/lf_mask.h @@ -32,13 +32,13 @@ #include #include "src/levels.h" typedef struct Av1FilterLUT { - uint8_t e[64]; - uint8_t i[64]; - uint64_t sharp[2]; + ALIGN(uint8_t e[64], 16); + ALIGN(uint8_t i[64], 16); + ALIGN(uint64_t sharp[2], 16); } Av1FilterLUT; typedef struct Av1RestorationUnit { /* SGR: type = DAV1D_RESTORATION_SGRPROJ + sgr_idx */ uint8_t /* enum Dav1dRestorationType */ type; diff --git a/third_party/dav1d/src/loongarch/itx.S b/third_party/dav1d/src/loongarch/itx.S --- a/third_party/dav1d/src/loongarch/itx.S +++ b/third_party/dav1d/src/loongarch/itx.S @@ -1146,11 +1146,11 @@ LSX_TRANSPOSE4x8_H vr0, vr1, vr2, vr3, vr8, vr9, vr24, vr25, vr26, \ vr27, vr14, vr28, vr10, vr11, vr12, vr13 416: - ble t5, a3, 416416f + bge a3, t5, 416416f .irp i, vr8, vr9, vr24, vr25, vr26, vr27, vr14, vr28 vxor.v \i, \i, \i .endr 416416: @@ -1652,13 +1652,13 @@ vr8, vr9, vr10, vr11, vr12, vr13, vr14, vr15, \ vr0, vr1, vr2, vr3, vr4, vr5, vr6, vr7 .endif 816: - ble t5, a3, 816816f + bge a3, t5, 816816f .irp i, vr8, vr9, vr10, vr11, vr12, vr13, vr14, vr15 - vxor.v \i, \i, \i + vxor.v \i, \i, \i .endr 816816: vld_x8 a2, 0, 32, vr0, vr1, vr2, vr3, vr4, vr5, vr6, vr7 vxor.v vr23, vr23, vr23 @@ -1817,11 +1817,11 @@ DST_ADD_W16 vr10, vr11, vr12, vr13, vr20, vr20, vr20, \ vr20, vr20, vr20, vr20, vr20 alsl.d a0, a1, a0, 2 alsl.d t2, a1, a0, 1 - VLD_DST_ADD_W16 vr20, vr20, vr20, vr20, vr20, vr20, vr20, vr20, + VLD_DST_ADD_W16 vr20, vr20, vr20, vr20, vr20, vr20, vr20, vr20 b .\txfm1\()_\txfm2\()_16x8_END .NO_HAS_DCONLY_16x8: .endif la.local t7, inv_\txfm1\()_8h_x16_lsx @@ -1944,11 +1944,11 @@ addi.d a2, a2, 16 blt a3, t5, 1616f .endr 1616: - ble t5, a3, 16161616f + bge a3, t5, 16161616f addi.d t1, sp, 320 vxor.v vr23, vr23, vr23 .irp i, 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, \ 240 vst vr23, t1, \i @@ -4282,11 +4282,11 @@ .irp i, vr0, vr1, vr2, vr3, vr4, vr5, vr6, vr7, \ vr8, vr9, vr10, vr11, vr12, vr13, vr14, vr15 vsrari.h \i, \i, 1 .endr - vst_x8 t3, 0, 16, vr0, vr1, vr2, vr3, vr4, vr5, vr6, vr7, + vst_x8 t3, 0, 16, vr0, vr1, vr2, vr3, vr4, vr5, vr6, vr7 vst_x8 t3, 512, 16, vr8, vr9, vr10, vr11, vr12, vr13, vr14, vr15 addi.d a2, a2, 16 addi.d t3, t3, 128 bge a3, t7, .DCT_DCT_EOB_16x32 diff --git a/third_party/dav1d/src/loongarch/loongson_asm.S b/third_party/dav1d/src/loongarch/loongson_asm.S --- a/third_party/dav1d/src/loongarch/loongson_asm.S +++ b/third_party/dav1d/src/loongarch/loongson_asm.S @@ -57,10 +57,11 @@ .purgem endfunc .endm .text ; .align \align ; .globl ASM_PREF\name ; +.hidden ASM_PREF\name ; .type ASM_PREF\name, @function ; ASM_PREF\name: ; .endm .macro const name, align=DEFAULT_ALIGN diff --git a/third_party/dav1d/src/loongarch/loopfilter.S b/third_party/dav1d/src/loongarch/loopfilter.S --- a/third_party/dav1d/src/loongarch/loopfilter.S +++ b/third_party/dav1d/src/loongarch/loopfilter.S @@ -727,11 +727,11 @@ LPF_16_WD6 slli.d t3, a1, 4 sub.d a0, a0, t3 - TRANSPOSE_4x16b vr22, vr23, vr24, vr25, vr26, vr27, vr28, vr29 + TRANSPOSE_4x16B vr22, vr23, vr24, vr25, vr26, vr27, vr28, vr29 addi.d a0, a0, -2 .irp i, vr22, vr23, vr24, vr25 vstelm.w \i, a0, 0, 0 add.d a0, a0, a1 @@ -832,11 +832,11 @@ LPF_16_WD8 slli.d t3, a1, 4 sub.d a0, a0, t3 - TRANSPOSE_8x16b vr20, vr21, vr22, vr23, vr24, vr25, vr26, vr27, vr28, vr29 + TRANSPOSE_8x16B vr20, vr21, vr22, vr23, vr24, vr25, vr26, vr27, vr28, vr29 addi.d a0, a0, -4 .irp i, vr20, vr21, vr22, vr23, vr24, vr25, vr26, vr27 vstelm.d \i, a0, 0, 0 add.d a0, a0, a1 diff --git a/third_party/dav1d/src/loongarch/looprestoration.S b/third_party/dav1d/src/loongarch/looprestoration.S --- a/third_party/dav1d/src/loongarch/looprestoration.S +++ b/third_party/dav1d/src/loongarch/looprestoration.S @@ -383,11 +383,11 @@ addi.d t1, t1, 16 addi.d t0, t0, 32 addi.d t5, t5, 32 addi.d t6, t6, 16 addi.d t3, t3, -8 - ble t3, zero, .LBS3_V_H0 + bge zero, t3, .LBS3_V_H0 .LBS3_V_W8: vld vr0, t1, 0 // a 0 1 2 3 4 5 6 7 vld vr1, t1, 2 // b 1 2 3 4 5 6 7 8 vld vr2, t1, 4 // c 2 3 4 5 6 7 8 9 @@ -1040,11 +1040,11 @@ addi.d t3, t3, 16 addi.d t1, t1, 16 addi.d t0, t0, 32 addi.d t2, t2, 32 addi.w t4, t4, -8 - ble t4, zero, .LBOXSUM5_V_H1 + bge zero, t4, .LBOXSUM5_V_H1 .LBOXSUM5_V_W: vld vr0, t1, 0 // a 0 1 2 3 4 5 6 7 vld vr1, t1, 2 // b 1 2 3 4 5 6 7 8 vld vr2, t1, 4 // c 2 diff --git a/third_party/dav1d/src/loongarch/looprestoration_tmpl.c b/third_party/dav1d/src/loongarch/looprestoration_inner.c rename from third_party/dav1d/src/loongarch/looprestoration_tmpl.c rename to third_party/dav1d/src/loongarch/looprestoration_inner.c diff --git a/third_party/dav1d/src/loongarch/refmvs.S b/third_party/dav1d/src/loongarch/refmvs.S --- a/third_party/dav1d/src/loongarch/refmvs.S +++ b/third_party/dav1d/src/loongarch/refmvs.S @@ -200,15 +200,15 @@ st.d s6, sp, 48 st.d s7, sp, 56 st.d s8, sp, 64 vld vr16, a0, 16 - vld vr0, a0, 52 // rf->mfmv_ref - ld.w s8, a0, 152 // [0] - rf->n_mfmvs - vld vr17, a0, 168 // [0] - rp_ref| [1]- rp_proj - ld.d t1, a0, 184 // stride - ld.w t0, a0, 200 + vld vr0, a0, 48 // rf->mfmv_ref, rf->mfmv_ref2cur + ld.w s8, a0, 80 // [0] - rf->n_mfmvs + vld vr17, a0, 96 // [0] - rp_ref| [1]- rp_proj + ld.d t1, a0, 112 // stride + ld.w t0, a0, 128 addi.w t0, t0, -1 bnez t0, 1f addi.w a1, zero, 0 1: addi.d t0, a3, 8 @@ -246,12 +246,11 @@ bge a6, s8, .end_load add.d t3, t8, t4 // rp_proj mul.w t6, a4, t2 addi.d s7, zero, 40 vpickve2gr.w t1, vr1, 0 // col_end8i - vbsrl.v vr2, vr0, 4 // rf->mfmv_ref2cur - addi.d t5, a0, 64 // rf->mfmv_ref2ref + addi.d t5, a0, 58 // rf->mfmv_ref2ref - 1 la.local t8, la_div_mult vld vr6, t8, 0 vld vr7, t8, 16 vld vr8, t8, 32 vld vr9, t8, 48 @@ -263,30 +262,24 @@ vpickod.b vr13, vr7, vr6 vpickev.b vr14, vr9, vr8 vpickod.b vr15, vr9, vr8 vpickve2gr.d s6, vr17, 0 // rf->rp_ref 5: - vld vr10, t5, 0 - vld vr11, t5, 16 - vpickev.h vr10, vr11, vr10 - vpickev.b vr10, vr11, vr10 // [1...7] - + vld vr10, t5, 0 // ref2ref [1...7] + vpickve2gr.b t8, vr0, 8 // ref2cur vbsrl.v vr0, vr0, 1 - vpickve2gr.wu t8, vr2, 0 // ref2cur - vbsrl.v vr2, vr2, 4 - srli.d t4, t8, 24 - xori t4, t4, 0x80 - beqz t4, 8f + addi.w t4, t8, 32 + beqz t4, 8f // INVALID_REF2CUR vreplgr2vr.h vr23, t8 vshuf.b vr6, vr14, vr12, vr10 vshuf.b vr7, vr15, vr13, vr10 vilvl.b vr8, vr7, vr6 vmulwev.w.h vr6, vr8, vr23 vmulwod.w.h vr7, vr8, vr23 - vpickve2gr.b s0, vr0, 0 // ref + vpickve2gr.b s0, vr0, 4 // ref slli.d t8, s0, 3 ldx.d s1, s6, t8 // rf->rp_ref[ref] addi.d s0, s0, -4 // ref_sign vreplgr2vr.h vr19, s0 add.d s1, s1, t6 // &rf->rp_ref[ref][row_start8 * stride] @@ -458,11 +451,11 @@ add.d s1, s1, t2 // r + stride addi.d s2, s2, 1 // y + 1 blt s2, a5, 6b 8: addi.d a6, a6, 1 // n + 1 - addi.d t5, t5, 28 // mfmv_ref2ref(offset) + 28 + addi.d t5, t5, 7 // mfmv_ref2ref(offset) + 7 blt a6, s8, 5b .end_load: ld.d s0, sp, 0 ld.d s1, sp, 8 diff --git a/third_party/dav1d/src/mc_tmpl.c b/third_party/dav1d/src/mc_tmpl.c --- a/third_party/dav1d/src/mc_tmpl.c +++ b/third_party/dav1d/src/mc_tmpl.c @@ -734,20 +734,20 @@ const int rnd = (32 << intermediate_bits) + PREP_BIAS * 64; const int mask_sh = bitdepth + intermediate_bits - 4; const int mask_rnd = 1 << (mask_sh - 5); do { for (int x = 0; x < w; x++) { - const int m = imin(38 + ((abs(tmp1[x] - tmp2[x]) + mask_rnd) >> mask_sh), 64); - dst[x] = iclip_pixel((tmp1[x] * m + - tmp2[x] * (64 - m) + rnd) >> sh); + const int tmpdiff = tmp1[x] - tmp2[x]; + const int m = imin(38 + ((abs(tmpdiff) + mask_rnd) >> mask_sh), 64); + dst[x] = iclip_pixel((tmpdiff * m + tmp2[x] * 64 + rnd) >> sh); if (ss_hor) { x++; - const int n = imin(38 + ((abs(tmp1[x] - tmp2[x]) + mask_rnd) >> mask_sh), 64); - dst[x] = iclip_pixel((tmp1[x] * n + - tmp2[x] * (64 - n) + rnd) >> sh); + const int tmpdiff = tmp1[x] - tmp2[x]; + const int n = imin(38 + ((abs(tmpdiff) + mask_rnd) >> mask_sh), 64); + dst[x] = iclip_pixel((tmpdiff * n + tmp2[x] * 64 + rnd) >> sh); if (h & ss_ver) { mask[x >> 1] = (m + n + mask[x >> 1] + 2 - sign) >> 2; } else if (ss_ver) { mask[x >> 1] = m + n; diff --git a/third_party/dav1d/src/mem.h b/third_party/dav1d/src/mem.h --- a/third_party/dav1d/src/mem.h +++ b/third_party/dav1d/src/mem.h @@ -99,19 +99,26 @@ #elif HAVE_ALIGNED_ALLOC // The C11 standard specifies that the size parameter // must be an integral multiple of alignment. return aligned_alloc(align, ROUND_UP(sz, align)); #else -#error No aligned allocation functions are available + void *const buf = malloc(sz + align + sizeof(void *)); + if (!buf) return NULL; + + void *const ptr = (void *)(((uintptr_t)buf + sizeof(void *) + align - 1) & ~(align - 1)); + ((void **)ptr)[-1] = buf; + return ptr; #endif } static inline void dav1d_free_aligned_internal(void *ptr) { #ifdef _WIN32 _aligned_free(ptr); +#elif HAVE_POSIX_MEMALIGN || HAVE_MEMALIGN || HAVE_ALIGNED_ALLOC + free(ptr); #else - free(ptr); + if (ptr) free(((void **)ptr)[-1]); #endif } #if TRACK_HEAP_ALLOCATIONS void *dav1d_malloc(enum AllocationType type, size_t sz); diff --git a/third_party/dav1d/src/meson.build b/third_party/dav1d/src/meson.build --- a/third_party/dav1d/src/meson.build +++ b/third_party/dav1d/src/meson.build @@ -233,11 +233,11 @@ libdav1d_sources += files( 'loongarch/cpu.c', ) libdav1d_arch_tmpl_sources += {'default': files( - 'loongarch/looprestoration_tmpl.c', + 'loongarch/looprestoration_inner.c', )} libdav1d_sources_asm = files( 'loongarch/cdef.S', 'loongarch/ipred.S', diff --git a/third_party/dav1d/src/obu.c b/third_party/dav1d/src/obu.c --- a/third_party/dav1d/src/obu.c +++ b/third_party/dav1d/src/obu.c @@ -108,11 +108,11 @@ if (strict_std_compliance && (!hdr->num_units_in_tick || !hdr->time_scale)) goto error; hdr->equal_picture_interval = dav1d_get_bit(gb); if (hdr->equal_picture_interval) { const unsigned num_ticks_per_picture = dav1d_get_vlc(gb); - if (num_ticks_per_picture == 0xFFFFFFFFU) + if (num_ticks_per_picture == UINT32_MAX) goto error; hdr->num_ticks_per_picture = num_ticks_per_picture + 1; } hdr->decoder_model_info_present = dav1d_get_bit(gb); @@ -413,12 +413,12 @@ const uint8_t *const init_ptr = gb->ptr; #endif const Dav1dSequenceHeader *const seqhdr = c->seq_hdr; Dav1dFrameHeader *const hdr = c->frame_hdr; - hdr->show_existing_frame = - !seqhdr->reduced_still_picture_header && dav1d_get_bit(gb); + if (!seqhdr->reduced_still_picture_header) + hdr->show_existing_frame = dav1d_get_bit(gb); #if DEBUG_FRAME_HDR printf("HDR: post-show_existing_frame: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif if (hdr->show_existing_frame) { @@ -431,12 +431,17 @@ if (!ref_frame_hdr || ref_frame_hdr->frame_id != hdr->frame_id) goto error; } return 0; } - hdr->frame_type = seqhdr->reduced_still_picture_header ? DAV1D_FRAME_TYPE_KEY : dav1d_get_bits(gb, 2); - hdr->show_frame = seqhdr->reduced_still_picture_header || dav1d_get_bit(gb); + if (seqhdr->reduced_still_picture_header) { + hdr->frame_type = DAV1D_FRAME_TYPE_KEY; + hdr->show_frame = 1; + } else { + hdr->frame_type = dav1d_get_bits(gb, 2); + hdr->show_frame = dav1d_get_bit(gb); + } if (hdr->show_frame) { if (seqhdr->decoder_model_info_present && !seqhdr->equal_picture_interval) hdr->frame_presentation_delay = dav1d_get_bits(gb, seqhdr->frame_presentation_delay_length); hdr->showable_frame = hdr->frame_type != DAV1D_FRAME_TYPE_KEY; } else @@ -449,31 +454,29 @@ printf("HDR: post-frametype_bits: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif hdr->disable_cdf_update = dav1d_get_bit(gb); hdr->allow_screen_content_tools = seqhdr->screen_content_tools == DAV1D_ADAPTIVE ? - dav1d_get_bit(gb) : seqhdr->screen_content_tools; + dav1d_get_bit(gb) : seqhdr->screen_content_tools; if (hdr->allow_screen_content_tools) hdr->force_integer_mv = seqhdr->force_integer_mv == DAV1D_ADAPTIVE ? dav1d_get_bit(gb) : seqhdr->force_integer_mv; - else - hdr->force_integer_mv = 0; if (IS_KEY_OR_INTRA(hdr)) hdr->force_integer_mv = 1; if (seqhdr->frame_id_numbers_present) hdr->frame_id = dav1d_get_bits(gb, seqhdr->frame_id_n_bits); - hdr->frame_size_override = seqhdr->reduced_still_picture_header ? 0 : - hdr->frame_type == DAV1D_FRAME_TYPE_SWITCH ? 1 : dav1d_get_bit(gb); + if (!seqhdr->reduced_still_picture_header) + hdr->frame_size_override = hdr->frame_type == DAV1D_FRAME_TYPE_SWITCH ? 1 : dav1d_get_bit(gb); #if DEBUG_FRAME_HDR printf("HDR: post-frame_size_override_flag: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif - hdr->frame_offset = seqhdr->order_hint ? - dav1d_get_bits(gb, seqhdr->order_hint_n_bits) : 0; + if (seqhdr->order_hint) + hdr->frame_offset = dav1d_get_bits(gb, seqhdr->order_hint_n_bits); hdr->primary_ref_frame = !hdr->error_resilient_mode && IS_INTER_OR_SWITCH(hdr) ? dav1d_get_bits(gb, 3) : DAV1D_PRIMARY_REF_NONE; if (seqhdr->decoder_model_info_present) { hdr->buffer_removal_time_present = dav1d_get_bit(gb); @@ -501,111 +504,88 @@ hdr->frame_type == DAV1D_FRAME_TYPE_INTRA && hdr->refresh_frame_flags == 0xff) { goto error; } if (read_frame_size(c, gb, 0) < 0) goto error; - hdr->allow_intrabc = hdr->allow_screen_content_tools && - !hdr->super_res.enabled && dav1d_get_bit(gb); - hdr->use_ref_frame_mvs = 0; + if (hdr->allow_screen_content_tools && !hdr->super_res.enabled) + hdr->allow_intrabc = dav1d_get_bit(gb); } else { - hdr->allow_intrabc = 0; hdr->refresh_frame_flags = hdr->frame_type == DAV1D_FRAME_TYPE_SWITCH ? 0xff : dav1d_get_bits(gb, 8); if (hdr->error_resilient_mode && seqhdr->order_hint) for (int i = 0; i < 8; i++) dav1d_get_bits(gb, seqhdr->order_hint_n_bits); - hdr->frame_ref_short_signaling = - seqhdr->order_hint && dav1d_get_bit(gb); - if (hdr->frame_ref_short_signaling) { // FIXME: Nearly verbatim copy from section 7.8 - hdr->refidx[0] = dav1d_get_bits(gb, 3); - hdr->refidx[1] = hdr->refidx[2] = -1; - hdr->refidx[3] = dav1d_get_bits(gb, 3); - hdr->refidx[4] = hdr->refidx[5] = hdr->refidx[6] = -1; - - int shifted_frame_offset[8]; - const int current_frame_offset = 1 << (seqhdr->order_hint_n_bits - 1); - for (int i = 0; i < 8; i++) { - if (!c->refs[i].p.p.frame_hdr) goto error; - shifted_frame_offset[i] = current_frame_offset + - get_poc_diff(seqhdr->order_hint_n_bits, - c->refs[i].p.p.frame_hdr->frame_offset, - hdr->frame_offset); - } - - int used_frame[8] = { 0 }; - used_frame[hdr->refidx[0]] = 1; - used_frame[hdr->refidx[3]] = 1; - - int latest_frame_offset = -1; - for (int i = 0; i < 8; i++) { - const int hint = shifted_frame_offset[i]; - if (!used_frame[i] && hint >= current_frame_offset && - hint >= latest_frame_offset) - { - hdr->refidx[6] = i; - latest_frame_offset = hint; - } - } - if (latest_frame_offset != -1) - used_frame[hdr->refidx[6]] = 1; + if (seqhdr->order_hint) { + hdr->frame_ref_short_signaling = dav1d_get_bit(gb); + if (hdr->frame_ref_short_signaling) { + hdr->refidx[0] = dav1d_get_bits(gb, 3); + hdr->refidx[1] = hdr->refidx[2] = -1; + hdr->refidx[3] = dav1d_get_bits(gb, 3); - int earliest_frame_offset = INT_MAX; - for (int i = 0; i < 8; i++) { - const int hint = shifted_frame_offset[i]; - if (!used_frame[i] && hint >= current_frame_offset && - hint < earliest_frame_offset) - { - hdr->refidx[4] = i; - earliest_frame_offset = hint; + /* +1 allows for unconditional stores, as unused + * values can be dumped into frame_offset[-1]. */ + int frame_offset_mem[8+1]; + int *const frame_offset = &frame_offset_mem[1]; + int earliest_ref = -1; + for (int i = 0, earliest_offset = INT_MAX; i < 8; i++) { + const Dav1dFrameHeader *const refhdr = c->refs[i].p.p.frame_hdr; + if (!refhdr) goto error; + const int diff = get_poc_diff(seqhdr->order_hint_n_bits, + refhdr->frame_offset, + hdr->frame_offset); + frame_offset[i] = diff; + if (diff < earliest_offset) { + earliest_offset = diff; + earliest_ref = i; + } } - } - if (earliest_frame_offset != INT_MAX) - used_frame[hdr->refidx[4]] = 1; + frame_offset[hdr->refidx[0]] = INT_MIN; // = reference frame is used + frame_offset[hdr->refidx[3]] = INT_MIN; + assert(earliest_ref >= 0); - earliest_frame_offset = INT_MAX; - for (int i = 0; i < 8; i++) { - const int hint = shifted_frame_offset[i]; - if (!used_frame[i] && hint >= current_frame_offset && - (hint < earliest_frame_offset)) - { - hdr->refidx[5] = i; - earliest_frame_offset = hint; + int refidx = -1; + for (int i = 0, latest_offset = 0; i < 8; i++) { + const int hint = frame_offset[i]; + if (hint >= latest_offset) { + latest_offset = hint; + refidx = i; + } } - } - if (earliest_frame_offset != INT_MAX) - used_frame[hdr->refidx[5]] = 1; + frame_offset[refidx] = INT_MIN; + hdr->refidx[6] = refidx; - for (int i = 1; i < 7; i++) { - if (hdr->refidx[i] < 0) { - latest_frame_offset = -1; + for (int i = 4; i < 6; i++) { + /* Unsigned compares to handle negative values. */ + unsigned earliest_offset = UINT8_MAX; + refidx = -1; for (int j = 0; j < 8; j++) { - const int hint = shifted_frame_offset[j]; - if (!used_frame[j] && hint < current_frame_offset && - hint >= latest_frame_offset) - { - hdr->refidx[i] = j; - latest_frame_offset = hint; + const unsigned hint = frame_offset[j]; + if (hint < earliest_offset) { + earliest_offset = hint; + refidx = j; } } - if (latest_frame_offset != -1) - used_frame[hdr->refidx[i]] = 1; + frame_offset[refidx] = INT_MIN; + hdr->refidx[i] = refidx; } - } - earliest_frame_offset = INT_MAX; - int ref = -1; - for (int i = 0; i < 8; i++) { - const int hint = shifted_frame_offset[i]; - if (hint < earliest_frame_offset) { - ref = i; - earliest_frame_offset = hint; + for (int i = 1; i < 7; i++) { + refidx = hdr->refidx[i]; + if (refidx < 0) { + unsigned latest_offset = ~UINT8_MAX; + for (int j = 0; j < 8; j++) { + const unsigned hint = frame_offset[j]; + if (hint >= latest_offset) { + latest_offset = hint; + refidx = j; + } + } + frame_offset[refidx] = INT_MIN; + hdr->refidx[i] = refidx >= 0 ? refidx : earliest_ref; + } } } - for (int i = 0; i < 7; i++) { - if (hdr->refidx[i] < 0) - hdr->refidx[i] = ref; - } } for (int i = 0; i < 7; i++) { if (!hdr->frame_ref_short_signaling) hdr->refidx[i] = dav1d_get_bits(gb, 3); if (seqhdr->frame_id_numbers_present) { @@ -616,25 +596,28 @@ } } const int use_ref = !hdr->error_resilient_mode && hdr->frame_size_override; if (read_frame_size(c, gb, use_ref) < 0) goto error; - hdr->hp = !hdr->force_integer_mv && dav1d_get_bit(gb); + if (!hdr->force_integer_mv) + hdr->hp = dav1d_get_bit(gb); hdr->subpel_filter_mode = dav1d_get_bit(gb) ? DAV1D_FILTER_SWITCHABLE : - dav1d_get_bits(gb, 2); + dav1d_get_bits(gb, 2); hdr->switchable_motion_mode = dav1d_get_bit(gb); - hdr->use_ref_frame_mvs = !hdr->error_resilient_mode && - seqhdr->ref_frame_mvs && seqhdr->order_hint && - IS_INTER_OR_SWITCH(hdr) && dav1d_get_bit(gb); + if (!hdr->error_resilient_mode && seqhdr->ref_frame_mvs && + seqhdr->order_hint && IS_INTER_OR_SWITCH(hdr)) + { + hdr->use_ref_frame_mvs = dav1d_get_bit(gb); + } } #if DEBUG_FRAME_HDR printf("HDR: post-frametype-specific-bits: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif - hdr->refresh_context = !seqhdr->reduced_still_picture_header && - !hdr->disable_cdf_update && !dav1d_get_bit(gb); + if (!seqhdr->reduced_still_picture_header && !hdr->disable_cdf_update) + hdr->refresh_context = !dav1d_get_bit(gb); #if DEBUG_FRAME_HDR printf("HDR: post-refresh_context: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif @@ -672,13 +655,11 @@ } else { hdr->tiling.cols = 0; int widest_tile = 0, max_tile_area_sb = sbw * sbh; for (int sbx = 0; sbx < sbw && hdr->tiling.cols < DAV1D_MAX_TILE_COLS; hdr->tiling.cols++) { const int tile_width_sb = imin(sbw - sbx, max_tile_width_sb); - const int tile_w = (tile_width_sb > 1) ? - 1 + dav1d_get_uniform(gb, tile_width_sb) : - 1; + const int tile_w = (tile_width_sb > 1) ? 1 + dav1d_get_uniform(gb, tile_width_sb) : 1; hdr->tiling.col_start_sb[hdr->tiling.cols] = sbx; sbx += tile_w; widest_tile = imax(widest_tile, tile_w); } hdr->tiling.log2_cols = tile_log2(1, hdr->tiling.cols); @@ -686,48 +667,47 @@ const int max_tile_height_sb = imax(max_tile_area_sb / widest_tile, 1); hdr->tiling.rows = 0; for (int sby = 0; sby < sbh && hdr->tiling.rows < DAV1D_MAX_TILE_ROWS; hdr->tiling.rows++) { const int tile_height_sb = imin(sbh - sby, max_tile_height_sb); - const int tile_h = (tile_height_sb > 1) ? - 1 + dav1d_get_uniform(gb, tile_height_sb) : - 1; + const int tile_h = (tile_height_sb > 1) ? 1 + dav1d_get_uniform(gb, tile_height_sb) : 1; hdr->tiling.row_start_sb[hdr->tiling.rows] = sby; sby += tile_h; } hdr->tiling.log2_rows = tile_log2(1, hdr->tiling.rows); } hdr->tiling.col_start_sb[hdr->tiling.cols] = sbw; hdr->tiling.row_start_sb[hdr->tiling.rows] = sbh; if (hdr->tiling.log2_cols || hdr->tiling.log2_rows) { - hdr->tiling.update = dav1d_get_bits(gb, hdr->tiling.log2_cols + - hdr->tiling.log2_rows); + hdr->tiling.update = dav1d_get_bits(gb, hdr->tiling.log2_cols + hdr->tiling.log2_rows); if (hdr->tiling.update >= hdr->tiling.cols * hdr->tiling.rows) goto error; hdr->tiling.n_bytes = dav1d_get_bits(gb, 2) + 1; - } else { - hdr->tiling.n_bytes = 0; - hdr->tiling.update = 0; } #if DEBUG_FRAME_HDR printf("HDR: post-tiling: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif // quant data hdr->quant.yac = dav1d_get_bits(gb, 8); - hdr->quant.ydc_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0; + if (dav1d_get_bit(gb)) + hdr->quant.ydc_delta = dav1d_get_sbits(gb, 7); if (!seqhdr->monochrome) { // If the sequence header says that delta_q might be different // for U, V, we must check whether it actually is for this // frame. const int diff_uv_delta = seqhdr->separate_uv_delta_q ? dav1d_get_bit(gb) : 0; - hdr->quant.udc_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0; - hdr->quant.uac_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0; + if (dav1d_get_bit(gb)) + hdr->quant.udc_delta = dav1d_get_sbits(gb, 7); + if (dav1d_get_bit(gb)) + hdr->quant.uac_delta = dav1d_get_sbits(gb, 7); if (diff_uv_delta) { - hdr->quant.vdc_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0; - hdr->quant.vac_delta = dav1d_get_bit(gb) ? dav1d_get_sbits(gb, 7) : 0; + if (dav1d_get_bit(gb)) + hdr->quant.vdc_delta = dav1d_get_sbits(gb, 7); + if (dav1d_get_bit(gb)) + hdr->quant.vac_delta = dav1d_get_sbits(gb, 7); } else { hdr->quant.vdc_delta = hdr->quant.udc_delta; hdr->quant.vac_delta = hdr->quant.uac_delta; } } @@ -737,13 +717,12 @@ #endif hdr->quant.qm = dav1d_get_bit(gb); if (hdr->quant.qm) { hdr->quant.qm_y = dav1d_get_bits(gb, 4); hdr->quant.qm_u = dav1d_get_bits(gb, 4); - hdr->quant.qm_v = - seqhdr->separate_uv_delta_q ? dav1d_get_bits(gb, 4) : - hdr->quant.qm_u; + hdr->quant.qm_v = seqhdr->separate_uv_delta_q ? dav1d_get_bits(gb, 4) : + hdr->quant.qm_u; } #if DEBUG_FRAME_HDR printf("HDR: post-qm: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif @@ -751,54 +730,42 @@ // segmentation data hdr->segmentation.enabled = dav1d_get_bit(gb); if (hdr->segmentation.enabled) { if (hdr->primary_ref_frame == DAV1D_PRIMARY_REF_NONE) { hdr->segmentation.update_map = 1; - hdr->segmentation.temporal = 0; hdr->segmentation.update_data = 1; } else { hdr->segmentation.update_map = dav1d_get_bit(gb); - hdr->segmentation.temporal = - hdr->segmentation.update_map ? dav1d_get_bit(gb) : 0; + if (hdr->segmentation.update_map) + hdr->segmentation.temporal = dav1d_get_bit(gb); hdr->segmentation.update_data = dav1d_get_bit(gb); } if (hdr->segmentation.update_data) { - hdr->segmentation.seg_data.preskip = 0; hdr->segmentation.seg_data.last_active_segid = -1; for (int i = 0; i < DAV1D_MAX_SEGMENTS; i++) { Dav1dSegmentationData *const seg = &hdr->segmentation.seg_data.d[i]; if (dav1d_get_bit(gb)) { seg->delta_q = dav1d_get_sbits(gb, 9); hdr->segmentation.seg_data.last_active_segid = i; - } else { - seg->delta_q = 0; } if (dav1d_get_bit(gb)) { seg->delta_lf_y_v = dav1d_get_sbits(gb, 7); hdr->segmentation.seg_data.last_active_segid = i; - } else { - seg->delta_lf_y_v = 0; } if (dav1d_get_bit(gb)) { seg->delta_lf_y_h = dav1d_get_sbits(gb, 7); hdr->segmentation.seg_data.last_active_segid = i; - } else { - seg->delta_lf_y_h = 0; } if (dav1d_get_bit(gb)) { seg->delta_lf_u = dav1d_get_sbits(gb, 7); hdr->segmentation.seg_data.last_active_segid = i; - } else { - seg->delta_lf_u = 0; } if (dav1d_get_bit(gb)) { seg->delta_lf_v = dav1d_get_sbits(gb, 7); hdr->segmentation.seg_data.last_active_segid = i; - } else { - seg->delta_lf_v = 0; } if (dav1d_get_bit(gb)) { seg->ref = dav1d_get_bits(gb, 3); hdr->segmentation.seg_data.last_active_segid = i; hdr->segmentation.seg_data.preskip = 1; @@ -822,26 +789,32 @@ if (!c->refs[pri_ref].p.p.frame_hdr) goto error; hdr->segmentation.seg_data = c->refs[pri_ref].p.p.frame_hdr->segmentation.seg_data; } } else { - memset(&hdr->segmentation.seg_data, 0, sizeof(Dav1dSegmentationDataSet)); for (int i = 0; i < DAV1D_MAX_SEGMENTS; i++) hdr->segmentation.seg_data.d[i].ref = -1; } #if DEBUG_FRAME_HDR printf("HDR: post-segmentation: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif // delta q - hdr->delta.q.present = hdr->quant.yac ? dav1d_get_bit(gb) : 0; - hdr->delta.q.res_log2 = hdr->delta.q.present ? dav1d_get_bits(gb, 2) : 0; - hdr->delta.lf.present = hdr->delta.q.present && !hdr->allow_intrabc && - dav1d_get_bit(gb); - hdr->delta.lf.res_log2 = hdr->delta.lf.present ? dav1d_get_bits(gb, 2) : 0; - hdr->delta.lf.multi = hdr->delta.lf.present ? dav1d_get_bit(gb) : 0; + if (hdr->quant.yac) { + hdr->delta.q.present = dav1d_get_bit(gb); + if (hdr->delta.q.present) { + hdr->delta.q.res_log2 = dav1d_get_bits(gb, 2); + if (!hdr->allow_intrabc) { + hdr->delta.lf.present = dav1d_get_bit(gb); + if (hdr->delta.lf.present) { + hdr->delta.lf.res_log2 = dav1d_get_bits(gb, 2); + hdr->delta.lf.multi = dav1d_get_bit(gb); + } + } + } + } #if DEBUG_FRAME_HDR printf("HDR: post-delta_q_lf_flags: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif @@ -858,13 +831,10 @@ hdr->all_lossless &= hdr->segmentation.lossless[i]; } // loopfilter if (hdr->all_lossless || hdr->allow_intrabc) { - hdr->loopfilter.level_y[0] = hdr->loopfilter.level_y[1] = 0; - hdr->loopfilter.level_u = hdr->loopfilter.level_v = 0; - hdr->loopfilter.sharpness = 0; hdr->loopfilter.mode_ref_delta_enabled = 1; hdr->loopfilter.mode_ref_delta_update = 1; hdr->loopfilter.mode_ref_deltas = default_mode_ref_deltas; } else { hdr->loopfilter.level_y[0] = dav1d_get_bits(gb, 6); @@ -912,14 +882,10 @@ for (int i = 0; i < (1 << hdr->cdef.n_bits); i++) { hdr->cdef.y_strength[i] = dav1d_get_bits(gb, 6); if (!seqhdr->monochrome) hdr->cdef.uv_strength[i] = dav1d_get_bits(gb, 6); } - } else { - hdr->cdef.n_bits = 0; - hdr->cdef.y_strength[0] = 0; - hdr->cdef.uv_strength[0] = 0; } #if DEBUG_FRAME_HDR printf("HDR: post-cdef: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif @@ -930,13 +896,10 @@ { hdr->restoration.type[0] = dav1d_get_bits(gb, 2); if (!seqhdr->monochrome) { hdr->restoration.type[1] = dav1d_get_bits(gb, 2); hdr->restoration.type[2] = dav1d_get_bits(gb, 2); - } else { - hdr->restoration.type[1] = - hdr->restoration.type[2] = DAV1D_RESTORATION_NONE; } if (hdr->restoration.type[0] || hdr->restoration.type[1] || hdr->restoration.type[2]) { @@ -954,94 +917,89 @@ hdr->restoration.unit_size[1] -= dav1d_get_bit(gb); } } else { hdr->restoration.unit_size[0] = 8; } - } else { - hdr->restoration.type[0] = DAV1D_RESTORATION_NONE; - hdr->restoration.type[1] = DAV1D_RESTORATION_NONE; - hdr->restoration.type[2] = DAV1D_RESTORATION_NONE; } #if DEBUG_FRAME_HDR printf("HDR: post-restoration: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif - hdr->txfm_mode = hdr->all_lossless ? DAV1D_TX_4X4_ONLY : - dav1d_get_bit(gb) ? DAV1D_TX_SWITCHABLE : DAV1D_TX_LARGEST; + if (!hdr->all_lossless) + hdr->txfm_mode = dav1d_get_bit(gb) ? DAV1D_TX_SWITCHABLE : DAV1D_TX_LARGEST; #if DEBUG_FRAME_HDR printf("HDR: post-txfmmode: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif - hdr->switchable_comp_refs = IS_INTER_OR_SWITCH(hdr) ? dav1d_get_bit(gb) : 0; + if (IS_INTER_OR_SWITCH(hdr)) + hdr->switchable_comp_refs = dav1d_get_bit(gb); #if DEBUG_FRAME_HDR printf("HDR: post-refmode: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif - hdr->skip_mode_allowed = 0; if (hdr->switchable_comp_refs && IS_INTER_OR_SWITCH(hdr) && seqhdr->order_hint) { - const unsigned poc = hdr->frame_offset; - unsigned off_before = 0xFFFFFFFFU; - int off_after = -1; + const int poc = hdr->frame_offset; + int off_before = -1, off_after = -1; int off_before_idx, off_after_idx; for (int i = 0; i < 7; i++) { if (!c->refs[hdr->refidx[i]].p.p.frame_hdr) goto error; - const unsigned refpoc = c->refs[hdr->refidx[i]].p.p.frame_hdr->frame_offset; + const int refpoc = c->refs[hdr->refidx[i]].p.p.frame_hdr->frame_offset; const int diff = get_poc_diff(seqhdr->order_hint_n_bits, refpoc, poc); if (diff > 0) { - if (off_after == -1 || get_poc_diff(seqhdr->order_hint_n_bits, - off_after, refpoc) > 0) + if (off_after < 0 || get_poc_diff(seqhdr->order_hint_n_bits, + off_after, refpoc) > 0) { off_after = refpoc; off_after_idx = i; } - } else if (diff < 0 && (off_before == 0xFFFFFFFFU || + } else if (diff < 0 && (off_before < 0 || get_poc_diff(seqhdr->order_hint_n_bits, refpoc, off_before) > 0)) { off_before = refpoc; off_before_idx = i; } } - if (off_before != 0xFFFFFFFFU && off_after != -1) { + if ((off_before | off_after) >= 0) { hdr->skip_mode_refs[0] = imin(off_before_idx, off_after_idx); hdr->skip_mode_refs[1] = imax(off_before_idx, off_after_idx); hdr->skip_mode_allowed = 1; - } else if (off_before != 0xFFFFFFFFU) { - unsigned off_before2 = 0xFFFFFFFFU; + } else if (off_before >= 0) { + int off_before2 = -1; int off_before2_idx; for (int i = 0; i < 7; i++) { if (!c->refs[hdr->refidx[i]].p.p.frame_hdr) goto error; - const unsigned refpoc = c->refs[hdr->refidx[i]].p.p.frame_hdr->frame_offset; + const int refpoc = c->refs[hdr->refidx[i]].p.p.frame_hdr->frame_offset; if (get_poc_diff(seqhdr->order_hint_n_bits, refpoc, off_before) < 0) { - if (off_before2 == 0xFFFFFFFFU || - get_poc_diff(seqhdr->order_hint_n_bits, - refpoc, off_before2) > 0) + if (off_before2 < 0 || get_poc_diff(seqhdr->order_hint_n_bits, + refpoc, off_before2) > 0) { off_before2 = refpoc; off_before2_idx = i; } } } - if (off_before2 != 0xFFFFFFFFU) { + if (off_before2 >= 0) { hdr->skip_mode_refs[0] = imin(off_before_idx, off_before2_idx); hdr->skip_mode_refs[1] = imax(off_before_idx, off_before2_idx); hdr->skip_mode_allowed = 1; } } } - hdr->skip_mode_enabled = hdr->skip_mode_allowed ? dav1d_get_bit(gb) : 0; + if (hdr->skip_mode_allowed) + hdr->skip_mode_enabled = dav1d_get_bit(gb); #if DEBUG_FRAME_HDR printf("HDR: post-extskip: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif - hdr->warp_motion = !hdr->error_resilient_mode && IS_INTER_OR_SWITCH(hdr) && - seqhdr->warped_motion && dav1d_get_bit(gb); + if (!hdr->error_resilient_mode && IS_INTER_OR_SWITCH(hdr) && seqhdr->warped_motion) + hdr->warp_motion = dav1d_get_bit(gb); #if DEBUG_FRAME_HDR printf("HDR: post-warpmotionbit: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif hdr->reduced_txtp_set = dav1d_get_bit(gb); @@ -1056,11 +1014,11 @@ if (IS_INTER_OR_SWITCH(hdr)) { for (int i = 0; i < 7; i++) { hdr->gmv[i].type = !dav1d_get_bit(gb) ? DAV1D_WM_TYPE_IDENTITY : dav1d_get_bit(gb) ? DAV1D_WM_TYPE_ROT_ZOOM : dav1d_get_bit(gb) ? DAV1D_WM_TYPE_TRANSLATION : - DAV1D_WM_TYPE_AFFINE; + DAV1D_WM_TYPE_AFFINE; if (hdr->gmv[i].type == DAV1D_WM_TYPE_IDENTITY) continue; const Dav1dWarpedMotionParams *ref_gmv; if (hdr->primary_ref_frame == DAV1D_PRIMARY_REF_NONE) { @@ -1102,88 +1060,86 @@ #if DEBUG_FRAME_HDR printf("HDR: post-gmv: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif - hdr->film_grain.present = seqhdr->film_grain_present && - (hdr->show_frame || hdr->showable_frame) && - dav1d_get_bit(gb); - if (hdr->film_grain.present) { - const unsigned seed = dav1d_get_bits(gb, 16); - hdr->film_grain.update = hdr->frame_type != DAV1D_FRAME_TYPE_INTER || dav1d_get_bit(gb); - if (!hdr->film_grain.update) { - const int refidx = dav1d_get_bits(gb, 3); - int i; - for (i = 0; i < 7; i++) - if (hdr->refidx[i] == refidx) - break; - if (i == 7 || !c->refs[refidx].p.p.frame_hdr) goto error; - hdr->film_grain.data = c->refs[refidx].p.p.frame_hdr->film_grain.data; - hdr->film_grain.data.seed = seed; - } else { - Dav1dFilmGrainData *const fgd = &hdr->film_grain.data; - fgd->seed = seed; + if (seqhdr->film_grain_present && (hdr->show_frame || hdr->showable_frame)) { + hdr->film_grain.present = dav1d_get_bit(gb); + if (hdr->film_grain.present) { + const unsigned seed = dav1d_get_bits(gb, 16); + hdr->film_grain.update = hdr->frame_type != DAV1D_FRAME_TYPE_INTER || dav1d_get_bit(gb); + if (!hdr->film_grain.update) { + const int refidx = dav1d_get_bits(gb, 3); + int i; + for (i = 0; i < 7; i++) + if (hdr->refidx[i] == refidx) + break; + if (i == 7 || !c->refs[refidx].p.p.frame_hdr) goto error; + hdr->film_grain.data = c->refs[refidx].p.p.frame_hdr->film_grain.data; + hdr->film_grain.data.seed = seed; + } else { + Dav1dFilmGrainData *const fgd = &hdr->film_grain.data; + fgd->seed = seed; - fgd->num_y_points = dav1d_get_bits(gb, 4); - if (fgd->num_y_points > 14) goto error; - for (int i = 0; i < fgd->num_y_points; i++) { - fgd->y_points[i][0] = dav1d_get_bits(gb, 8); - if (i && fgd->y_points[i - 1][0] >= fgd->y_points[i][0]) - goto error; - fgd->y_points[i][1] = dav1d_get_bits(gb, 8); - } + fgd->num_y_points = dav1d_get_bits(gb, 4); + if (fgd->num_y_points > 14) goto error; + for (int i = 0; i < fgd->num_y_points; i++) { + fgd->y_points[i][0] = dav1d_get_bits(gb, 8); + if (i && fgd->y_points[i - 1][0] >= fgd->y_points[i][0]) + goto error; + fgd->y_points[i][1] = dav1d_get_bits(gb, 8); + } - fgd->chroma_scaling_from_luma = - !seqhdr->monochrome && dav1d_get_bit(gb); - if (seqhdr->monochrome || fgd->chroma_scaling_from_luma || - (seqhdr->ss_ver == 1 && seqhdr->ss_hor == 1 && !fgd->num_y_points)) - { - fgd->num_uv_points[0] = fgd->num_uv_points[1] = 0; - } else for (int pl = 0; pl < 2; pl++) { - fgd->num_uv_points[pl] = dav1d_get_bits(gb, 4); - if (fgd->num_uv_points[pl] > 10) goto error; - for (int i = 0; i < fgd->num_uv_points[pl]; i++) { - fgd->uv_points[pl][i][0] = dav1d_get_bits(gb, 8); - if (i && fgd->uv_points[pl][i - 1][0] >= fgd->uv_points[pl][i][0]) - goto error; - fgd->uv_points[pl][i][1] = dav1d_get_bits(gb, 8); + if (!seqhdr->monochrome) + fgd->chroma_scaling_from_luma = dav1d_get_bit(gb); + if (seqhdr->monochrome || fgd->chroma_scaling_from_luma || + (seqhdr->ss_ver == 1 && seqhdr->ss_hor == 1 && !fgd->num_y_points)) + { + fgd->num_uv_points[0] = fgd->num_uv_points[1] = 0; + } else for (int pl = 0; pl < 2; pl++) { + fgd->num_uv_points[pl] = dav1d_get_bits(gb, 4); + if (fgd->num_uv_points[pl] > 10) goto error; + for (int i = 0; i < fgd->num_uv_points[pl]; i++) { + fgd->uv_points[pl][i][0] = dav1d_get_bits(gb, 8); + if (i && fgd->uv_points[pl][i - 1][0] >= fgd->uv_points[pl][i][0]) + goto error; + fgd->uv_points[pl][i][1] = dav1d_get_bits(gb, 8); + } } - } - if (seqhdr->ss_hor == 1 && seqhdr->ss_ver == 1 && - !!fgd->num_uv_points[0] != !!fgd->num_uv_points[1]) - { - goto error; - } + if (seqhdr->ss_hor == 1 && seqhdr->ss_ver == 1 && + !!fgd->num_uv_points[0] != !!fgd->num_uv_points[1]) + { + goto error; + } - fgd->scaling_shift = dav1d_get_bits(gb, 2) + 8; - fgd->ar_coeff_lag = dav1d_get_bits(gb, 2); - const int num_y_pos = 2 * fgd->ar_coeff_lag * (fgd->ar_coeff_lag + 1); - if (fgd->num_y_points) - for (int i = 0; i < num_y_pos; i++) - fgd->ar_coeffs_y[i] = dav1d_get_bits(gb, 8) - 128; - for (int pl = 0; pl < 2; pl++) - if (fgd->num_uv_points[pl] || fgd->chroma_scaling_from_luma) { - const int num_uv_pos = num_y_pos + !!fgd->num_y_points; - for (int i = 0; i < num_uv_pos; i++) - fgd->ar_coeffs_uv[pl][i] = dav1d_get_bits(gb, 8) - 128; - if (!fgd->num_y_points) - fgd->ar_coeffs_uv[pl][num_uv_pos] = 0; - } - fgd->ar_coeff_shift = dav1d_get_bits(gb, 2) + 6; - fgd->grain_scale_shift = dav1d_get_bits(gb, 2); - for (int pl = 0; pl < 2; pl++) - if (fgd->num_uv_points[pl]) { - fgd->uv_mult[pl] = dav1d_get_bits(gb, 8) - 128; - fgd->uv_luma_mult[pl] = dav1d_get_bits(gb, 8) - 128; - fgd->uv_offset[pl] = dav1d_get_bits(gb, 9) - 256; - } - fgd->overlap_flag = dav1d_get_bit(gb); - fgd->clip_to_restricted_range = dav1d_get_bit(gb); + fgd->scaling_shift = dav1d_get_bits(gb, 2) + 8; + fgd->ar_coeff_lag = dav1d_get_bits(gb, 2); + const int num_y_pos = 2 * fgd->ar_coeff_lag * (fgd->ar_coeff_lag + 1); + if (fgd->num_y_points) + for (int i = 0; i < num_y_pos; i++) + fgd->ar_coeffs_y[i] = dav1d_get_bits(gb, 8) - 128; + for (int pl = 0; pl < 2; pl++) + if (fgd->num_uv_points[pl] || fgd->chroma_scaling_from_luma) { + const int num_uv_pos = num_y_pos + !!fgd->num_y_points; + for (int i = 0; i < num_uv_pos; i++) + fgd->ar_coeffs_uv[pl][i] = dav1d_get_bits(gb, 8) - 128; + if (!fgd->num_y_points) + fgd->ar_coeffs_uv[pl][num_uv_pos] = 0; + } + fgd->ar_coeff_shift = dav1d_get_bits(gb, 2) + 6; + fgd->grain_scale_shift = dav1d_get_bits(gb, 2); + for (int pl = 0; pl < 2; pl++) + if (fgd->num_uv_points[pl]) { + fgd->uv_mult[pl] = dav1d_get_bits(gb, 8) - 128; + fgd->uv_luma_mult[pl] = dav1d_get_bits(gb, 8) - 128; + fgd->uv_offset[pl] = dav1d_get_bits(gb, 9) - 256; + } + fgd->overlap_flag = dav1d_get_bit(gb); + fgd->clip_to_restricted_range = dav1d_get_bit(gb); + } } - } else { - memset(&hdr->film_grain.data, 0, sizeof(hdr->film_grain.data)); } #if DEBUG_FRAME_HDR printf("HDR: post-filmgrain: off=%td\n", (gb->ptr - init_ptr) * 8 - gb->bits_left); #endif diff --git a/third_party/dav1d/src/recon_tmpl.c b/third_party/dav1d/src/recon_tmpl.c --- a/third_party/dav1d/src/recon_tmpl.c +++ b/third_party/dav1d/src/recon_tmpl.c @@ -399,20 +399,20 @@ tx, t_dim->min, idx, *txtp, ts->msac.rng); } } // find end-of-block (eob) - int eob_bin; + int eob; const int slw = imin(t_dim->lw, TX_32X32), slh = imin(t_dim->lh, TX_32X32); const int tx2dszctx = slw + slh; const enum TxClass tx_class = dav1d_tx_type_class[*txtp]; const int is_1d = tx_class != TX_CLASS_2D; switch (tx2dszctx) { #define case_sz(sz, bin, ns, is_1d) \ case sz: { \ uint16_t *const eob_bin_cdf = ts->cdf.coef.eob_bin_##bin[chroma]is_1d; \ - eob_bin = dav1d_msac_decode_symbol_adapt##ns(&ts->msac, eob_bin_cdf, 4 + sz); \ + eob = dav1d_msac_decode_symbol_adapt##ns(&ts->msac, eob_bin_cdf, 4 + sz); \ break; \ } case_sz(0, 16, 8, [is_1d]); case_sz(1, 32, 8, [is_1d]); case_sz(2, 64, 8, [is_1d]); @@ -422,25 +422,22 @@ case_sz(6, 1024, 16, ); #undef case_sz } if (dbg) printf("Post-eob_bin_%d[%d][%d][%d]: r=%d\n", - 16 << tx2dszctx, chroma, is_1d, eob_bin, ts->msac.rng); - int eob; - if (eob_bin > 1) { + 16 << tx2dszctx, chroma, is_1d, eob, ts->msac.rng); + if (eob > 1) { + const int eob_bin = eob - 2; uint16_t *const eob_hi_bit_cdf = ts->cdf.coef.eob_hi_bit[t_dim->ctx][chroma][eob_bin]; const int eob_hi_bit = dav1d_msac_decode_bool_adapt(&ts->msac, eob_hi_bit_cdf); if (dbg) printf("Post-eob_hi_bit[%d][%d][%d][%d]: r=%d\n", t_dim->ctx, chroma, eob_bin, eob_hi_bit, ts->msac.rng); - eob = ((eob_hi_bit | 2) << (eob_bin - 2)) | - dav1d_msac_decode_bools(&ts->msac, eob_bin - 2); + eob = ((eob_hi_bit | 2) << eob_bin) | dav1d_msac_decode_bools(&ts->msac, eob_bin); if (dbg) printf("Post-eob[%d]: r=%d\n", eob, ts->msac.rng); - } else { - eob = eob_bin; } assert(eob >= 0); // base tokens uint16_t (*const eob_cdf)[4] = ts->cdf.coef.eob_base_tok[t_dim->ctx][chroma]; @@ -479,11 +476,11 @@ printf("Post-hi_tok[%d][%d][%d][%d=%d=%d]: r=%d\n", \ imin(t_dim->ctx, 3), chroma, ctx, eob, rc, tok, \ ts->msac.rng); \ } \ cf[rc] = tok << 11; \ - if (TX_CLASS_2D) \ + if (tx_class == TX_CLASS_2D) \ level = levels + rc; \ else \ level = levels + x * stride + y; \ *level = (uint8_t) level_tok; \ for (int i = eob - 1; i > 0; i--) { /* ac */ \ @@ -493,12 +490,12 @@ else if (tx_class == TX_CLASS_H) \ x = i & mask, y = i >> shift, rc_i = i; \ else /* tx_class == TX_CLASS_V */ \ x = i & mask, y = i >> shift, rc_i = (x << shift2) | y; \ assert(x < 32 && y < 32); \ - if (TX_CLASS_2D) \ - level = levels + rc; \ + if (tx_class == TX_CLASS_2D) \ + level = levels + rc_i; \ else \ level = levels + x * stride + y; \ ctx = get_lo_ctx(level, tx_class, &mag, lo_ctx_offsets, x, y, stride); \ if (tx_class == TX_CLASS_2D) \ y |= x; \ diff --git a/third_party/dav1d/src/refmvs.h b/third_party/dav1d/src/refmvs.h --- a/third_party/dav1d/src/refmvs.h +++ b/third_party/dav1d/src/refmvs.h @@ -36,14 +36,15 @@ #include "src/intra_edge.h" #include "src/tables.h" #define INVALID_MV 0x80008000 +#define INVALID_REF2CUR (-32) PACKED(typedef struct refmvs_temporal_block { mv mv; - int8_t ref; + uint8_t ref; }) refmvs_temporal_block; CHECK_SIZE(refmvs_temporal_block, 5); PACKED(typedef union refmvs_refpair { int8_t ref[2]; // [0] = 0: intra=1, [1] = -1: comp=0 @@ -70,12 +71,12 @@ int sbsz; int use_ref_frame_mvs; uint8_t sign_bias[7], mfmv_sign[7]; int8_t pocdiff[7]; uint8_t mfmv_ref[3]; - int mfmv_ref2cur[3]; - int mfmv_ref2ref[3][7]; + int8_t mfmv_ref2cur[3]; + uint8_t mfmv_ref2ref[3][7]; int n_mfmvs; int n_blocks; refmvs_temporal_block *rp; /*const*/ refmvs_temporal_block *const *rp_ref; @@ -127,13 +128,13 @@ // call once per frame int dav1d_refmvs_init_frame(refmvs_frame *rf, const Dav1dSequenceHeader *seq_hdr, const Dav1dFrameHeader *frm_hdr, - const unsigned ref_poc[7], + const uint8_t ref_poc[7], refmvs_temporal_block *rp, - const unsigned ref_ref_poc[7][7], + const uint8_t ref_ref_poc[7][7], /*const*/ refmvs_temporal_block *const rp_ref[7], int n_tile_threads, int n_frame_threads); // cache the current tile/sbrow (or frame/sbrow)'s projectable motion vectors // into buffers for use in future frame's temporal MV prediction diff --git a/third_party/dav1d/src/refmvs.c b/third_party/dav1d/src/refmvs.c --- a/third_party/dav1d/src/refmvs.c +++ b/third_party/dav1d/src/refmvs.c @@ -708,11 +708,11 @@ } rp_proj = &rf->rp_proj[16 * stride * tile_row_idx]; for (int n = 0; n < rf->n_mfmvs; n++) { const int ref2cur = rf->mfmv_ref2cur[n]; - if (ref2cur == INT_MIN) continue; + if (ref2cur == INVALID_REF2CUR) continue; const int ref = rf->mfmv_ref[n]; const int ref_sign = ref - 4; const refmvs_temporal_block *r = &rf->rp_ref[ref][row_start8 * stride]; for (int y = row_start8; y < row_end8; y++) { @@ -797,13 +797,13 @@ } int dav1d_refmvs_init_frame(refmvs_frame *const rf, const Dav1dSequenceHeader *const seq_hdr, const Dav1dFrameHeader *const frm_hdr, - const unsigned ref_poc[7], + const uint8_t ref_poc[7], refmvs_temporal_block *const rp, - const unsigned ref_ref_poc[7][7], + const uint8_t ref_ref_poc[7][7], /*const*/ refmvs_temporal_block *const rp_ref[7], const int n_tile_threads, const int n_frame_threads) { const int rp_stride = ((frm_hdr->width[0] + 127) & ~127) >> 3; const int n_tile_rows = n_tile_threads > 1 ? frm_hdr->tiling.rows : 1; @@ -834,11 +834,11 @@ rf->rp_proj = (refmvs_temporal_block*)((uintptr_t)rf->r + r_sz); rf->n_blocks = n_blocks; } - const unsigned poc = frm_hdr->frame_offset; + const int poc = frm_hdr->frame_offset; for (int i = 0; i < 7; i++) { const int poc_diff = get_poc_diff(seq_hdr->order_hint_n_bits, ref_poc[i], poc); rf->sign_bias[i] = poc_diff > 0; rf->mfmv_sign[i] = poc_diff < 0; @@ -873,19 +873,19 @@ } if (rf->n_mfmvs < total && rp_ref[1]) rf->mfmv_ref[rf->n_mfmvs++] = 1; // last2 for (int n = 0; n < rf->n_mfmvs; n++) { - const unsigned rpoc = ref_poc[rf->mfmv_ref[n]]; + const int rpoc = ref_poc[rf->mfmv_ref[n]]; const int diff1 = get_poc_diff(seq_hdr->order_hint_n_bits, rpoc, frm_hdr->frame_offset); if (abs(diff1) > 31) { - rf->mfmv_ref2cur[n] = INT_MIN; + rf->mfmv_ref2cur[n] = INVALID_REF2CUR; } else { rf->mfmv_ref2cur[n] = rf->mfmv_ref[n] < 4 ? -diff1 : diff1; for (int m = 0; m < 7; m++) { - const unsigned rrpoc = ref_ref_poc[rf->mfmv_ref[n]][m]; + const int rrpoc = ref_ref_poc[rf->mfmv_ref[n]][m]; const int diff2 = get_poc_diff(seq_hdr->order_hint_n_bits, rpoc, rrpoc); // unsigned comparison also catches the < 0 case rf->mfmv_ref2ref[n][m] = (unsigned) diff2 > 31U ? 0 : diff2; } diff --git a/third_party/dav1d/src/riscv/64/ipred.S b/third_party/dav1d/src/riscv/64/ipred.S --- a/third_party/dav1d/src/riscv/64/ipred.S +++ b/third_party/dav1d/src/riscv/64/ipred.S @@ -25,10 +25,57 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *****************************************************************************/ #include "src/riscv/asm.S" +// void ipred_v_8bpc_rvv(pixel *dst, const ptrdiff_t stride, +// const pixel *const topleft, +// const int width, const int height, const int a, +// const int max_width, const int max_height) +function ipred_v_8bpc_rvv, export=1, ext="v,zba" + csrw vxrm, zero + addi a2, a2, 1 + vsetvli t0, a3, e8, m1, ta, ma + bne t0, a3, 3f // Go to slow path - whole row doesn't fit in regsiter +1: + // Fast path - row fits in register + add t1, a0, a1 + vle8.v v4, (a2) +2: + vse8.v v4, (a0) + sh1add a0, a1, a0 + vse8.v v4, (t1) + sh1add t1, a1, t1 + addi a4, a4, -2 + bnez a4, 2b + ret + + // Row doesn't fit in register. +3: + vsetvli t0, a3, e8, m2, ta, ma // Try using 2 registers at once (LMUL=2) + beq t0, a3, 1b // Back to fast path - now it fits + +4: + // No need for more vsetli, since both width and VLEN are power of 2, so there is no tail. + vle8.v v4, (a2) + mv t2, a0 + mv t1, a4 +5: + vse8.v v4, (t2) + add t2, t2, a1 + addi t1, t1, -1 + bnez t1, 5b // Loop over rows. + + sub a3, a3, t0 + add a2, a2, t0 + add a0, a0, t0 + bnez a3, 4b // Loop over columns + + ret +endfunc + + function dc_gen_8bpc_rvv, export=1, ext="v,zbb" .variant_cc dav1d_dc_gen_8bpc_rvv add t1, a1, a2 srli t5, t1, 1 mv t1, a1 diff --git a/third_party/dav1d/src/riscv/64/mc.S b/third_party/dav1d/src/riscv/64/mc.S --- a/third_party/dav1d/src/riscv/64/mc.S +++ b/third_party/dav1d/src/riscv/64/mc.S @@ -1,8 +1,9 @@ /****************************************************************************** * Copyright © 2018, VideoLAN and dav1d authors * Copyright © 2024, Nathan Egge, Niklas Haas, Bogdan Gligorijevic + * Copyright © 2025, Sungjoon Moon * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * @@ -530,5 +531,423 @@ addi sp, sp, 2*15*8 ret endfunc + +function emu_edge_8bpc_rvv, export=1, ext="v,zbb" + ld t0, 0(sp) + ld t1, 8(sp) + + // int cx = iclip((int) x, 0, (int) iw - 1); + max t2, a4, zero + addi t4, a2, -1 + min t2, t2, t4 + + // int cy = iclip((int) y, 0, (int) ih - 1); + max t3, a5, zero + addi t5, a3, -1 + min t3, t3, t5 + + // ref += cy*PXSTRIDE(ref_stride) + cx + mul t3, t3, t1 + add t3, t3, t2 + + add t0, t0, t3 + + addi t4, a0, -1 + + neg t2, a4 + add t3, a4, a0 + sub t3, t3, a2 + + // int left_ext = iclip((int) -x, 0, (int) bw - 1); + max t2, t2, zero + min a2, t2, t4 # a2 = left_ext + + // int right_ext = iclip((int) (x + bw - iw), 0, (int) bw - 1); + max t3, t3, zero + min a4, t3, t4 # a4 = right_ext + + addi t6, a1, -1 + + neg t4, a5 + add t5, a5, a1 + sub t5, t5, a3 + + // int top_ext = iclip((int) -y, 0, (int) bh - 1); + max t4, t4, zero + min a3, t4, t6 # a3 = top_ext + + // int bottom_ext = iclip((int) (x + bh - ih), 0, (int) bh - 1); + max t5, t5, zero + min a5, t5, t6 # a5 = bottom_ext + + sub t4, a1, a3 + sub t4, t4, a5 # t4 = center_h + + mul t5, a3, a7 + add a1, a6, t5 # blk = dst + top_ext * dst_stride + + sub t3, a0, a2 + sub t3, t3, a4 # t3 = center_w = bw - left_ext - right_ext + +.macro v_loop need_left, need_right +9: + # pixel_copy() + add t5, a1, a2 # t5 = blk + left_ext + mv t2, t0 # ref +0: + vsetvli t6, t3, e8, m1, ta, ma + vle8.v v8, (t2) + add t2, t2, t6 + + vse8.v v8, (t5) + sub t3, t3, t6 + add t5, t5, t6 + bnez t3, 0b + + sub t3, a0, a2 + sub t3, t3, a4 # t3 = center_w = bw - left_ext - right_ext + +.if \need_left + lb t2, (t0) # ref[0] + # pixel_set() + vsetvli t6, a2, e8, m1, ta, ma + vmv.v.x v8, t2 + mv t2, a2 # left_ext + mv t5, a1 # blk +0: + vse8.v v8, (t5) + sub t2, t2, t6 # left_ext -= t6 + add t5, t5, t6 # blk += t6 + vsetvli t6, t2, e8, m1, ta, ma + bnez t2, 0b +.endif + +.if \need_right + add t5, a1, a2 # t5 = blk + left_ext + add t5, t5, t3 # t5 = blk + left_ext + center_w + lb t2, -1(t5) # blk[left_ext + center_w - 1] + # pixel_set() + vsetvli t6, a4, e8, m1, ta, ma + vmv.v.x v8, t2 + mv t2, a4 # right_ext +0: + vse8.v v8, (t5) + sub t2, t2, t6 + add t5, t5, t6 + vsetvli t6, t2, e8, m1, ta, ma + bnez t2, 0b +.endif + + add t0, t0, t1 # ref += ref_stride + add a1, a1, a7 # blk += dst_stride + addi t4, t4, -1 # center_h-- + bnez t4, 9b +.endm + +L(emu_edge_center): + blez t4, L(emu_edge_bottom) + + beqz a2, 1f # if (left_ext) + beqz a4, 2f # if (right_ext) + v_loop 1, 1 + j L(emu_edge_bottom) + +1: + beqz a4, 3f + v_loop 0, 1 + j L(emu_edge_bottom) + +2: + v_loop 1, 0 + j L(emu_edge_bottom) + +3: + v_loop 0, 0 + +L(emu_edge_bottom): # copy bottom + blez a5, L(emu_edge_top) + mv t2, a0 # bw +2: + mv t5, a5 # bottom_ext + mv t1, a1 # dst + + vsetvli t6, t2, e8, m1, ta, ma + sub t0, t1, a7 # dst - dst_stride + vle8.v v8, (t0) +0: + vse8.v v8, (t1) + add t1, t1, a7 + addi t5, t5, -1 + bnez t5, 0b + + sub t2, t2, t6 + add a1, a1, t6 + bnez t2, 2b + +L(emu_edge_top): # copy top + blez a3, L(emu_edge_end) + mul t5, a3, a7 + add t1, a6, t5 # blk = dst + top_ext * PXSTRIDE(dst_stride) + # a6 = dst +1: + mv t0, a3 # top_ext + mv t4, a6 # dst + + vsetvli t6, a0, e8, m1, ta, ma + vle8.v v8, (t1) +0: + vse8.v v8, (t4) + add t4, t4, a7 + vse8.v v8, (t4) + add t4, t4, a7 + addi t0, t0, -2 + bgtz t0, 0b + + sub a0, a0, t6 + add t1, t1, t6 + add a6, a6, t6 + + bnez a0, 1b + +L(emu_edge_end): + ret +endfunc + +.macro w_mask_fn type vlen +function w_mask_\type\()_\vlen\()8bpc_rvv, export=1, ext="v,zba,zbb" + csrw vxrm, zero + li t1, 38*256+8 +.ifc \vlen, vl256_ + addi t0, zero, 64 + bgt a4, t0, 2f + li t2, 0xCAC9C8CFCE0000 + li t3, 0xC1C0C7C6C50000 +.else + addi t0, zero, 32 + bgt a4, t0, 2f + li t2, 0xCAC9C8CF0000 + li t3, 0xC1C0C7C60000 +.endif + ctz t4, a4 + slli t4, t4, 3 + srl t2, t2, t4 + andi t2, t2, 0xFF + srl t3, t3, t4 + andi t3, t3, 0xFF + +1: +.if \type == 444 +w_mask_body 444 narrow + + sh1add a0, a1, a0 # dst += dst_stride + add a6, a6, a4 # mask += w +.elseif \type == 422 +w_mask_body 422 narrow + + sh1add a0, a1, a0 # dst += dst_stride + srli t4, a4, 1 + add a6, a6, t4 # mask += w >> 1 +.elseif \type == 420 +w_mask_body 420 narrow + + sh1add a0, a1, a0 # dst += dst_stride +.endif + + sh1add a2, a4, a2 + sh1add a3, a4, a3 + + addi a5, a5, -2 + bnez a5, 1b + + ret + +2: + li t2, 0xca + li t3, 0xc1 + +3: + mv t5, zero + +.if \type == 444 +w_mask_body 444 wide # VLEN>=256 +.elseif \type == 422 +w_mask_body 422 wide # VLEN>=256 +.elseif \type == 420 +w_mask_body 420 wide # VLEN>=256 +.endif + + add t5, t5, t6 + bne t5, a4, 4b + + sh1add a0, a1, a0 # dst += dst_stride +.if \type == 444 + add a6, a6, a4 # mask += w +.elseif \type == 422 + srli t4, a4, 1 + add a6, a6, t4 # mask += w >> 1 +.elseif \type == 420 +.endif + + sh1add a2, a4, a2 + sh1add a3, a4, a3 + + addi a5, a5, -2 + bnez a5, 3b + + ret + +endfunc +.endm + +.macro w_mask_body type size + mv t0, a0 # dst + +4: + vsetvl t6, a4, t2 + + # load tmp1 and tmp2 + vle16.v v0, (a2) # tmp1[x] + + sh1add t4, a4, a2 # tmp1 + vle16.v v16, (t4) # tmp1[x] + sh1add a2, t6, a2 # tmp1 += w / k + + vle16.v v4, (a3) # tmp2[x] + + sh1add t4, a4, a3 # tmp2 + vle16.v v20, (t4) # tmp2[x] + sh1add a3, t6, a3 # tmp2 += w / k + + # v12 = abs(tmp1[x] - tmp2[x]) + vsub.vv v12, v0, v4 # tmp1[x] - tmp2[x] + vsub.vv v8, v4, v0 # tmp2[x] - tmp1[x] + vmax.vv v8, v12, v8 + + vsub.vv v28, v16, v20 # tmp1[x] - tmp2[x] + vsub.vv v24, v20, v16 # tmp2[x] - tmp1[x] + vmax.vv v24, v28, v24 + + li t4, 64 + + # min(38 + (v12 + 8) >> 8, 64) -> min((v12 + 38*256 + 8) >> 8, 64) + vadd.vx v8, v8, t1 + vsra.vi v8, v8, 8 + vmin.vx v8, v8, t4 + + vadd.vx v24, v24, t1 + vsra.vi v24, v24, 8 + vmin.vx v24, v24, t4 + + # dst[x] = (tmp1[x] - tmp2[x]) * m + 64 * tmp2[x]; + # v12, v28 = tmp1[x] - tmp2[x] + # v8, v24 = {m,n} + vwmul.vx v0, v4, t4 + vwmacc.vv v0, v8, v12 + vnclipu.wi v0, v0, 10 + vmax.vx v0, v0, zero + + vwmul.vx v16, v20, t4 + vwmacc.vv v16, v24, v28 + vnclipu.wi v16, v16, 10 + vmax.vx v16, v16, zero + +.if \type == 444 + vsetvl zero, zero, t3 + + vnclipu.wi v0, v0, 0 + vnclipu.wi v16, v16, 0 + + vse8.v v0, (t0) # dst[x] = + add t4, t0, a1 + vse8.v v16, (t4) # dst[x] = + add t0, t0, t6 + + vnsrl.wi v8, v8, 0 + vnsrl.wi v24, v24, 0 + + vse8.v v8, (a6) # mask[x] = m + add t4, a6, a4 + vse8.v v24, (t4) # mask[x] = m + add a6, a6, t6 + +.elseif \type == 422 + # v4, v20 = m + # v12, v28 = n + vnsrl.wi v4, v8, 0 + vnsrl.wi v8, v8, 16 + + vnsrl.wi v20, v24, 0 + vnsrl.wi v24, v24, 16 + + # v8, v24 = m + n - sign + vadd.vv v8, v4, v8 + vsub.vx v8, v8, a7 + + vadd.vv v24, v20, v24 + vsub.vx v24, v24, a7 + + vsetvl zero, zero, t3 + + vnclipu.wi v0, v0, 0 + vnclipu.wi v16, v16, 0 + + vse8.v v0, (t0) # dst[x] = + add t4, t0, a1 + vse8.v v16, (t4) # dst[x] = + add t0, t0, t6 + + vnclipu.wi v8, v8, 1 + vnclipu.wi v24, v24, 1 + +.ifc \size, wide + srli t4, t6, 1 + vsetvl zero, t4, t3 +.endif + + vse8.v v8, (a6) # mask[x] = m + n + 1 - sign + srli t4, a4, 1 + add t4, a6, t4 + vse8.v v24, (t4) # mask[x] = m + n + 1 - sign + srli t4, t6, 1 + add a6, a6, t4 +.elseif \type == 420 + # v4, v20 = m + # v12, v28 = n + vnsrl.wi v4, v8, 0 + vnsrl.wi v8, v8, 16 + + vnsrl.wi v20, v24, 0 + vnsrl.wi v24, v24, 16 + + # v8 = m + n + mask[x >> 1] + vadd.vv v8, v4, v8 + vadd.vv v24, v20, v24 + vadd.vv v8, v8, v24 + vsub.vx v8, v8, a7 + + vsetvl zero, zero, t3 + + vnclipu.wi v0, v0, 0 + vnclipu.wi v16, v16, 0 + + vse8.v v0, (t0) # dst[x] = + add t4, t0, a1 + vse8.v v16, (t4) # dst[x] = + add t0, t0, t6 + + vnclipu.wi v8, v8, 2 + + vse8.v v8, (a6) # mask[x] = (m + n + mask[x >> 1] + 2 - sign) >> 2; + srli t4, t6, 1 + add a6, a6, t4 +.endif +.endm + +w_mask_fn 444 +w_mask_fn 444 vl256_ +w_mask_fn 422 +w_mask_fn 422 vl256_ +w_mask_fn 420 +w_mask_fn 420 vl256_ diff --git a/third_party/dav1d/src/riscv/ipred.h b/third_party/dav1d/src/riscv/ipred.h --- a/third_party/dav1d/src/riscv/ipred.h +++ b/third_party/dav1d/src/riscv/ipred.h @@ -31,10 +31,11 @@ decl_cfl_pred_fn(BF(dav1d_ipred_cfl, rvv)); decl_cfl_pred_fn(BF(dav1d_ipred_cfl_128, rvv)); decl_cfl_pred_fn(BF(dav1d_ipred_cfl_top, rvv)); decl_cfl_pred_fn(BF(dav1d_ipred_cfl_left, rvv)); +decl_angular_ipred_fn(BF(dav1d_ipred_v, rvv)); decl_angular_ipred_fn(BF(dav1d_ipred_paeth, rvv)); decl_angular_ipred_fn(BF(dav1d_ipred_smooth, rvv)); decl_angular_ipred_fn(BF(dav1d_ipred_smooth_v, rvv)); decl_angular_ipred_fn(BF(dav1d_ipred_smooth_h, rvv)); @@ -50,10 +51,11 @@ c->cfl_pred[DC_PRED ] = dav1d_ipred_cfl_8bpc_rvv; c->cfl_pred[DC_128_PRED ] = dav1d_ipred_cfl_128_8bpc_rvv; c->cfl_pred[TOP_DC_PRED ] = dav1d_ipred_cfl_top_8bpc_rvv; c->cfl_pred[LEFT_DC_PRED] = dav1d_ipred_cfl_left_8bpc_rvv; + c->intra_pred[VERT_PRED ] = dav1d_ipred_v_8bpc_rvv; c->intra_pred[PAETH_PRED ] = dav1d_ipred_paeth_8bpc_rvv; c->intra_pred[SMOOTH_PRED ] = dav1d_ipred_smooth_8bpc_rvv; c->intra_pred[SMOOTH_V_PRED] = dav1d_ipred_smooth_v_8bpc_rvv; c->intra_pred[SMOOTH_H_PRED] = dav1d_ipred_smooth_h_8bpc_rvv; diff --git a/third_party/dav1d/src/riscv/mc.h b/third_party/dav1d/src/riscv/mc.h --- a/third_party/dav1d/src/riscv/mc.h +++ b/third_party/dav1d/src/riscv/mc.h @@ -38,12 +38,21 @@ decl_avg_fn(BF(dav1d_avg, rvv)); decl_w_avg_fn(BF(dav1d_w_avg, rvv)); decl_mask_fn(BF(dav1d_mask, rvv)); +decl_w_mask_fn(BF(dav1d_w_mask_444, rvv)); +decl_w_mask_fn(BF(dav1d_w_mask_422, rvv)); +decl_w_mask_fn(BF(dav1d_w_mask_420, rvv)); + +decl_w_mask_fn(BF(dav1d_w_mask_444_vl256, rvv)); +decl_w_mask_fn(BF(dav1d_w_mask_422_vl256, rvv)); +decl_w_mask_fn(BF(dav1d_w_mask_420_vl256, rvv)); + decl_warp8x8_fn(BF(dav1d_warp_8x8, rvv)); decl_warp8x8t_fn(BF(dav1d_warp_8x8t, rvv)); +decl_emu_edge_fn(BF(dav1d_emu_edge, rvv)); static ALWAYS_INLINE void mc_dsp_init_riscv(Dav1dMCDSPContext *const c) { const unsigned flags = dav1d_get_cpu_flags(); if (!(flags & DAV1D_RISCV_CPU_FLAG_V)) return; @@ -56,18 +65,27 @@ c->blend_v = BF(dav1d_blend_v_vl256, rvv); } #if BITDEPTH == 8 c->blend_h = BF(dav1d_blend_h, rvv); + c->emu_edge = BF(dav1d_emu_edge, rvv); - if (dav1d_get_vlen() >= 256) { - c->blend_h = BF(dav1d_blend_h_vl256, rvv); - } + c->w_mask[0] = BF(dav1d_w_mask_444, rvv); + c->w_mask[1] = BF(dav1d_w_mask_422, rvv); + c->w_mask[2] = BF(dav1d_w_mask_420, rvv); c->avg = BF(dav1d_avg, rvv); c->w_avg = BF(dav1d_w_avg, rvv); c->mask = BF(dav1d_mask, rvv); c->warp8x8 = BF(dav1d_warp_8x8, rvv); c->warp8x8t = BF(dav1d_warp_8x8t, rvv); + + if (dav1d_get_vlen() >= 256) { + c->blend_h = BF(dav1d_blend_h_vl256, rvv); + + c->w_mask[0] = BF(dav1d_w_mask_444_vl256, rvv); + c->w_mask[1] = BF(dav1d_w_mask_422_vl256, rvv); + c->w_mask[2] = BF(dav1d_w_mask_420_vl256, rvv); + } #endif } diff --git a/third_party/dav1d/src/x86/filmgrain16_avx2.asm b/third_party/dav1d/src/x86/filmgrain16_avx2.asm --- a/third_party/dav1d/src/x86/filmgrain16_avx2.asm +++ b/third_party/dav1d/src/x86/filmgrain16_avx2.asm @@ -869,11 +869,11 @@ vpbroadcastd m12, [base+fg_min+r10*4] vpbroadcastd m13, [base+fg_max+r9*4] test sbyd, sbyd setnz r7b vpbroadcastd m14, [base+pd_16] - test r7b, [fg_dataq+FGData.overlap_flag] + test [fg_dataq+FGData.overlap_flag], r7b jnz .vertical_overlap imul seed, sbyd, (173 << 24) | 37 add seed, (105 << 24) | 178 rorx seed, seed, 24 @@ -1361,11 +1361,11 @@ %else vpbroadcastq m15, [base+pw_27_17_17_27] %endif vpbroadcastd m14, [base+pd_16] %endif - test r7b, [fg_dataq+FGData.overlap_flag] + test [fg_dataq+FGData.overlap_flag], r7b jnz %%vertical_overlap imul seed, sbyd, (173 << 24) | 37 add seed, (105 << 24) | 178 rorx seed, seed, 24 diff --git a/third_party/dav1d/src/x86/filmgrain16_avx512.asm b/third_party/dav1d/src/x86/filmgrain16_avx512.asm --- a/third_party/dav1d/src/x86/filmgrain16_avx512.asm +++ b/third_party/dav1d/src/x86/filmgrain16_avx512.asm @@ -79,11 +79,11 @@ vpbroadcastd m11, [base+scale_shift+r6*8+4] test sbyd, sbyd setnz r7b vpbroadcastd m12, [base+pw_27_17_17_27+r6*8+0] vpbroadcastd m13, [base+pw_27_17_17_27+r6*8+4] - test r7b, [fg_dataq+FGData.overlap_flag] + test [fg_dataq+FGData.overlap_flag], r7b jnz .v_overlap imul seed, sbyd, (173 << 24) | 37 add seed, (105 << 24) | 178 rorx seed, seed, 24 @@ -415,11 +415,11 @@ vpbroadcastd m14, [fg_dataq+FGData.uv_offset+r6*4] vbroadcasti32x4 m15, [fg_dataq+FGData.uv_mult+r6*4] pmaddwd m14, m0 pshufb m15, m1 ; { uv_luma_mult, uv_mult } %endif - test r7b, [fg_dataq+FGData.overlap_flag] + test [fg_dataq+FGData.overlap_flag], r7b jnz %%v_overlap imul seed, sbyd, (173 << 24) | 37 add seed, (105 << 24) | 178 rorx seed, seed, 24 diff --git a/third_party/dav1d/src/x86/refmvs.asm b/third_party/dav1d/src/x86/refmvs.asm --- a/third_party/dav1d/src/x86/refmvs.asm +++ b/third_party/dav1d/src/x86/refmvs.asm @@ -102,12 +102,12 @@ .use_rf_mvs: resd 1 .sign_bias: resb 7 .mfmv_sign: resb 7 .pocdiff: resb 7 .mfmv_ref: resb 3 - .mfmv_ref2cur: resd 3 - .mfmv_ref2ref: resd 3*7 + .mfmv_ref2cur: resb 3 + .mfmv_ref2ref: resb 3*7 .n_mfmvs: resd 1 .n_blocks: resd 1 .rp: resq 1 .rp_ref: resq 1 .rp_proj: resq 1 @@ -430,23 +430,23 @@ movddup m3, [pq_8192] mov r9d, ystartd mov [rsp+0x38], yendd mov [rsp+0x20], xstartid xor nd, nd - xor n7d, n7d + lea n7q, [rfq+rf.mfmv_ref2ref-1] imul r9, strideq ; ystart * stride mov [rsp+0x48], rfq mov [rsp+0x18], stride5q lea r7, [r9*5] mov [rsp+0x24], ystartd mov [rsp+0x00], r7 .nloop: DEFINE_ARGS y, off, xstart, xend, ystart, rf, n7, refsign, \ ref, rp_ref, xendi, xstarti, _, _, n mov rfq, [rsp+0x48] - mov refd, [rfq+rf.mfmv_ref2cur+nq*4] - cmp refd, 0x80000000 + movsx refd, byte [rfq+rf.mfmv_ref2cur+nq] + cmp refd, -32 ; INVALID_REF2CUR je .next_n mov [rsp+0x40], refd mov offq, [rsp+0x00] ; ystart * stride * 5 movzx refd, byte [rfq+rf.mfmv_ref+nq] lea refsignq, [refq-4] @@ -471,16 +471,14 @@ ref, x, xendi, mvx, mvy, rb, ref2ref mov xd, [rsp+0x20] ; xstarti .xloop: lea rbd, [xq*5] add rbq, srcq - movsx refd, byte [rbq+4] + movzx refd, byte [rbq+4] test refd, refd jz .next_x_bad_ref - mov rfq, [rsp+0x48] - lea ref2refd, [(rf.mfmv_ref2ref/4)+n7q+refq-1] - mov ref2refd, [rfq+ref2refq*4] ; rf->mfmv_ref2ref[n][b_ref-1] + movzx ref2refd, byte [n7q+refq] ; rf->mfmv_ref2ref[n][b_ref-1] test ref2refd, ref2refd jz .next_x_bad_ref lea fracq, [mv_proj] movzx fracd, word [fracq+ref2refq*2] mov mvd, [rbq] @@ -552,11 +550,11 @@ cmp yd, [rsp+0x38] ; yend jne .yloop mov nd, [rsp+0x14] mov ystartd, [rsp+0x24] .next_n: - add n7d, 7 + add n7q, 7 inc nd cmp nd, [rsp+0x0c] ; n_mfmvs jne .nloop .ret: RET diff --git a/third_party/dav1d/tests/seek_stress.c b/third_party/dav1d/tests/seek_stress.c --- a/third_party/dav1d/tests/seek_stress.c +++ b/third_party/dav1d/tests/seek_stress.c @@ -60,11 +60,11 @@ static unsigned get_seed(void) { #ifdef __APPLE__ return (unsigned) mach_absolute_time(); #elif HAVE_CLOCK_GETTIME struct timespec ts; - clock_gettime(CLOCK_MONOTONIC, &ts); + clock_gettime(CLOCK_REALTIME, &ts); return (unsigned) (1000000000ULL * ts.tv_sec + ts.tv_nsec); #endif } #endif