Commit graph

33 commits

Author SHA1 Message Date
Lynne
8c0314d44a
proresdec: call ff_get_format if the interlacing changes
Decoders need to track all state that hwaccels may be intersted in,
and trigger a reconfiguration if it changes.
2025-11-26 15:16:41 +01:00
Lynne
e93e2a5be1
prores: call ff_get_format if width and height change
The issue is that hardware decoders may have some state they depend on,
which would get broken if the dimensions change.
2025-11-12 00:37:19 +01:00
Andreas Rheinhardt
d01608e022 avcodec/proresdec: Remove unused hwaccel_last_picture_private
ProRes is an intra-only codec.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2025-10-25 22:34:30 +02:00
averne
23df9d4172 avcodec/prores: add parser
Introduce a basic parser for ProRes frame headers.
This avoid having to decode an entire frame to
extract codec information.
2025-10-25 19:56:44 +00:00
averne
98412edfed lavc: add a ProRes Vulkan hwaccel
Add a shader-based Apple ProRes decoder.
It supports all codec features for profiles up to
the 4444 XQ profile, ie.:
- 4:2:2 and 4:4:4 chroma subsampling
- 10- and 12-bit component depth
- Interlacing
- Alpha

The implementation consists in two shaders: the
VLD kernel does entropy decoding for color/alpha,
and the IDCT kernel performs the inverse transform
on color components.

Benchmarks for a 4k yuv422p10 sample:
- AMD Radeon 6700XT:   178 fps
- Intel i7 Tiger Lake: 37 fps
- NVidia Orin Nano:    70 fps
2025-10-25 19:54:13 +00:00
averne
3fd55d952e avcodec/proresdec: save slice width parameter in codec context
Save the log2_desired_slice_size_in_mb syntax
element in the codec context.
Required by the Vulkan hwaccel to compute slice
widths and positions.
2025-10-25 19:54:13 +00:00
averne
987368ef25 avcodec/prores: adapt hwaccel code for slice-based accelerators
In preparation for the Vulkan hwaccel.
The existing hwaccel code was designed around
videotoolbox, which ingests the whole frame
bitstream including picture headers.
This adapts the code to accomodate lower-level,
slice-based hwaccels.
2025-10-25 19:54:13 +00:00
averne
9195af77eb proresdec: allocate private memory for hwaccel pictures
In preparation for the Vulkan hwaccel, which
stores per-frame acceleration structures.
2025-10-25 19:54:13 +00:00
averne
a49108fd29 avcodec/proresdec: Remove grayscale hack
This was introduced in commit 9c43703, to support a codec "extension"
in the prores_aw encoder.
This removes the chroma fill loop, and instead performs the inverse
transform on null coefficients, which achieves the same result and
fixes an off-by-one in the chroma values produced.

Updated test to reflect this change.
2025-08-02 06:11:39 +00:00
Lynne
caff29dbb1
FFHWAccel: add buffer_ref argument to start_frame
This commit adds a reference to the buffer as an argument to
start_frame, and adapts all existing code.

This allows for asynchronous hardware accelerators to skip
copying packet data by referencing it.
2025-03-17 08:51:23 +01:00
Andreas Rheinhardt
deee2fb52d avcodec/proresdec: Reuse permutation
The ProresDSPContext already contains the idct_permutation.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2025-02-27 15:30:12 +01:00
Andreas Rheinhardt
802e4f4a53 avcodec/proresdec: Disable HWAccel at compile-time when possible
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2025-02-27 15:30:12 +01:00
Andreas Rheinhardt
57d892bd7b avcodec/prores{dec,dsp}: Remove always-false checks
avctx->bits_per_raw_sample is always 10 or 12 here;
the checks have been added in preparation for making
bits_per_raw_sample user-settable via an AVOption,
but this never happened.

While just at it, also set unpack_alpha earlier
(where bits_per_raw_sample is set).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2025-02-27 15:30:12 +01:00
Andreas Rheinhardt
90ed5ddf66 avcodec/proresdec: Deduplicate debug message
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2025-02-27 15:30:12 +01:00
Andreas Rheinhardt
8ad2daec58 avcodec/proresdec: Don't use LONG_BITSTREAM_READER
Using LONG_BITSTREAM_READER means that every get_bits() call
uses an AV_RB64() to ensure that cache always contains 32 valid bits
(as opposed to the ordinary 25 guaranteed by reading 32 bits);
yet this is unnecessary when unpacking alpha. So only use these
64bit reads where necessary.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2025-02-27 15:30:12 +01:00
Michael Niedermayer
419eee6356
avcodec/proresdec: Consider negative bits left
Fixes: 70036/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_PRORES_fuzzer-6298797647396864
Fixes: shift exponent 40 is too large for 32-bit type 'uint32_t' (aka 'unsigned int')

