Commit graph

89 commits

Author SHA1 Message Date
Andreas Rheinhardt
341914495e avcodec/utvideodec: Avoid qsort when creating Huffman tables
The Ut video format uses Huffman trees which are only implicitly coded
in the bitstream: Only the lengths of the codes are coded, the rest has
to be inferred by the decoder according to the rule that the longer
codes are to the left of shorter codes in the tree and on each level the
symbols are descending from left to right.

Because longer codes are to the left of shorter codes, one needs to know
how many non-leaf nodes there are on each level in order to know the
code of the next left-most leaf (which belongs to the highest symbol on
that level). The current code does this by sorting the entries to be
ascending according to length and (for entries with the same length)
ascending according to their symbols. This array is then traversed in
reverse order, so that the lowest level is dealt with first, so that the
number of non-leaf nodes of the next higher level is known when
processing said level.

But this can also be calculated without sorting: Simply count how many
leaf nodes there are on each level. Then one can calculate the number of
non-leaf nodes on each level iteratively from the lowest level upwards:
It is just half the number of nodes of the level below.

This improves performance: For the sample from ticket #4044 the amount
of decicycles for one call to build_huff() decreased from 1055489 to
446310 for Clang 10 and from 1080306 to 535155 for GCC 9.

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
2020-09-26 21:10:45 +02:00
Andreas Rheinhardt
9c8b85f5fa avcodec/utvideodec: Remove code duplication when creating Huffman tables
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
2020-09-26 21:10:45 +02:00
Andreas Rheinhardt
099feb9411 avcodec/utvideodec/enc: Fix edge case of creating Huffman table
The Ut Video format stores Huffman tables in its bitstream by coding
the length of a given symbol; it does not code the actual code directly,
instead this is to be inferred by the rule that a symbol is to the left
of every shorter symbol in the Huffman tree and that for symbols of the
same length the symbol is descending from left to right. With one
exception, this is also what our de- and encoder did.

The exception only matters when there are codes of length 32, because
in this case the first symbol of this length did not get the code 0,
but 1; this is tantamount to pretending that there is a (nonexistent)
leaf of length 32. This is simply false. The reference software agrees
with this [1].

[1]: 2700a471a7/utv_core/HuffmanCode.cpp (L280)

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
2020-09-26 21:10:29 +02:00
Michael Niedermayer
876cfa67f3 avcodec/utvideodec: Fix integer overflow in decode_plane()
Fixes: signed integer overflow: 2147483594 + 142 cannot be represented in type 'int'
Fixes: 20492/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_UTVIDEO_fuzzer-5658568101724160

Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2020-05-12 01:00:28 +02:00
Paul B Mahol
022796c82f avcodec/utvideodec: add support for UQY0 2020-02-25 13:09:20 +01:00
Paul B Mahol
78c8a76536 avcodec/get_bits: unbreak get_bits_le() with cached reader 2019-04-19 13:58:54 +02:00
Paul B Mahol
562f00ed07 avcodec/utvideodec: use cached bitstream reader everywhere except on x86_32
From 100x real-time decoding to 138x real-time decoding for 320x240 video.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
2018-08-30 12:00:27 +02:00
Michael Niedermayer
47b7c68ae5 avcodec/utvideodec: Set pro flag based on fourcc
This avoids mixing 8bit variants with pro and 10bit with non pro mode.
Fixes: out of array read
Fixes: poc_03_30.avi

Found-by: GwanYeong Kim <gy741.kim@gmail.com>
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2018-04-01 02:58:51 +02:00
Michael Niedermayer
7414d0bda7 avcodec/utvideodec: Check subsample factors
Fixes: Out of array read
Fixes: heap_poc

Found-by: GwanYeong Kim <gy741.kim@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2018-02-27 12:23:23 +01:00
Michael Niedermayer
76cc0f0f67 avcodec/utvideodec: Add several out of array read related checks
Fixes: OV_decode_plane.avi

Found-by: GwanYeong Kim <gy741.kim@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2018-02-11 03:04:48 +01:00
Michael Niedermayer
118e1b0b33 avcodec/utvideodec: Fix bytes left check in decode_frame()
Fixes: out of array read
Fixes: poc-2017.avi

