This work is sponsored by, and copyright, Google.
The filter coefficients are signed values, where the product of the
multiplication with one individual filter coefficient doesn't
overflow a 16 bit signed value (the largest filter coefficient is
127). But when the products are accumulated, the resulting sum can
overflow the 16 bit signed range. Instead of accumulating in 32 bit,
we accumulate the largest product (either index 3 or 4) last with a
saturated addition.
(The VP8 MC asm does something similar, but slightly simpler, by
accumulating each half of the filter separately. In the VP9 MC
filters, each half of the filter can also overflow though, so the
largest component has to be handled individually.)
Examples of relative speedup compared to the C version, from checkasm:
Cortex A7 A8 A9 A53
vp9_avg4_neon: 1.71 1.15 1.42 1.49
vp9_avg8_neon: 2.51 3.63 3.14 2.58
vp9_avg16_neon: 2.95 6.76 3.01 2.84
vp9_avg32_neon: 3.29 6.64 2.85 3.00
vp9_avg64_neon: 3.47 6.67 3.14 2.80
vp9_avg_8tap_smooth_4h_neon: 3.22 4.73 2.76 4.67
vp9_avg_8tap_smooth_4hv_neon: 3.67 4.76 3.28 4.71
vp9_avg_8tap_smooth_4v_neon: 5.52 7.60 4.60 6.31
vp9_avg_8tap_smooth_8h_neon: 6.22 9.04 5.12 9.32
vp9_avg_8tap_smooth_8hv_neon: 6.38 8.21 5.72 8.17
vp9_avg_8tap_smooth_8v_neon: 9.22 12.66 8.15 11.10
vp9_avg_8tap_smooth_64h_neon: 7.02 10.23 5.54 11.58
vp9_avg_8tap_smooth_64hv_neon: 6.76 9.46 5.93 9.40
vp9_avg_8tap_smooth_64v_neon: 10.76 14.13 9.46 13.37
vp9_put4_neon: 1.11 1.47 1.00 1.21
vp9_put8_neon: 1.23 2.17 1.94 1.48
vp9_put16_neon: 1.63 4.02 1.73 1.97
vp9_put32_neon: 1.56 4.92 2.00 1.96
vp9_put64_neon: 2.10 5.28 2.03 2.35
vp9_put_8tap_smooth_4h_neon: 3.11 4.35 2.63 4.35
vp9_put_8tap_smooth_4hv_neon: 3.67 4.69 3.25 4.71
vp9_put_8tap_smooth_4v_neon: 5.45 7.27 4.49 6.52
vp9_put_8tap_smooth_8h_neon: 5.97 8.18 4.81 8.56
vp9_put_8tap_smooth_8hv_neon: 6.39 7.90 5.64 8.15
vp9_put_8tap_smooth_8v_neon: 9.03 11.84 8.07 11.51
vp9_put_8tap_smooth_64h_neon: 6.78 9.48 4.88 10.89
vp9_put_8tap_smooth_64hv_neon: 6.99 8.87 5.94 9.56
vp9_put_8tap_smooth_64v_neon: 10.69 13.30 9.43 14.34
For the larger 8tap filters, the speedup vs C code is around 5-14x.
This is significantly faster than libvpx's implementation of the same
functions, at least when comparing the put_8tap_smooth_64 functions
(compared to vpx_convolve8_horiz_neon and vpx_convolve8_vert_neon from
libvpx).
Absolute runtimes from checkasm:
Cortex A7 A8 A9 A53
vp9_put_8tap_smooth_64h_neon: 20150.3 14489.4 19733.6 10863.7
libvpx vpx_convolve8_horiz_neon: 52623.3 19736.4 21907.7 25027.7
vp9_put_8tap_smooth_64v_neon: 14455.0 12303.9 13746.4 9628.9
libvpx vpx_convolve8_vert_neon: 42090.0 17706.2 17659.9 16941.2
Thus, on the A9, the horizontal filter is only marginally faster than
libvpx, while our version is significantly faster on the other cores,
and the vertical filter is significantly faster on all cores. The
difference is especially large on the A7.
The libvpx implementation does the accumulation in 32 bit, which
probably explains most of the differences.
This is an adapted cherry-pick from libav commits
ffbd1d2b00,
392caa65df,
557c1675cf and
11623217e3.
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
We reset .Lpic_gp to zero at the start of each function, which means
that the logic within movrelx for clearing gp when necessary will
be missed.
This fixes using movrelx in different functions with a different
helper register.
This is cherry-picked from libav commit
824e8c2840.
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
Make them aligned, to allow efficient access to them from simd.
This is an adapted cherry-pick from libav commit
a4cfcddcb0.
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
Also a small cosmetic change to the avx2 idct16 version to make it
explicit that one of the arguments to the write-out macros is unused
for >=avx2 (it uses pmovzxbw instead of punpcklbw).
* commit 'dc08bbf63a217c839aa4c143f2a1d0b7e2e6d997':
vp8dsp: Clarify the first dimension of the mc function tables
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '924e2ecd2b7d51cca60c79351ef16b04dd4245c3':
qsvdec: when a frames ctx is supplied, use its frame dimensions
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '92736c74fb1633e36f7134a880422a9b7db14d3f':
qsvdec: add support for P010 (10-bit 420) decoding
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit 'ce320cf1c4daab3e2e3726ed7d2e879d10f7b991':
qsvdec: use the same mfxFrameInfo for allocating frames that was passed to DECODE_Init
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '536bb17e9659c5ed7576a218d4085cdd6d5742fa':
qsvdec: make ff_qsv_map_pixfmt() return a MFX fourcc as well
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '4926fa9a4aa03f3b751f52e900b9efb87fea0591':
hwcontext_vaapi: Add driver quirks to the hwdevice
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit 'e78e5b735fd559bc7aa3f5a01e9c8d37dc2ec6d8':
swscale: add P010 input support
This commit is a noop, see 2e31434d84
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit 'b7c5f885233a7b8692140c920d9f43220dc830d9':
pixfmt: add P010 pixel format
This commit is a noop, see c2869b4640
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit 'b55566db4c51d920a6496455bb30a608e5a50a41':
avconv: use avcodec_parameters_copy() with streamcopy
The fate-aac-autobsf-adtstoasc changes from writing an audio bitdepth
based on the sample format, which is now available.
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit 'be3e807c8fad1f82766c083073e44396799f155b':
oggparseopus: export pre-skip
Noop, we already export this information
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '029cf99c5166b36f33381cd8ebfa5f1f1f463d1f':
mov: Save number of stsd elements after stream extradata allocation
Mostly noop, see 8b43ee4054
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '6c445990e64124ad64c79423dfd3764520648c89':
tiffenc: Check zlib support for deflate option during initialization
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit 'd8f3b0fb584677d4882e3a2d7c28f8b15c7319f5':
targaenc: Move size check to initialization function
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '67cb2c0f73ec08bdcecd675c1ffe25c3a5b26ef2':
checkasm: hevc: Iterate over features first, then over bitdepths
Noop, we don't have these checkasm tests.
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit 'fe27792fd779ac4cdd5e57be5f6f488483c307b2':
build: Move ff_mpeg12_frame_rate_tab to a separate file
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '8c929037ec75fbe9f367e0a31ee34839e92de481':
build: Add a new component for H.264 parsing code
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '3c08b7bc761b6411f55db68189721638dde2c46a':
ffv1: Report additional bitstream information in verbose mode
Noop, we already have bitstream information printing.
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit 'fe6e5cbea7dbd5d2c67d79b5570e26debb70e95b':
ffv1: Remove version 2 and mark version 3 as non-experimental
Noop, our ffv1 decoder is far more advanced and version 3 has been stable for a while.
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
* commit '7c55fac7dfa8bad9644dea5d03309da30be69563':
fate: Add test for webp
Noop, we already have a variety of webp tests, including a fate-webp target,
which would collide with this test.
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
__MAC_10_11 can be present in updated revision of an older SDK so it
can't reliably detect availability of kAudioFormatEnhancedAC3 constant.
Fixes: b4daa2c40f ('lavc/audiotoolboxdec: add eac3 decoder')
Cc: Rodger Combs <rodger.combs@gmail.com>
Signed-off-by: Dmitry Kalinkin <dmitry.kalinkin@gmail.com>
Previous version reviewed by: Rodger Combs <rodger.combs@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>