Found-by: continuous fuzzing process https://github.com/google/oss-fuzz/tree/master/projects/ffmpeg
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
2024-07-23 23:21:14 +02:00
Andreas Rheinhardt
df3cdf4c75 avcodec: Remove redundant setting of AV_FRAME_FLAG_KEY, AV_PICTURE_TYPE_I
This is done generically now.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2024-05-19 11:40:07 +02:00
Andreas Rheinhardt
e123295cc8 avcodec/proresdec2: Rename to proresdec
Once upon a time, there used to be a LGPL and a GPL ProRes decoder
in FFmpeg; the current decoder evolved from the second of these.
But given that it is now the only ProRes decoder we have, it's file
should simply be named proresdec.c (which also brings it in line with
its header).

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
2024-04-03 19:10:30 +02:00
Michael Niedermayer
4b9e9a57ee proresdec: rename to avoid confusion
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2011-10-14 21:45:14 +02:00
Michael Niedermayer
337496980e prores: use C idct for fate as the SSE code is not matching the SSE* code down at the bits
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2011-10-14 19:48:41 +02:00
Michael Niedermayer
8937afd39f proresdec: set CODEC_CAP_DR1, it appears this was forgotten.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2011-10-14 02:18:55 +02:00
Elvis Presley
bebaf4ea1f prores: change license to LGPL, merge some parts.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2011-10-12 19:55:25 +02:00
Michael Niedermayer
28d3738428 Merge remote-tracking branch 'qatar/master'
* qatar/master:
  Add LATM demuxer
  avplay: flush audio decoder with empty packets at EOF if the decoder has CODEC_CAP_DELAY set.
  8svx/iff: fix decoding of compressed stereo 8svx files.
  8svx: log an error message if output buffer is too small
  8svx: check packet size before reading the initial sample value.
  8svx: output 8-bit samples instead of 16-bit.
  8svx: split delta decoding into a separate function.
  mp4: Don't read an empty Decoder Config Descriptor
  fate.sh: Ignore errors from rm command during cleanup.
  fate.sh: Run git-pull in quiet mode to avoid console spam.
  Apple ProRes decoder
  rtmp: Make the input FLV parser handle data cut at any point
  rv34: Check for invalid slices offsets
  eval: test isnan(sqrt(-1)) instead of just sqrt(-1)

Conflicts:
	Changelog
	libavcodec/8svx.c
	libavcodec/proresdec.c
	libavcodec/version.h
	libavformat/iff.c
	libavformat/version.h
	tests/ref/fate/eval

Merged-by: Michael Niedermayer <michaelni@gmx.at>
2011-09-23 00:35:31 +02:00
Maxim Poliakovski
be64629a13 Apple ProRes decoder
Signed-off-by: Martin Storsjö <martin@martin.st>
2011-09-22 14:54:46 +03:00
Jonne Ahner
8a73246391 prores: skip alpha if present 2011-09-22 06:26:52 +02:00
Michael Niedermayer
358d837dad prores: Add forgotten Copyright statements
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2011-09-21 04:03:51 +02:00
Michael Niedermayer
743e1df5c2 prores: Simplify code further
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
2011-09-21 00:08:53 +02:00
Jonne Ahner
ecb0edd9d7 prores: simplify 4444 handling 2011-09-20 23:55:01 +02:00
Jonne Ahner
d673972d30 prores: fixes a few prores 4444 samples 2011-09-20 22:46:36 +02:00
Jonne Ahner
989c02825e prores: use shift instead of multiply 2011-09-20 22:46:17 +02:00
Reimar Döffinger
0bbb1cdc28 Use correct LOCAL_ALIGNED for stack variables instead of DECLARE_ALIGNED.
LOCAL_ALIGNED should work for all compilers/systems whereas
DECLARE_ALIGNED does not work on some (do not remember which though).

Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
2011-09-20 19:05:51 +02:00
Reimar Döffinger
b9acca288e Remove unused variable.
Signed-off-by: Reimar Döffinger <Reimar.Doeffinger@gmx.de>
2011-09-20 19:05:51 +02:00
Elvis Presley
5554de13b2 ProRes Decoder
Signed-off-by: Elvis Presley <elvis@e.p>
2011-09-15 15:58:56 +02:00