Found-by: GwanYeong Kim <gy741.kim@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2018-02-05 02:54:02 +01:00
Paul B Mahol
92b32664cd avcodec/utvideodec: add support for UMH2, UMY2, UMH4, UMY4, UMRA, UMRG
These are new modes which are supposed to be more SIMD friendly.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
2018-01-02 13:41:49 +01:00
Martin Vignali
f2e9156eb6 avcodec/utvideodec : use gradient_pred dsp in interlace decoding 2017-12-19 20:55:08 +01:00
Martin Vignali
630967ef63 avcodec/utvideodec : add SIMD (SSSE3 and AVX2) for gradient_pred 2017-12-09 15:19:03 +01:00
Martin Vignali
9e1c9633cc avcodec/utvideodec : use dsp add_median_pred for second line
process start of the line in scalar, before call dsp
(dsp need align 16)
2017-12-09 15:11:12 +01:00
Martin Vignali
9c71473189 libavcodec/utvideo : simplify decode_plane
the func is only call with step = 1
no need to pass it in the func
2017-11-07 00:51:17 +01:00
James Almer
b428d445a8 Merge commit '7c25523cc8'
* commit '7c25523cc8':
  utvideodec: Fix decoding odd sizes with interlaced video with some formats

See 9ef21a897c

Merged-by: James Almer <jamrial@gmail.com>
2017-10-30 14:25:15 -03:00
Michael Niedermayer
850c6db97d avcodec/utvideodec: Factor multiply out of inner loop
0.5% faster loop

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Reviewed-by: Steven Liu <lingjiujianke@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2017-06-28 14:08:21 +02:00
Michael Niedermayer
5eb4701b7d avcodec/utvideodec: bswap directly without memcpy
Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2017-06-28 14:08:21 +02:00
Michael Niedermayer
676a589c93 avcodec/utvideodec: enable unchecked bitreader
inner reader loop becomes 16% faster

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2017-06-28 14:08:21 +02:00
Michael Niedermayer
9c604b34d4 avcodec/utvideodec: hardcode vlc bits
2.5% faster vlc decoding

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2017-06-28 14:08:21 +02:00
Michael Niedermayer
1835c5e7a4 avcodec/utvideodec: Move bitstream end check out of inner loop
This is not needed when the buffer is large enough for the worst case of a line

2% faster vlc reading

Reviewed-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2017-06-28 14:08:21 +02:00
Paul B Mahol
4ed7c2bbc3 avcodec/utvideodec: add SIMD for restore_rgb_planes
Signed-off-by: Paul B Mahol <onemda@gmail.com>
2017-06-27 09:54:10 +02:00
Paul B Mahol
3594788b71 avcodec/utvideodec: decode to GBR(A)P
This is actually internal utvideo format.
Allows to make use of SIMD for median prediction for rgb(a) formats,
thus speeding up decoding.
Simplifies code, eases further developement and maintenance.

Update FATE because of pixel format switch.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
2017-06-26 20:11:58 +02:00
Paul B Mahol
7c25523cc8 utvideodec: Fix decoding odd sizes with interlaced video with some formats
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2017-04-25 00:38:07 +02:00
Paul B Mahol
4925537004 avcodec/utvideodec: fix gradient prediction when stride does not match width
Fixes #6340.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
2017-04-21 21:46:00 +02:00
Paul B Mahol
9ef21a897c avcodec/utvideodec: fix decoding odd sizes with interlaced video with some formats
Fixes #6316.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
2017-04-21 12:55:30 +02:00
Paul B Mahol
378460fef1 utvideodec: Support for gradient prediction
Introduced with utvideo 18.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2017-04-15 15:37:18 +02:00
Paul B Mahol
9227bd8ac2 utvideodec: Reuse the huffyuv add_left
~10% faster when simd is available.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2017-04-15 15:37:18 +02:00
Paul B Mahol
4f33d9d41a utvideodec: Support ULY4 and ULH4
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2017-04-15 15:37:18 +02:00
Paul B Mahol
a93faf30d6 utvideodec: Support UQRA and UQRG 2017-04-15 15:37:18 +02:00
Paul B Mahol
c523095564 utvideodec: Support UQY2
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2017-04-13 14:09:07 +02:00
Ganesh Ajjanagadde
1fe858136b utvideodec: Prevent possible signed overflow
Doing slice_end - slice_start is unsafe and can lead to undefined behavior
until slice_end has been properly sanitized.

Reviewed-by: Ronald S. Bultje <rsbultje@gmail.com>
Signed-off-by: Ganesh Ajjanagadde <gajjanag@gmail.com>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2017-04-13 13:37:10 +02:00
Paul B Mahol
faa94a576f avcodec/utvideodec: add support for gradient prediction
Signed-off-by: Paul B Mahol <onemda@gmail.com>
2017-04-07 20:11:23 +02:00
Clément Bœsch
eed8ccde3e Merge commit '131a85a1fe'
* commit '131a85a1fe':
  utvideo: Change type of array stride parameters to ptrdiff_t

Merged-by: Clément Bœsch <u@pkh.me>
2017-03-20 11:33:48 +01:00
Martin Storsjö
bc25897630 utvideodec: Add a missing include
This was missing from 77c23704c7, fixing building.

Signed-off-by: Martin Storsjö <martin@martin.st>
2017-02-10 09:31:49 +02:00
Derek Buitenhuis
77c23704c7 avcodec: Mark some codecs with threadsafe init as such
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Signed-off-by: Luca Barbato <lu_zero@gentoo.org>
2017-02-09 23:28:18 +01:00
Derek Buitenhuis
91ed4e7196 avcodec: Mark some codecs with threadsafe init as such
Signed-off-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2017-02-07 23:31:25 +01:00
Diego Biurrun
a25dac976a Use bitstream_init8() where appropriate 2017-02-07 18:27:21 +01:00
James Almer
47f212329e huffyuvdsp: move functions only used by huffyuv from lossless_videodsp
Signed-off-by: James Almer <jamrial@gmail.com>
2017-01-12 22:53:05 -03:00
James Almer
5ac1dd8e23 lossless_videodsp: move shared functions from huffyuvdsp
Several codecs other than huffyuv use them.

Signed-off-by: James Almer <jamrial@gmail.com>
2017-01-12 22:53:04 -03:00
Paul B Mahol
68e5598e22 avcodec/utvideo: fix mistake using wrong arguments for left and lefttop pixel components
Signed-off-by: Paul B Mahol <onemda@gmail.com>
2016-12-24 10:59:26 +01:00
Paul B Mahol
ea93052db3 avcodec/utvideodec: add SIMD support for median prediction for planar formats
~10% faster overall.

Signed-off-by: Paul B Mahol <onemda@gmail.com>
2016-12-23 17:44:01 +01:00
Alexandra Hájková
104a4289f9 utvideodec: Convert to the new bitstream reader 2016-11-24 11:22:12 +01:00
Diego Biurrun
131a85a1fe utvideo: Change type of array stride parameters to ptrdiff_t
ptrdiff_t is the correct type for array strides and similar.
2016-09-08 13:51:30 +02:00
Paul B Mahol
c62cb9bf5a avcodec/utvideodec: add support for ULY4 and ULH4
Signed-off-by: Paul B Mahol <onemda@gmail.com>
2016-09-04 01:57:50 +02:00
Paul B Mahol
84efdabc94 avcodec/utvideodec: add support for UQRG and UQRA formats
Signed-off-by: Paul B Mahol <onemda@gmail.com>
2016-06-12 01:07:23 +02:00
Paul B Mahol
3ecc59bc35 avcodec/utvideodec: fix multiple slices for UQY2 and other issues
Signed-off-by: Paul B Mahol <onemda@gmail.com>
2016-06-11 21:31:49 +02:00
Paul B Mahol
115e63c8d6 avcodec/utvideo: add support for UQY2
Signed-off-by: Paul B Mahol <onemda@gmail.com>
2016-06-11 18:36:39 +02:00
Ganesh Ajjanagadde
e86444b19d lavc/utvideodec: prevent possible signed overflow
Doing slice_end - slice_start is unsafe and can lead to undefined behavior
until slice_end has been properly sanitized.

Reviewed-by: Ronald S. Bultje <rsbultje@gmail.com>
Signed-off-by: Ganesh Ajjanagadde <gajjanag@gmail.com>
2016-02-23 20:37:11 -05:00