mirror of
https://github.com/jellyfin/jellyfin-ffmpeg.git
synced 2026-09-02 21:03:08 +03:00
Merge pull request #731 from nyanmisaka/jellyfin-8.1.2
New upstream version 8.1.2
This commit is contained in:
@@ -1,6 +1,162 @@
|
|||||||
Entries are sorted chronologically from oldest to youngest within each release,
|
Entries are sorted chronologically from oldest to youngest within each release,
|
||||||
releases are sorted from youngest to oldest.
|
releases are sorted from youngest to oldest.
|
||||||
|
|
||||||
|
|
||||||
|
version 8.1.2:
|
||||||
|
swscale/x86/rgb_2_rgb: fix uyvytoyuv422 overwrite on odd width
|
||||||
|
swscale/aarch64: fix uyvy/yuyv to yuv420p/yuv422p on odd width
|
||||||
|
avcodec/snowenc: fix SIGFPE in get_dc() when a block lies outside the plane
|
||||||
|
avcodec/snowenc: fix out-of-bounds OBMC read in get_dc() for narrow planes
|
||||||
|
(fforge/pr/23505) avformat/tls_gnutls:fix crash when connecting to peer
|
||||||
|
libavcodec/jpeg2000htdec: remove trailing whitespace
|
||||||
|
libavdevice/alsa.c: fix NULL pointer dereference
|
||||||
|
avcodec/libjxlenc: check orientation tag metadata before reading
|
||||||
|
avformat/icecast: reject CR/LF in metadata header values
|
||||||
|
avfilter/avf_showspectrum: Fix allocation check
|
||||||
|
avformat/sctp: add size check in sctp_read() matching sctp_write()
|
||||||
|
avcodec/jpeg2000: Fix undefined behavior on ROI shift-up
|
||||||
|
aacdec_usac_mps212: reject reserved freq_res value
|
||||||
|
avcodec/aac/aacdec_usac_mps212: Off-by-one bounds check in ff_aac_ec_data_deci()
|
||||||
|
Update for 8.1.2
|
||||||
|
avcodec/snowenc: fix out-of-bounds memcpy in get_block_rd() for narrow planes
|
||||||
|
avutil/eval: apply unary sign to print, squish, gauss and lerp
|
||||||
|
avcodec/cbs_av1_syntax_template: reset seen_frame_header on sequence headers
|
||||||
|
avfilter/convolution: compute user matrix products in unsigned
|
||||||
|
avformat/mpegts: use av_fast_realloc() for prg
|
||||||
|
avfilter/avf_showcwt: fix DIRECTION_DU EOF fill clearing the wrong rows
|
||||||
|
avfilter/avf_showcwt: fix DIRECTION_RL EOF fill clearing the wrong columns
|
||||||
|
avfilter/avf_showcwt: avoid undefined float to int conversion of nb_consumed_samples
|
||||||
|
avfilter/avf_showcwt: fix out of array read in compute_kernel
|
||||||
|
avfilter/v360: compute remap table offsets in 64bit
|
||||||
|
avfilter/v360: reject out-of-range dimensions
|
||||||
|
swresample/x86/resample: write only int16 in the int16 resampler
|
||||||
|
avformat/rtpenc_amr: Check input size
|
||||||
|
swscale/ppc: fix ASAN stack-buffer-overflow in yuv2planeX
|
||||||
|
swscale/ppc: fix LOAD_FILTER overread in VSX path
|
||||||
|
avcodec/sanm: reject codec37 frames taller than the allocated buffer
|
||||||
|
avcodec/sanm: reject codec47 frames taller than the allocated buffer
|
||||||
|
avfilter: use ff_slice_pos() for per-slice boundary computation
|
||||||
|
avfilter: add ff_slice_pos() helper for slice boundaries
|
||||||
|
(origin/release/8.1, fforge/release/8.1) avformat/iamf_writer: reject muxing PCM streams
|
||||||
|
avfilter/estdif: avoid signed overflow in slice boundary calculation
|
||||||
|
swscale: support sliced input with cascaded scaling contexts
|
||||||
|
avformat/rtspdec: bound Content-Length in the ANNOUNCE handler to SDP_MAX_SIZE
|
||||||
|
avcodec/cbs_h266_syntax_template: reject subpic info with res_change_in_clvs
|
||||||
|
avcodec/misc4: Check nb channels
|
||||||
|
avcodec/rv10, rv34: check init_get_bits8() before RealVideo bit access
|
||||||
|
avformat/http: reject request-line tokens not terminated by whitespace
|
||||||
|
avformat/mov: reject out of range ispe dimensions, avoid overflow summing HEIF tile dimensions
|
||||||
|
avcodec/agm: validate actual src_y against prev plane in decode_inter_plane
|
||||||
|
avformat/dhav: Fix second integer overflow in get_duration()
|
||||||
|
fftools/ffmpeg_dec: deep-copy subtitle_header to fix use-after-free
|
||||||
|
avcodec/hevc/ps: Check window parameters
|
||||||
|
avcodec/hevc/ps: Factor window reading out
|
||||||
|
avcodec/truespeech: reject iterations count whose * 240 product overflows 32-bit
|
||||||
|
libavcodec/options_table: gamma22 and gamma28 aliases
|
||||||
|
avcodec/on2avc: reject subframe count whose * SUBFRAME_SIZE product overflows 32-bit
|
||||||
|
avfilter/zmq: initialize send_buf before shared cleanup on parse failure
|
||||||
|
avcodec/adpcm: fix signed integer overflow in get_nb_samples()
|
||||||
|
avformat/matroskadec: avoid signed overflow in DASH cue time differences
|
||||||
|
avcodec/fastaudio: reject subframes count whose * 256 product overflows 32-bit
|
||||||
|
avcodec/vc2enc_dwt: avoid signed overflow in the 9/7 DWT lifting
|
||||||
|
avcodec/vc2enc_dwt: avoid signed overflow in the 5/3 and Haar DWT
|
||||||
|
avformat/dashdec: Fail with any inner stream count being 0
|
||||||
|
avcodec/mjpegdec: require progress in AVRn interlaced field loop
|
||||||
|
avcodec/mwsc: do not dereference a missing reference frame
|
||||||
|
avcodec/misc4: reject invalid sample rate
|
||||||
|
swscale/output: avoid signed overflow in yuv2rgba64_1 alpha
|
||||||
|
swscale/output: avoid signed overflow in yuv2rgba64_full_1 alpha
|
||||||
|
tools/target_dem_fuzzer: do not exit on io_buffer allocation failure
|
||||||
|
avformat/gxfenc: Check timecode and propagate error
|
||||||
|
swscale/rgb2rgb_template: use unsigned for <<24
|
||||||
|
avformat/iamf_parse: bound substream count by remaining OBU size
|
||||||
|
avformat/matroskadec: bound TRACKENTRY parsing by max_streams
|
||||||
|
avcodec/diracdec: fix heap buffer overflow in edge_emu_buffer
|
||||||
|
avformat/rtmppkt: Check recursion depth
|
||||||
|
avcodec/tdsc: propagate max_pixels to the JPEG tile decoder
|
||||||
|
avcodec/imm5: propagate max_pixels to the H264/HEVC sub-decoders
|
||||||
|
avcodec/cri: propagate max_pixels to the JPEG tile decoder
|
||||||
|
avcodec/jpeglsdec: only apply color transform to decoded rows
|
||||||
|
avcodec/adpcm: require block_align to be a multiple of channels in ADPCM_PSXC init
|
||||||
|
avfilter/avf_showcwt: fix out-of-bounds read in du scroll
|
||||||
|
avfilter/f_ebur128: avoid signed-int wrap when sizing per-channel cache
|
||||||
|
avformat/mov: cap HEIF ICC profile copies via c*max_streams to bound CPU and memory
|
||||||
|
avcodec/aac/aacdec_usac: reject explicit usacSamplingFrequency of 0
|
||||||
|
avcodec/aac/aacdec_usac: avoid signed overflow in decode_tsd
|
||||||
|
avcodec/aac/aacdec: reject decoded frame without a valid sample rate
|
||||||
|
avformat/iff: check av_get_packet() result in ANIM branch
|
||||||
|
avcodec/cbs_h266_syntax_template: Fix pps_exp_slice_height_in_ctus_minus1 range
|
||||||
|
avfilter/vf_scale: split rational multiply
|
||||||
|
avcodec/bsf/dts2pts: fix binary tree invariant violation on selective dec_poc
|
||||||
|
avfilter/vf_drawtext: Avoid double free in glyph_enu_border_free()
|
||||||
|
avfilter/vf_drawtext: plug error-path leaks in measure_text/draw_text
|
||||||
|
avfilter/vf_drawtext: shape_text_hb() free allocated things on error
|
||||||
|
avfilter/vf_drawtext: avoid double-free of aliased FT_Glyph in glyph_enu_free
|
||||||
|
avfilter/vf_drawtext: don't double-free glyph that has been cached in tree
|
||||||
|
avfilter/vf_drawtext: always check pixel_mode == FT_PIXEL_MODE_MONO
|
||||||
|
avcodec/cook: bound subpacket channel sum against channel count
|
||||||
|
avcodec/apv_decode: avoid using apv_cbc
|
||||||
|
avformat/mxfdec: Remove unneeded check
|
||||||
|
avformat/ftp: Check string used for RNTO
|
||||||
|
avformat/ftp: Check for Telnet IAC characters and other non printable ASCII chars
|
||||||
|
avformat/ftp: reject CR/LF in the URL path to prevent FTP command injection
|
||||||
|
avcodec/jpeg2000dec: Clear header derived variables
|
||||||
|
avcodec/bsf/smpte436m_to_eia608: properly frees stuff on errors in ff_smpte436m_to_eia608_filter()
|
||||||
|
tests/checkasm/crc: retain offset values between calls
|
||||||
|
avformat/avc: Adjust get_ue_golomb() to handle 32 bit
|
||||||
|
avformat/whip: require remote DTLS fingerprint in SDP answer
|
||||||
|
avcodec/x86/vorbisdsp: change cmpleps to cmpltps in inverse coupling
|
||||||
|
avcodec/liboapvenc: derive and validate APV profile from pixel format
|
||||||
|
avformat/dashdec: bound manifest reloads and fragment-open retries
|
||||||
|
avfilter/af_join: fix wrong loop bound in buffer dedup (use-after-free)
|
||||||
|
avcodec/nvenc: fix compatibility with Video Codec SDK 13.1
|
||||||
|
avformat/mov: validate APV access unit length before passing to decoder
|
||||||
|
avcodec/h264_slice: guard color_frame() against chroma-width underflow
|
||||||
|
avcodec/magicyuv: reject slice_height misaligned with chroma vshift
|
||||||
|
avcodec/magicyuv: Expand the s->interlaced slice-height sanity check
|
||||||
|
avcodec/magicyuv: Fix 1 line MEDIAN slices
|
||||||
|
avformat/mxfdec: zero-init Sony MPEG-4 extradata and add padding
|
||||||
|
avformat/soxdec: Check sample_rate for nan
|
||||||
|
tests/tiny_ssim: fixed mistake in ssim_c1 calculation
|
||||||
|
avformat/hls: Check TIME-OFFSET value
|
||||||
|
avformat/hls: Check url_offset and size
|
||||||
|
avcodec/prores_raw: reject invalid tile alignment values
|
||||||
|
avformat/ty: check rec_size
|
||||||
|
avformat/ogg: Fix overflow and stale oggvorbis_private values
|
||||||
|
avformat/rtpenc_xiph: bail out when the max payload size underflows
|
||||||
|
avformat/rtpenc_aac: reject packets smaller than the ADTS header
|
||||||
|
avcodec/jpeg2000dec: compute mask in decode_clnpass() like in decode_sigpass()
|
||||||
|
avformat/flvdec: Check size at the top of the main loop
|
||||||
|
avformat/vividas: fix misaligned access
|
||||||
|
avformat/mccdec: dont pass NULL to bytestream2_put_buffer()
|
||||||
|
avcodec/g2meet: The stack is EPIC_PIX_STACK_SIZE
|
||||||
|
avcodec/h2645_sei: Initialize side data before deallocation
|
||||||
|
avfilter/boxblur: Fix off by one errors
|
||||||
|
avformat/assenc: Add the missing parentheses
|
||||||
|
avcodec/diracdec: Enlarge `mctmp` to cover the worst-case `blheight·ybsep + yblen` rows, and break the MC loop when no output rows remain
|
||||||
|
tools/zmqsend: free the AVBprint buffer after using it
|
||||||
|
[Wave] Fix issues with unaligned metadata chunks.
|
||||||
|
avformat/mpegts: Dont assume fc->priv_data is a MpegTSContext
|
||||||
|
fftools/graph: Add missing include "libavutil/mem.h" for fftools/graph/graphprint.c
|
||||||
|
avcodec/cbs_h266_syntax_template: tighten sh_num_tiles_in_slice_minus1 upper bound
|
||||||
|
avcodec/hevc: limit missing-ref fill to coded planes
|
||||||
|
avformat/mov: Fix negative index given to can_seek_to_key_sample()
|
||||||
|
avcodec/hdrdec: fix pixel count decrement in RLE decompress loop
|
||||||
|
(fforge/pr/23464) forgejo/workflows: update test workflow for 8.1 release
|
||||||
|
(fforge/pr/23445) aarch64: vp9lpf: Fix GCS violations
|
||||||
|
(fforge/pr/23303) avformat/mov: don't abort on unsupported or invalid chnl boxes
|
||||||
|
avformat/mov_chan: keep the layout untouched on chan/chnl box failure
|
||||||
|
(fforge/pr/23240) avformat/oggparsevorbis.c: Prevent integer overflow when summing header lengths; add bounds check.
|
||||||
|
(fforge/pr/23187) avformat/oggparsecelt: bound extra_headers to avoid an effectively infinite loop
|
||||||
|
(fforge/pr/23111) avformat/demux: use correct close function for custom io
|
||||||
|
avformat/hlsenc: use correct close function for custom io
|
||||||
|
avformat/hlsenc: respect io_open set in AVFormatContext
|
||||||
|
avformat/dashenc: respect io_open set in AVFormatContext
|
||||||
|
avformat/dashdec: respect io_open set in AVFormatContext
|
||||||
|
vulkan: fix using encode caps before querying
|
||||||
|
avformat/rtpdec_av1: fix buffer overflow due to variable confusion
|
||||||
|
|
||||||
|
|
||||||
version 8.1.1:
|
version 8.1.1:
|
||||||
avcodec/aac/aacdec_usac_mps212: fix attach_lsb() OOB after huff_decode
|
avcodec/aac/aacdec_usac_mps212: fix attach_lsb() OOB after huff_decode
|
||||||
avcodec/dfpwmdec: Check nb_samples
|
avcodec/dfpwmdec: Check nb_samples
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
---
|
---
|
||||||
# We just wrap `build` so this is really it
|
# We just wrap `build` so this is really it
|
||||||
name: "jellyfin-ffmpeg"
|
name: "jellyfin-ffmpeg"
|
||||||
version: "8.1.1-4"
|
version: "8.1.2-1"
|
||||||
packages:
|
packages:
|
||||||
- bullseye-amd64
|
- bullseye-amd64
|
||||||
- bullseye-arm64
|
- bullseye-arm64
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/openssl/openssl.git"
|
SCRIPT_REPO="https://github.com/openssl/openssl.git"
|
||||||
SCRIPT_COMMIT="openssl-3.6.2"
|
SCRIPT_COMMIT="openssl-3.6.3"
|
||||||
SCRIPT_TAGFILTER="openssl-3.6.*"
|
SCRIPT_TAGFILTER="openssl-3.6.*"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/harfbuzz/harfbuzz.git"
|
SCRIPT_REPO="https://github.com/harfbuzz/harfbuzz.git"
|
||||||
SCRIPT_COMMIT="b0ffab42d473eb380ad0fcf42730e0f1868cbc97"
|
SCRIPT_COMMIT="56feae4035bdd48f62ba2b8d8c16232d4d89b3a4"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/KhronosGroup/Vulkan-Headers.git"
|
SCRIPT_REPO="https://github.com/KhronosGroup/Vulkan-Headers.git"
|
||||||
SCRIPT_COMMIT="v1.4.349"
|
SCRIPT_COMMIT="v1.4.355"
|
||||||
SCRIPT_TAGFILTER="v?.*.*"
|
SCRIPT_TAGFILTER="v?.*.*"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ SCRIPT_REPO="https://github.com/BtbN/Vulkan-Shim-Loader.git"
|
|||||||
SCRIPT_COMMIT="65b3936528cd92eb4ea3de485d03f858a3850484"
|
SCRIPT_COMMIT="65b3936528cd92eb4ea3de485d03f858a3850484"
|
||||||
|
|
||||||
SCRIPT_REPO2="https://github.com/KhronosGroup/Vulkan-Headers.git"
|
SCRIPT_REPO2="https://github.com/KhronosGroup/Vulkan-Headers.git"
|
||||||
SCRIPT_COMMIT2="v1.4.349"
|
SCRIPT_COMMIT2="v1.4.355"
|
||||||
SCRIPT_TAGFILTER2="v?.*.*"
|
SCRIPT_TAGFILTER2="v?.*.*"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/google/shaderc.git"
|
SCRIPT_REPO="https://github.com/google/shaderc.git"
|
||||||
SCRIPT_COMMIT="301b4ede53d59b68bf55f95bb26412d9233c8187"
|
SCRIPT_COMMIT="d5f08ae5c5a9a45165578445cbd0f9adf0223448"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
[[ $TARGET == mac* ]] && return -1
|
[[ $TARGET == mac* ]] && return -1
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/KhronosGroup/SPIRV-Cross.git"
|
SCRIPT_REPO="https://github.com/KhronosGroup/SPIRV-Cross.git"
|
||||||
SCRIPT_COMMIT="b9ded926bd2ec460b8d60d5c9678808bf8cbdd9b"
|
SCRIPT_COMMIT="1a6169566c73d3da552748fc372fe2bbb856e46e"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
[[ $TARGET == mac* ]] && return -1
|
[[ $TARGET == mac* ]] && return -1
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git"
|
SCRIPT_REPO="https://github.com/GPUOpen-LibrariesAndSDKs/AMF.git"
|
||||||
SCRIPT_COMMIT="d0b3e6dd544a5f207bb6a12a1ecb98532491176a"
|
SCRIPT_COMMIT="eadd00804d5f7e5cd8c85d540073198312870776"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
[[ $TARGET == mac* ]] && return -1
|
[[ $TARGET == mac* ]] && return -1
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/libass/libass.git"
|
SCRIPT_REPO="https://github.com/libass/libass.git"
|
||||||
SCRIPT_COMMIT="bbb3c7f1570a4a021e52683f3fbdf74fe492ae84"
|
SCRIPT_COMMIT="4a05d8127f525943ebf45fdc6497c9e665947f0d"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/intel/libvpl.git"
|
SCRIPT_REPO="https://github.com/intel/libvpl.git"
|
||||||
SCRIPT_COMMIT="778a66d6c6537f08eabb91955dbbf1bce3812894"
|
SCRIPT_COMMIT="d77f9195cf495b937631607333288fd917ae8939"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
[[ $TARGET == mac* ]] && return -1
|
[[ $TARGET == mac* ]] && return -1
|
||||||
@@ -17,7 +17,7 @@ ffbuild_dockerbuild() {
|
|||||||
|
|
||||||
cmake -GNinja -DCMAKE_TOOLCHAIN_FILE="$FFBUILD_CMAKE_TOOLCHAIN" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$FFBUILD_PREFIX" \
|
cmake -GNinja -DCMAKE_TOOLCHAIN_FILE="$FFBUILD_CMAKE_TOOLCHAIN" -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX="$FFBUILD_PREFIX" \
|
||||||
-DCMAKE_INSTALL_BINDIR="$FFBUILD_PREFIX"/bin -DCMAKE_INSTALL_LIBDIR="$FFBUILD_PREFIX"/lib \
|
-DCMAKE_INSTALL_BINDIR="$FFBUILD_PREFIX"/bin -DCMAKE_INSTALL_LIBDIR="$FFBUILD_PREFIX"/lib \
|
||||||
-DINSTALL_DEV=ON -DINSTALL_LIB=ON \
|
-DINSTALL_DEV=ON -DINSTALL_LIB=ON -DINSTALL_EXAMPLES=OFF \
|
||||||
-DBUILD_EXAMPLES=OFF -DBUILD_EXPERIMENTAL=OFF \
|
-DBUILD_EXAMPLES=OFF -DBUILD_EXPERIMENTAL=OFF \
|
||||||
-DBUILD_SHARED_LIBS=OFF -DBUILD_TESTS=OFF ..
|
-DBUILD_SHARED_LIBS=OFF -DBUILD_TESTS=OFF ..
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
SCRIPT_REPO="https://github.com/OpenMPT/openmpt.git"
|
SCRIPT_REPO="https://github.com/OpenMPT/openmpt.git"
|
||||||
SCRIPT_COMMIT="a2b251c67ca757bb181a0cd4cc97e9e94bfe2608"
|
SCRIPT_COMMIT="11363ff11ba021b1cf1533da17d9fdf20c8d883c"
|
||||||
|
|
||||||
ffbuild_enabled() {
|
ffbuild_enabled() {
|
||||||
return 0
|
return 0
|
||||||
|
|||||||
Vendored
+9
@@ -1,3 +1,12 @@
|
|||||||
|
jellyfin-ffmpeg (8.1.2-1) unstable; urgency=medium
|
||||||
|
|
||||||
|
* New upstream version 8.1.2
|
||||||
|
* Fix a conflict between VPP tonemap and specific scaling mode
|
||||||
|
* Fix typos in some shader based deint filters
|
||||||
|
* Update build scripts and dependencies
|
||||||
|
|
||||||
|
-- nyanmisaka <nst799610810@gmail.com> Sun, 28 Jun 2026 17:07:36 +0800
|
||||||
|
|
||||||
jellyfin-ffmpeg (8.1.1-4) unstable; urgency=medium
|
jellyfin-ffmpeg (8.1.1-4) unstable; urgency=medium
|
||||||
|
|
||||||
* Fix broken macro place for scale_vt patch
|
* Fix broken macro place for scale_vt patch
|
||||||
|
|||||||
+1
-1
@@ -2324,7 +2324,7 @@ Index: FFmpeg/libavfilter/vf_tonemap_opencl.c
|
|||||||
+
|
+
|
||||||
+ if (max_compute_units >= 40)
|
+ if (max_compute_units >= 40)
|
||||||
+ ctx->tradeoff = 0;
|
+ ctx->tradeoff = 0;
|
||||||
+ else if (device_name) {
|
+ else if (device_name) {
|
||||||
+ const char *excluded_devices[5] = { "Arc", "Iris", "Xe", "770", "750" };
|
+ const char *excluded_devices[5] = { "Arc", "Iris", "Xe", "770", "750" };
|
||||||
+ for (i = 0; i < FF_ARRAY_ELEMS(excluded_devices); i++) {
|
+ for (i = 0; i < FF_ARRAY_ELEMS(excluded_devices); i++) {
|
||||||
+ if (strstr(device_name, excluded_devices[i])) {
|
+ if (strstr(device_name, excluded_devices[i])) {
|
||||||
|
|||||||
+11
-6
@@ -241,7 +241,7 @@ Index: FFmpeg/libavfilter/vf_vpp_qsv.c
|
|||||||
outvsi_conf.ColourDescriptionPresent = 1;
|
outvsi_conf.ColourDescriptionPresent = 1;
|
||||||
|
|
||||||
if (memcmp(&vpp->invsi_conf, &invsi_conf, sizeof(mfxExtVideoSignalInfo)) ||
|
if (memcmp(&vpp->invsi_conf, &invsi_conf, sizeof(mfxExtVideoSignalInfo)) ||
|
||||||
@@ -689,12 +718,23 @@ static int config_output(AVFilterLink *o
|
@@ -689,12 +718,28 @@ static int config_output(AVFilterLink *o
|
||||||
|
|
||||||
if (inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format) {
|
if (inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format) {
|
||||||
if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) {
|
if (QSV_RUNTIME_VERSION_ATLEAST(mfx_version, 1, 19)) {
|
||||||
@@ -256,10 +256,15 @@ Index: FFmpeg/libavfilter/vf_vpp_qsv.c
|
|||||||
-#endif
|
-#endif
|
||||||
+ /* Compute mode is only available on DG2+ platforms */
|
+ /* Compute mode is only available on DG2+ platforms */
|
||||||
+ if (vpl && get_mfx_platform(ctx, &mfx_platform) == MFX_ERR_NONE) {
|
+ if (vpl && get_mfx_platform(ctx, &mfx_platform) == MFX_ERR_NONE) {
|
||||||
|
+ const AVPixFmtDescriptor *in_desc = av_pix_fmt_desc_get(in_format);
|
||||||
+ int code_name = mfx_platform.CodeName;
|
+ int code_name = mfx_platform.CodeName;
|
||||||
+ compute = code_name >= 45 &&
|
+ compute = code_name >= 45 &&
|
||||||
+ code_name <= 54 &&
|
+ code_name <= 54 &&
|
||||||
+ code_name != 50;
|
+ code_name != 50;
|
||||||
|
+ /* When used with tonemap, only 4:2:0 chroma is supported */
|
||||||
|
+ if (vpp->tonemap && in_desc &&
|
||||||
|
+ !(in_desc->log2_chroma_w && in_desc->log2_chroma_h))
|
||||||
|
+ compute = 0;
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ if (mode == -1)
|
+ if (mode == -1)
|
||||||
@@ -269,7 +274,7 @@ Index: FFmpeg/libavfilter/vf_vpp_qsv.c
|
|||||||
|
|
||||||
INIT_MFX_EXTBUF(scale_conf, MFX_EXTBUFF_VPP_SCALING);
|
INIT_MFX_EXTBUF(scale_conf, MFX_EXTBUFF_VPP_SCALING);
|
||||||
SET_MFX_PARAM_FIELD(scale_conf, ScalingMode, mode);
|
SET_MFX_PARAM_FIELD(scale_conf, ScalingMode, mode);
|
||||||
@@ -706,6 +746,13 @@ static int config_output(AVFilterLink *o
|
@@ -706,6 +751,13 @@ static int config_output(AVFilterLink *o
|
||||||
#undef INIT_MFX_EXTBUF
|
#undef INIT_MFX_EXTBUF
|
||||||
#undef SET_MFX_PARAM_FIELD
|
#undef SET_MFX_PARAM_FIELD
|
||||||
|
|
||||||
@@ -283,7 +288,7 @@ Index: FFmpeg/libavfilter/vf_vpp_qsv.c
|
|||||||
if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise ||
|
if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise ||
|
||||||
vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip ||
|
vpp->detail || vpp->procamp || vpp->rotate || vpp->hflip ||
|
||||||
inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format ||
|
inlink->w != outlink->w || inlink->h != outlink->h || in_format != vpp->out_format ||
|
||||||
@@ -884,19 +931,13 @@ static const AVOption vpp_options[] = {
|
@@ -884,19 +936,13 @@ static const AVOption vpp_options[] = {
|
||||||
{ "height", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS },
|
{ "height", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str="w*ch/cw" }, 0, 255, .flags = FLAGS },
|
||||||
{ "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
|
{ "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
|
||||||
{ "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 4 }, 0, INT_MAX, .flags = FLAGS },
|
{ "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = 4 }, 0, INT_MAX, .flags = FLAGS },
|
||||||
@@ -304,7 +309,7 @@ Index: FFmpeg/libavfilter/vf_vpp_qsv.c
|
|||||||
|
|
||||||
{ "rate", "Generate output at frame rate or field rate, available only for deinterlace mode",
|
{ "rate", "Generate output at frame rate or field rate, available only for deinterlace mode",
|
||||||
OFFSET(field_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, .unit = "rate" },
|
OFFSET(field_rate), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, .unit = "rate" },
|
||||||
@@ -927,8 +968,9 @@ static const AVOption vpp_options[] = {
|
@@ -927,8 +973,9 @@ static const AVOption vpp_options[] = {
|
||||||
{ "out_color_transfer", "Output color transfer characteristics",
|
{ "out_color_transfer", "Output color transfer characteristics",
|
||||||
OFFSET(color_transfer_str), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
|
OFFSET(color_transfer_str), AV_OPT_TYPE_STRING, { .str = NULL }, .flags = FLAGS },
|
||||||
|
|
||||||
@@ -315,7 +320,7 @@ Index: FFmpeg/libavfilter/vf_vpp_qsv.c
|
|||||||
{ NULL }
|
{ NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -984,19 +1026,14 @@ static const AVOption qsvscale_options[]
|
@@ -984,19 +1031,14 @@ static const AVOption qsvscale_options[]
|
||||||
{ "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS },
|
{ "h", "Output video height(0=input video height, -1=keep input video aspect)", OFFSET(oh), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS },
|
||||||
{ "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
|
{ "format", "Output pixel format", OFFSET(output_format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
|
||||||
|
|
||||||
@@ -337,7 +342,7 @@ Index: FFmpeg/libavfilter/vf_vpp_qsv.c
|
|||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1021,6 +1058,7 @@ static const AVOption qsvdeint_options[]
|
@@ -1021,6 +1063,7 @@ static const AVOption qsvdeint_options[]
|
||||||
{ "bob", "bob algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_BOB}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, .unit = "mode"},
|
{ "bob", "bob algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_BOB}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, .unit = "mode"},
|
||||||
{ "advanced", "Motion adaptive algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, .unit = "mode"},
|
{ "advanced", "Motion adaptive algorithm", 0, AV_OPT_TYPE_CONST, {.i64 = MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, FLAGS, .unit = "mode"},
|
||||||
|
|
||||||
|
|||||||
@@ -2,10 +2,11 @@ Index: FFmpeg/libavcodec/dxva2.c
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FFmpeg.orig/libavcodec/dxva2.c
|
--- FFmpeg.orig/libavcodec/dxva2.c
|
||||||
+++ FFmpeg/libavcodec/dxva2.c
|
+++ FFmpeg/libavcodec/dxva2.c
|
||||||
@@ -616,6 +616,16 @@ int ff_dxva2_common_frame_params(AVCodec
|
@@ -616,6 +616,18 @@ int ff_dxva2_common_frame_params(AVCodec
|
||||||
else
|
else
|
||||||
surface_alignment = 16;
|
surface_alignment = 16;
|
||||||
|
|
||||||
|
+#if CONFIG_D3D11VA
|
||||||
+ /* align surfaces to 32 on Intel to keep in line with the MSDK impl,
|
+ /* align surfaces to 32 on Intel to keep in line with the MSDK impl,
|
||||||
+ which avoids the unnecessary resizing when mapping to QSV */
|
+ which avoids the unnecessary resizing when mapping to QSV */
|
||||||
+ if (device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) {
|
+ if (device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) {
|
||||||
@@ -15,11 +16,12 @@ Index: FFmpeg/libavcodec/dxva2.c
|
|||||||
+ surface_alignment = 32;
|
+ surface_alignment = 32;
|
||||||
+ }
|
+ }
|
||||||
+ }
|
+ }
|
||||||
|
+#endif
|
||||||
+
|
+
|
||||||
/* 1 base work surface */
|
/* 1 base work surface */
|
||||||
num_surfaces = 1;
|
num_surfaces = 1;
|
||||||
|
|
||||||
@@ -623,9 +633,9 @@ int ff_dxva2_common_frame_params(AVCodec
|
@@ -623,9 +635,9 @@ int ff_dxva2_common_frame_params(AVCodec
|
||||||
if (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_HEVC)
|
if (avctx->codec_id == AV_CODEC_ID_H264 || avctx->codec_id == AV_CODEC_ID_HEVC)
|
||||||
num_surfaces += 16;
|
num_surfaces += 16;
|
||||||
else if (avctx->codec_id == AV_CODEC_ID_VP9 || avctx->codec_id == AV_CODEC_ID_AV1)
|
else if (avctx->codec_id == AV_CODEC_ID_VP9 || avctx->codec_id == AV_CODEC_ID_AV1)
|
||||||
|
|||||||
+44
-10
@@ -2,7 +2,7 @@ Index: FFmpeg/configure
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FFmpeg.orig/configure
|
--- FFmpeg.orig/configure
|
||||||
+++ FFmpeg/configure
|
+++ FFmpeg/configure
|
||||||
@@ -4120,6 +4120,7 @@ boxblur_opencl_filter_deps="opencl gpl"
|
@@ -4123,6 +4123,7 @@ boxblur_opencl_filter_deps="opencl gpl"
|
||||||
bs2b_filter_deps="libbs2b"
|
bs2b_filter_deps="libbs2b"
|
||||||
bwdif_cuda_filter_deps="ffnvcodec"
|
bwdif_cuda_filter_deps="ffnvcodec"
|
||||||
bwdif_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
|
bwdif_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
|
||||||
@@ -155,7 +155,7 @@ Index: FFmpeg/libavfilter/metal/vf_bwdif_videotoolbox.metal
|
|||||||
+ if (abs(c - e) > temporal_diff0) {
|
+ if (abs(c - e) > temporal_diff0) {
|
||||||
+ interpol = (((coef_hf[0] * (prev2_0 + next2_0)
|
+ interpol = (((coef_hf[0] * (prev2_0 + next2_0)
|
||||||
+ - coef_hf[1] * (prev2_mrefs2 + next2_mrefs2 + prev2_prefs2 + next2_prefs2)
|
+ - coef_hf[1] * (prev2_mrefs2 + next2_mrefs2 + prev2_prefs2 + next2_prefs2)
|
||||||
+ + coef_hf[2] * (prev2_mrefs4 + next2_mrefs4 + prev2_prefs4 + next2_mrefs4)) / 4)
|
+ + coef_hf[2] * (prev2_mrefs4 + next2_mrefs4 + prev2_prefs4 + next2_prefs4)) / 4)
|
||||||
+ + coef_lf[0] * (c + e) - coef_lf[1] * (cur_mrefs3 + cur_prefs3)) / (1 << 13);
|
+ + coef_lf[0] * (c + e) - coef_lf[1] * (cur_mrefs3 + cur_prefs3)) / (1 << 13);
|
||||||
+ } else {
|
+ } else {
|
||||||
+ interpol = (coef_sp[0] * (c + e) - coef_sp[1] * (cur_mrefs3 + cur_prefs3)) / (1 << 13);
|
+ interpol = (coef_sp[0] * (c + e) - coef_sp[1] * (cur_mrefs3 + cur_prefs3)) / (1 << 13);
|
||||||
@@ -196,10 +196,10 @@ Index: FFmpeg/libavfilter/metal/vf_bwdif_videotoolbox.metal
|
|||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ // Calculate temporal prediction
|
+ // Calculate temporal prediction
|
||||||
+ texture2d<float, accesstype> prev2 = prev;
|
+ texture2d<float, accesstype> prev2 = is_second_field ? cur : prev;
|
||||||
+ texture2d<float, accesstype> prev1 = is_second_field ? cur : prev;
|
+ texture2d<float, accesstype> prev1 = prev;
|
||||||
+ texture2d<float, accesstype> next1 = is_second_field ? next : cur;
|
+ texture2d<float, accesstype> next1 = next;
|
||||||
+ texture2d<float, accesstype> next2 = next;
|
+ texture2d<float, accesstype> next2 = is_second_field ? next : cur;
|
||||||
+
|
+
|
||||||
+ T prev2_prefs4 = tex2D<T>(prev2, pos.x, pos.y+ 4);
|
+ T prev2_prefs4 = tex2D<T>(prev2, pos.x, pos.y+ 4);
|
||||||
+ T prev2_prefs2 = tex2D<T>(prev2, pos.x, pos.y + 2);
|
+ T prev2_prefs2 = tex2D<T>(prev2, pos.x, pos.y + 2);
|
||||||
@@ -249,10 +249,10 @@ Index: FFmpeg/libavfilter/metal/vf_bwdif_videotoolbox.metal
|
|||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
+ // Calculate temporal prediction
|
+ // Calculate temporal prediction
|
||||||
+ texture2d<float, accesstype> prev2 = prev;
|
+ texture2d<float, accesstype> prev2 = is_second_field ? cur : prev;
|
||||||
+ texture2d<float, accesstype> prev1 = is_second_field ? cur : prev;
|
+ texture2d<float, accesstype> prev1 = prev;
|
||||||
+ texture2d<float, accesstype> next1 = is_second_field ? next : cur;
|
+ texture2d<float, accesstype> next1 = next;
|
||||||
+ texture2d<float, accesstype> next2 = next;
|
+ texture2d<float, accesstype> next2 = is_second_field ? next : cur;
|
||||||
+
|
+
|
||||||
+ T prev2_prefs4 = tex2D<T>(prev2, pos.x, pos.y+ 4);
|
+ T prev2_prefs4 = tex2D<T>(prev2, pos.x, pos.y+ 4);
|
||||||
+ T prev2_prefs2 = tex2D<T>(prev2, pos.x, pos.y + 2);
|
+ T prev2_prefs2 = tex2D<T>(prev2, pos.x, pos.y + 2);
|
||||||
@@ -312,6 +312,40 @@ Index: FFmpeg/libavfilter/metal/vf_bwdif_videotoolbox.metal
|
|||||||
+ }
|
+ }
|
||||||
+ dst.write(pred.xyyy, pos);
|
+ dst.write(pred.xyyy, pos);
|
||||||
+}
|
+}
|
||||||
|
Index: FFmpeg/libavfilter/metal/vf_yadif_videotoolbox.metal
|
||||||
|
===================================================================
|
||||||
|
--- FFmpeg.orig/libavfilter/metal/vf_yadif_videotoolbox.metal
|
||||||
|
+++ FFmpeg/libavfilter/metal/vf_yadif_videotoolbox.metal
|
||||||
|
@@ -88,7 +88,7 @@ T spatial_predictor(T a, T b, T c, T d,
|
||||||
|
T h, T i, T j, T k, T l, T m, T n)
|
||||||
|
{
|
||||||
|
T spatial_pred = (d + k)/2;
|
||||||
|
- T spatial_score = abs(c - j) + abs(d - k) + abs(e - l);
|
||||||
|
+ T spatial_score = abs(c - j) + abs(d - k) + abs(e - l) - (1.0f / 255.0f);
|
||||||
|
|
||||||
|
T score = abs(b - k) + abs(c - l) + abs(d - m);
|
||||||
|
if (score < spatial_score) {
|
||||||
|
@@ -128,7 +128,7 @@ T temporal_predictor(T A, T B, T C, T D,
|
||||||
|
T tdiff1 = (abs(A - F) + abs(B - G)) / 2;
|
||||||
|
T tdiff2 = (abs(K - F) + abs(G - L)) / 2;
|
||||||
|
|
||||||
|
- T diff = max3(tdiff0, tdiff1, tdiff2);
|
||||||
|
+ T diff = max3(tdiff0 / 2, tdiff1, tdiff2);
|
||||||
|
|
||||||
|
if (!skip_check) {
|
||||||
|
T maxi = max3(p2 - p3, p2 - p1, min(p0 - p1, p4 - p3));
|
||||||
|
@@ -239,9 +239,9 @@ T yadif(
|
||||||
|
T spatial_pred = yadif_compute_spatial<T>(cur, pos);
|
||||||
|
|
||||||
|
if (params.is_second_field) {
|
||||||
|
- return yadif_compute_temporal(cur, prev, cur, next, next, spatial_pred, params.skip_spatial_check, pos);
|
||||||
|
+ return yadif_compute_temporal(cur, cur, prev, next, next, spatial_pred, params.skip_spatial_check, pos);
|
||||||
|
} else {
|
||||||
|
- return yadif_compute_temporal(cur, prev, prev, cur, next, spatial_pred, params.skip_spatial_check, pos);
|
||||||
|
+ return yadif_compute_temporal(cur, prev, prev, next, cur, spatial_pred, params.skip_spatial_check, pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Index: FFmpeg/libavfilter/vf_bwdif_videotoolbox.m
|
Index: FFmpeg/libavfilter/vf_bwdif_videotoolbox.m
|
||||||
===================================================================
|
===================================================================
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Index: FFmpeg/configure
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FFmpeg.orig/configure
|
--- FFmpeg.orig/configure
|
||||||
+++ FFmpeg/configure
|
+++ FFmpeg/configure
|
||||||
@@ -4121,6 +4121,7 @@ boxblur_opencl_filter_deps="opencl gpl"
|
@@ -4124,6 +4124,7 @@ boxblur_opencl_filter_deps="opencl gpl"
|
||||||
bs2b_filter_deps="libbs2b"
|
bs2b_filter_deps="libbs2b"
|
||||||
bwdif_cuda_filter_deps="ffnvcodec"
|
bwdif_cuda_filter_deps="ffnvcodec"
|
||||||
bwdif_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
|
bwdif_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
|
||||||
@@ -10,7 +10,7 @@ Index: FFmpeg/configure
|
|||||||
bwdif_videotoolbox_filter_deps="metal corevideo videotoolbox"
|
bwdif_videotoolbox_filter_deps="metal corevideo videotoolbox"
|
||||||
bwdif_vulkan_filter_deps="vulkan spirv_compiler"
|
bwdif_vulkan_filter_deps="vulkan spirv_compiler"
|
||||||
chromaber_vulkan_filter_deps="vulkan spirv_library"
|
chromaber_vulkan_filter_deps="vulkan spirv_library"
|
||||||
@@ -4280,6 +4281,7 @@ xfade_opencl_filter_deps="opencl"
|
@@ -4283,6 +4284,7 @@ xfade_opencl_filter_deps="opencl"
|
||||||
xfade_vulkan_filter_deps="vulkan spirv_library"
|
xfade_vulkan_filter_deps="vulkan spirv_library"
|
||||||
yadif_cuda_filter_deps="ffnvcodec"
|
yadif_cuda_filter_deps="ffnvcodec"
|
||||||
yadif_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
|
yadif_cuda_filter_deps_any="cuda_nvcc cuda_llvm"
|
||||||
@@ -52,7 +52,7 @@ Index: FFmpeg/libavfilter/allfilters.c
|
|||||||
extern const FFFilter ff_vf_bwdif_videotoolbox;
|
extern const FFFilter ff_vf_bwdif_videotoolbox;
|
||||||
extern const FFFilter ff_vf_bwdif_vulkan;
|
extern const FFFilter ff_vf_bwdif_vulkan;
|
||||||
extern const FFFilter ff_vf_cas;
|
extern const FFFilter ff_vf_cas;
|
||||||
@@ -562,6 +563,7 @@ extern const FFFilter ff_vf_xpsnr;
|
@@ -563,6 +564,7 @@ extern const FFFilter ff_vf_xpsnr;
|
||||||
extern const FFFilter ff_vf_xstack;
|
extern const FFFilter ff_vf_xstack;
|
||||||
extern const FFFilter ff_vf_yadif;
|
extern const FFFilter ff_vf_yadif;
|
||||||
extern const FFFilter ff_vf_yadif_cuda;
|
extern const FFFilter ff_vf_yadif_cuda;
|
||||||
@@ -228,7 +228,7 @@ Index: FFmpeg/libavfilter/opencl/bwdif.cl
|
|||||||
+ if (fabs(c - e) > temporal_diff0) {
|
+ if (fabs(c - e) > temporal_diff0) {
|
||||||
+ interpol = native_divide((((coef_hf[0] * (prev2_0 + next2_0)
|
+ interpol = native_divide((((coef_hf[0] * (prev2_0 + next2_0)
|
||||||
+ - coef_hf[1] * (prev2_mrefs2 + next2_mrefs2 + prev2_prefs2 + next2_prefs2)
|
+ - coef_hf[1] * (prev2_mrefs2 + next2_mrefs2 + prev2_prefs2 + next2_prefs2)
|
||||||
+ + coef_hf[2] * (prev2_mrefs4 + next2_mrefs4 + prev2_prefs4 + next2_mrefs4)) * 0.25f)
|
+ + coef_hf[2] * (prev2_mrefs4 + next2_mrefs4 + prev2_prefs4 + next2_prefs4)) * 0.25f)
|
||||||
+ + coef_lf[0] * (c + e) - coef_lf[1] * (cur_mrefs3 + cur_prefs3)), (float)(1 << 13));
|
+ + coef_lf[0] * (c + e) - coef_lf[1] * (cur_mrefs3 + cur_prefs3)), (float)(1 << 13));
|
||||||
+ } else {
|
+ } else {
|
||||||
+ interpol = native_divide((coef_sp[0] * (c + e) - coef_sp[1] * (cur_mrefs3 + cur_prefs3)), (float)(1 << 13));
|
+ interpol = native_divide((coef_sp[0] * (c + e) - coef_sp[1] * (cur_mrefs3 + cur_prefs3)), (float)(1 << 13));
|
||||||
@@ -322,17 +322,17 @@ Index: FFmpeg/libavfilter/opencl/bwdif.cl
|
|||||||
+
|
+
|
||||||
+ if (channels == 1) {
|
+ if (channels == 1) {
|
||||||
+ float pred = is_second_field
|
+ float pred = is_second_field
|
||||||
+ ? bwdif_compute_float(dst, cur, prev, cur, next, next,
|
+ ? bwdif_compute_float(dst, cur, cur, prev, next, next,
|
||||||
+ parity, is_field_end, pos)
|
+ parity, is_field_end, pos)
|
||||||
+ : bwdif_compute_float(dst, cur, prev, prev, cur, next,
|
+ : bwdif_compute_float(dst, cur, prev, prev, next, cur,
|
||||||
+ parity, is_field_end, pos);
|
+ parity, is_field_end, pos);
|
||||||
+
|
+
|
||||||
+ write_imagef(dst, pos, (float4)(pred, 0.0f, 0.0f, 1.0f));
|
+ write_imagef(dst, pos, (float4)(pred, 0.0f, 0.0f, 1.0f));
|
||||||
+ } else if (channels == 2) {
|
+ } else if (channels == 2) {
|
||||||
+ float2 pred = is_second_field
|
+ float2 pred = is_second_field
|
||||||
+ ? bwdif_compute_float2(dst, cur, prev, cur, next, next,
|
+ ? bwdif_compute_float2(dst, cur, cur, prev, next, next,
|
||||||
+ parity, is_field_end, pos)
|
+ parity, is_field_end, pos)
|
||||||
+ : bwdif_compute_float2(dst, cur, prev, prev, cur, next,
|
+ : bwdif_compute_float2(dst, cur, prev, prev, next, cur,
|
||||||
+ parity, is_field_end, pos);
|
+ parity, is_field_end, pos);
|
||||||
+
|
+
|
||||||
+ write_imagef(dst, pos, (float4)(pred.x, pred.y, 0.0f, 1.0f));
|
+ write_imagef(dst, pos, (float4)(pred.x, pred.y, 0.0f, 1.0f));
|
||||||
@@ -375,7 +375,7 @@ Index: FFmpeg/libavfilter/opencl/yadif.cl
|
|||||||
+ float h, float i, float j, float k, float l, float m, float n)
|
+ float h, float i, float j, float k, float l, float m, float n)
|
||||||
+{
|
+{
|
||||||
+ float spatial_pred = (d + k) * 0.5f;
|
+ float spatial_pred = (d + k) * 0.5f;
|
||||||
+ float spatial_score = fabs(c - j) + fabs(d - k) + fabs(e - l);
|
+ float spatial_score = fabs(c - j) + fabs(d - k) + fabs(e - l) - (1.0f / 255.0f);
|
||||||
+
|
+
|
||||||
+ float score = fabs(b - k) + fabs(c - l) + fabs(d - m);
|
+ float score = fabs(b - k) + fabs(c - l) + fabs(d - m);
|
||||||
+ if (score < spatial_score) {
|
+ if (score < spatial_score) {
|
||||||
@@ -424,7 +424,7 @@ Index: FFmpeg/libavfilter/opencl/yadif.cl
|
|||||||
+ float tdiff1 = (fabs(A - F) + fabs(B - G)) * 0.5f;
|
+ float tdiff1 = (fabs(A - F) + fabs(B - G)) * 0.5f;
|
||||||
+ float tdiff2 = (fabs(K - F) + fabs(G - L)) * 0.5f;
|
+ float tdiff2 = (fabs(K - F) + fabs(G - L)) * 0.5f;
|
||||||
+
|
+
|
||||||
+ float diff = max3(tdiff0, tdiff1, tdiff2);
|
+ float diff = max3(tdiff0 * 0.5f, tdiff1, tdiff2);
|
||||||
+
|
+
|
||||||
+ if (!skip_check) {
|
+ if (!skip_check) {
|
||||||
+ float maxi = max3(p2 - p3, p2 - p1, min(p0 - p1, p4 - p3));
|
+ float maxi = max3(p2 - p3, p2 - p1, min(p0 - p1, p4 - p3));
|
||||||
@@ -523,18 +523,18 @@ Index: FFmpeg/libavfilter/opencl/yadif.cl
|
|||||||
+ if (channels == 1) {
|
+ if (channels == 1) {
|
||||||
+ float spatial_pred = yadif_compute_spatial_float(cur, pos);
|
+ float spatial_pred = yadif_compute_spatial_float(cur, pos);
|
||||||
+ float pred = is_second_field
|
+ float pred = is_second_field
|
||||||
+ ? yadif_compute_temporal_float(cur, prev, cur, next, next,
|
+ ? yadif_compute_temporal_float(cur, cur, prev, next, next,
|
||||||
+ spatial_pred, skip_spatial_check, pos)
|
+ spatial_pred, skip_spatial_check, pos)
|
||||||
+ : yadif_compute_temporal_float(cur, prev, prev, cur, next,
|
+ : yadif_compute_temporal_float(cur, prev, prev, next, cur,
|
||||||
+ spatial_pred, skip_spatial_check, pos);
|
+ spatial_pred, skip_spatial_check, pos);
|
||||||
+
|
+
|
||||||
+ write_imagef(dst, pos, (float4)(pred, 0.0f, 0.0f, 1.0f));
|
+ write_imagef(dst, pos, (float4)(pred, 0.0f, 0.0f, 1.0f));
|
||||||
+ } else if (channels == 2) {
|
+ } else if (channels == 2) {
|
||||||
+ float2 spatial_pred = yadif_compute_spatial_float2(cur, pos);
|
+ float2 spatial_pred = yadif_compute_spatial_float2(cur, pos);
|
||||||
+ float2 pred = is_second_field
|
+ float2 pred = is_second_field
|
||||||
+ ? yadif_compute_temporal_float2(cur, prev, cur, next, next,
|
+ ? yadif_compute_temporal_float2(cur, cur, prev, next, next,
|
||||||
+ spatial_pred, skip_spatial_check, pos)
|
+ spatial_pred, skip_spatial_check, pos)
|
||||||
+ : yadif_compute_temporal_float2(cur, prev, prev, cur, next,
|
+ : yadif_compute_temporal_float2(cur, prev, prev, next, cur,
|
||||||
+ spatial_pred, skip_spatial_check, pos);
|
+ spatial_pred, skip_spatial_check, pos);
|
||||||
+
|
+
|
||||||
+ write_imagef(dst, pos, (float4)(pred.x, pred.y, 0.0f, 1.0f));
|
+ write_imagef(dst, pos, (float4)(pred.x, pred.y, 0.0f, 1.0f));
|
||||||
|
|||||||
-22
@@ -1,22 +0,0 @@
|
|||||||
Index: FFmpeg/fftools/ffmpeg_demux.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/fftools/ffmpeg_demux.c
|
|
||||||
+++ FFmpeg/fftools/ffmpeg_demux.c
|
|
||||||
@@ -534,7 +534,7 @@ static void readrate_sleep(Demuxer *d)
|
|
||||||
ds->lag = lag;
|
|
||||||
ds->resume_wc = now;
|
|
||||||
ds->resume_pts = pts;
|
|
||||||
- av_log_once(ds, AV_LOG_WARNING, AV_LOG_DEBUG, &resume_warn,
|
|
||||||
+ av_log_once(ds, AV_LOG_VERBOSE, AV_LOG_DEBUG, &resume_warn,
|
|
||||||
"Resumed reading at pts %0.3f with rate %0.3f after a lag of %0.3fs\n",
|
|
||||||
(float)pts/AV_TIME_BASE, d->readrate_catchup, (float)lag/AV_TIME_BASE);
|
|
||||||
}
|
|
||||||
@@ -2152,7 +2152,7 @@ int ifile_open(const OptionsContext *o,
|
|
||||||
d->readrate_initial_burst);
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
- d->readrate_catchup = o->readrate_catchup ? o->readrate_catchup : d->readrate * 1.05;
|
|
||||||
+ d->readrate_catchup = o->readrate_catchup ? o->readrate_catchup : d->readrate * 100;
|
|
||||||
if (d->readrate_catchup < d->readrate) {
|
|
||||||
av_log(d, AV_LOG_ERROR,
|
|
||||||
"Option -readrate_catchup is %0.3f; it must be at least equal to %0.3f.\n",
|
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
Index: FFmpeg/fftools/ffmpeg_demux.c
|
||||||
|
===================================================================
|
||||||
|
--- FFmpeg.orig/fftools/ffmpeg_demux.c
|
||||||
|
+++ FFmpeg/fftools/ffmpeg_demux.c
|
||||||
|
@@ -96,12 +96,6 @@ typedef struct DemuxStream {
|
||||||
|
uint64_t nb_packets;
|
||||||
|
// combined size of all the packets read
|
||||||
|
uint64_t data_size;
|
||||||
|
- // latest wallclock time at which packet reading resumed after a stall - used for readrate
|
||||||
|
- int64_t resume_wc;
|
||||||
|
- // timestamp of first packet sent after the latest stall - used for readrate
|
||||||
|
- int64_t resume_pts;
|
||||||
|
- // measure of how far behind packet reading is against spceified readrate
|
||||||
|
- int64_t lag;
|
||||||
|
} DemuxStream;
|
||||||
|
|
||||||
|
typedef struct DemuxStreamGroup {
|
||||||
|
@@ -144,6 +138,13 @@ typedef struct Demuxer {
|
||||||
|
double readrate_initial_burst;
|
||||||
|
float readrate_catchup;
|
||||||
|
|
||||||
|
+ // latest wallclock time at which packet reading resumed after a stall - used for readrate
|
||||||
|
+ int64_t resume_wc;
|
||||||
|
+ // relative timestamp of first packet sent after the latest stall - used for readrate
|
||||||
|
+ int64_t resume_progress;
|
||||||
|
+ // measure of how far behind packet reading is against spceified readrate
|
||||||
|
+ int64_t lag;
|
||||||
|
+
|
||||||
|
Scheduler *sch;
|
||||||
|
|
||||||
|
AVPacket *pkt_heartbeat;
|
||||||
|
@@ -514,43 +515,55 @@ static void readrate_sleep(Demuxer *d)
|
||||||
|
int64_t initial_burst = AV_TIME_BASE * d->readrate_initial_burst;
|
||||||
|
int resume_warn = 0;
|
||||||
|
|
||||||
|
+ DemuxStream *slowest = NULL;
|
||||||
|
+ int64_t progress = INT64_MAX;
|
||||||
|
+
|
||||||
|
for (int i = 0; i < f->nb_streams; i++) {
|
||||||
|
InputStream *ist = f->streams[i];
|
||||||
|
DemuxStream *ds = ds_from_ist(ist);
|
||||||
|
- int64_t stream_ts_offset, pts, now, wc_elapsed, elapsed, lag, max_pts, limit_pts;
|
||||||
|
-
|
||||||
|
- if (ds->discard) continue;
|
||||||
|
+ int64_t stream_ts_offset, pts, pts_diff;
|
||||||
|
+ if (ds->discard || ds->finished || ds->first_dts == AV_NOPTS_VALUE)
|
||||||
|
+ continue;
|
||||||
|
|
||||||
|
- stream_ts_offset = FFMAX(ds->first_dts != AV_NOPTS_VALUE ? ds->first_dts : 0, file_start);
|
||||||
|
+ stream_ts_offset = FFMAX(ds->first_dts, file_start);
|
||||||
|
pts = av_rescale(ds->dts, 1000000, AV_TIME_BASE);
|
||||||
|
- now = av_gettime_relative();
|
||||||
|
- wc_elapsed = now - d->wallclock_start;
|
||||||
|
-
|
||||||
|
- if (pts <= stream_ts_offset + initial_burst) continue;
|
||||||
|
-
|
||||||
|
- max_pts = stream_ts_offset + initial_burst + (int64_t)(wc_elapsed * d->readrate);
|
||||||
|
- lag = FFMAX(max_pts - pts, 0);
|
||||||
|
- if ( (!ds->lag && lag > 0.3 * AV_TIME_BASE) || ( lag > ds->lag + 0.3 * AV_TIME_BASE) ) {
|
||||||
|
- ds->lag = lag;
|
||||||
|
- ds->resume_wc = now;
|
||||||
|
- ds->resume_pts = pts;
|
||||||
|
- av_log_once(ds, AV_LOG_WARNING, AV_LOG_DEBUG, &resume_warn,
|
||||||
|
- "Resumed reading at pts %0.3f with rate %0.3f after a lag of %0.3fs\n",
|
||||||
|
- (float)pts/AV_TIME_BASE, d->readrate_catchup, (float)lag/AV_TIME_BASE);
|
||||||
|
- }
|
||||||
|
- if (ds->lag && !lag)
|
||||||
|
- ds->lag = ds->resume_wc = ds->resume_pts = 0;
|
||||||
|
- if (ds->resume_wc) {
|
||||||
|
- elapsed = now - ds->resume_wc;
|
||||||
|
- limit_pts = ds->resume_pts + (int64_t)(elapsed * d->readrate_catchup);
|
||||||
|
- } else {
|
||||||
|
- elapsed = wc_elapsed;
|
||||||
|
- limit_pts = max_pts;
|
||||||
|
+ pts_diff = pts - stream_ts_offset;
|
||||||
|
+ if (pts_diff < progress) {
|
||||||
|
+ progress = pts_diff;
|
||||||
|
+ slowest = ds;
|
||||||
|
}
|
||||||
|
+ }
|
||||||
|
|
||||||
|
- if (pts > limit_pts)
|
||||||
|
- av_usleep(pts - limit_pts);
|
||||||
|
+ if (!slowest || progress <= initial_burst)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ int64_t now = av_gettime_relative();
|
||||||
|
+ int64_t wc_elapsed = now - d->wallclock_start;
|
||||||
|
+ int64_t max_prog = initial_burst + (int64_t)(wc_elapsed * d->readrate);
|
||||||
|
+ int64_t lag = FFMAX(max_prog - progress, 0);
|
||||||
|
+ int64_t limit;
|
||||||
|
+
|
||||||
|
+ if ( (!d->lag && lag > 0.3 * AV_TIME_BASE) || ( lag > d->lag + 0.3 * AV_TIME_BASE) ) {
|
||||||
|
+ d->lag = lag;
|
||||||
|
+ d->resume_wc = now;
|
||||||
|
+ d->resume_progress = progress;
|
||||||
|
+
|
||||||
|
+ int64_t pts = FFMAX(slowest->first_dts, file_start) + progress;
|
||||||
|
+ av_log_once(slowest, AV_LOG_VERBOSE, AV_LOG_DEBUG, &resume_warn,
|
||||||
|
+ "Resumed reading at pts %0.3f with rate %0.3f after a lag of %0.3fs\n",
|
||||||
|
+ (float)pts/AV_TIME_BASE, d->readrate_catchup, (float)lag/AV_TIME_BASE);
|
||||||
|
+ }
|
||||||
|
+ if (d->lag && !lag)
|
||||||
|
+ d->lag = d->resume_wc = d->resume_progress = 0;
|
||||||
|
+ if (d->resume_wc) {
|
||||||
|
+ int64_t elapsed = now - d->resume_wc;
|
||||||
|
+ limit = d->resume_progress + (int64_t)(elapsed * d->readrate_catchup);
|
||||||
|
+ } else {
|
||||||
|
+ limit = max_prog;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ if (progress > limit)
|
||||||
|
+ av_usleep(progress - limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int do_send(Demuxer *d, DemuxStream *ds, AVPacket *pkt, unsigned flags,
|
||||||
+129
-43
@@ -83,19 +83,7 @@ Index: FFmpeg/libavcodec/nvenc.c
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FFmpeg.orig/libavcodec/nvenc.c
|
--- FFmpeg.orig/libavcodec/nvenc.c
|
||||||
+++ FFmpeg/libavcodec/nvenc.c
|
+++ FFmpeg/libavcodec/nvenc.c
|
||||||
@@ -266,8 +266,10 @@ static void nvenc_map_preset(NvencContex
|
@@ -594,12 +594,24 @@ static int nvenc_check_capabilities(AVCo
|
||||||
|
|
||||||
static void nvenc_print_driver_requirement(AVCodecContext *avctx, int level)
|
|
||||||
{
|
|
||||||
-#if NVENCAPI_CHECK_VERSION(13, 1)
|
|
||||||
+#if NVENCAPI_CHECK_VERSION(13, 2)
|
|
||||||
const char *minver = "(unknown)";
|
|
||||||
+#elif NVENCAPI_CHECK_VERSION(13, 1)
|
|
||||||
+ const char *minver = "610.00";
|
|
||||||
#elif NVENCAPI_CHECK_VERSION(13, 0)
|
|
||||||
const char *minver = "570.0";
|
|
||||||
#elif NVENCAPI_CHECK_VERSION(12, 2)
|
|
||||||
@@ -592,12 +594,24 @@ static int nvenc_check_capabilities(AVCo
|
|
||||||
#ifdef NVENC_HAVE_BFRAME_REF_MODE
|
#ifdef NVENC_HAVE_BFRAME_REF_MODE
|
||||||
tmp = (ctx->b_ref_mode >= 0) ? ctx->b_ref_mode : NV_ENC_BFRAME_REF_MODE_DISABLED;
|
tmp = (ctx->b_ref_mode >= 0) ? ctx->b_ref_mode : NV_ENC_BFRAME_REF_MODE_DISABLED;
|
||||||
ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_BFRAME_REF_MODE);
|
ret = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_BFRAME_REF_MODE);
|
||||||
@@ -126,7 +114,7 @@ Index: FFmpeg/libavcodec/nvenc.c
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
tmp = (ctx->b_ref_mode >= 0) ? ctx->b_ref_mode : 0;
|
tmp = (ctx->b_ref_mode >= 0) ? ctx->b_ref_mode : 0;
|
||||||
@@ -683,7 +697,9 @@ static int nvenc_check_capabilities(AVCo
|
@@ -685,7 +697,9 @@ static int nvenc_check_capabilities(AVCo
|
||||||
|
|
||||||
#ifdef NVENC_HAVE_MVHEVC
|
#ifdef NVENC_HAVE_MVHEVC
|
||||||
ctx->multiview_supported = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_MVHEVC_ENCODE) > 0;
|
ctx->multiview_supported = nvenc_check_cap(avctx, NV_ENC_CAPS_SUPPORT_MVHEVC_ENCODE) > 0;
|
||||||
@@ -137,7 +125,7 @@ Index: FFmpeg/libavcodec/nvenc.c
|
|||||||
av_log(avctx, AV_LOG_WARNING, "Multiview not supported by the device\n");
|
av_log(avctx, AV_LOG_WARNING, "Multiview not supported by the device\n");
|
||||||
return AVERROR(ENOSYS);
|
return AVERROR(ENOSYS);
|
||||||
}
|
}
|
||||||
@@ -1163,6 +1179,13 @@ static av_cold int nvenc_setup_rate_cont
|
@@ -1165,6 +1179,13 @@ static av_cold int nvenc_setup_rate_cont
|
||||||
#ifdef NVENC_HAVE_QP_CHROMA_OFFSETS
|
#ifdef NVENC_HAVE_QP_CHROMA_OFFSETS
|
||||||
ctx->encode_config.rcParams.cbQPIndexOffset = ctx->qp_cb_offset;
|
ctx->encode_config.rcParams.cbQPIndexOffset = ctx->qp_cb_offset;
|
||||||
ctx->encode_config.rcParams.crQPIndexOffset = ctx->qp_cr_offset;
|
ctx->encode_config.rcParams.crQPIndexOffset = ctx->qp_cr_offset;
|
||||||
@@ -151,7 +139,7 @@ Index: FFmpeg/libavcodec/nvenc.c
|
|||||||
#else
|
#else
|
||||||
if (ctx->qp_cb_offset || ctx->qp_cr_offset)
|
if (ctx->qp_cb_offset || ctx->qp_cr_offset)
|
||||||
av_log(avctx, AV_LOG_WARNING, "Failed setting QP CB/CR offsets, SDK 11.1 or greater required at compile time.\n");
|
av_log(avctx, AV_LOG_WARNING, "Failed setting QP CB/CR offsets, SDK 11.1 or greater required at compile time.\n");
|
||||||
@@ -1359,6 +1382,11 @@ static av_cold int nvenc_setup_h264_conf
|
@@ -1361,6 +1382,11 @@ static av_cold int nvenc_setup_h264_conf
|
||||||
case NV_ENC_H264_PROFILE_BASELINE:
|
case NV_ENC_H264_PROFILE_BASELINE:
|
||||||
cc->profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID;
|
cc->profileGUID = NV_ENC_H264_PROFILE_BASELINE_GUID;
|
||||||
avctx->profile = AV_PROFILE_H264_BASELINE;
|
avctx->profile = AV_PROFILE_H264_BASELINE;
|
||||||
@@ -163,35 +151,49 @@ Index: FFmpeg/libavcodec/nvenc.c
|
|||||||
break;
|
break;
|
||||||
case NV_ENC_H264_PROFILE_MAIN:
|
case NV_ENC_H264_PROFILE_MAIN:
|
||||||
cc->profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID;
|
cc->profileGUID = NV_ENC_H264_PROFILE_MAIN_GUID;
|
||||||
@@ -2529,7 +2557,12 @@ static void nvenc_fill_time_code(AVCodec
|
Index: FFmpeg/libavfilter/vf_bwdif_cuda.cu
|
||||||
unsigned hh, mm, ss, ff, drop;
|
|
||||||
ff_timecode_set_smpte(&drop, &hh, &mm, &ss, &ff, avctx->framerate, tc[i + 1], 0, 0);
|
|
||||||
|
|
||||||
+#ifdef NVENC_NEW_COUNTING_TYPE
|
|
||||||
+ time_code->clockTimestamp[i].countingTypeLSB = 0;
|
|
||||||
+ time_code->clockTimestamp[i].countingTypeMSB = 0;
|
|
||||||
+#else
|
|
||||||
time_code->clockTimestamp[i].countingType = 0;
|
|
||||||
+#endif
|
|
||||||
time_code->clockTimestamp[i].discontinuityFlag = 0;
|
|
||||||
time_code->clockTimestamp[i].cntDroppedFrames = drop;
|
|
||||||
time_code->clockTimestamp[i].nFrames = ff;
|
|
||||||
Index: FFmpeg/libavcodec/nvenc.h
|
|
||||||
===================================================================
|
===================================================================
|
||||||
--- FFmpeg.orig/libavcodec/nvenc.h
|
--- FFmpeg.orig/libavfilter/vf_bwdif_cuda.cu
|
||||||
+++ FFmpeg/libavcodec/nvenc.h
|
+++ FFmpeg/libavfilter/vf_bwdif_cuda.cu
|
||||||
@@ -111,6 +111,11 @@ typedef void ID3D11Device;
|
@@ -91,7 +91,7 @@ __inline__ __device__ T filter(T cur_pre
|
||||||
#define NVENC_HAVE_MVHEVC
|
if (abs(c - e) > temporal_diff0) {
|
||||||
#endif
|
interpol = (((coef_hf[0] * (prev2_0 + next2_0)
|
||||||
|
- coef_hf[1] * (prev2_mrefs2 + next2_mrefs2 + prev2_prefs2 + next2_prefs2)
|
||||||
|
- + coef_hf[2] * (prev2_mrefs4 + next2_mrefs4 + prev2_prefs4 + next2_mrefs4)) >> 2)
|
||||||
|
+ + coef_hf[2] * (prev2_mrefs4 + next2_mrefs4 + prev2_prefs4 + next2_prefs4)) >> 2)
|
||||||
|
+ coef_lf[0] * (c + e) - coef_lf[1] * (cur_mrefs3 + cur_prefs3)) >> 13;
|
||||||
|
} else {
|
||||||
|
interpol = (coef_sp[0] * (c + e) - coef_sp[1] * (cur_mrefs3 + cur_prefs3)) >> 13;
|
||||||
|
@@ -146,10 +146,10 @@ __inline__ __device__ void bwdif_single(
|
||||||
|
// Calculate temporal prediction
|
||||||
|
int is_second_field = !(parity ^ tff);
|
||||||
|
|
||||||
+// SDK 13.1 compile time feature checks
|
- cudaTextureObject_t prev2 = prev;
|
||||||
+#if NVENCAPI_CHECK_VERSION(13, 1)
|
- cudaTextureObject_t prev1 = is_second_field ? cur : prev;
|
||||||
+#define NVENC_NEW_COUNTING_TYPE
|
- cudaTextureObject_t next1 = is_second_field ? next : cur;
|
||||||
+#endif
|
- cudaTextureObject_t next2 = next;
|
||||||
+
|
+ cudaTextureObject_t prev2 = is_second_field ? cur : prev;
|
||||||
typedef struct NvencSurface
|
+ cudaTextureObject_t prev1 = prev;
|
||||||
{
|
+ cudaTextureObject_t next1 = next;
|
||||||
NV_ENC_INPUT_PTR input_surface;
|
+ cudaTextureObject_t next2 = is_second_field ? next : cur;
|
||||||
|
|
||||||
|
T prev2_prefs4 = tex2D<T>(prev2, xo, yo + 4);
|
||||||
|
T prev2_prefs2 = tex2D<T>(prev2, xo, yo + 2);
|
||||||
|
@@ -213,10 +213,10 @@ __inline__ __device__ void bwdif_double(
|
||||||
|
|
||||||
|
int is_second_field = !(parity ^ tff);
|
||||||
|
|
||||||
|
- cudaTextureObject_t prev2 = prev;
|
||||||
|
- cudaTextureObject_t prev1 = is_second_field ? cur : prev;
|
||||||
|
- cudaTextureObject_t next1 = is_second_field ? next : cur;
|
||||||
|
- cudaTextureObject_t next2 = next;
|
||||||
|
+ cudaTextureObject_t prev2 = is_second_field ? cur : prev;
|
||||||
|
+ cudaTextureObject_t prev1 = prev;
|
||||||
|
+ cudaTextureObject_t next1 = next;
|
||||||
|
+ cudaTextureObject_t next2 = is_second_field ? next : cur;
|
||||||
|
|
||||||
|
T prev2_prefs4 = tex2D<T>(prev2, xo, yo + 4);
|
||||||
|
T prev2_prefs2 = tex2D<T>(prev2, xo, yo + 2);
|
||||||
Index: FFmpeg/libavfilter/vf_scale_cuda.h
|
Index: FFmpeg/libavfilter/vf_scale_cuda.h
|
||||||
===================================================================
|
===================================================================
|
||||||
--- FFmpeg.orig/libavfilter/vf_scale_cuda.h
|
--- FFmpeg.orig/libavfilter/vf_scale_cuda.h
|
||||||
@@ -207,3 +209,87 @@ Index: FFmpeg/libavfilter/vf_scale_cuda.h
|
|||||||
#else
|
#else
|
||||||
#include <ffnvcodec/dynlink_cuda.h>
|
#include <ffnvcodec/dynlink_cuda.h>
|
||||||
#endif
|
#endif
|
||||||
|
Index: FFmpeg/libavfilter/vf_yadif_cuda.cu
|
||||||
|
===================================================================
|
||||||
|
--- FFmpeg.orig/libavfilter/vf_yadif_cuda.cu
|
||||||
|
+++ FFmpeg/libavfilter/vf_yadif_cuda.cu
|
||||||
|
@@ -23,7 +23,7 @@ __inline__ __device__ T spatial_predicto
|
||||||
|
T h, T i, T j, T k, T l, T m, T n)
|
||||||
|
{
|
||||||
|
int spatial_pred = (d + k)/2;
|
||||||
|
- int spatial_score = abs(c - j) + abs(d - k) + abs(e - l);
|
||||||
|
+ int spatial_score = abs(c - j) + abs(d - k) + abs(e - l) - 1;
|
||||||
|
|
||||||
|
int score = abs(b - k) + abs(c - l) + abs(d - m);
|
||||||
|
if (score < spatial_score) {
|
||||||
|
@@ -75,7 +75,7 @@ __inline__ __device__ T temporal_predict
|
||||||
|
int tdiff1 = (abs(A - F) + abs(B - G)) / 2;
|
||||||
|
int tdiff2 = (abs(K - F) + abs(G - L)) / 2;
|
||||||
|
|
||||||
|
- int diff = max3(tdiff0, tdiff1, tdiff2);
|
||||||
|
+ int diff = max3(tdiff0 >> 1, tdiff1, tdiff2);
|
||||||
|
|
||||||
|
if (!skip_check) {
|
||||||
|
int maxi = max3(p2 - p3, p2 - p1, min(p0 - p1, p4 - p3));
|
||||||
|
@@ -85,8 +85,7 @@ __inline__ __device__ T temporal_predict
|
||||||
|
|
||||||
|
if (spatial_pred > p2 + diff) {
|
||||||
|
spatial_pred = p2 + diff;
|
||||||
|
- }
|
||||||
|
- if (spatial_pred < p2 - diff) {
|
||||||
|
+ } else if (spatial_pred < p2 - diff) {
|
||||||
|
spatial_pred = p2 - diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -139,10 +138,10 @@ __inline__ __device__ void yadif_single(
|
||||||
|
// Calculate temporal prediction
|
||||||
|
int is_second_field = !(parity ^ tff);
|
||||||
|
|
||||||
|
- cudaTextureObject_t prev2 = prev;
|
||||||
|
- cudaTextureObject_t prev1 = is_second_field ? cur : prev;
|
||||||
|
- cudaTextureObject_t next1 = is_second_field ? next : cur;
|
||||||
|
- cudaTextureObject_t next2 = next;
|
||||||
|
+ cudaTextureObject_t prev2 = is_second_field ? cur : prev;
|
||||||
|
+ cudaTextureObject_t prev1 = prev;
|
||||||
|
+ cudaTextureObject_t next1 = next;
|
||||||
|
+ cudaTextureObject_t next2 = is_second_field ? next : cur;
|
||||||
|
|
||||||
|
T A = tex2D<T>(prev2, xo, yo - 1);
|
||||||
|
T B = tex2D<T>(prev2, xo, yo + 1);
|
||||||
|
@@ -210,10 +209,10 @@ __inline__ __device__ void yadif_double(
|
||||||
|
// Calculate temporal prediction
|
||||||
|
int is_second_field = !(parity ^ tff);
|
||||||
|
|
||||||
|
- cudaTextureObject_t prev2 = prev;
|
||||||
|
- cudaTextureObject_t prev1 = is_second_field ? cur : prev;
|
||||||
|
- cudaTextureObject_t next1 = is_second_field ? next : cur;
|
||||||
|
- cudaTextureObject_t next2 = next;
|
||||||
|
+ cudaTextureObject_t prev2 = is_second_field ? cur : prev;
|
||||||
|
+ cudaTextureObject_t prev1 = prev;
|
||||||
|
+ cudaTextureObject_t next1 = next;
|
||||||
|
+ cudaTextureObject_t next2 = is_second_field ? next : cur;
|
||||||
|
|
||||||
|
T A = tex2D<T>(prev2, xo, yo - 1);
|
||||||
|
T B = tex2D<T>(prev2, xo, yo + 1);
|
||||||
|
Index: FFmpeg/libavutil/hwcontext_cuda.c
|
||||||
|
===================================================================
|
||||||
|
--- FFmpeg.orig/libavutil/hwcontext_cuda.c
|
||||||
|
+++ FFmpeg/libavutil/hwcontext_cuda.c
|
||||||
|
@@ -207,7 +207,7 @@ static int cuda_get_buffer(AVHWFramesCon
|
||||||
|
if (ctx->sw_format == AV_PIX_FMT_YUV420P) {
|
||||||
|
frame->linesize[1] = frame->linesize[2] = frame->linesize[0] / 2;
|
||||||
|
frame->data[2] = frame->data[1];
|
||||||
|
- frame->data[1] = frame->data[2] + frame->linesize[2] * (ctx->height / 2);
|
||||||
|
+ frame->data[1] = frame->data[2] + frame->linesize[2] * AV_CEIL_RSHIFT(ctx->height, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
frame->format = AV_PIX_FMT_CUDA;
|
||||||
|
@@ -259,7 +259,7 @@ static int cuda_transfer_data(AVHWFrames
|
||||||
|
.srcPitch = src->linesize[i],
|
||||||
|
.dstPitch = dst->linesize[i],
|
||||||
|
.WidthInBytes = FFMIN(src->linesize[i], dst->linesize[i]),
|
||||||
|
- .Height = src->height >> ((i == 0 || i == 3) ? 0 : priv->shift_height),
|
||||||
|
+ .Height = AV_CEIL_RSHIFT(src->height, ((i == 0 || i == 3) ? 0 : priv->shift_height)),
|
||||||
|
};
|
||||||
|
|
||||||
|
if (src->hw_frames_ctx) {
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
Index: FFmpeg/libavcodec/magicyuv.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavcodec/magicyuv.c
|
|
||||||
+++ FFmpeg/libavcodec/magicyuv.c
|
|
||||||
@@ -225,7 +225,8 @@ static int magy_decode_slice10(AVCodecCo
|
|
||||||
s->llviddsp.add_left_pred_int16(dst, dst, max, width, 0);
|
|
||||||
dst += stride;
|
|
||||||
}
|
|
||||||
- lefttop = left = dst[0];
|
|
||||||
+ if (1 + interlaced < height)
|
|
||||||
+ lefttop = left = dst[0];
|
|
||||||
for (k = 1 + interlaced; k < height; k++) {
|
|
||||||
magicyuv_median_pred16(dst, dst - fake_stride, dst, width, &left, &lefttop, max);
|
|
||||||
lefttop = left = dst[0];
|
|
||||||
@@ -584,6 +585,13 @@ static int magy_decode_frame(AVCodecCont
|
|
||||||
"invalid slice height: %d\n", s->slice_height);
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
+ if (s->vshift[1] && (s->slice_height & ((1 << s->vshift[1]) - 1))) {
|
|
||||||
+ av_log(avctx, AV_LOG_ERROR,
|
|
||||||
+ "slice_height %d is not aligned to chroma vertical "
|
|
||||||
+ "subsampling (must be a multiple of %d)\n",
|
|
||||||
+ s->slice_height, 1 << s->vshift[1]);
|
|
||||||
+ return AVERROR_INVALIDDATA;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
bytestream2_skipu(&gb, 4);
|
|
||||||
|
|
||||||
@@ -594,11 +602,11 @@ static int magy_decode_frame(AVCodecCont
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if ((s->slice_height >> s->vshift[1]) <= s->interlaced) {
|
|
||||||
+ av_log(avctx, AV_LOG_ERROR, "impossible slice height\n");
|
|
||||||
+ return AVERROR_INVALIDDATA;
|
|
||||||
+ }
|
|
||||||
if (s->interlaced) {
|
|
||||||
- if ((s->slice_height >> s->vshift[1]) < 2) {
|
|
||||||
- av_log(avctx, AV_LOG_ERROR, "impossible slice height\n");
|
|
||||||
- return AVERROR_INVALIDDATA;
|
|
||||||
- }
|
|
||||||
if ((avctx->coded_height % s->slice_height) && ((avctx->coded_height % s->slice_height) >> s->vshift[1]) < 2) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "impossible height\n");
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
+47
-6
@@ -2,7 +2,35 @@ Index: FFmpeg/fftools/ffmpeg_demux.c
|
|||||||
===================================================================
|
===================================================================
|
||||||
--- FFmpeg.orig/fftools/ffmpeg_demux.c
|
--- FFmpeg.orig/fftools/ffmpeg_demux.c
|
||||||
+++ FFmpeg/fftools/ffmpeg_demux.c
|
+++ FFmpeg/fftools/ffmpeg_demux.c
|
||||||
@@ -1789,18 +1789,21 @@ static int safe_filename(const char *f,
|
@@ -1757,10 +1757,26 @@ static int is_windows_reserved_device_na
|
||||||
|
{
|
||||||
|
#if HAVE_DOS_PATHS
|
||||||
|
for (const char *p = f; p && *p; ) {
|
||||||
|
- char stem[6], *s;
|
||||||
|
+ char stem[16], *s;
|
||||||
|
+ size_t len;
|
||||||
|
av_strlcpy(stem, p, sizeof(stem));
|
||||||
|
+
|
||||||
|
+ if ((s = strchr(stem, '/')))
|
||||||
|
+ *s = 0;
|
||||||
|
+
|
||||||
|
+ /* Trim trailing spaces and dots */
|
||||||
|
+ len = strlen(stem);
|
||||||
|
+ while (len > 0 && (stem[len - 1] == ' ' || stem[len - 1] == '.'))
|
||||||
|
+ stem[--len] = 0;
|
||||||
|
+
|
||||||
|
if ((s = strchr(stem, '.')))
|
||||||
|
*s = 0;
|
||||||
|
+
|
||||||
|
+ /* Trim again after stripping extension */
|
||||||
|
+ len = strlen(stem);
|
||||||
|
+ while (len > 0 && (stem[len - 1] == ' ' || stem[len - 1] == '.'))
|
||||||
|
+ stem[--len] = 0;
|
||||||
|
+
|
||||||
|
if ((s = strpbrk(stem, "123456789")))
|
||||||
|
*s = '1';
|
||||||
|
|
||||||
|
@@ -1789,18 +1805,35 @@ static int safe_filename(const char *f,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (; *f; f++) {
|
for (; *f; f++) {
|
||||||
@@ -10,10 +38,6 @@ Index: FFmpeg/fftools/ffmpeg_demux.c
|
|||||||
- if (!((unsigned)((*f | 32) - 'a') < 26 ||
|
- if (!((unsigned)((*f | 32) - 'a') < 26 ||
|
||||||
- (unsigned)(*f - '0') < 10 || *f == '_' || *f == '-')) {
|
- (unsigned)(*f - '0') < 10 || *f == '_' || *f == '-')) {
|
||||||
- if (f == start)
|
- if (f == start)
|
||||||
- return 0;
|
|
||||||
- else if (allow_subdir && *f == '/')
|
|
||||||
- start = f + 1;
|
|
||||||
- else if (*f != '.')
|
|
||||||
+ /* Non-ASCII bytes cannot be '/' or '.' */
|
+ /* Non-ASCII bytes cannot be '/' or '.' */
|
||||||
+ if ((unsigned char)*f > 127)
|
+ if ((unsigned char)*f > 127)
|
||||||
+ continue;
|
+ continue;
|
||||||
@@ -23,17 +47,34 @@ Index: FFmpeg/fftools/ffmpeg_demux.c
|
|||||||
+ if (*f == '/') {
|
+ if (*f == '/') {
|
||||||
+ if (!allow_subdir || f == start)
|
+ if (!allow_subdir || f == start)
|
||||||
return 0;
|
return 0;
|
||||||
|
- else if (allow_subdir && *f == '/')
|
||||||
|
- start = f + 1;
|
||||||
|
- else if (*f != '.')
|
||||||
|
+
|
||||||
|
+#if HAVE_DOS_PATHS
|
||||||
|
+ /* Reject intermediate dirs ending with trailing spaces or dots */
|
||||||
|
+ if (f > start && (*(f - 1) == ' ' || *(f - 1) == '.'))
|
||||||
|
return 0;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
+ start = f + 1;
|
+ start = f + 1;
|
||||||
+ } else if (*f == '.' && f == start) {
|
+ } else if (*f == '.' && f == start) {
|
||||||
+ return 0;
|
+ return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
- return 1;
|
- return 1;
|
||||||
|
+
|
||||||
|
+#if HAVE_DOS_PATHS
|
||||||
|
+ /* Reject final filenames ending with trailing spaces or dots */
|
||||||
|
+ if (f > start && (*(f - 1) == ' ' || *(f - 1) == '.'))
|
||||||
|
+ return 0;
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
+ return f != start;
|
+ return f != start;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dump_attachment(InputStream *ist, const char *filename)
|
static int dump_attachment(InputStream *ist, const char *filename)
|
||||||
@@ -1817,8 +1820,8 @@ static int dump_attachment(InputStream *
|
@@ -1817,8 +1850,8 @@ static int dump_attachment(InputStream *
|
||||||
if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0))) {
|
if (!*filename && (e = av_dict_get(st->metadata, "filename", NULL, 0))) {
|
||||||
filename = e->value;
|
filename = e->value;
|
||||||
if (!safe_filename(filename, 0)) {
|
if (!safe_filename(filename, 0)) {
|
||||||
-8
@@ -12,11 +12,3 @@ Index: FFmpeg/libavcodec/codec_par.c
|
|||||||
par->width = codec->width;
|
par->width = codec->width;
|
||||||
par->height = codec->height;
|
par->height = codec->height;
|
||||||
par->field_order = codec->field_order;
|
par->field_order = codec->field_order;
|
||||||
@@ -219,6 +220,7 @@ int avcodec_parameters_to_context(AVCode
|
|
||||||
|
|
||||||
switch (par->codec_type) {
|
|
||||||
case AVMEDIA_TYPE_VIDEO:
|
|
||||||
+ codec->sw_pix_fmt =
|
|
||||||
codec->pix_fmt = par->format;
|
|
||||||
codec->width = par->width;
|
|
||||||
codec->height = par->height;
|
|
||||||
-764
@@ -1,764 +0,0 @@
|
|||||||
Index: FFmpeg/libavcodec/aarch64/vp9lpf_16bpp_neon.S
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavcodec/aarch64/vp9lpf_16bpp_neon.S
|
|
||||||
+++ FFmpeg/libavcodec/aarch64/vp9lpf_16bpp_neon.S
|
|
||||||
@@ -56,9 +56,7 @@
|
|
||||||
mov x11, v4.d[0]
|
|
||||||
mov x12, v4.d[1]
|
|
||||||
adds x11, x11, x12
|
|
||||||
- b.ne 1f
|
|
||||||
- ret x10
|
|
||||||
-1:
|
|
||||||
+ b.eq 9f
|
|
||||||
|
|
||||||
.if \wd >= 8
|
|
||||||
dup v0.8h, w5
|
|
||||||
@@ -189,13 +187,7 @@
|
|
||||||
// If no pixels need flat8in, jump to flat8out
|
|
||||||
// (or to a writeout of the inner 4 pixels, for wd=8)
|
|
||||||
.if \wd >= 8
|
|
||||||
-.if \wd == 16
|
|
||||||
b.eq 6f
|
|
||||||
-.else
|
|
||||||
- b.ne 1f
|
|
||||||
- ret x13
|
|
||||||
-1:
|
|
||||||
-.endif
|
|
||||||
|
|
||||||
// flat8in
|
|
||||||
add \tmp1\().8h, v20.8h, v21.8h
|
|
||||||
@@ -249,20 +241,16 @@
|
|
||||||
mov x11, v2.d[0]
|
|
||||||
mov x12, v2.d[1]
|
|
||||||
adds x11, x11, x12
|
|
||||||
- b.ne 1f
|
|
||||||
// If no pixels needed flat8in nor flat8out, jump to a
|
|
||||||
// writeout of the inner 4 pixels
|
|
||||||
- ret x14
|
|
||||||
-1:
|
|
||||||
+ b.eq 7f
|
|
||||||
|
|
||||||
mov x11, v7.d[0]
|
|
||||||
mov x12, v7.d[1]
|
|
||||||
adds x11, x11, x12
|
|
||||||
- b.ne 1f
|
|
||||||
// If no pixels need flat8out, jump to a writeout of the inner 6 pixels
|
|
||||||
- ret x15
|
|
||||||
+ b.eq 8f
|
|
||||||
|
|
||||||
-1:
|
|
||||||
// flat8out
|
|
||||||
// This writes all outputs into v2-v17 (skipping v6 and v16).
|
|
||||||
// If this part is skipped, the output is read from v21-v26 (which is the input
|
|
||||||
@@ -378,35 +366,57 @@
|
|
||||||
// while we need those for inputs/outputs in wd=16 and use v8-v15
|
|
||||||
// for temp registers there instead.
|
|
||||||
function vp9_loop_filter_4
|
|
||||||
+ mov x13, #0
|
|
||||||
loop_filter 4, v16, v17, v18, v19, v28, v29, v30, v31
|
|
||||||
ret
|
|
||||||
+9:
|
|
||||||
+ mov x13, #(1<<9)
|
|
||||||
+ ret
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function vp9_loop_filter_8
|
|
||||||
+ mov x13, #0
|
|
||||||
loop_filter 8, v16, v17, v18, v19, v28, v29, v30, v31
|
|
||||||
ret
|
|
||||||
+6:
|
|
||||||
+ mov x13, #(1<<6)
|
|
||||||
+ ret
|
|
||||||
+9:
|
|
||||||
+ mov x13, #(1<<9)
|
|
||||||
+ ret
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function vp9_loop_filter_16
|
|
||||||
+ mov x13, #0
|
|
||||||
loop_filter 16, v8, v9, v10, v11, v12, v13, v14, v15
|
|
||||||
ret
|
|
||||||
+7:
|
|
||||||
+ mov x13, #(1<<7)
|
|
||||||
+ ret
|
|
||||||
+8:
|
|
||||||
+ mov x13, #(1<<8)
|
|
||||||
+ ret
|
|
||||||
+9:
|
|
||||||
+ mov x13, #(1<<9)
|
|
||||||
+ ret
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
.macro loop_filter_4
|
|
||||||
bl vp9_loop_filter_4
|
|
||||||
+ tbnz x13, #9, 9f
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro loop_filter_8
|
|
||||||
- // calculate alternative 'return' targets
|
|
||||||
- adr x13, 6f
|
|
||||||
bl vp9_loop_filter_8
|
|
||||||
+ tbnz x13, #6, 6f
|
|
||||||
+ tbnz x13, #9, 9f
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro loop_filter_16
|
|
||||||
- // calculate alternative 'return' targets
|
|
||||||
- adr x14, 7f
|
|
||||||
- adr x15, 8f
|
|
||||||
bl vp9_loop_filter_16
|
|
||||||
+ tbnz x13, #7, 7f
|
|
||||||
+ tbnz x13, #8, 8f
|
|
||||||
+ tbnz x13, #9, 9f
|
|
||||||
.endm
|
|
||||||
|
|
||||||
|
|
||||||
@@ -540,7 +550,7 @@ function vp9_loop_filter_v_4_8_16_neon
|
|
||||||
st1 {v23.8h}, [x9], x1
|
|
||||||
st1 {v25.8h}, [x0], x1
|
|
||||||
sub x0, x0, x1, lsl #1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
@@ -588,7 +598,7 @@ function vp9_loop_filter_h_4_8_16_neon
|
|
||||||
st1 {v25.d}[1], [x0], x1
|
|
||||||
sub x0, x0, x1, lsl #3
|
|
||||||
add x0, x0, #4
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
@@ -619,7 +629,7 @@ function vp9_loop_filter_v_8_8_16_neon
|
|
||||||
st1 {v26.8h}, [x0], x1
|
|
||||||
sub x0, x0, x1, lsl #1
|
|
||||||
sub x0, x0, x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
6:
|
|
||||||
sub x9, x0, x1, lsl #1
|
|
||||||
@@ -670,7 +680,7 @@ function vp9_loop_filter_h_8_8_16_neon
|
|
||||||
st1 {v27.8h}, [x0], x1
|
|
||||||
sub x0, x0, x1, lsl #3
|
|
||||||
add x0, x0, #8
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
6:
|
|
||||||
// If we didn't need to do the flat8in part, we use the same writeback
|
|
||||||
@@ -742,7 +752,7 @@ function vp9_loop_filter_v_16_8_16_neon
|
|
||||||
st1 {v17.8h}, [x0], x1
|
|
||||||
sub x0, x0, x1, lsl #3
|
|
||||||
add x0, x0, x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
8:
|
|
||||||
add x9, x9, x1, lsl #2
|
|
||||||
@@ -820,7 +830,7 @@ function vp9_loop_filter_h_16_8_16_neon
|
|
||||||
st1 {v9.8h}, [x9], x1
|
|
||||||
st1 {v31.8h}, [x0], x1
|
|
||||||
sub x0, x0, x1, lsl #3
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
8:
|
|
||||||
// The same writeback as in loop_filter_h_8_8
|
|
||||||
Index: FFmpeg/libavcodec/aarch64/vp9lpf_neon.S
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavcodec/aarch64/vp9lpf_neon.S
|
|
||||||
+++ FFmpeg/libavcodec/aarch64/vp9lpf_neon.S
|
|
||||||
@@ -388,32 +388,28 @@
|
|
||||||
.endif
|
|
||||||
.if \wd == 16
|
|
||||||
6:
|
|
||||||
+ // If no pixels needed flat8in nor flat8out, jump to a
|
|
||||||
+ // writeout of the inner 4 pixels
|
|
||||||
orr v2\sz, v6\sz, v7\sz
|
|
||||||
mov x5, v2.d[0]
|
|
||||||
.ifc \sz, .16b
|
|
||||||
mov x6, v2.d[1]
|
|
||||||
adds x5, x5, x6
|
|
||||||
- b.ne 1f
|
|
||||||
+ b.eq 7f
|
|
||||||
.else
|
|
||||||
- cbnz x5, 1f
|
|
||||||
+ cbz x5, 7f
|
|
||||||
.endif
|
|
||||||
- // If no pixels needed flat8in nor flat8out, jump to a
|
|
||||||
- // writeout of the inner 4 pixels
|
|
||||||
- ret x14
|
|
||||||
-1:
|
|
||||||
|
|
||||||
+ // If no pixels need flat8out, jump to a writeout of the inner 6 pixels
|
|
||||||
mov x5, v7.d[0]
|
|
||||||
.ifc \sz, .16b
|
|
||||||
mov x6, v7.d[1]
|
|
||||||
adds x5, x5, x6
|
|
||||||
- b.ne 1f
|
|
||||||
+ b.eq 8f
|
|
||||||
.else
|
|
||||||
- cbnz x5, 1f
|
|
||||||
+ cbz x5, 8f
|
|
||||||
.endif
|
|
||||||
- // If no pixels need flat8out, jump to a writeout of the inner 6 pixels
|
|
||||||
- ret x15
|
|
||||||
|
|
||||||
-1:
|
|
||||||
// flat8out
|
|
||||||
// This writes all outputs into v2-v17 (skipping v6 and v16).
|
|
||||||
// If this part is skipped, the output is read from v21-v26 (which is the input
|
|
||||||
@@ -529,76 +525,94 @@
|
|
||||||
// while we need those for inputs/outputs in wd=16 and use v8-v15
|
|
||||||
// for temp registers there instead.
|
|
||||||
function vp9_loop_filter_4
|
|
||||||
+ mov x13, #0
|
|
||||||
loop_filter 4, .8b, 0, v16, v17, v18, v19, v28, v29, v30, v31
|
|
||||||
ret
|
|
||||||
9:
|
|
||||||
- ret x10
|
|
||||||
+ mov x13, #(1<<9)
|
|
||||||
+ ret
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function vp9_loop_filter_4_16b_mix_44
|
|
||||||
+ mov x13, #0
|
|
||||||
loop_filter 4, .16b, 44, v16, v17, v18, v19, v28, v29, v30, v31
|
|
||||||
ret
|
|
||||||
9:
|
|
||||||
- ret x10
|
|
||||||
+ mov x13, #(1<<9)
|
|
||||||
+ ret
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function vp9_loop_filter_8
|
|
||||||
+ mov x13, #0
|
|
||||||
loop_filter 8, .8b, 0, v16, v17, v18, v19, v28, v29, v30, v31
|
|
||||||
ret
|
|
||||||
6:
|
|
||||||
- ret x13
|
|
||||||
+ mov x13, #(1<<6)
|
|
||||||
+ ret
|
|
||||||
9:
|
|
||||||
- ret x10
|
|
||||||
+ mov x13, #(1<<9)
|
|
||||||
+ ret
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function vp9_loop_filter_8_16b_mix
|
|
||||||
+ mov x13, #0
|
|
||||||
loop_filter 8, .16b, 88, v16, v17, v18, v19, v28, v29, v30, v31
|
|
||||||
ret
|
|
||||||
6:
|
|
||||||
- ret x13
|
|
||||||
+ mov x13, #(1<<6)
|
|
||||||
+ ret
|
|
||||||
9:
|
|
||||||
- ret x10
|
|
||||||
+ mov x13, #(1<<9)
|
|
||||||
+ ret
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function vp9_loop_filter_16
|
|
||||||
+ mov x13, #0
|
|
||||||
loop_filter 16, .8b, 0, v8, v9, v10, v11, v12, v13, v14, v15
|
|
||||||
ret
|
|
||||||
+7:
|
|
||||||
+ mov x13, #(1<<7)
|
|
||||||
+ ret
|
|
||||||
+8:
|
|
||||||
+ mov x13, #(1<<8)
|
|
||||||
+ ret
|
|
||||||
9:
|
|
||||||
- ldp d10, d11, [sp, #0x10]
|
|
||||||
- ldp d12, d13, [sp, #0x20]
|
|
||||||
- ldp d14, d15, [sp, #0x30]
|
|
||||||
- ldp d8, d9, [sp], #0x40
|
|
||||||
- ret x10
|
|
||||||
+ mov x13, #(1<<9)
|
|
||||||
+ ret
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
function vp9_loop_filter_16_16b
|
|
||||||
+ mov x13, #0
|
|
||||||
loop_filter 16, .16b, 0, v8, v9, v10, v11, v12, v13, v14, v15
|
|
||||||
ret
|
|
||||||
+7:
|
|
||||||
+ mov x13, #(1<<7)
|
|
||||||
+ ret
|
|
||||||
+8:
|
|
||||||
+ mov x13, #(1<<8)
|
|
||||||
+ ret
|
|
||||||
9:
|
|
||||||
- ldp d10, d11, [sp, #0x10]
|
|
||||||
- ldp d12, d13, [sp, #0x20]
|
|
||||||
- ldp d14, d15, [sp, #0x30]
|
|
||||||
- ldp d8, d9, [sp], #0x40
|
|
||||||
- ret x10
|
|
||||||
+ mov x13, #(1<<9)
|
|
||||||
+ ret
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
.macro loop_filter_4
|
|
||||||
bl vp9_loop_filter_4
|
|
||||||
+ tbnz x13, #9, 9f
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro loop_filter_4_16b_mix mix
|
|
||||||
bl vp9_loop_filter_4_16b_mix_\mix
|
|
||||||
+ tbnz x13, #9, 9f
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro loop_filter_8
|
|
||||||
- // calculate alternative 'return' targets
|
|
||||||
- adr x13, 6f
|
|
||||||
bl vp9_loop_filter_8
|
|
||||||
+ tbnz x13, #6, 6f
|
|
||||||
+ tbnz x13, #9, 9f
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro loop_filter_8_16b_mix mix
|
|
||||||
- // calculate alternative 'return' targets
|
|
||||||
- adr x13, 6f
|
|
||||||
.if \mix == 48
|
|
||||||
mov x11, #0xffffffff00000000
|
|
||||||
.elseif \mix == 84
|
|
||||||
@@ -607,20 +621,22 @@ endfunc
|
|
||||||
mov x11, #0xffffffffffffffff
|
|
||||||
.endif
|
|
||||||
bl vp9_loop_filter_8_16b_mix
|
|
||||||
+ tbnz x13, #6, 6f
|
|
||||||
+ tbnz x13, #9, 9f
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro loop_filter_16
|
|
||||||
- // calculate alternative 'return' targets
|
|
||||||
- adr x14, 7f
|
|
||||||
- adr x15, 8f
|
|
||||||
bl vp9_loop_filter_16
|
|
||||||
+ tbnz x13, #7, 7f
|
|
||||||
+ tbnz x13, #8, 8f
|
|
||||||
+ tbnz x13, #9, 9f
|
|
||||||
.endm
|
|
||||||
|
|
||||||
.macro loop_filter_16_16b
|
|
||||||
- // calculate alternative 'return' targets
|
|
||||||
- adr x14, 7f
|
|
||||||
- adr x15, 8f
|
|
||||||
bl vp9_loop_filter_16_16b
|
|
||||||
+ tbnz x13, #7, 7f
|
|
||||||
+ tbnz x13, #8, 8f
|
|
||||||
+ tbnz x13, #9, 9f
|
|
||||||
.endm
|
|
||||||
|
|
||||||
|
|
||||||
@@ -647,7 +663,7 @@ function ff_vp9_loop_filter_v_4_8_neon,
|
|
||||||
st1 {v24.8b}, [x0], x1
|
|
||||||
st1 {v23.8b}, [x9], x1
|
|
||||||
st1 {v25.8b}, [x0], x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
@@ -671,7 +687,7 @@ function ff_vp9_loop_filter_v_44_16_neon
|
|
||||||
st1 {v24.16b}, [x0], x1
|
|
||||||
st1 {v23.16b}, [x9], x1
|
|
||||||
st1 {v25.16b}, [x0], x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
@@ -713,7 +729,7 @@ function ff_vp9_loop_filter_h_4_8_neon,
|
|
||||||
st1 {v24.s}[1], [x0], x1
|
|
||||||
st1 {v25.s}[0], [x9], x1
|
|
||||||
st1 {v25.s}[1], [x0], x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
@@ -765,7 +781,7 @@ function ff_vp9_loop_filter_h_44_16_neon
|
|
||||||
st1 {v24.s}[3], [x0], x1
|
|
||||||
st1 {v25.s}[1], [x9], x1
|
|
||||||
st1 {v25.s}[3], [x0], x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
endfunc
|
|
||||||
|
|
||||||
@@ -792,7 +808,7 @@ function ff_vp9_loop_filter_v_8_8_neon,
|
|
||||||
st1 {v25.8b}, [x0], x1
|
|
||||||
st1 {v23.8b}, [x9], x1
|
|
||||||
st1 {v26.8b}, [x0], x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
6:
|
|
||||||
sub x9, x0, x1, lsl #1
|
|
||||||
@@ -827,7 +843,7 @@ function ff_vp9_loop_filter_v_\mix\()_16
|
|
||||||
st1 {v25.16b}, [x0], x1
|
|
||||||
st1 {v23.16b}, [x9], x1
|
|
||||||
st1 {v26.16b}, [x0], x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
6:
|
|
||||||
sub x9, x0, x1, lsl #1
|
|
||||||
@@ -875,7 +891,7 @@ function ff_vp9_loop_filter_h_8_8_neon,
|
|
||||||
st1 {v26.8b}, [x0], x1
|
|
||||||
st1 {v23.8b}, [x9], x1
|
|
||||||
st1 {v27.8b}, [x0], x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
6:
|
|
||||||
// If we didn't need to do the flat8in part, we use the same writeback
|
|
||||||
@@ -941,7 +957,7 @@ function ff_vp9_loop_filter_h_\mix\()_16
|
|
||||||
st1 {v26.d}[1], [x0], x1
|
|
||||||
st1 {v27.8b}, [x9], x1
|
|
||||||
st1 {v27.d}[1], [x0], x1
|
|
||||||
-
|
|
||||||
+9:
|
|
||||||
ret x10
|
|
||||||
6:
|
|
||||||
add x9, x9, #2
|
|
||||||
Index: FFmpeg/libavcodec/vulkan_encode.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavcodec/vulkan_encode.c
|
|
||||||
+++ FFmpeg/libavcodec/vulkan_encode.c
|
|
||||||
@@ -772,14 +772,6 @@ av_cold int ff_vulkan_encode_init(AVCode
|
|
||||||
return AVERROR(EINVAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
- if ((ctx->enc_caps.supportedEncodeFeedbackFlags & feedback_flags) !=
|
|
||||||
- feedback_flags) {
|
|
||||||
- av_log (avctx, AV_LOG_ERROR,
|
|
||||||
- "Driver does not support required encode feedback flags "
|
|
||||||
- "(BUFFER_OFFSET and BYTES_WRITTEN).\n");
|
|
||||||
- return AVERROR(ENOTSUP);
|
|
||||||
- }
|
|
||||||
-
|
|
||||||
ctx->base.op = &vulkan_base_encode_ops;
|
|
||||||
ctx->codec = codec;
|
|
||||||
|
|
||||||
@@ -881,6 +873,14 @@ av_cold int ff_vulkan_encode_init(AVCode
|
|
||||||
return AVERROR_EXTERNAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
+ if ((ctx->enc_caps.supportedEncodeFeedbackFlags & feedback_flags) !=
|
|
||||||
+ feedback_flags) {
|
|
||||||
+ av_log(avctx, AV_LOG_ERROR,
|
|
||||||
+ "Driver does not support required encode feedback flags "
|
|
||||||
+ "(BUFFER_OFFSET and BYTES_WRITTEN).\n");
|
|
||||||
+ return AVERROR(ENOTSUP);
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
err = init_rc(avctx, ctx);
|
|
||||||
if (err < 0)
|
|
||||||
return err;
|
|
||||||
Index: FFmpeg/libavformat/dashdec.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/dashdec.c
|
|
||||||
+++ FFmpeg/libavformat/dashdec.c
|
|
||||||
@@ -447,7 +447,7 @@ static int open_url(AVFormatContext *s,
|
|
||||||
av_freep(pb);
|
|
||||||
av_dict_copy(&tmp, *opts, 0);
|
|
||||||
av_dict_copy(&tmp, opts2, 0);
|
|
||||||
- ret = ffio_open_whitelist(pb, url, AVIO_FLAG_READ, c->interrupt_callback, &tmp, s->protocol_whitelist, s->protocol_blacklist);
|
|
||||||
+ ret = s->io_open(s, pb, url, AVIO_FLAG_READ, &tmp);
|
|
||||||
if (ret >= 0) {
|
|
||||||
// update cookies on http response with setcookies.
|
|
||||||
char *new_cookies = NULL;
|
|
||||||
@@ -1255,7 +1255,7 @@ static int parse_manifest(AVFormatContex
|
|
||||||
close_in = 1;
|
|
||||||
|
|
||||||
av_dict_copy(&opts, c->avio_opts, 0);
|
|
||||||
- ret = ffio_open_whitelist(&in, url, AVIO_FLAG_READ, c->interrupt_callback, &opts, s->protocol_whitelist, s->protocol_blacklist);
|
|
||||||
+ ret = s->io_open(s, &in, url, AVIO_FLAG_READ, &opts);
|
|
||||||
av_dict_free(&opts);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
@@ -1398,7 +1398,7 @@ cleanup:
|
|
||||||
|
|
||||||
av_bprint_finalize(&buf, NULL);
|
|
||||||
if (close_in) {
|
|
||||||
- avio_close(in);
|
|
||||||
+ ff_format_io_close(s, &in);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
Index: FFmpeg/libavformat/dashenc.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/dashenc.c
|
|
||||||
+++ FFmpeg/libavformat/dashenc.c
|
|
||||||
@@ -490,7 +490,7 @@ static void dash_free(AVFormatContext *s
|
|
||||||
if (!c->single_file)
|
|
||||||
ffio_free_dyn_buf(&os->ctx->pb);
|
|
||||||
else
|
|
||||||
- avio_close(os->ctx->pb);
|
|
||||||
+ ff_format_io_close(s, &os->ctx->pb);
|
|
||||||
}
|
|
||||||
ff_format_io_close(s, &os->out);
|
|
||||||
avformat_free_context(os->ctx);
|
|
||||||
@@ -1458,7 +1458,7 @@ static int dash_init(AVFormatContext *s)
|
|
||||||
ret = s->io_open(s, &os->out, filename, AVIO_FLAG_WRITE, &opts);
|
|
||||||
} else {
|
|
||||||
ctx->url = av_strdup(filename);
|
|
||||||
- ret = avio_open2(&ctx->pb, filename, AVIO_FLAG_WRITE, NULL, &opts);
|
|
||||||
+ ret = s->io_open(s, &ctx->pb, filename, AVIO_FLAG_WRITE, &opts);
|
|
||||||
}
|
|
||||||
av_dict_free(&opts);
|
|
||||||
if (ret < 0)
|
|
||||||
Index: FFmpeg/libavformat/demux.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/demux.c
|
|
||||||
+++ FFmpeg/libavformat/demux.c
|
|
||||||
@@ -368,7 +368,7 @@ fail:
|
|
||||||
ff_id3v2_free_extra_meta(&id3v2_extra_meta);
|
|
||||||
av_dict_free(&tmp);
|
|
||||||
if (s->pb && !(s->flags & AVFMT_FLAG_CUSTOM_IO))
|
|
||||||
- avio_closep(&s->pb);
|
|
||||||
+ ff_format_io_close(s, &s->pb);
|
|
||||||
avformat_free_context(s);
|
|
||||||
*ps = NULL;
|
|
||||||
return ret;
|
|
||||||
Index: FFmpeg/libavformat/hlsenc.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/hlsenc.c
|
|
||||||
+++ FFmpeg/libavformat/hlsenc.c
|
|
||||||
@@ -703,7 +703,7 @@ static int do_encrypt(AVFormatContext *s
|
|
||||||
return ret;
|
|
||||||
avio_seek(pb, 0, SEEK_CUR);
|
|
||||||
avio_write(pb, key, KEYSIZE);
|
|
||||||
- avio_close(pb);
|
|
||||||
+ ff_format_io_close(s, &pb);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -1171,9 +1171,7 @@ static int parse_playlist(AVFormatContex
|
|
||||||
const char *end;
|
|
||||||
double discont_program_date_time = 0;
|
|
||||||
|
|
||||||
- if ((ret = ffio_open_whitelist(&in, url, AVIO_FLAG_READ,
|
|
||||||
- &s->interrupt_callback, NULL,
|
|
||||||
- s->protocol_whitelist, s->protocol_blacklist)) < 0)
|
|
||||||
+ if ((ret = s->io_open(s, &in, url, AVIO_FLAG_READ, NULL)) < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
ff_get_chomp_line(in, line, sizeof(line));
|
|
||||||
@@ -1283,7 +1281,7 @@ static int parse_playlist(AVFormatContex
|
|
||||||
}
|
|
||||||
|
|
||||||
fail:
|
|
||||||
- avio_close(in);
|
|
||||||
+ ff_format_io_close(s, &in);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
Index: FFmpeg/libavformat/mov.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/mov.c
|
|
||||||
+++ FFmpeg/libavformat/mov.c
|
|
||||||
@@ -1237,15 +1237,13 @@ static int mov_read_chnl(MOVContext *c,
|
|
||||||
version = avio_r8(pb);
|
|
||||||
flags = avio_rb24(pb);
|
|
||||||
if (version != 0 || flags != 0) {
|
|
||||||
- av_log(c->fc, AV_LOG_ERROR,
|
|
||||||
- "Unsupported 'chnl' box with version %d, flags: %#x",
|
|
||||||
+ av_log(c->fc, AV_LOG_WARNING,
|
|
||||||
+ "Unsupported 'chnl' box with version %d, flags: %#x\n",
|
|
||||||
version, flags);
|
|
||||||
- return AVERROR_INVALIDDATA;
|
|
||||||
+ return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ret = ff_mov_read_chnl(c->fc, pb, st);
|
|
||||||
- if (ret < 0)
|
|
||||||
- return ret;
|
|
||||||
+ ff_mov_read_chnl(c->fc, pb, st);
|
|
||||||
|
|
||||||
if (avio_tell(pb) != end) {
|
|
||||||
av_log(c->fc, AV_LOG_WARNING, "skip %" PRId64 " bytes of unknown data inside chnl\n",
|
|
||||||
Index: FFmpeg/libavformat/mov_chan.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/mov_chan.c
|
|
||||||
+++ FFmpeg/libavformat/mov_chan.c
|
|
||||||
@@ -375,6 +375,7 @@ static int mov_get_channel_layout(AVChan
|
|
||||||
/* find the channel layout for the specified layout tag */
|
|
||||||
layout_map = find_layout_map(tag, map);
|
|
||||||
if (layout_map) {
|
|
||||||
+ AVChannelLayout tmp = { 0 };
|
|
||||||
int ret;
|
|
||||||
int map_layout_nb_channels = tag & 0xFFFF;
|
|
||||||
int nb_channels = ch_layout->nb_channels;
|
|
||||||
@@ -383,19 +384,23 @@ static int mov_get_channel_layout(AVChan
|
|
||||||
if (omitted_channel_map >> map_layout_nb_channels)
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
- av_channel_layout_uninit(ch_layout);
|
|
||||||
- ret = av_channel_layout_custom_init(ch_layout, nb_channels);
|
|
||||||
+ ret = av_channel_layout_custom_init(&tmp, nb_channels);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
for (int i = 0, idx = 0; i < map_layout_nb_channels && idx < nb_channels; i++, omitted_channel_map >>= 1) {
|
|
||||||
if (!(omitted_channel_map & 1)) {
|
|
||||||
enum AVChannel id = layout_map[i].id;
|
|
||||||
- ch_layout->u.map[idx++].id = (id != AV_CHAN_NONE ? id : AV_CHAN_UNKNOWN);
|
|
||||||
+ tmp.u.map[idx++].id = (id != AV_CHAN_NONE ? id : AV_CHAN_UNKNOWN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- return av_channel_layout_retype(ch_layout, 0, AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
|
|
||||||
+ ret = av_channel_layout_retype(&tmp, 0, AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
|
|
||||||
+ if (ret < 0)
|
|
||||||
+ return ret;
|
|
||||||
+
|
|
||||||
+ av_channel_layout_uninit(ch_layout);
|
|
||||||
+ *ch_layout = tmp;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -543,6 +548,7 @@ int ff_mov_read_chan(AVFormatContext *s,
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (layout_tag == MOV_CH_LAYOUT_USE_DESCRIPTIONS) {
|
|
||||||
+ AVChannelLayout tmp = { 0 };
|
|
||||||
int nb_channels = ch_layout->nb_channels;
|
|
||||||
|
|
||||||
if (!num_descr || num_descr < nb_channels) {
|
|
||||||
@@ -562,8 +568,7 @@ int ff_mov_read_chan(AVFormatContext *s,
|
|
||||||
num_descr = nb_channels;
|
|
||||||
}
|
|
||||||
|
|
||||||
- av_channel_layout_uninit(ch_layout);
|
|
||||||
- ret = av_channel_layout_custom_init(ch_layout, nb_channels);
|
|
||||||
+ ret = av_channel_layout_custom_init(&tmp, nb_channels);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
@@ -580,12 +585,15 @@ int ff_mov_read_chan(AVFormatContext *s,
|
|
||||||
avio_rl32(pb); // mCoordinates[1]
|
|
||||||
avio_rl32(pb); // mCoordinates[2]
|
|
||||||
size -= 20;
|
|
||||||
- ch_layout->u.map[i].id = mov_get_channel_id(label);
|
|
||||||
+ tmp.u.map[i].id = mov_get_channel_id(label);
|
|
||||||
}
|
|
||||||
|
|
||||||
- ret = av_channel_layout_retype(ch_layout, 0, AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
|
|
||||||
+ ret = av_channel_layout_retype(&tmp, 0, AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
|
|
||||||
if (ret < 0)
|
|
||||||
goto out;
|
|
||||||
+
|
|
||||||
+ av_channel_layout_uninit(ch_layout);
|
|
||||||
+ *ch_layout = tmp;
|
|
||||||
} else if (layout_tag == MOV_CH_LAYOUT_USE_BITMAP) {
|
|
||||||
if (!ch_layout->nb_channels || av_popcount(bitmap) == ch_layout->nb_channels) {
|
|
||||||
if (bitmap < 0x40000) {
|
|
||||||
@@ -737,11 +745,10 @@ int ff_mov_read_chnl(AVFormatContext *s,
|
|
||||||
|
|
||||||
av_log(s, AV_LOG_TRACE, "'chnl' layout %d\n", layout);
|
|
||||||
if (!layout) {
|
|
||||||
- AVChannelLayout *ch_layout = &st->codecpar->ch_layout;
|
|
||||||
+ AVChannelLayout tmp = { 0 }, *ch_layout = &st->codecpar->ch_layout;
|
|
||||||
int nb_channels = ch_layout->nb_channels;
|
|
||||||
|
|
||||||
- av_channel_layout_uninit(ch_layout);
|
|
||||||
- ret = av_channel_layout_custom_init(ch_layout, nb_channels);
|
|
||||||
+ ret = av_channel_layout_custom_init(&tmp, nb_channels);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
@@ -762,12 +769,15 @@ int ff_mov_read_chnl(AVFormatContext *s,
|
|
||||||
channel = AV_CHAN_UNKNOWN;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ch_layout->u.map[i].id = channel;
|
|
||||||
+ tmp.u.map[i].id = channel;
|
|
||||||
}
|
|
||||||
|
|
||||||
- ret = av_channel_layout_retype(ch_layout, 0, AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
|
|
||||||
+ ret = av_channel_layout_retype(&tmp, 0, AV_CHANNEL_LAYOUT_RETYPE_FLAG_CANONICAL);
|
|
||||||
if (ret < 0)
|
|
||||||
return ret;
|
|
||||||
+
|
|
||||||
+ av_channel_layout_uninit(ch_layout);
|
|
||||||
+ *ch_layout = tmp;
|
|
||||||
} else {
|
|
||||||
uint64_t omitted_channel_map = avio_rb64(pb);
|
|
||||||
ret = ff_mov_get_channel_layout_from_config(layout, &st->codecpar->ch_layout, omitted_channel_map);
|
|
||||||
Index: FFmpeg/libavformat/oggparsecelt.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/oggparsecelt.c
|
|
||||||
+++ FFmpeg/libavformat/oggparsecelt.c
|
|
||||||
@@ -27,6 +27,9 @@
|
|
||||||
#include "internal.h"
|
|
||||||
#include "oggdec.h"
|
|
||||||
|
|
||||||
+/* CELT-over-Ogg streams use at most a couple of vorbiscomment "extra" headers. */
|
|
||||||
+#define CELT_MAX_EXTRA_HEADERS 16
|
|
||||||
+
|
|
||||||
struct oggcelt_private {
|
|
||||||
int extra_headers_left;
|
|
||||||
};
|
|
||||||
@@ -62,6 +65,12 @@ static int celt_header(AVFormatContext *
|
|
||||||
overlap = AV_RL32(p + 48);
|
|
||||||
/* unused bytes per packet field skipped */
|
|
||||||
extra_headers = AV_RL32(p + 56);
|
|
||||||
+ if (extra_headers > CELT_MAX_EXTRA_HEADERS) {
|
|
||||||
+ av_log(s, AV_LOG_ERROR,
|
|
||||||
+ "Too many CELT extra headers (%u)\n", extra_headers);
|
|
||||||
+ av_free(priv);
|
|
||||||
+ return AVERROR_INVALIDDATA;
|
|
||||||
+ }
|
|
||||||
st->codecpar->codec_type = AVMEDIA_TYPE_AUDIO;
|
|
||||||
st->codecpar->codec_id = AV_CODEC_ID_CELT;
|
|
||||||
st->codecpar->sample_rate = sample_rate;
|
|
||||||
Index: FFmpeg/libavformat/oggparsevorbis.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/oggparsevorbis.c
|
|
||||||
+++ FFmpeg/libavformat/oggparsevorbis.c
|
|
||||||
@@ -230,8 +230,11 @@ static int fixup_vorbis_headers(AVFormat
|
|
||||||
int i, offset, len, err;
|
|
||||||
int buf_len;
|
|
||||||
unsigned char *ptr;
|
|
||||||
+ uint64_t total_len = (uint64_t)priv->len[0] + priv->len[1] + priv->len[2];
|
|
||||||
+ if (total_len + total_len / 255 + 64 > INT_MAX)
|
|
||||||
+ return AVERROR_INVALIDDATA;
|
|
||||||
|
|
||||||
- len = priv->len[0] + priv->len[1] + priv->len[2];
|
|
||||||
+ len = total_len;
|
|
||||||
buf_len = len + len / 255 + 64;
|
|
||||||
|
|
||||||
if (*buf)
|
|
||||||
Index: FFmpeg/libavformat/rtpdec_av1.c
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/rtpdec_av1.c
|
|
||||||
+++ FFmpeg/libavformat/rtpdec_av1.c
|
|
||||||
@@ -249,7 +249,7 @@ static int av1_handle_packet(AVFormatCon
|
|
||||||
// ignore and remove OBUs according to spec
|
|
||||||
if ((obu_type == AV1_OBU_TEMPORAL_DELIMITER) ||
|
|
||||||
(obu_type == AV1_OBU_TILE_LIST)) {
|
|
||||||
- pktpos += obu_size;
|
|
||||||
+ buf_ptr += obu_size;
|
|
||||||
rem_pkt_size -= obu_size;
|
|
||||||
// TODO: This probably breaks if the OBU_TILE_LIST is fragmented
|
|
||||||
// into the next RTP packet, so at least check and fail here
|
|
||||||
Index: FFmpeg/libavformat/version.h
|
|
||||||
===================================================================
|
|
||||||
--- FFmpeg.orig/libavformat/version.h
|
|
||||||
+++ FFmpeg/libavformat/version.h
|
|
||||||
@@ -32,7 +32,7 @@
|
|
||||||
#include "version_major.h"
|
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_MINOR 12
|
|
||||||
-#define LIBAVFORMAT_VERSION_MICRO 101
|
|
||||||
+#define LIBAVFORMAT_VERSION_MICRO 102
|
|
||||||
|
|
||||||
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
|
|
||||||
LIBAVFORMAT_VERSION_MINOR, \
|
|
||||||
Vendored
+6
-8
@@ -74,19 +74,17 @@
|
|||||||
0074-fix-mapped-hwframe-to-swframe-swscale-conversion.patch
|
0074-fix-mapped-hwframe-to-swframe-swscale-conversion.patch
|
||||||
0075-fix-hwupload-filter-cannot-use-devices-created-by-hwaccel.patch
|
0075-fix-hwupload-filter-cannot-use-devices-created-by-hwaccel.patch
|
||||||
0076-fix-seeking-h264-open-gop-videos-with-d3d11va-on-amd.patch
|
0076-fix-seeking-h264-open-gop-videos-with-d3d11va-on-amd.patch
|
||||||
0077-fix-low-default-readrate-catchup-caused-remuxing-to-stall.patch
|
0077-fix-readrate-catchup-caused-remuxing-to-stall.patch
|
||||||
0078-backport-fixes-for-vulkan-from-upstream.patch
|
0078-backport-fixes-for-vulkan-from-upstream.patch
|
||||||
0079-add-fixes-for-vaapi-drm-prime-vulkan-interop.patch
|
0079-add-fixes-for-vaapi-drm-prime-vulkan-interop.patch
|
||||||
0080-prefer-vulkan-device-with-higher-api-version.patch
|
0080-prefer-vulkan-device-with-higher-api-version.patch
|
||||||
0081-signal-vulkan-semaphores-in-drm-prime-reverse-mapping.patch
|
0081-signal-vulkan-semaphores-in-drm-prime-reverse-mapping.patch
|
||||||
0082-add-fixes-and-enhancements-for-vulkan-filters.patch
|
0082-add-fixes-and-enhancements-for-vulkan-filters.patch
|
||||||
0083-backport-fixes-for-nvenc-and-cuvid-from-upstream.patch
|
0083-backport-fixes-for-cuda-from-upstream.patch
|
||||||
0084-backport-fixes-for-detecting-ac4-streams-in-mpegts.patch
|
0084-backport-fixes-for-detecting-ac4-streams-in-mpegts.patch
|
||||||
0085-fix-hdr10-sidedata-not-removed-in-libplacebo-outlink.patch
|
0085-fix-hdr10-sidedata-not-removed-in-libplacebo-outlink.patch
|
||||||
0086-workaround-amd-hevc-vaapi-encoder-out-of-band-vtag-hvc1.patch
|
0086-workaround-amd-hevc-vaapi-encoder-out-of-band-vtag-hvc1.patch
|
||||||
0087-backport-a-fix-from-upstream-for-magicyuv-decoder.patch
|
0087-add-dtsx-detect-for-dts-hd-hra.patch
|
||||||
0088-add-dtsx-detect-for-dts-hd-hra.patch
|
0088-add-webp-to-matroskadec-image-mime-types.patch
|
||||||
0089-add-webp-to-matroskadec-image-mime-types.patch
|
0089-relax-to-allow-safe-filenames-in-mkv-attachments.patch
|
||||||
0090-relax-to-allow-safe-filenames-in-mkv-attachments.patch
|
0090-backport-a-fix-to-use-sw-pix-fmt-in-codec-par-if-set.patch
|
||||||
0091-backport-a-fix-to-use-sw-pix-fmt-in-codec-par-if-set.patch
|
|
||||||
0092-backport-fixes-by-comparing-n8-1-1-and-release-8-1.patch
|
|
||||||
|
|||||||
+1
-1
@@ -38,7 +38,7 @@ PROJECT_NAME = FFmpeg
|
|||||||
# could be handy for archiving the generated documentation or if some version
|
# could be handy for archiving the generated documentation or if some version
|
||||||
# control system is used.
|
# control system is used.
|
||||||
|
|
||||||
PROJECT_NUMBER = 8.1.1
|
PROJECT_NUMBER = 8.1.2
|
||||||
|
|
||||||
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
# Using the PROJECT_BRIEF tag one can provide an optional one line description
|
||||||
# for a project that appears at the top of each page and should give viewer a
|
# for a project that appears at the top of each page and should give viewer a
|
||||||
|
|||||||
@@ -179,7 +179,7 @@ ninja -j$(nproc) -C fontconfig_build install
|
|||||||
popd
|
popd
|
||||||
|
|
||||||
# HARFBUZZ
|
# HARFBUZZ
|
||||||
git clone -b 14.2.0 --depth=1 https://github.com/harfbuzz/harfbuzz.git
|
git clone -b 14.2.1 --depth=1 https://github.com/harfbuzz/harfbuzz.git
|
||||||
meson setup harfbuzz harfbuzz_build \
|
meson setup harfbuzz harfbuzz_build \
|
||||||
--prefix=${FF_DEPS_PREFIX} \
|
--prefix=${FF_DEPS_PREFIX} \
|
||||||
--cross-file=${FF_MESON_TOOLCHAIN} \
|
--cross-file=${FF_MESON_TOOLCHAIN} \
|
||||||
@@ -218,7 +218,7 @@ make install
|
|||||||
popd
|
popd
|
||||||
|
|
||||||
# LIBASS
|
# LIBASS
|
||||||
git clone -b 0.17.4 --depth=1 https://github.com/libass/libass.git
|
git clone -b 0.17.5 --depth=1 https://github.com/libass/libass.git
|
||||||
pushd libass
|
pushd libass
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
./configure \
|
./configure \
|
||||||
@@ -321,7 +321,7 @@ popd
|
|||||||
# OPENMPT
|
# OPENMPT
|
||||||
mkdir mpt
|
mkdir mpt
|
||||||
pushd mpt
|
pushd mpt
|
||||||
mpt_ver="0.8.6"
|
mpt_ver="0.8.7"
|
||||||
mpt_link="https://lib.openmpt.org/files/libopenmpt/src/libopenmpt-${mpt_ver}+release.autotools.tar.gz"
|
mpt_link="https://lib.openmpt.org/files/libopenmpt/src/libopenmpt-${mpt_ver}+release.autotools.tar.gz"
|
||||||
wget ${mpt_link} -O mpt.tar.gz
|
wget ${mpt_link} -O mpt.tar.gz
|
||||||
tar xaf mpt.tar.gz
|
tar xaf mpt.tar.gz
|
||||||
@@ -549,7 +549,7 @@ popd
|
|||||||
# AMF
|
# AMF
|
||||||
mkdir amf-headers
|
mkdir amf-headers
|
||||||
pushd amf-headers
|
pushd amf-headers
|
||||||
amf_ver="1.5.0"
|
amf_ver="1.5.2"
|
||||||
amf_link="https://github.com/GPUOpen-LibrariesAndSDKs/AMF/releases/download/v${amf_ver}/AMF-headers-v${amf_ver}.tar.gz"
|
amf_link="https://github.com/GPUOpen-LibrariesAndSDKs/AMF/releases/download/v${amf_ver}/AMF-headers-v${amf_ver}.tar.gz"
|
||||||
wget ${amf_link} -O amf.tar.gz
|
wget ${amf_link} -O amf.tar.gz
|
||||||
tar xaf amf.tar.gz
|
tar xaf amf.tar.gz
|
||||||
@@ -560,7 +560,7 @@ popd
|
|||||||
popd
|
popd
|
||||||
|
|
||||||
# VPL
|
# VPL
|
||||||
git clone -b v2.16.0 --depth=1 https://github.com/intel/libvpl.git
|
git clone -b v2.17.0 --depth=1 https://github.com/intel/libvpl.git
|
||||||
pushd libvpl
|
pushd libvpl
|
||||||
mkdir build && pushd build
|
mkdir build && pushd build
|
||||||
cmake \
|
cmake \
|
||||||
@@ -571,6 +571,7 @@ cmake \
|
|||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DBUILD_SHARED_LIBS=OFF \
|
-DBUILD_SHARED_LIBS=OFF \
|
||||||
-DINSTALL_{DEV,LIB}=ON \
|
-DINSTALL_{DEV,LIB}=ON \
|
||||||
|
-DINSTALL_EXAMPLES=OFF \
|
||||||
-DBUILD_{TESTS,EXAMPLES,EXPERIMENTAL}=OFF \
|
-DBUILD_{TESTS,EXAMPLES,EXPERIMENTAL}=OFF \
|
||||||
..
|
..
|
||||||
make -j$(nproc)
|
make -j$(nproc)
|
||||||
|
|||||||
+19
-10
@@ -135,7 +135,7 @@ prepare_extra_common() {
|
|||||||
|
|
||||||
# HARFBUZZ
|
# HARFBUZZ
|
||||||
pushd ${SOURCE_DIR}
|
pushd ${SOURCE_DIR}
|
||||||
git clone -b 14.2.0 --depth=1 https://github.com/harfbuzz/harfbuzz.git
|
git clone -b 14.2.1 --depth=1 https://github.com/harfbuzz/harfbuzz.git
|
||||||
meson setup harfbuzz harfbuzz_build \
|
meson setup harfbuzz harfbuzz_build \
|
||||||
${MESON_CROSS_OPT} \
|
${MESON_CROSS_OPT} \
|
||||||
--prefix=${TARGET_DIR} \
|
--prefix=${TARGET_DIR} \
|
||||||
@@ -169,7 +169,7 @@ prepare_extra_common() {
|
|||||||
|
|
||||||
# LIBASS
|
# LIBASS
|
||||||
pushd ${SOURCE_DIR}
|
pushd ${SOURCE_DIR}
|
||||||
git clone -b 0.17.4 --depth=1 https://github.com/libass/libass.git
|
git clone -b 0.17.5 --depth=1 https://github.com/libass/libass.git
|
||||||
pushd libass
|
pushd libass
|
||||||
./autogen.sh
|
./autogen.sh
|
||||||
./configure \
|
./configure \
|
||||||
@@ -315,7 +315,7 @@ prepare_extra_amd64() {
|
|||||||
pushd ${SOURCE_DIR}
|
pushd ${SOURCE_DIR}
|
||||||
mkdir amf-headers
|
mkdir amf-headers
|
||||||
pushd amf-headers
|
pushd amf-headers
|
||||||
amf_ver="1.5.0"
|
amf_ver="1.5.2"
|
||||||
amf_link="https://github.com/GPUOpen-LibrariesAndSDKs/AMF/releases/download/v${amf_ver}/AMF-headers-v${amf_ver}.tar.gz"
|
amf_link="https://github.com/GPUOpen-LibrariesAndSDKs/AMF/releases/download/v${amf_ver}/AMF-headers-v${amf_ver}.tar.gz"
|
||||||
wget ${amf_link} -O amf.tar.gz
|
wget ${amf_link} -O amf.tar.gz
|
||||||
tar xaf amf.tar.gz
|
tar xaf amf.tar.gz
|
||||||
@@ -431,7 +431,7 @@ prepare_extra_amd64() {
|
|||||||
# Provides VPL header and dispatcher (libvpl.so.2) for FFmpeg
|
# Provides VPL header and dispatcher (libvpl.so.2) for FFmpeg
|
||||||
# Both MSDK and VPL runtime can be loaded by VPL dispatcher
|
# Both MSDK and VPL runtime can be loaded by VPL dispatcher
|
||||||
pushd ${SOURCE_DIR}
|
pushd ${SOURCE_DIR}
|
||||||
git clone -b v2.16.0 --depth=1 https://github.com/intel/libvpl.git
|
git clone -b v2.17.0 --depth=1 https://github.com/intel/libvpl.git
|
||||||
pushd libvpl
|
pushd libvpl
|
||||||
sed -i 's|ParseEnvSearchPaths(ONEVPL_PRIORITY_PATH_VAR, searchDirList)|searchDirList.push_back("/usr/lib/jellyfin-ffmpeg/lib")|g' libvpl/src/mfx_dispatcher_vpl_loader.cpp
|
sed -i 's|ParseEnvSearchPaths(ONEVPL_PRIORITY_PATH_VAR, searchDirList)|searchDirList.push_back("/usr/lib/jellyfin-ffmpeg/lib")|g' libvpl/src/mfx_dispatcher_vpl_loader.cpp
|
||||||
mkdir build && pushd build
|
mkdir build && pushd build
|
||||||
@@ -441,6 +441,7 @@ prepare_extra_amd64() {
|
|||||||
-DCMAKE_BUILD_TYPE=Release \
|
-DCMAKE_BUILD_TYPE=Release \
|
||||||
-DBUILD_SHARED_LIBS=ON \
|
-DBUILD_SHARED_LIBS=ON \
|
||||||
-DINSTALL_{DEV,LIB}=ON \
|
-DINSTALL_{DEV,LIB}=ON \
|
||||||
|
-DINSTALL_EXAMPLES=OFF \
|
||||||
-DBUILD_{TESTS,EXAMPLES,EXPERIMENTAL}=OFF \
|
-DBUILD_{TESTS,EXAMPLES,EXPERIMENTAL}=OFF \
|
||||||
..
|
..
|
||||||
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/intel
|
make -j$(nproc) && make install && make install DESTDIR=${SOURCE_DIR}/intel
|
||||||
@@ -453,7 +454,7 @@ prepare_extra_amd64() {
|
|||||||
# VPL-GPU-RT (RT only)
|
# VPL-GPU-RT (RT only)
|
||||||
# Provides VPL runtime (libmfx-gen.so.1.2) for 11th Gen Tiger Lake and newer
|
# Provides VPL runtime (libmfx-gen.so.1.2) for 11th Gen Tiger Lake and newer
|
||||||
pushd ${SOURCE_DIR}
|
pushd ${SOURCE_DIR}
|
||||||
git clone -b intel-onevpl-26.1.6 --depth=1 https://github.com/intel/vpl-gpu-rt.git
|
git clone -b intel-onevpl-26.2.3 --depth=1 https://github.com/intel/vpl-gpu-rt.git
|
||||||
pushd vpl-gpu-rt
|
pushd vpl-gpu-rt
|
||||||
# Fix missing entries in PicStruct validation
|
# Fix missing entries in PicStruct validation
|
||||||
wget -q -O - https://github.com/intel/vpl-gpu-rt/commit/c7eb030.patch | git apply
|
wget -q -O - https://github.com/intel/vpl-gpu-rt/commit/c7eb030.patch | git apply
|
||||||
@@ -475,10 +476,12 @@ prepare_extra_amd64() {
|
|||||||
# Full Feature Build: ENABLE_KERNELS=ON(Default) ENABLE_NONFREE_KERNELS=ON(Default)
|
# Full Feature Build: ENABLE_KERNELS=ON(Default) ENABLE_NONFREE_KERNELS=ON(Default)
|
||||||
# Free Kernel Build: ENABLE_KERNELS=ON ENABLE_NONFREE_KERNELS=OFF
|
# Free Kernel Build: ENABLE_KERNELS=ON ENABLE_NONFREE_KERNELS=OFF
|
||||||
pushd ${SOURCE_DIR}
|
pushd ${SOURCE_DIR}
|
||||||
git clone -b intel-media-26.1.6 --depth=1 https://github.com/intel/media-driver.git
|
git clone -b intel-media-26.2.3 --depth=1 https://github.com/intel/media-driver.git
|
||||||
pushd media-driver
|
pushd media-driver
|
||||||
# Enable VC1 decode on DG2 (note that MTL+ is not supported)
|
# Enable VC1 decode on DG2 (note that MTL+ is not supported)
|
||||||
wget -q -O - https://github.com/intel/media-driver/commit/25fb926.patch | git apply
|
wget -q -O - https://github.com/intel/media-driver/commit/e47702f.patch | git apply
|
||||||
|
# Fix iHD crashes when used with Xe KMD on small BAR systems
|
||||||
|
wget -q -O - https://github.com/intel/media-driver/commit/6fd4037.patch | git apply
|
||||||
mkdir build && pushd build
|
mkdir build && pushd build
|
||||||
cmake -DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
|
cmake -DCMAKE_INSTALL_PREFIX=${TARGET_DIR} \
|
||||||
-DCMAKE_C_FLAGS="${CFLAGS} -Wno-error=array-bounds" \
|
-DCMAKE_C_FLAGS="${CFLAGS} -Wno-error=array-bounds" \
|
||||||
@@ -498,7 +501,7 @@ prepare_extra_amd64() {
|
|||||||
|
|
||||||
# Vulkan Headers
|
# Vulkan Headers
|
||||||
pushd ${SOURCE_DIR}
|
pushd ${SOURCE_DIR}
|
||||||
git clone -b v1.4.349 --depth=1 https://github.com/KhronosGroup/Vulkan-Headers.git
|
git clone -b v1.4.355 --depth=1 https://github.com/KhronosGroup/Vulkan-Headers.git
|
||||||
pushd Vulkan-Headers
|
pushd Vulkan-Headers
|
||||||
mkdir build && pushd build
|
mkdir build && pushd build
|
||||||
cmake \
|
cmake \
|
||||||
@@ -511,7 +514,7 @@ prepare_extra_amd64() {
|
|||||||
|
|
||||||
# Vulkan ICD Loader
|
# Vulkan ICD Loader
|
||||||
pushd ${SOURCE_DIR}
|
pushd ${SOURCE_DIR}
|
||||||
git clone -b v1.4.349 --depth=1 https://github.com/KhronosGroup/Vulkan-Loader.git
|
git clone -b v1.4.355 --depth=1 https://github.com/KhronosGroup/Vulkan-Loader.git
|
||||||
pushd Vulkan-Loader
|
pushd Vulkan-Loader
|
||||||
mkdir build && pushd build
|
mkdir build && pushd build
|
||||||
cmake \
|
cmake \
|
||||||
@@ -531,7 +534,7 @@ prepare_extra_amd64() {
|
|||||||
popd
|
popd
|
||||||
|
|
||||||
# SHADERC
|
# SHADERC
|
||||||
shaderc_ver="v2026.1"
|
shaderc_ver="v2026.2"
|
||||||
pushd ${SOURCE_DIR}
|
pushd ${SOURCE_DIR}
|
||||||
git clone -b ${shaderc_ver} --depth=1 https://github.com/google/shaderc.git
|
git clone -b ${shaderc_ver} --depth=1 https://github.com/google/shaderc.git
|
||||||
pushd shaderc
|
pushd shaderc
|
||||||
@@ -578,6 +581,12 @@ prepare_extra_amd64() {
|
|||||||
# Enable VAAPI VPP alpha blending support
|
# Enable VAAPI VPP alpha blending support
|
||||||
wget -q -O - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41090.patch | \
|
wget -q -O - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/41090.patch | \
|
||||||
patch -p1 -d mesa-${mesa_ver}
|
patch -p1 -d mesa-${mesa_ver}
|
||||||
|
# Fix misc CSC issues in VAAPI VPP
|
||||||
|
wget -q -O - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/42181.patch | \
|
||||||
|
patch -p1 -d mesa-${mesa_ver}
|
||||||
|
# Fix setting VPE rotation with horizontal flip enabled
|
||||||
|
wget -q -O - https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/42408.patch | \
|
||||||
|
sed 's#/mm/#/#g' | patch -p1 -d mesa-${mesa_ver}
|
||||||
meson setup mesa-${mesa_ver} mesa_build \
|
meson setup mesa-${mesa_ver} mesa_build \
|
||||||
--prefix=${TARGET_DIR} \
|
--prefix=${TARGET_DIR} \
|
||||||
--libdir=lib \
|
--libdir=lib \
|
||||||
|
|||||||
+1
-1
@@ -469,7 +469,7 @@ typedef struct Decoder {
|
|||||||
|
|
||||||
enum AVMediaType type;
|
enum AVMediaType type;
|
||||||
|
|
||||||
const uint8_t *subtitle_header;
|
uint8_t *subtitle_header;
|
||||||
int subtitle_header_size;
|
int subtitle_header_size;
|
||||||
|
|
||||||
// number of frames/samples retrieved from the decoder
|
// number of frames/samples retrieved from the decoder
|
||||||
|
|||||||
+11
-2
@@ -136,6 +136,8 @@ void dec_free(Decoder **pdec)
|
|||||||
av_frame_free(&dp->sub_prev[i]);
|
av_frame_free(&dp->sub_prev[i]);
|
||||||
av_frame_free(&dp->sub_heartbeat);
|
av_frame_free(&dp->sub_heartbeat);
|
||||||
|
|
||||||
|
av_freep(&dp->dec.subtitle_header);
|
||||||
|
|
||||||
av_freep(&dp->parent_name);
|
av_freep(&dp->parent_name);
|
||||||
|
|
||||||
av_freep(&dp->views_requested);
|
av_freep(&dp->views_requested);
|
||||||
@@ -1621,8 +1623,15 @@ static int dec_open(DecoderPriv *dp, AVDictionary **dec_opts,
|
|||||||
dp->dec_ctx->extra_hw_frames = extra_frames;
|
dp->dec_ctx->extra_hw_frames = extra_frames;
|
||||||
}
|
}
|
||||||
|
|
||||||
dp->dec.subtitle_header = dp->dec_ctx->subtitle_header;
|
if (dp->dec_ctx->subtitle_header) {
|
||||||
dp->dec.subtitle_header_size = dp->dec_ctx->subtitle_header_size;
|
/* ASS code assumes this buffer is null terminated so add extra byte. */
|
||||||
|
dp->dec.subtitle_header = av_mallocz(dp->dec_ctx->subtitle_header_size + 1);
|
||||||
|
if (!dp->dec.subtitle_header)
|
||||||
|
return AVERROR(ENOMEM);
|
||||||
|
memcpy(dp->dec.subtitle_header, dp->dec_ctx->subtitle_header,
|
||||||
|
dp->dec_ctx->subtitle_header_size);
|
||||||
|
dp->dec.subtitle_header_size = dp->dec_ctx->subtitle_header_size;
|
||||||
|
}
|
||||||
|
|
||||||
if (param_out) {
|
if (param_out) {
|
||||||
if (dp->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
if (dp->dec_ctx->codec_type == AVMEDIA_TYPE_AUDIO) {
|
||||||
|
|||||||
@@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
#include "libavutil/avassert.h"
|
#include "libavutil/avassert.h"
|
||||||
#include "libavutil/avstring.h"
|
#include "libavutil/avstring.h"
|
||||||
|
#include "libavutil/mem.h"
|
||||||
#include "libavutil/pixdesc.h"
|
#include "libavutil/pixdesc.h"
|
||||||
#include "libavutil/dict.h"
|
#include "libavutil/dict.h"
|
||||||
#include "libavutil/common.h"
|
#include "libavutil/common.h"
|
||||||
|
|||||||
@@ -2383,6 +2383,12 @@ static int decode_frame_ga(AVCodecContext *avctx, AACDecContext *ac,
|
|||||||
ac->oc[1].status = OC_LOCKED;
|
ac->oc[1].status = OC_LOCKED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (samples && avctx->sample_rate <= 0) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
"Cannot output a frame without a valid sample rate\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
if (!ac->frame->data[0] && samples) {
|
if (!ac->frame->data[0] && samples) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "no frame data found\n");
|
av_log(avctx, AV_LOG_ERROR, "no frame data found\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|||||||
@@ -215,6 +215,9 @@ static int decode_usac_element_pair(AACDecContext *ac,
|
|||||||
|
|
||||||
if (e->stereo_config_index) {
|
if (e->stereo_config_index) {
|
||||||
e->mps.freq_res = get_bits(gb, 3); /* bsFreqRes */
|
e->mps.freq_res = get_bits(gb, 3); /* bsFreqRes */
|
||||||
|
if (!e->mps.freq_res)
|
||||||
|
return AVERROR_INVALIDDATA; /* value 0 is reserved */
|
||||||
|
|
||||||
int numBands = ((int[]){0,28,20,14,10,7,5,4})[e->mps.freq_res]; // ISO/IEC 23003-1:2007, 5.2, Table 39
|
int numBands = ((int[]){0,28,20,14,10,7,5,4})[e->mps.freq_res]; // ISO/IEC 23003-1:2007, 5.2, Table 39
|
||||||
|
|
||||||
e->mps.fixed_gain = get_bits(gb, 3); /* bsFixedGainDMX */
|
e->mps.fixed_gain = get_bits(gb, 3); /* bsFixedGainDMX */
|
||||||
@@ -374,6 +377,8 @@ int ff_aac_usac_config_decode(AACDecContext *ac, AVCodecContext *avctx,
|
|||||||
freq_idx = get_bits(gb, 5); /* usacSamplingFrequencyIndex */
|
freq_idx = get_bits(gb, 5); /* usacSamplingFrequencyIndex */
|
||||||
if (freq_idx == 0x1f) {
|
if (freq_idx == 0x1f) {
|
||||||
samplerate = get_bits(gb, 24); /* usacSamplingFrequency */
|
samplerate = get_bits(gb, 24); /* usacSamplingFrequency */
|
||||||
|
if (samplerate == 0)
|
||||||
|
return AVERROR(EINVAL);
|
||||||
} else {
|
} else {
|
||||||
samplerate = ff_aac_usac_samplerate[freq_idx];
|
samplerate = ff_aac_usac_samplerate[freq_idx];
|
||||||
if (samplerate < 0)
|
if (samplerate < 0)
|
||||||
@@ -1385,11 +1390,10 @@ static void decode_tsd(GetBitContext *gb, int *data,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
int64_t c = k - p + 1;
|
int64_t c = k - p + 1;
|
||||||
for (int h = 2; h <= p; h++) {
|
for (int h = 2; h <= p && c <= s; h++) {
|
||||||
c *= k - p + h;
|
c += c*(k-p)/h;
|
||||||
c /= h;
|
|
||||||
}
|
}
|
||||||
if (s >= (int)c) { /* c is long long for up to 32 slots */
|
if (s >= c) {
|
||||||
s -= c;
|
s -= c;
|
||||||
data[k] = 1;
|
data[k] = 1;
|
||||||
p--;
|
p--;
|
||||||
|
|||||||
@@ -645,7 +645,7 @@ int ff_aac_ec_data_dec(GetBitContext *gb, AACMPSLosslessData *ld,
|
|||||||
stride_table[ld->freq_res[set_idx]],
|
stride_table[ld->freq_res[set_idx]],
|
||||||
start_band, end_band);
|
start_band, end_band);
|
||||||
|
|
||||||
if (set_idx + data_pair > MPS_MAX_PARAM_SETS)
|
if (set_idx + data_pair >= MPS_MAX_PARAM_SETS)
|
||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
|
|
||||||
for (int j = 0; j < data_bands; j++)
|
for (int j = 0; j < data_bands; j++)
|
||||||
|
|||||||
@@ -56,9 +56,7 @@
|
|||||||
mov x11, v4.d[0]
|
mov x11, v4.d[0]
|
||||||
mov x12, v4.d[1]
|
mov x12, v4.d[1]
|
||||||
adds x11, x11, x12
|
adds x11, x11, x12
|
||||||
b.ne 1f
|
b.eq 9f
|
||||||
ret x10
|
|
||||||
1:
|
|
||||||
|
|
||||||
.if \wd >= 8
|
.if \wd >= 8
|
||||||
dup v0.8h, w5
|
dup v0.8h, w5
|
||||||
@@ -189,13 +187,7 @@
|
|||||||
// If no pixels need flat8in, jump to flat8out
|
// If no pixels need flat8in, jump to flat8out
|
||||||
// (or to a writeout of the inner 4 pixels, for wd=8)
|
// (or to a writeout of the inner 4 pixels, for wd=8)
|
||||||
.if \wd >= 8
|
.if \wd >= 8
|
||||||
.if \wd == 16
|
|
||||||
b.eq 6f
|
b.eq 6f
|
||||||
.else
|
|
||||||
b.ne 1f
|
|
||||||
ret x13
|
|
||||||
1:
|
|
||||||
.endif
|
|
||||||
|
|
||||||
// flat8in
|
// flat8in
|
||||||
add \tmp1\().8h, v20.8h, v21.8h
|
add \tmp1\().8h, v20.8h, v21.8h
|
||||||
@@ -249,20 +241,16 @@
|
|||||||
mov x11, v2.d[0]
|
mov x11, v2.d[0]
|
||||||
mov x12, v2.d[1]
|
mov x12, v2.d[1]
|
||||||
adds x11, x11, x12
|
adds x11, x11, x12
|
||||||
b.ne 1f
|
|
||||||
// If no pixels needed flat8in nor flat8out, jump to a
|
// If no pixels needed flat8in nor flat8out, jump to a
|
||||||
// writeout of the inner 4 pixels
|
// writeout of the inner 4 pixels
|
||||||
ret x14
|
b.eq 7f
|
||||||
1:
|
|
||||||
|
|
||||||
mov x11, v7.d[0]
|
mov x11, v7.d[0]
|
||||||
mov x12, v7.d[1]
|
mov x12, v7.d[1]
|
||||||
adds x11, x11, x12
|
adds x11, x11, x12
|
||||||
b.ne 1f
|
|
||||||
// If no pixels need flat8out, jump to a writeout of the inner 6 pixels
|
// If no pixels need flat8out, jump to a writeout of the inner 6 pixels
|
||||||
ret x15
|
b.eq 8f
|
||||||
|
|
||||||
1:
|
|
||||||
// flat8out
|
// flat8out
|
||||||
// This writes all outputs into v2-v17 (skipping v6 and v16).
|
// This writes all outputs into v2-v17 (skipping v6 and v16).
|
||||||
// If this part is skipped, the output is read from v21-v26 (which is the input
|
// If this part is skipped, the output is read from v21-v26 (which is the input
|
||||||
@@ -378,35 +366,57 @@
|
|||||||
// while we need those for inputs/outputs in wd=16 and use v8-v15
|
// while we need those for inputs/outputs in wd=16 and use v8-v15
|
||||||
// for temp registers there instead.
|
// for temp registers there instead.
|
||||||
function vp9_loop_filter_4
|
function vp9_loop_filter_4
|
||||||
|
mov x13, #0
|
||||||
loop_filter 4, v16, v17, v18, v19, v28, v29, v30, v31
|
loop_filter 4, v16, v17, v18, v19, v28, v29, v30, v31
|
||||||
ret
|
ret
|
||||||
|
9:
|
||||||
|
mov x13, #(1<<9)
|
||||||
|
ret
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function vp9_loop_filter_8
|
function vp9_loop_filter_8
|
||||||
|
mov x13, #0
|
||||||
loop_filter 8, v16, v17, v18, v19, v28, v29, v30, v31
|
loop_filter 8, v16, v17, v18, v19, v28, v29, v30, v31
|
||||||
ret
|
ret
|
||||||
|
6:
|
||||||
|
mov x13, #(1<<6)
|
||||||
|
ret
|
||||||
|
9:
|
||||||
|
mov x13, #(1<<9)
|
||||||
|
ret
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function vp9_loop_filter_16
|
function vp9_loop_filter_16
|
||||||
|
mov x13, #0
|
||||||
loop_filter 16, v8, v9, v10, v11, v12, v13, v14, v15
|
loop_filter 16, v8, v9, v10, v11, v12, v13, v14, v15
|
||||||
ret
|
ret
|
||||||
|
7:
|
||||||
|
mov x13, #(1<<7)
|
||||||
|
ret
|
||||||
|
8:
|
||||||
|
mov x13, #(1<<8)
|
||||||
|
ret
|
||||||
|
9:
|
||||||
|
mov x13, #(1<<9)
|
||||||
|
ret
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
.macro loop_filter_4
|
.macro loop_filter_4
|
||||||
bl vp9_loop_filter_4
|
bl vp9_loop_filter_4
|
||||||
|
tbnz x13, #9, 9f
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro loop_filter_8
|
.macro loop_filter_8
|
||||||
// calculate alternative 'return' targets
|
|
||||||
adr x13, 6f
|
|
||||||
bl vp9_loop_filter_8
|
bl vp9_loop_filter_8
|
||||||
|
tbnz x13, #6, 6f
|
||||||
|
tbnz x13, #9, 9f
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro loop_filter_16
|
.macro loop_filter_16
|
||||||
// calculate alternative 'return' targets
|
|
||||||
adr x14, 7f
|
|
||||||
adr x15, 8f
|
|
||||||
bl vp9_loop_filter_16
|
bl vp9_loop_filter_16
|
||||||
|
tbnz x13, #7, 7f
|
||||||
|
tbnz x13, #8, 8f
|
||||||
|
tbnz x13, #9, 9f
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
||||||
@@ -540,7 +550,7 @@ function vp9_loop_filter_v_4_8_16_neon
|
|||||||
st1 {v23.8h}, [x9], x1
|
st1 {v23.8h}, [x9], x1
|
||||||
st1 {v25.8h}, [x0], x1
|
st1 {v25.8h}, [x0], x1
|
||||||
sub x0, x0, x1, lsl #1
|
sub x0, x0, x1, lsl #1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@@ -588,7 +598,7 @@ function vp9_loop_filter_h_4_8_16_neon
|
|||||||
st1 {v25.d}[1], [x0], x1
|
st1 {v25.d}[1], [x0], x1
|
||||||
sub x0, x0, x1, lsl #3
|
sub x0, x0, x1, lsl #3
|
||||||
add x0, x0, #4
|
add x0, x0, #4
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@@ -619,7 +629,7 @@ function vp9_loop_filter_v_8_8_16_neon
|
|||||||
st1 {v26.8h}, [x0], x1
|
st1 {v26.8h}, [x0], x1
|
||||||
sub x0, x0, x1, lsl #1
|
sub x0, x0, x1, lsl #1
|
||||||
sub x0, x0, x1
|
sub x0, x0, x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
6:
|
6:
|
||||||
sub x9, x0, x1, lsl #1
|
sub x9, x0, x1, lsl #1
|
||||||
@@ -670,7 +680,7 @@ function vp9_loop_filter_h_8_8_16_neon
|
|||||||
st1 {v27.8h}, [x0], x1
|
st1 {v27.8h}, [x0], x1
|
||||||
sub x0, x0, x1, lsl #3
|
sub x0, x0, x1, lsl #3
|
||||||
add x0, x0, #8
|
add x0, x0, #8
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
6:
|
6:
|
||||||
// If we didn't need to do the flat8in part, we use the same writeback
|
// If we didn't need to do the flat8in part, we use the same writeback
|
||||||
@@ -742,7 +752,7 @@ function vp9_loop_filter_v_16_8_16_neon
|
|||||||
st1 {v17.8h}, [x0], x1
|
st1 {v17.8h}, [x0], x1
|
||||||
sub x0, x0, x1, lsl #3
|
sub x0, x0, x1, lsl #3
|
||||||
add x0, x0, x1
|
add x0, x0, x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
8:
|
8:
|
||||||
add x9, x9, x1, lsl #2
|
add x9, x9, x1, lsl #2
|
||||||
@@ -820,7 +830,7 @@ function vp9_loop_filter_h_16_8_16_neon
|
|||||||
st1 {v9.8h}, [x9], x1
|
st1 {v9.8h}, [x9], x1
|
||||||
st1 {v31.8h}, [x0], x1
|
st1 {v31.8h}, [x0], x1
|
||||||
sub x0, x0, x1, lsl #3
|
sub x0, x0, x1, lsl #3
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
8:
|
8:
|
||||||
// The same writeback as in loop_filter_h_8_8
|
// The same writeback as in loop_filter_h_8_8
|
||||||
|
|||||||
@@ -388,32 +388,28 @@
|
|||||||
.endif
|
.endif
|
||||||
.if \wd == 16
|
.if \wd == 16
|
||||||
6:
|
6:
|
||||||
|
// If no pixels needed flat8in nor flat8out, jump to a
|
||||||
|
// writeout of the inner 4 pixels
|
||||||
orr v2\sz, v6\sz, v7\sz
|
orr v2\sz, v6\sz, v7\sz
|
||||||
mov x5, v2.d[0]
|
mov x5, v2.d[0]
|
||||||
.ifc \sz, .16b
|
.ifc \sz, .16b
|
||||||
mov x6, v2.d[1]
|
mov x6, v2.d[1]
|
||||||
adds x5, x5, x6
|
adds x5, x5, x6
|
||||||
b.ne 1f
|
b.eq 7f
|
||||||
.else
|
.else
|
||||||
cbnz x5, 1f
|
cbz x5, 7f
|
||||||
.endif
|
.endif
|
||||||
// If no pixels needed flat8in nor flat8out, jump to a
|
|
||||||
// writeout of the inner 4 pixels
|
|
||||||
ret x14
|
|
||||||
1:
|
|
||||||
|
|
||||||
|
// If no pixels need flat8out, jump to a writeout of the inner 6 pixels
|
||||||
mov x5, v7.d[0]
|
mov x5, v7.d[0]
|
||||||
.ifc \sz, .16b
|
.ifc \sz, .16b
|
||||||
mov x6, v7.d[1]
|
mov x6, v7.d[1]
|
||||||
adds x5, x5, x6
|
adds x5, x5, x6
|
||||||
b.ne 1f
|
b.eq 8f
|
||||||
.else
|
.else
|
||||||
cbnz x5, 1f
|
cbz x5, 8f
|
||||||
.endif
|
.endif
|
||||||
// If no pixels need flat8out, jump to a writeout of the inner 6 pixels
|
|
||||||
ret x15
|
|
||||||
|
|
||||||
1:
|
|
||||||
// flat8out
|
// flat8out
|
||||||
// This writes all outputs into v2-v17 (skipping v6 and v16).
|
// This writes all outputs into v2-v17 (skipping v6 and v16).
|
||||||
// If this part is skipped, the output is read from v21-v26 (which is the input
|
// If this part is skipped, the output is read from v21-v26 (which is the input
|
||||||
@@ -529,76 +525,94 @@
|
|||||||
// while we need those for inputs/outputs in wd=16 and use v8-v15
|
// while we need those for inputs/outputs in wd=16 and use v8-v15
|
||||||
// for temp registers there instead.
|
// for temp registers there instead.
|
||||||
function vp9_loop_filter_4
|
function vp9_loop_filter_4
|
||||||
|
mov x13, #0
|
||||||
loop_filter 4, .8b, 0, v16, v17, v18, v19, v28, v29, v30, v31
|
loop_filter 4, .8b, 0, v16, v17, v18, v19, v28, v29, v30, v31
|
||||||
ret
|
ret
|
||||||
9:
|
9:
|
||||||
ret x10
|
mov x13, #(1<<9)
|
||||||
|
ret
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function vp9_loop_filter_4_16b_mix_44
|
function vp9_loop_filter_4_16b_mix_44
|
||||||
|
mov x13, #0
|
||||||
loop_filter 4, .16b, 44, v16, v17, v18, v19, v28, v29, v30, v31
|
loop_filter 4, .16b, 44, v16, v17, v18, v19, v28, v29, v30, v31
|
||||||
ret
|
ret
|
||||||
9:
|
9:
|
||||||
ret x10
|
mov x13, #(1<<9)
|
||||||
|
ret
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function vp9_loop_filter_8
|
function vp9_loop_filter_8
|
||||||
|
mov x13, #0
|
||||||
loop_filter 8, .8b, 0, v16, v17, v18, v19, v28, v29, v30, v31
|
loop_filter 8, .8b, 0, v16, v17, v18, v19, v28, v29, v30, v31
|
||||||
ret
|
ret
|
||||||
6:
|
6:
|
||||||
ret x13
|
mov x13, #(1<<6)
|
||||||
|
ret
|
||||||
9:
|
9:
|
||||||
ret x10
|
mov x13, #(1<<9)
|
||||||
|
ret
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function vp9_loop_filter_8_16b_mix
|
function vp9_loop_filter_8_16b_mix
|
||||||
|
mov x13, #0
|
||||||
loop_filter 8, .16b, 88, v16, v17, v18, v19, v28, v29, v30, v31
|
loop_filter 8, .16b, 88, v16, v17, v18, v19, v28, v29, v30, v31
|
||||||
ret
|
ret
|
||||||
6:
|
6:
|
||||||
ret x13
|
mov x13, #(1<<6)
|
||||||
|
ret
|
||||||
9:
|
9:
|
||||||
ret x10
|
mov x13, #(1<<9)
|
||||||
|
ret
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function vp9_loop_filter_16
|
function vp9_loop_filter_16
|
||||||
|
mov x13, #0
|
||||||
loop_filter 16, .8b, 0, v8, v9, v10, v11, v12, v13, v14, v15
|
loop_filter 16, .8b, 0, v8, v9, v10, v11, v12, v13, v14, v15
|
||||||
ret
|
ret
|
||||||
|
7:
|
||||||
|
mov x13, #(1<<7)
|
||||||
|
ret
|
||||||
|
8:
|
||||||
|
mov x13, #(1<<8)
|
||||||
|
ret
|
||||||
9:
|
9:
|
||||||
ldp d10, d11, [sp, #0x10]
|
mov x13, #(1<<9)
|
||||||
ldp d12, d13, [sp, #0x20]
|
ret
|
||||||
ldp d14, d15, [sp, #0x30]
|
|
||||||
ldp d8, d9, [sp], #0x40
|
|
||||||
ret x10
|
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
function vp9_loop_filter_16_16b
|
function vp9_loop_filter_16_16b
|
||||||
|
mov x13, #0
|
||||||
loop_filter 16, .16b, 0, v8, v9, v10, v11, v12, v13, v14, v15
|
loop_filter 16, .16b, 0, v8, v9, v10, v11, v12, v13, v14, v15
|
||||||
ret
|
ret
|
||||||
|
7:
|
||||||
|
mov x13, #(1<<7)
|
||||||
|
ret
|
||||||
|
8:
|
||||||
|
mov x13, #(1<<8)
|
||||||
|
ret
|
||||||
9:
|
9:
|
||||||
ldp d10, d11, [sp, #0x10]
|
mov x13, #(1<<9)
|
||||||
ldp d12, d13, [sp, #0x20]
|
ret
|
||||||
ldp d14, d15, [sp, #0x30]
|
|
||||||
ldp d8, d9, [sp], #0x40
|
|
||||||
ret x10
|
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
.macro loop_filter_4
|
.macro loop_filter_4
|
||||||
bl vp9_loop_filter_4
|
bl vp9_loop_filter_4
|
||||||
|
tbnz x13, #9, 9f
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro loop_filter_4_16b_mix mix
|
.macro loop_filter_4_16b_mix mix
|
||||||
bl vp9_loop_filter_4_16b_mix_\mix
|
bl vp9_loop_filter_4_16b_mix_\mix
|
||||||
|
tbnz x13, #9, 9f
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro loop_filter_8
|
.macro loop_filter_8
|
||||||
// calculate alternative 'return' targets
|
|
||||||
adr x13, 6f
|
|
||||||
bl vp9_loop_filter_8
|
bl vp9_loop_filter_8
|
||||||
|
tbnz x13, #6, 6f
|
||||||
|
tbnz x13, #9, 9f
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro loop_filter_8_16b_mix mix
|
.macro loop_filter_8_16b_mix mix
|
||||||
// calculate alternative 'return' targets
|
|
||||||
adr x13, 6f
|
|
||||||
.if \mix == 48
|
.if \mix == 48
|
||||||
mov x11, #0xffffffff00000000
|
mov x11, #0xffffffff00000000
|
||||||
.elseif \mix == 84
|
.elseif \mix == 84
|
||||||
@@ -607,20 +621,22 @@ endfunc
|
|||||||
mov x11, #0xffffffffffffffff
|
mov x11, #0xffffffffffffffff
|
||||||
.endif
|
.endif
|
||||||
bl vp9_loop_filter_8_16b_mix
|
bl vp9_loop_filter_8_16b_mix
|
||||||
|
tbnz x13, #6, 6f
|
||||||
|
tbnz x13, #9, 9f
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro loop_filter_16
|
.macro loop_filter_16
|
||||||
// calculate alternative 'return' targets
|
|
||||||
adr x14, 7f
|
|
||||||
adr x15, 8f
|
|
||||||
bl vp9_loop_filter_16
|
bl vp9_loop_filter_16
|
||||||
|
tbnz x13, #7, 7f
|
||||||
|
tbnz x13, #8, 8f
|
||||||
|
tbnz x13, #9, 9f
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro loop_filter_16_16b
|
.macro loop_filter_16_16b
|
||||||
// calculate alternative 'return' targets
|
|
||||||
adr x14, 7f
|
|
||||||
adr x15, 8f
|
|
||||||
bl vp9_loop_filter_16_16b
|
bl vp9_loop_filter_16_16b
|
||||||
|
tbnz x13, #7, 7f
|
||||||
|
tbnz x13, #8, 8f
|
||||||
|
tbnz x13, #9, 9f
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
|
||||||
@@ -647,7 +663,7 @@ function ff_vp9_loop_filter_v_4_8_neon, export=1
|
|||||||
st1 {v24.8b}, [x0], x1
|
st1 {v24.8b}, [x0], x1
|
||||||
st1 {v23.8b}, [x9], x1
|
st1 {v23.8b}, [x9], x1
|
||||||
st1 {v25.8b}, [x0], x1
|
st1 {v25.8b}, [x0], x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@@ -671,7 +687,7 @@ function ff_vp9_loop_filter_v_44_16_neon, export=1
|
|||||||
st1 {v24.16b}, [x0], x1
|
st1 {v24.16b}, [x0], x1
|
||||||
st1 {v23.16b}, [x9], x1
|
st1 {v23.16b}, [x9], x1
|
||||||
st1 {v25.16b}, [x0], x1
|
st1 {v25.16b}, [x0], x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@@ -713,7 +729,7 @@ function ff_vp9_loop_filter_h_4_8_neon, export=1
|
|||||||
st1 {v24.s}[1], [x0], x1
|
st1 {v24.s}[1], [x0], x1
|
||||||
st1 {v25.s}[0], [x9], x1
|
st1 {v25.s}[0], [x9], x1
|
||||||
st1 {v25.s}[1], [x0], x1
|
st1 {v25.s}[1], [x0], x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@@ -765,7 +781,7 @@ function ff_vp9_loop_filter_h_44_16_neon, export=1
|
|||||||
st1 {v24.s}[3], [x0], x1
|
st1 {v24.s}[3], [x0], x1
|
||||||
st1 {v25.s}[1], [x9], x1
|
st1 {v25.s}[1], [x9], x1
|
||||||
st1 {v25.s}[3], [x0], x1
|
st1 {v25.s}[3], [x0], x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
@@ -792,7 +808,7 @@ function ff_vp9_loop_filter_v_8_8_neon, export=1
|
|||||||
st1 {v25.8b}, [x0], x1
|
st1 {v25.8b}, [x0], x1
|
||||||
st1 {v23.8b}, [x9], x1
|
st1 {v23.8b}, [x9], x1
|
||||||
st1 {v26.8b}, [x0], x1
|
st1 {v26.8b}, [x0], x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
6:
|
6:
|
||||||
sub x9, x0, x1, lsl #1
|
sub x9, x0, x1, lsl #1
|
||||||
@@ -827,7 +843,7 @@ function ff_vp9_loop_filter_v_\mix\()_16_neon, export=1
|
|||||||
st1 {v25.16b}, [x0], x1
|
st1 {v25.16b}, [x0], x1
|
||||||
st1 {v23.16b}, [x9], x1
|
st1 {v23.16b}, [x9], x1
|
||||||
st1 {v26.16b}, [x0], x1
|
st1 {v26.16b}, [x0], x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
6:
|
6:
|
||||||
sub x9, x0, x1, lsl #1
|
sub x9, x0, x1, lsl #1
|
||||||
@@ -875,7 +891,7 @@ function ff_vp9_loop_filter_h_8_8_neon, export=1
|
|||||||
st1 {v26.8b}, [x0], x1
|
st1 {v26.8b}, [x0], x1
|
||||||
st1 {v23.8b}, [x9], x1
|
st1 {v23.8b}, [x9], x1
|
||||||
st1 {v27.8b}, [x0], x1
|
st1 {v27.8b}, [x0], x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
6:
|
6:
|
||||||
// If we didn't need to do the flat8in part, we use the same writeback
|
// If we didn't need to do the flat8in part, we use the same writeback
|
||||||
@@ -941,7 +957,7 @@ function ff_vp9_loop_filter_h_\mix\()_16_neon, export=1
|
|||||||
st1 {v26.d}[1], [x0], x1
|
st1 {v26.d}[1], [x0], x1
|
||||||
st1 {v27.8b}, [x9], x1
|
st1 {v27.8b}, [x9], x1
|
||||||
st1 {v27.d}[1], [x0], x1
|
st1 {v27.d}[1], [x0], x1
|
||||||
|
9:
|
||||||
ret x10
|
ret x10
|
||||||
6:
|
6:
|
||||||
add x9, x9, #2
|
add x9, x9, #2
|
||||||
|
|||||||
+3
-2
@@ -294,7 +294,8 @@ static av_cold int adpcm_decode_init(AVCodecContext * avctx)
|
|||||||
break;
|
break;
|
||||||
case AV_CODEC_ID_ADPCM_PSXC:
|
case AV_CODEC_ID_ADPCM_PSXC:
|
||||||
max_channels = 8;
|
max_channels = 8;
|
||||||
if (avctx->ch_layout.nb_channels <= 0 || avctx->block_align <= 0)
|
if (avctx->ch_layout.nb_channels <= 0 || avctx->block_align <= 0 ||
|
||||||
|
avctx->block_align % avctx->ch_layout.nb_channels)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
break;
|
break;
|
||||||
case AV_CODEC_ID_ADPCM_IMA_DAT4:
|
case AV_CODEC_ID_ADPCM_IMA_DAT4:
|
||||||
@@ -1173,7 +1174,7 @@ static int get_nb_samples(AVCodecContext *avctx, GetByteContext *gb,
|
|||||||
|
|
||||||
if(ch <= 0)
|
if(ch <= 0)
|
||||||
return 0;
|
return 0;
|
||||||
if (buf_size > INT_MAX / 2)
|
if (buf_size > INT_MAX / 14)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
switch (avctx->codec->id) {
|
switch (avctx->codec->id) {
|
||||||
|
|||||||
+10
-6
@@ -409,12 +409,14 @@ static int decode_inter_plane(AGMContext *s, GetBitContext *gb, int size,
|
|||||||
int map = s->map[x];
|
int map = s->map[x];
|
||||||
|
|
||||||
if (orig_mv_x >= -32) {
|
if (orig_mv_x >= -32) {
|
||||||
if (y * 8 + mv_y < 0 || y * 8 + mv_y + 8 > h ||
|
int src_y = (s->blocks_h - 1 - y) * 8 - mv_y;
|
||||||
x * 8 + mv_x < 0 || x * 8 + mv_x + 8 > w)
|
int src_x = x * 8 + mv_x;
|
||||||
|
if (src_y < 0 || src_y + 8 > h ||
|
||||||
|
src_x < 0 || src_x + 8 > w)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
copy_block8(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
|
copy_block8(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
|
||||||
prev->data[plane] + ((s->blocks_h - 1 - y) * 8 - mv_y) * prev->linesize[plane] + (x * 8 + mv_x),
|
prev->data[plane] + src_y * prev->linesize[plane] + src_x,
|
||||||
frame->linesize[plane], prev->linesize[plane], 8);
|
frame->linesize[plane], prev->linesize[plane], 8);
|
||||||
if (map) {
|
if (map) {
|
||||||
s->idsp.idct(s->wblocks + x * 64);
|
s->idsp.idct(s->wblocks + x * 64);
|
||||||
@@ -446,12 +448,14 @@ static int decode_inter_plane(AGMContext *s, GetBitContext *gb, int size,
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (orig_mv_x >= -32) {
|
if (orig_mv_x >= -32) {
|
||||||
if (y * 8 + mv_y < 0 || y * 8 + mv_y + 8 > h ||
|
int src_y = (s->blocks_h - 1 - y) * 8 - mv_y;
|
||||||
x * 8 + mv_x < 0 || x * 8 + mv_x + 8 > w)
|
int src_x = x * 8 + mv_x;
|
||||||
|
if (src_y < 0 || src_y + 8 > h ||
|
||||||
|
src_x < 0 || src_x + 8 > w)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
copy_block8(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
|
copy_block8(frame->data[plane] + (s->blocks_h - 1 - y) * 8 * frame->linesize[plane] + x * 8,
|
||||||
prev->data[plane] + ((s->blocks_h - 1 - y) * 8 - mv_y) * prev->linesize[plane] + (x * 8 + mv_x),
|
prev->data[plane] + src_y * prev->linesize[plane] + src_x,
|
||||||
frame->linesize[plane], prev->linesize[plane], 8);
|
frame->linesize[plane], prev->linesize[plane], 8);
|
||||||
if (map) {
|
if (map) {
|
||||||
s->idsp.idct(s->block);
|
s->idsp.idct(s->block);
|
||||||
|
|||||||
@@ -208,14 +208,13 @@ static int apv_decode_tile_component(AVCodecContext *avctx, void *data,
|
|||||||
{
|
{
|
||||||
APVRawFrame *input = data;
|
APVRawFrame *input = data;
|
||||||
APVDecodeContext *apv = avctx->priv_data;
|
APVDecodeContext *apv = avctx->priv_data;
|
||||||
const CodedBitstreamAPVContext *apv_cbc = apv->cbc->priv_data;
|
|
||||||
const APVDerivedTileInfo *tile_info = &apv->tile_info;
|
const APVDerivedTileInfo *tile_info = &apv->tile_info;
|
||||||
|
|
||||||
int tile_index = job / apv_cbc->num_comp;
|
|
||||||
int comp_index = job % apv_cbc->num_comp;
|
|
||||||
|
|
||||||
const AVPixFmtDescriptor *pix_fmt_desc =
|
const AVPixFmtDescriptor *pix_fmt_desc =
|
||||||
av_pix_fmt_desc_get(avctx->pix_fmt);
|
av_pix_fmt_desc_get(avctx->pix_fmt);
|
||||||
|
int nb_components = pix_fmt_desc->nb_components;
|
||||||
|
|
||||||
|
int tile_index = job / nb_components;
|
||||||
|
int comp_index = job % nb_components;
|
||||||
|
|
||||||
int sub_w_shift = comp_index == 0 ? 0 : pix_fmt_desc->log2_chroma_w;
|
int sub_w_shift = comp_index == 0 ? 0 : pix_fmt_desc->log2_chroma_w;
|
||||||
int sub_h_shift = comp_index == 0 ? 0 : pix_fmt_desc->log2_chroma_h;
|
int sub_h_shift = comp_index == 0 ? 0 : pix_fmt_desc->log2_chroma_h;
|
||||||
@@ -266,7 +265,7 @@ static int apv_decode_tile_component(AVCodecContext *avctx, void *data,
|
|||||||
int qp = tile->tile_header.tile_qp[comp_index];
|
int qp = tile->tile_header.tile_qp[comp_index];
|
||||||
int level_scale = apv_level_scale[qp % 6];
|
int level_scale = apv_level_scale[qp % 6];
|
||||||
|
|
||||||
bit_depth = apv_cbc->bit_depth;
|
bit_depth = input->frame_header.frame_info.bit_depth_minus8 + 8;
|
||||||
qp_shift = qp / 6;
|
qp_shift = qp / 6;
|
||||||
|
|
||||||
for (int y = 0; y < 8; y++) {
|
for (int y = 0; y < 8; y++) {
|
||||||
|
|||||||
@@ -412,11 +412,23 @@ static int hevc_init_nb_frame(AVBSFContext *ctx, int poc)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int same_gop(void *opaque, void *elem)
|
typedef struct DTS2PTSCollect {
|
||||||
|
int gop;
|
||||||
|
DTS2PTSNode **out;
|
||||||
|
int count;
|
||||||
|
int max;
|
||||||
|
} DTS2PTSCollect;
|
||||||
|
|
||||||
|
static int collect_same_gop(void *opaque, void *elem)
|
||||||
{
|
{
|
||||||
|
DTS2PTSCollect *c = opaque;
|
||||||
DTS2PTSNode *node = elem;
|
DTS2PTSNode *node = elem;
|
||||||
int gop = ((int *)opaque)[1];
|
if (node->gop == c->gop) {
|
||||||
return FFDIFFSIGN(gop, node->gop);
|
if (c->count < c->max)
|
||||||
|
c->out[c->count] = node;
|
||||||
|
c->count++;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int hevc_queue_frame(AVBSFContext *ctx, AVPacket *pkt, int poc, bool *queued)
|
static int hevc_queue_frame(AVBSFContext *ctx, AVPacket *pkt, int poc, bool *queued)
|
||||||
@@ -440,10 +452,26 @@ static int hevc_queue_frame(AVBSFContext *ctx, AVPacket *pkt, int poc, bool *que
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (poc < s->nb_frame && hevc->gop == s->gop) {
|
if (poc < s->nb_frame && hevc->gop == s->gop) {
|
||||||
int tmp[] = {s->nb_frame - poc, s->gop};
|
int dec = s->nb_frame - poc;
|
||||||
|
DTS2PTSNode *nodes[HEVC_MAX_DPB_SIZE * 2];
|
||||||
|
DTS2PTSCollect c = { s->gop, nodes, 0, FF_ARRAY_ELEMS(nodes) };
|
||||||
|
|
||||||
s->nb_frame -= tmp[0];
|
s->nb_frame -= dec;
|
||||||
av_tree_enumerate(s->root, tmp, same_gop, dec_poc);
|
|
||||||
|
av_tree_enumerate(s->root, &c, NULL, collect_same_gop);
|
||||||
|
av_assert0(c.count <= c.max);
|
||||||
|
for (int i = 0; i < c.count; i++) {
|
||||||
|
struct AVTreeNode *tnode = NULL;
|
||||||
|
DTS2PTSNode *r;
|
||||||
|
av_tree_insert(&s->root, nodes[i], cmp_insert, &tnode);
|
||||||
|
nodes[i]->poc -= dec;
|
||||||
|
r = av_tree_insert(&s->root, nodes[i], cmp_insert, &tnode);
|
||||||
|
if (r && r != nodes[i]) {
|
||||||
|
*r = *nodes[i];
|
||||||
|
av_refstruct_unref(&nodes[i]);
|
||||||
|
av_free(tnode);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = alloc_and_insert_node(ctx, pkt->dts, pkt->duration, s->nb_frame, 1, s->gop);
|
ret = alloc_and_insert_node(ctx, pkt->dts, pkt->duration, s->nb_frame, 1, s->gop);
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ static int ff_smpte436m_to_eia608_filter(AVBSFContext *ctx, AVPacket *out)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (ret != AVERROR_EOF)
|
if (ret != AVERROR_EOF)
|
||||||
return ret;
|
goto fail;
|
||||||
ret = AVERROR(EAGAIN);
|
ret = AVERROR(EAGAIN);
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
|
|||||||
@@ -186,10 +186,13 @@ static int FUNC(decoder_model_info)(CodedBitstreamContext *ctx, RWContext *rw,
|
|||||||
static int FUNC(sequence_header_obu)(CodedBitstreamContext *ctx, RWContext *rw,
|
static int FUNC(sequence_header_obu)(CodedBitstreamContext *ctx, RWContext *rw,
|
||||||
AV1RawSequenceHeader *current)
|
AV1RawSequenceHeader *current)
|
||||||
{
|
{
|
||||||
|
CodedBitstreamAV1Context *priv = ctx->priv_data;
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
HEADER("Sequence Header");
|
HEADER("Sequence Header");
|
||||||
|
|
||||||
|
priv->seen_frame_header = 0;
|
||||||
|
|
||||||
fc(3, seq_profile, AV_PROFILE_AV1_MAIN,
|
fc(3, seq_profile, AV_PROFILE_AV1_MAIN,
|
||||||
AV_PROFILE_AV1_PROFESSIONAL);
|
AV_PROFILE_AV1_PROFESSIONAL);
|
||||||
flag(still_picture);
|
flag(still_picture);
|
||||||
|
|||||||
@@ -1133,7 +1133,7 @@ static int FUNC(sps)(CodedBitstreamContext *ctx, RWContext *rw,
|
|||||||
max_width_minus1 = tmp_width_val - 1;
|
max_width_minus1 = tmp_width_val - 1;
|
||||||
max_height_minus1 = tmp_height_val - 1;
|
max_height_minus1 = tmp_height_val - 1;
|
||||||
|
|
||||||
flag(sps_subpic_info_present_flag);
|
u(1, sps_subpic_info_present_flag, 0, !current->sps_res_change_in_clvs_allowed_flag);
|
||||||
if (current->sps_subpic_info_present_flag) {
|
if (current->sps_subpic_info_present_flag) {
|
||||||
ue(sps_num_subpics_minus1, 0, VVC_MAX_SLICES - 1);
|
ue(sps_num_subpics_minus1, 0, VVC_MAX_SLICES - 1);
|
||||||
if (current->sps_num_subpics_minus1 > 0) {
|
if (current->sps_num_subpics_minus1 > 0) {
|
||||||
@@ -2022,7 +2022,7 @@ static int FUNC(pps) (CodedBitstreamContext *ctx, RWContext *rw,
|
|||||||
for (j = 0; j < current->pps_num_exp_slices_in_tile[i];
|
for (j = 0; j < current->pps_num_exp_slices_in_tile[i];
|
||||||
j++) {
|
j++) {
|
||||||
ues(pps_exp_slice_height_in_ctus_minus1[i][j], 0,
|
ues(pps_exp_slice_height_in_ctus_minus1[i][j], 0,
|
||||||
remaining_height_in_ctbs_y - 1, 2,
|
remaining_height_in_ctbs_y - (current->pps_num_exp_slices_in_tile[i] - j), 2,
|
||||||
i, j);
|
i, j);
|
||||||
slice_height_in_ctus =
|
slice_height_in_ctus =
|
||||||
current->
|
current->
|
||||||
@@ -3145,7 +3145,7 @@ static int FUNC(slice_header) (CodedBitstreamContext *ctx, RWContext *rw,
|
|||||||
|
|
||||||
if (!pps->pps_rect_slice_flag &&
|
if (!pps->pps_rect_slice_flag &&
|
||||||
pps->num_tiles_in_pic - current->sh_slice_address > 1)
|
pps->num_tiles_in_pic - current->sh_slice_address > 1)
|
||||||
ue(sh_num_tiles_in_slice_minus1, 0, pps->num_tiles_in_pic - 1);
|
ue(sh_num_tiles_in_slice_minus1, 0, pps->num_tiles_in_pic - 1 - current->sh_slice_address);
|
||||||
else
|
else
|
||||||
infer(sh_num_tiles_in_slice_minus1, 0);
|
infer(sh_num_tiles_in_slice_minus1, 0);
|
||||||
|
|
||||||
|
|||||||
+5
-2
@@ -1080,6 +1080,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
|
|||||||
int s = 0;
|
int s = 0;
|
||||||
unsigned int channel_mask = 0;
|
unsigned int channel_mask = 0;
|
||||||
int samples_per_frame = 0;
|
int samples_per_frame = 0;
|
||||||
|
int total_channels = 0;
|
||||||
int ret;
|
int ret;
|
||||||
int channels = avctx->ch_layout.nb_channels;
|
int channels = avctx->ch_layout.nb_channels;
|
||||||
|
|
||||||
@@ -1237,10 +1238,12 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
|
|||||||
q->subpacket[s].gains2.now = q->subpacket[s].gain_3;
|
q->subpacket[s].gains2.now = q->subpacket[s].gain_3;
|
||||||
q->subpacket[s].gains2.previous = q->subpacket[s].gain_4;
|
q->subpacket[s].gains2.previous = q->subpacket[s].gain_4;
|
||||||
|
|
||||||
if (q->num_subpackets + q->subpacket[s].num_channels > channels) {
|
if (total_channels + q->subpacket[s].num_channels > channels) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "Too many subpackets %d for channels %d\n", q->num_subpackets, channels);
|
av_log(avctx, AV_LOG_ERROR, "Too many subpacket channels %d for channels %d\n",
|
||||||
|
total_channels + q->subpacket[s].num_channels, channels);
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
total_channels += q->subpacket[s].num_channels;
|
||||||
|
|
||||||
q->num_subpackets++;
|
q->num_subpackets++;
|
||||||
s++;
|
s++;
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ static av_cold int cri_decode_init(AVCodecContext *avctx)
|
|||||||
s->jpeg_avctx->flags = avctx->flags;
|
s->jpeg_avctx->flags = avctx->flags;
|
||||||
s->jpeg_avctx->flags2 = avctx->flags2;
|
s->jpeg_avctx->flags2 = avctx->flags2;
|
||||||
s->jpeg_avctx->idct_algo = avctx->idct_algo;
|
s->jpeg_avctx->idct_algo = avctx->idct_algo;
|
||||||
|
s->jpeg_avctx->max_pixels = avctx->max_pixels;
|
||||||
ret = avcodec_open2(s->jpeg_avctx, NULL, NULL);
|
ret = avcodec_open2(s->jpeg_avctx, NULL, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -339,9 +339,9 @@ static int alloc_buffers(DiracContext *s, int stride)
|
|||||||
av_freep(&s->mctmp);
|
av_freep(&s->mctmp);
|
||||||
av_freep(&s->mcscratch);
|
av_freep(&s->mcscratch);
|
||||||
|
|
||||||
s->edge_emu_buffer_base = av_malloc_array(stride, MAX_BLOCKSIZE);
|
s->edge_emu_buffer_base = av_malloc_array(stride, 4 * MAX_BLOCKSIZE);
|
||||||
|
|
||||||
s->mctmp = av_malloc_array((stride+MAX_BLOCKSIZE), (h+MAX_BLOCKSIZE) * sizeof(*s->mctmp));
|
s->mctmp = av_malloc_array((stride+MAX_BLOCKSIZE), (h + 5*MAX_BLOCKSIZE) * sizeof(*s->mctmp));
|
||||||
s->mcscratch = av_malloc_array(stride, MAX_BLOCKSIZE);
|
s->mcscratch = av_malloc_array(stride, MAX_BLOCKSIZE);
|
||||||
|
|
||||||
if (!s->edge_emu_buffer_base || !s->mctmp || !s->mcscratch)
|
if (!s->edge_emu_buffer_base || !s->mctmp || !s->mcscratch)
|
||||||
@@ -1895,7 +1895,7 @@ static int dirac_decode_frame_internal(DiracContext *s)
|
|||||||
|
|
||||||
/* FIXME: small resolutions */
|
/* FIXME: small resolutions */
|
||||||
for (i = 0; i < 4; i++)
|
for (i = 0; i < 4; i++)
|
||||||
s->edge_emu_buffer[i] = s->edge_emu_buffer_base + i*FFALIGN(p->width, 16);
|
s->edge_emu_buffer[i] = s->edge_emu_buffer_base + i*s->buffer_stride*MAX_BLOCKSIZE;
|
||||||
|
|
||||||
if (!s->zero_res && !s->low_delay)
|
if (!s->zero_res && !s->low_delay)
|
||||||
{
|
{
|
||||||
@@ -1944,7 +1944,7 @@ static int dirac_decode_frame_internal(DiracContext *s)
|
|||||||
h = p->height - start;
|
h = p->height - start;
|
||||||
else
|
else
|
||||||
h = p->ybsep - (start - dsty);
|
h = p->ybsep - (start - dsty);
|
||||||
if (h < 0)
|
if (h <= 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
memset(mctmp+2*p->yoffset*p->stride, 0, 2*rowheight);
|
memset(mctmp+2*p->yoffset*p->stride, 0, 2*rowheight);
|
||||||
|
|||||||
@@ -113,6 +113,8 @@ static int fastaudio_decode(AVCodecContext *avctx, AVFrame *frame,
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
subframes = pkt->size / (40 * avctx->ch_layout.nb_channels);
|
subframes = pkt->size / (40 * avctx->ch_layout.nb_channels);
|
||||||
|
if (subframes <= 0 || subframes > INT_MAX / 256)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
frame->nb_samples = subframes * 256;
|
frame->nb_samples = subframes * 256;
|
||||||
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
+3
-2
@@ -481,12 +481,13 @@ static void epic_free_pixel_cache(ePICPixHash *hash)
|
|||||||
static inline int is_pixel_on_stack(const ePICContext *dc, uint32_t pix)
|
static inline int is_pixel_on_stack(const ePICContext *dc, uint32_t pix)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
int n = FFMIN(dc->stack_pos, EPIC_PIX_STACK_SIZE);
|
||||||
|
|
||||||
for (i = 0; i < dc->stack_pos; i++)
|
for (i = 0; i < n; i++)
|
||||||
if (dc->stack[i] == pix)
|
if (dc->stack[i] == pix)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
return i != dc->stack_pos;
|
return i != n;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TOSIGNED(val) (((val) >> 1) ^ -((val) & 1))
|
#define TOSIGNED(val) (((val) >> 1) ^ -((val) & 1))
|
||||||
|
|||||||
@@ -629,15 +629,15 @@ static int h2645_sei_to_side_data(AVCodecContext *avctx, H2645SEI *sei,
|
|||||||
return AVERROR(ENOMEM);
|
return AVERROR(ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dst_env->ambient_illuminance = av_make_q(env->ambient_illuminance, 10000);
|
||||||
|
dst_env->ambient_light_x = av_make_q(env->ambient_light_x, 50000);
|
||||||
|
dst_env->ambient_light_y = av_make_q(env->ambient_light_y, 50000);
|
||||||
|
|
||||||
ret = ff_frame_new_side_data_from_buf_ext(avctx, sd, nb_sd,
|
ret = ff_frame_new_side_data_from_buf_ext(avctx, sd, nb_sd,
|
||||||
AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, &buf);
|
AV_FRAME_DATA_AMBIENT_VIEWING_ENVIRONMENT, &buf);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
dst_env->ambient_illuminance = av_make_q(env->ambient_illuminance, 10000);
|
|
||||||
dst_env->ambient_light_x = av_make_q(env->ambient_light_x, 50000);
|
|
||||||
dst_env->ambient_light_y = av_make_q(env->ambient_light_y, 50000);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (sei->mastering_display.present) {
|
if (sei->mastering_display.present) {
|
||||||
|
|||||||
@@ -316,8 +316,10 @@ static void color_frame(AVFrame *frame, const int c[4])
|
|||||||
int bytes = is_chroma ? AV_CEIL_RSHIFT(frame->width, desc->log2_chroma_w) : frame->width;
|
int bytes = is_chroma ? AV_CEIL_RSHIFT(frame->width, desc->log2_chroma_w) : frame->width;
|
||||||
int height = is_chroma ? AV_CEIL_RSHIFT(frame->height, desc->log2_chroma_h) : frame->height;
|
int height = is_chroma ? AV_CEIL_RSHIFT(frame->height, desc->log2_chroma_h) : frame->height;
|
||||||
if (desc->comp[0].depth >= 9) {
|
if (desc->comp[0].depth >= 9) {
|
||||||
((uint16_t*)dst)[0] = c[p];
|
if (bytes >= 1)
|
||||||
av_memcpy_backptr(dst + 2, 2, bytes - 2);
|
((uint16_t*)dst)[0] = c[p];
|
||||||
|
if (bytes >= 2)
|
||||||
|
av_memcpy_backptr(dst + 2, 2, 2 * (bytes - 1));
|
||||||
dst += frame->linesize[p];
|
dst += frame->linesize[p];
|
||||||
for (int y = 1; y < height; y++) {
|
for (int y = 1; y < height; y++) {
|
||||||
memcpy(dst, frame->data[p], 2*bytes);
|
memcpy(dst, frame->data[p], 2*bytes);
|
||||||
|
|||||||
+1
-1
@@ -72,7 +72,7 @@ static int decompress(uint8_t *scanline, int w, GetByteContext *gb, const uint8_
|
|||||||
for (int i = run << rshift; i > 0 && w > 0 && scanline >= start + 4; i--) {
|
for (int i = run << rshift; i > 0 && w > 0 && scanline >= start + 4; i--) {
|
||||||
memcpy(scanline, scanline - 4, 4);
|
memcpy(scanline, scanline - 4, 4);
|
||||||
scanline += 4;
|
scanline += 4;
|
||||||
w -= 4;
|
w--;
|
||||||
}
|
}
|
||||||
rshift += 8;
|
rshift += 8;
|
||||||
if (rshift > 16)
|
if (rshift > 16)
|
||||||
|
|||||||
+34
-22
@@ -62,6 +62,29 @@ static const uint8_t hevc_sub_height_c[] = {
|
|||||||
1, 2, 1, 1
|
1, 2, 1, 1
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static int read_window(HEVCWindow *window, GetBitContext *gb, int chroma_format_idc, int w, int h)
|
||||||
|
{
|
||||||
|
int64_t vert_mult = hevc_sub_height_c[chroma_format_idc];
|
||||||
|
int64_t horiz_mult = hevc_sub_width_c [chroma_format_idc];
|
||||||
|
int64_t left = get_ue_golomb_long(gb) * horiz_mult;
|
||||||
|
int64_t right = get_ue_golomb_long(gb) * horiz_mult;
|
||||||
|
int64_t top = get_ue_golomb_long(gb) * vert_mult;
|
||||||
|
int64_t bottom = get_ue_golomb_long(gb) * vert_mult;
|
||||||
|
|
||||||
|
if (left < 0 || right < 0 || top < 0 || bottom < 0 ||
|
||||||
|
w <= left + right ||
|
||||||
|
h <= top + bottom) {
|
||||||
|
memset(window, 0, sizeof(*window));
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
|
window->left_offset = left;
|
||||||
|
window->right_offset = right;
|
||||||
|
window->top_offset = top;
|
||||||
|
window->bottom_offset = bottom;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void remove_sps(HEVCParamSets *s, int id)
|
static void remove_sps(HEVCParamSets *s, int id)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@@ -702,12 +725,9 @@ static int decode_vps_ext(GetBitContext *gb, AVCodecContext *avctx, HEVCVPS *vps
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (get_bits1(gb) /* conformance_window_vps_flag */) {
|
if (get_bits1(gb) /* conformance_window_vps_flag */) {
|
||||||
int vert_mult = hevc_sub_height_c[vps->rep_format.chroma_format_idc];
|
int ret = read_window(&vps->rep_format.conf_win, gb, vps->rep_format.chroma_format_idc, vps->rep_format.pic_width_in_luma_samples, vps->rep_format.pic_height_in_luma_samples);
|
||||||
int horiz_mult = hevc_sub_width_c[vps->rep_format.chroma_format_idc];
|
if (ret < 0)
|
||||||
vps->rep_format.conf_win_left_offset = get_ue_golomb(gb) * horiz_mult;
|
return ret;
|
||||||
vps->rep_format.conf_win_right_offset = get_ue_golomb(gb) * horiz_mult;
|
|
||||||
vps->rep_format.conf_win_top_offset = get_ue_golomb(gb) * vert_mult;
|
|
||||||
vps->rep_format.conf_win_bottom_offset = get_ue_golomb(gb) * vert_mult;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
vps->max_one_active_ref_layer = get_bits1(gb);
|
vps->max_one_active_ref_layer = get_bits1(gb);
|
||||||
@@ -962,12 +982,7 @@ static void decode_vui(GetBitContext *gb, AVCodecContext *avctx,
|
|||||||
vui->default_display_window_flag = get_bits1(gb);
|
vui->default_display_window_flag = get_bits1(gb);
|
||||||
|
|
||||||
if (vui->default_display_window_flag) {
|
if (vui->default_display_window_flag) {
|
||||||
int vert_mult = hevc_sub_height_c[sps->chroma_format_idc];
|
read_window(&vui->def_disp_win, gb, sps->chroma_format_idc, sps->width, sps->height);
|
||||||
int horiz_mult = hevc_sub_width_c[sps->chroma_format_idc];
|
|
||||||
vui->def_disp_win.left_offset = get_ue_golomb_long(gb) * horiz_mult;
|
|
||||||
vui->def_disp_win.right_offset = get_ue_golomb_long(gb) * horiz_mult;
|
|
||||||
vui->def_disp_win.top_offset = get_ue_golomb_long(gb) * vert_mult;
|
|
||||||
vui->def_disp_win.bottom_offset = get_ue_golomb_long(gb) * vert_mult;
|
|
||||||
|
|
||||||
if (apply_defdispwin &&
|
if (apply_defdispwin &&
|
||||||
avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) {
|
avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) {
|
||||||
@@ -1284,10 +1299,10 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
|
|||||||
sps->height, 0, avctx)) < 0)
|
sps->height, 0, avctx)) < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
sps->pic_conf_win.left_offset = rf->conf_win_left_offset;
|
sps->pic_conf_win.left_offset = rf->conf_win.left_offset;
|
||||||
sps->pic_conf_win.right_offset = rf->conf_win_right_offset;
|
sps->pic_conf_win.right_offset = rf->conf_win.right_offset;
|
||||||
sps->pic_conf_win.top_offset = rf->conf_win_top_offset;
|
sps->pic_conf_win.top_offset = rf->conf_win.top_offset;
|
||||||
sps->pic_conf_win.bottom_offset = rf->conf_win_bottom_offset;
|
sps->pic_conf_win.bottom_offset = rf->conf_win.bottom_offset;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
sps->chroma_format_idc = get_ue_golomb_long(gb);
|
sps->chroma_format_idc = get_ue_golomb_long(gb);
|
||||||
@@ -1310,12 +1325,9 @@ int ff_hevc_parse_sps(HEVCSPS *sps, GetBitContext *gb, unsigned int *sps_id,
|
|||||||
|
|
||||||
sps->conformance_window = get_bits1(gb);
|
sps->conformance_window = get_bits1(gb);
|
||||||
if (sps->conformance_window) {
|
if (sps->conformance_window) {
|
||||||
int vert_mult = hevc_sub_height_c[sps->chroma_format_idc];
|
ret = read_window(&sps->pic_conf_win, gb, sps->chroma_format_idc, sps->width, sps->height);
|
||||||
int horiz_mult = hevc_sub_width_c[sps->chroma_format_idc];
|
if (ret < 0)
|
||||||
sps->pic_conf_win.left_offset = get_ue_golomb_long(gb) * horiz_mult;
|
return ret;
|
||||||
sps->pic_conf_win.right_offset = get_ue_golomb_long(gb) * horiz_mult;
|
|
||||||
sps->pic_conf_win.top_offset = get_ue_golomb_long(gb) * vert_mult;
|
|
||||||
sps->pic_conf_win.bottom_offset = get_ue_golomb_long(gb) * vert_mult;
|
|
||||||
|
|
||||||
if (avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) {
|
if (avctx->flags2 & AV_CODEC_FLAG2_IGNORE_CROP) {
|
||||||
av_log(avctx, AV_LOG_DEBUG,
|
av_log(avctx, AV_LOG_DEBUG,
|
||||||
|
|||||||
@@ -162,10 +162,7 @@ typedef struct RepFormat {
|
|||||||
uint8_t separate_colour_plane_flag;
|
uint8_t separate_colour_plane_flag;
|
||||||
uint8_t bit_depth_luma; ///< bit_depth_vps_luma_minus8 + 8
|
uint8_t bit_depth_luma; ///< bit_depth_vps_luma_minus8 + 8
|
||||||
uint8_t bit_depth_chroma; ///< bit_depth_vps_chroma_minus8 + 8
|
uint8_t bit_depth_chroma; ///< bit_depth_vps_chroma_minus8 + 8
|
||||||
uint16_t conf_win_left_offset;
|
HEVCWindow conf_win;
|
||||||
uint16_t conf_win_right_offset;
|
|
||||||
uint16_t conf_win_top_offset;
|
|
||||||
uint16_t conf_win_bottom_offset;
|
|
||||||
} RepFormat;
|
} RepFormat;
|
||||||
|
|
||||||
typedef struct HEVCVPS {
|
typedef struct HEVCVPS {
|
||||||
|
|||||||
@@ -473,12 +473,13 @@ static HEVCFrame *generate_missing_ref(HEVCContext *s, HEVCLayerContext *l, int
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (!s->avctx->hwaccel) {
|
if (!s->avctx->hwaccel) {
|
||||||
|
int nb_planes = l->sps->chroma_format_idc ? 3 : 1;
|
||||||
if (!l->sps->pixel_shift) {
|
if (!l->sps->pixel_shift) {
|
||||||
for (i = 0; frame->f->data[i]; i++)
|
for (i = 0; i < nb_planes; i++)
|
||||||
memset(frame->f->data[i], 1 << (l->sps->bit_depth - 1),
|
memset(frame->f->data[i], 1 << (l->sps->bit_depth - 1),
|
||||||
frame->f->linesize[i] * AV_CEIL_RSHIFT(l->sps->height, l->sps->vshift[i]));
|
frame->f->linesize[i] * AV_CEIL_RSHIFT(l->sps->height, l->sps->vshift[i]));
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; frame->f->data[i]; i++)
|
for (i = 0; i < nb_planes; i++)
|
||||||
for (y = 0; y < (l->sps->height >> l->sps->vshift[i]); y++) {
|
for (y = 0; y < (l->sps->height >> l->sps->vshift[i]); y++) {
|
||||||
uint8_t *dst = frame->f->data[i] + y * frame->f->linesize[i];
|
uint8_t *dst = frame->f->data[i] + y * frame->f->linesize[i];
|
||||||
AV_WN16(dst, 1 << (l->sps->bit_depth - 1));
|
AV_WN16(dst, 1 << (l->sps->bit_depth - 1));
|
||||||
|
|||||||
@@ -62,6 +62,7 @@ static av_cold int imm5_init(AVCodecContext *avctx)
|
|||||||
ctx->h264_avctx->thread_count = 1;
|
ctx->h264_avctx->thread_count = 1;
|
||||||
ctx->h264_avctx->flags = avctx->flags;
|
ctx->h264_avctx->flags = avctx->flags;
|
||||||
ctx->h264_avctx->flags2 = avctx->flags2;
|
ctx->h264_avctx->flags2 = avctx->flags2;
|
||||||
|
ctx->h264_avctx->max_pixels = avctx->max_pixels;
|
||||||
ret = avcodec_open2(ctx->h264_avctx, NULL, NULL);
|
ret = avcodec_open2(ctx->h264_avctx, NULL, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
@@ -73,6 +74,7 @@ static av_cold int imm5_init(AVCodecContext *avctx)
|
|||||||
ctx->hevc_avctx->thread_count = 1;
|
ctx->hevc_avctx->thread_count = 1;
|
||||||
ctx->hevc_avctx->flags = avctx->flags;
|
ctx->hevc_avctx->flags = avctx->flags;
|
||||||
ctx->hevc_avctx->flags2 = avctx->flags2;
|
ctx->hevc_avctx->flags2 = avctx->flags2;
|
||||||
|
ctx->hevc_avctx->max_pixels = avctx->max_pixels;
|
||||||
ret = avcodec_open2(ctx->hevc_avctx, NULL, NULL);
|
ret = avcodec_open2(ctx->hevc_avctx, NULL, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -1957,7 +1957,7 @@ static void decode_clnpass(const Jpeg2000DecoderContext *s, Jpeg2000T1Context *t
|
|||||||
int width, int height, int bpno, int bandno,
|
int width, int height, int bpno, int bandno,
|
||||||
int seg_symbols, int vert_causal_ctx_csty_symbol)
|
int seg_symbols, int vert_causal_ctx_csty_symbol)
|
||||||
{
|
{
|
||||||
int mask = 3 << (bpno - 1), y0, x, y, runlen, dec;
|
int mask = (3u << bpno)>>1, y0, x, y, runlen, dec;
|
||||||
|
|
||||||
for (y0 = 0; y0 < height; y0 += 4) {
|
for (y0 = 0; y0 < height; y0 += 4) {
|
||||||
for (x = 0; x < width; x++) {
|
for (x = 0; x < width; x++) {
|
||||||
@@ -2448,8 +2448,14 @@ static void jpeg2000_dec_cleanup(Jpeg2000DecoderContext *s)
|
|||||||
memset(s->qntsty, 0, sizeof(s->qntsty));
|
memset(s->qntsty, 0, sizeof(s->qntsty));
|
||||||
memset(s->properties, 0, sizeof(s->properties));
|
memset(s->properties, 0, sizeof(s->properties));
|
||||||
memset(&s->poc , 0, sizeof(s->poc));
|
memset(&s->poc , 0, sizeof(s->poc));
|
||||||
|
memset(s->roi_shift, 0, sizeof(s->roi_shift));
|
||||||
s->numXtiles = s->numYtiles = 0;
|
s->numXtiles = s->numYtiles = 0;
|
||||||
s->ncomponents = 0;
|
s->ncomponents = 0;
|
||||||
|
s->has_ppm = 0;
|
||||||
|
s->isHT = 0;
|
||||||
|
s->precision = 0;
|
||||||
|
s->colour_space = 0;
|
||||||
|
s->pal8 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s)
|
static int jpeg2000_read_main_headers(Jpeg2000DecoderContext *s)
|
||||||
|
|||||||
@@ -1334,8 +1334,19 @@ ff_jpeg2000_decode_htj2k(const Jpeg2000DecoderContext *s, Jpeg2000CodingStyle *c
|
|||||||
sign = val & INT32_MIN;
|
sign = val & INT32_MIN;
|
||||||
val &= INT32_MAX;
|
val &= INT32_MAX;
|
||||||
/* ROI shift, if necessary */
|
/* ROI shift, if necessary */
|
||||||
if (roi_shift && (((uint32_t)val & ~mask) == 0))
|
if (roi_shift && (((uint32_t)val & ~mask) == 0)) {
|
||||||
val <<= roi_shift;
|
if ((32 - ff_clz(val | 1)) < roi_shift)
|
||||||
|
// Assuming that the internal precision for codeblock decoding is 32 bits.
|
||||||
|
val <<= roi_shift;
|
||||||
|
else {
|
||||||
|
av_log(s->avctx, AV_LOG_ERROR,
|
||||||
|
"Pixel precision in ROI is beyond the supported range.\n"
|
||||||
|
);
|
||||||
|
ret = AVERROR_PATCHWELCOME;
|
||||||
|
goto free;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
t1->data[n] = val | sign; /* NOTE: Binary point for reconstruction value is located in 31 - M_b */
|
t1->data[n] = val | sign; /* NOTE: Binary point for reconstruction value is located in 31 - M_b */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -499,7 +499,7 @@ int ff_jpegls_decode_picture(MJpegDecodeContext *s)
|
|||||||
if (s->bits <= 8) {
|
if (s->bits <= 8) {
|
||||||
uint8_t *src = s->picture_ptr->data[0];
|
uint8_t *src = s->picture_ptr->data[0];
|
||||||
|
|
||||||
for (i = 0; i < s->height; i++) {
|
for (i = 0; i < decoded_height; i++) {
|
||||||
switch(s->xfrm) {
|
switch(s->xfrm) {
|
||||||
case 1:
|
case 1:
|
||||||
for (x = off; x + 2 < w; x += 3) {
|
for (x = off; x + 2 < w; x += 3) {
|
||||||
|
|||||||
@@ -434,7 +434,8 @@ static int libjxl_preprocess_stream(AVCodecContext *avctx, const AVFrame *frame,
|
|||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
ret = av_exif_get_entry(avctx, &ifd, tag, 0, &orient);
|
ret = av_exif_get_entry(avctx, &ifd, tag, 0, &orient);
|
||||||
if (ret >= 0 && orient) {
|
if (ret >= 0 && orient) {
|
||||||
if (!have_matrix && orient->value.uint[0] >= 1 && orient->value.uint[0] <= 8) {
|
if (!have_matrix && orient->type == AV_TIFF_SHORT && orient->count
|
||||||
|
&& orient->value.uint[0] >= 1 && orient->value.uint[0] <= 8) {
|
||||||
av_exif_orientation_to_matrix(matrix, orient->value.uint[0]);
|
av_exif_orientation_to_matrix(matrix, orient->value.uint[0]);
|
||||||
have_matrix = 1;
|
have_matrix = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
+134
-18
@@ -59,8 +59,6 @@ typedef struct ApvEncContext {
|
|||||||
|
|
||||||
oapv_frms_t ifrms; // frames for input
|
oapv_frms_t ifrms; // frames for input
|
||||||
|
|
||||||
int num_frames; // number of frames in an access unit
|
|
||||||
|
|
||||||
int preset_id; // preset of apv ( fastest, fast, medium, slow, placebo)
|
int preset_id; // preset of apv ( fastest, fast, medium, slow, placebo)
|
||||||
|
|
||||||
int qp; // quantization parameter (QP) [0,63]
|
int qp; // quantization parameter (QP) [0,63]
|
||||||
@@ -129,6 +127,121 @@ static inline int get_color_format(enum AVPixelFormat pix_fmt)
|
|||||||
return cf;
|
return cf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int get_chroma_format_idc(enum AVPixelFormat pix_fmt)
|
||||||
|
{
|
||||||
|
int cfi = -1;
|
||||||
|
|
||||||
|
switch (pix_fmt) {
|
||||||
|
case AV_PIX_FMT_GRAY10:
|
||||||
|
cfi = APV_CHROMA_FORMAT_400;
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUV422P10:
|
||||||
|
case AV_PIX_FMT_YUV422P12:
|
||||||
|
cfi = APV_CHROMA_FORMAT_422;
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUV444P10:
|
||||||
|
case AV_PIX_FMT_YUV444P12:
|
||||||
|
cfi = APV_CHROMA_FORMAT_444;
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUVA444P10:
|
||||||
|
case AV_PIX_FMT_YUVA444P12:
|
||||||
|
cfi = APV_CHROMA_FORMAT_4444;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
av_assert0(cfi >= 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return cfi;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int get_min_profile(enum AVPixelFormat pix_fmt)
|
||||||
|
{
|
||||||
|
int profile = AV_PROFILE_UNKNOWN;
|
||||||
|
|
||||||
|
switch (pix_fmt) {
|
||||||
|
case AV_PIX_FMT_GRAY10:
|
||||||
|
profile = AV_PROFILE_APV_400_10;
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUV422P10:
|
||||||
|
profile = AV_PROFILE_APV_422_10;
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUV422P12:
|
||||||
|
profile = AV_PROFILE_APV_422_12;
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUV444P10:
|
||||||
|
profile = AV_PROFILE_APV_444_10;
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUV444P12:
|
||||||
|
profile = AV_PROFILE_APV_444_12;
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUVA444P10:
|
||||||
|
profile = AV_PROFILE_APV_4444_10;
|
||||||
|
break;
|
||||||
|
case AV_PIX_FMT_YUVA444P12:
|
||||||
|
profile = AV_PROFILE_APV_4444_12;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
av_assert0(profile != AV_PROFILE_UNKNOWN);
|
||||||
|
}
|
||||||
|
|
||||||
|
return profile;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int profile_is_compatible(enum AVPixelFormat pix_fmt, int profile)
|
||||||
|
{
|
||||||
|
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(pix_fmt);
|
||||||
|
const int chroma_format_idc = get_chroma_format_idc(pix_fmt);
|
||||||
|
const int bit_depth = desc->comp[0].depth;
|
||||||
|
|
||||||
|
av_assert0(desc);
|
||||||
|
|
||||||
|
switch (profile) {
|
||||||
|
case AV_PROFILE_APV_422_10:
|
||||||
|
return chroma_format_idc == APV_CHROMA_FORMAT_422 && bit_depth == 10;
|
||||||
|
case AV_PROFILE_APV_422_12:
|
||||||
|
return chroma_format_idc == APV_CHROMA_FORMAT_422 &&
|
||||||
|
bit_depth >= 10 && bit_depth <= 12;
|
||||||
|
case AV_PROFILE_APV_444_10:
|
||||||
|
return chroma_format_idc >= APV_CHROMA_FORMAT_422 &&
|
||||||
|
chroma_format_idc <= APV_CHROMA_FORMAT_444 &&
|
||||||
|
bit_depth == 10;
|
||||||
|
case AV_PROFILE_APV_444_12:
|
||||||
|
return chroma_format_idc >= APV_CHROMA_FORMAT_422 &&
|
||||||
|
chroma_format_idc <= APV_CHROMA_FORMAT_444 &&
|
||||||
|
bit_depth >= 10 && bit_depth <= 12;
|
||||||
|
case AV_PROFILE_APV_4444_10:
|
||||||
|
return chroma_format_idc >= APV_CHROMA_FORMAT_422 &&
|
||||||
|
chroma_format_idc <= APV_CHROMA_FORMAT_4444 &&
|
||||||
|
bit_depth == 10;
|
||||||
|
case AV_PROFILE_APV_4444_12:
|
||||||
|
return chroma_format_idc >= APV_CHROMA_FORMAT_422 &&
|
||||||
|
chroma_format_idc <= APV_CHROMA_FORMAT_4444 &&
|
||||||
|
bit_depth >= 10 && bit_depth <= 12;
|
||||||
|
case AV_PROFILE_APV_400_10:
|
||||||
|
return chroma_format_idc == APV_CHROMA_FORMAT_400 && bit_depth == 10;
|
||||||
|
default:
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int validate_profile(AVCodecContext *avctx, int profile)
|
||||||
|
{
|
||||||
|
const int minimum = get_min_profile(avctx->pix_fmt);
|
||||||
|
const char *profile_name = av_get_profile_name(avctx->codec, profile);
|
||||||
|
const char *minimum_name = av_get_profile_name(avctx->codec, minimum);
|
||||||
|
|
||||||
|
if (!profile_is_compatible(avctx->pix_fmt, profile)) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
"Profile %s (%d) is incompatible with pixel format %s; minimum compatible profile is %s (%d)\n",
|
||||||
|
profile_name ? profile_name : "unknown", profile,
|
||||||
|
av_get_pix_fmt_name(avctx->pix_fmt),
|
||||||
|
minimum_name ? minimum_name : "unknown", minimum);
|
||||||
|
return AVERROR(EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static oapv_imgb_t *apv_imgb_create(AVCodecContext *avctx)
|
static oapv_imgb_t *apv_imgb_create(AVCodecContext *avctx)
|
||||||
{
|
{
|
||||||
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
|
const AVPixFmtDescriptor *desc = av_pix_fmt_desc_get(avctx->pix_fmt);
|
||||||
@@ -180,22 +293,12 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The function returns a pointer to the object of the oapve_cdesc_t type.
|
* Populate the liboapv configuration from AVCodecContext and encoder options.
|
||||||
* oapve_cdesc_t contains all encoder parameters that should be initialized before the encoder is used.
|
|
||||||
*
|
*
|
||||||
* The field values of the oapve_cdesc_t structure are populated based on:
|
* AVCodecContext fields are applied first, followed by liboapv private options
|
||||||
* - the corresponding field values of the AvCodecConetxt structure,
|
* and finally oapv-params. The APV profile defaults to the minimum profile
|
||||||
* - the apv encoder specific option values,
|
* implied by pix_fmt, and later overrides must remain compatible with that
|
||||||
*
|
* pixel format.
|
||||||
* The order of processing input data and populating the apve_cdsc structure
|
|
||||||
* 1) first, the fields of the AVCodecContext structure corresponding to the provided input options are processed,
|
|
||||||
* (i.e -pix_fmt yuv422p -s:v 1920x1080 -r 30 -profile:v 0)
|
|
||||||
* 2) then apve-specific options added as AVOption to the apv AVCodec implementation
|
|
||||||
* (i.e -preset 0)
|
|
||||||
*
|
|
||||||
* Keep in mind that, there are options that can be set in different ways.
|
|
||||||
* In this case, please follow the above-mentioned order of processing.
|
|
||||||
* The most recent assignments overwrite the previous values.
|
|
||||||
*
|
*
|
||||||
* @param[in] avctx codec context (AVCodecContext)
|
* @param[in] avctx codec context (AVCodecContext)
|
||||||
* @param[out] cdsc contains all APV encoder encoder parameters that should be initialized before the encoder is use
|
* @param[out] cdsc contains all APV encoder encoder parameters that should be initialized before the encoder is use
|
||||||
@@ -228,6 +331,13 @@ static int get_conf(AVCodecContext *avctx, oapve_cdesc_t *cdsc)
|
|||||||
cdsc->param[FRM_IDX].fps_den = avctx->time_base.num;
|
cdsc->param[FRM_IDX].fps_den = avctx->time_base.num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cdsc->param[FRM_IDX].profile_idc = get_min_profile(avctx->pix_fmt);
|
||||||
|
if (avctx->profile != AV_PROFILE_UNKNOWN) {
|
||||||
|
ret = validate_profile(avctx, avctx->profile);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
cdsc->param[FRM_IDX].profile_idc = avctx->profile;
|
||||||
|
}
|
||||||
cdsc->param[FRM_IDX].preset = apv->preset_id;
|
cdsc->param[FRM_IDX].preset = apv->preset_id;
|
||||||
cdsc->param[FRM_IDX].qp = apv->qp;
|
cdsc->param[FRM_IDX].qp = apv->qp;
|
||||||
if (avctx->bit_rate / 1000 > INT_MAX || avctx->rc_max_rate / 1000 > INT_MAX) {
|
if (avctx->bit_rate / 1000 > INT_MAX || avctx->rc_max_rate / 1000 > INT_MAX) {
|
||||||
@@ -275,6 +385,12 @@ static int get_conf(AVCodecContext *avctx, oapve_cdesc_t *cdsc)
|
|||||||
av_log(avctx, AV_LOG_WARNING, "Error parsing option '%s = %s'.\n", en->key, en->value);
|
av_log(avctx, AV_LOG_WARNING, "Error parsing option '%s = %s'.\n", en->key, en->value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ret = validate_profile(avctx, cdsc->param[FRM_IDX].profile_idc);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
avctx->profile = cdsc->param[FRM_IDX].profile_idc;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -426,7 +542,7 @@ static av_cold int liboapve_close(AVCodecContext *avctx)
|
|||||||
{
|
{
|
||||||
ApvEncContext *apv = avctx->priv_data;
|
ApvEncContext *apv = avctx->priv_data;
|
||||||
|
|
||||||
for (int i = 0; i < apv->num_frames; i++) {
|
for (int i = 0; i < apv->ifrms.num_frms; i++) {
|
||||||
if (apv->ifrms.frm[i].imgb != NULL)
|
if (apv->ifrms.frm[i].imgb != NULL)
|
||||||
apv->ifrms.frm[i].imgb->release(apv->ifrms.frm[i].imgb);
|
apv->ifrms.frm[i].imgb->release(apv->ifrms.frm[i].imgb);
|
||||||
apv->ifrms.frm[i].imgb = NULL;
|
apv->ifrms.frm[i].imgb = NULL;
|
||||||
|
|||||||
+13
-5
@@ -225,7 +225,8 @@ static int magy_decode_slice10(AVCodecContext *avctx, void *tdata,
|
|||||||
s->llviddsp.add_left_pred_int16(dst, dst, max, width, 0);
|
s->llviddsp.add_left_pred_int16(dst, dst, max, width, 0);
|
||||||
dst += stride;
|
dst += stride;
|
||||||
}
|
}
|
||||||
lefttop = left = dst[0];
|
if (1 + interlaced < height)
|
||||||
|
lefttop = left = dst[0];
|
||||||
for (k = 1 + interlaced; k < height; k++) {
|
for (k = 1 + interlaced; k < height; k++) {
|
||||||
magicyuv_median_pred16(dst, dst - fake_stride, dst, width, &left, &lefttop, max);
|
magicyuv_median_pred16(dst, dst - fake_stride, dst, width, &left, &lefttop, max);
|
||||||
lefttop = left = dst[0];
|
lefttop = left = dst[0];
|
||||||
@@ -553,6 +554,13 @@ static int magy_decode_frame(AVCodecContext *avctx, AVFrame *p,
|
|||||||
"invalid slice height: %d\n", s->slice_height);
|
"invalid slice height: %d\n", s->slice_height);
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
if (s->vshift[1] && (s->slice_height & ((1 << s->vshift[1]) - 1))) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
"slice_height %d is not aligned to chroma vertical "
|
||||||
|
"subsampling (must be a multiple of %d)\n",
|
||||||
|
s->slice_height, 1 << s->vshift[1]);
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
bytestream2_skipu(&gb, 4);
|
bytestream2_skipu(&gb, 4);
|
||||||
|
|
||||||
@@ -563,11 +571,11 @@ static int magy_decode_frame(AVCodecContext *avctx, AVFrame *p,
|
|||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((s->slice_height >> s->vshift[1]) <= s->interlaced) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR, "impossible slice height\n");
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
if (s->interlaced) {
|
if (s->interlaced) {
|
||||||
if ((s->slice_height >> s->vshift[1]) < 2) {
|
|
||||||
av_log(avctx, AV_LOG_ERROR, "impossible slice height\n");
|
|
||||||
return AVERROR_INVALIDDATA;
|
|
||||||
}
|
|
||||||
if ((avctx->coded_height % s->slice_height) && ((avctx->coded_height % s->slice_height) >> s->vshift[1]) < 2) {
|
if ((avctx->coded_height % s->slice_height) && ((avctx->coded_height % s->slice_height) >> s->vshift[1]) < 2) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "impossible height\n");
|
av_log(avctx, AV_LOG_ERROR, "impossible height\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|||||||
@@ -57,6 +57,12 @@ static av_cold int misc4_init(AVCodecContext *avctx)
|
|||||||
{
|
{
|
||||||
MISC4Context *s = avctx->priv_data;
|
MISC4Context *s = avctx->priv_data;
|
||||||
|
|
||||||
|
if (avctx->sample_rate <= 0)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
|
if (avctx->ch_layout.nb_channels != 1 && avctx->ch_layout.nb_channels != 2)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
|
||||||
switch (avctx->sample_rate) {
|
switch (avctx->sample_rate) {
|
||||||
case 8000:
|
case 8000:
|
||||||
|
|||||||
@@ -1453,6 +1453,7 @@ static int mjpeg_decode_scan(MJpegDecodeContext *s)
|
|||||||
int linesize[MAX_COMPONENTS];
|
int linesize[MAX_COMPONENTS];
|
||||||
GetBitContext mb_bitmask_gb = {0}; // initialize to silence gcc warning
|
GetBitContext mb_bitmask_gb = {0}; // initialize to silence gcc warning
|
||||||
int bytes_per_pixel = 1 + (s->bits > 8);
|
int bytes_per_pixel = 1 + (s->bits > 8);
|
||||||
|
int field_pos = -1;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (s->avctx->codec_id == AV_CODEC_ID_MXPEG) {
|
if (s->avctx->codec_id == AV_CODEC_ID_MXPEG) {
|
||||||
@@ -1586,9 +1587,11 @@ next_field:
|
|||||||
if (s->interlaced &&
|
if (s->interlaced &&
|
||||||
bytestream2_get_bytes_left(&s->gB) > 2 &&
|
bytestream2_get_bytes_left(&s->gB) > 2 &&
|
||||||
bytestream2_tell(&s->gB) > 2 &&
|
bytestream2_tell(&s->gB) > 2 &&
|
||||||
|
bytestream2_tell(&s->gB) != field_pos &&
|
||||||
s->gB.buffer[-2] == 0xFF &&
|
s->gB.buffer[-2] == 0xFF &&
|
||||||
s->gB.buffer[-1] == 0xD1) {
|
s->gB.buffer[-1] == 0xD1) {
|
||||||
av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
|
av_log(s->avctx, AV_LOG_DEBUG, "AVRn interlaced picture marker found\n");
|
||||||
|
field_pos = bytestream2_tell(&s->gB);
|
||||||
s->bottom_field ^= 1;
|
s->bottom_field ^= 1;
|
||||||
|
|
||||||
goto next_field;
|
goto next_field;
|
||||||
|
|||||||
+11
-3
@@ -65,6 +65,9 @@ static int rle_uncompress(GetByteContext *gb, PutByteContext *pb, GetByteContext
|
|||||||
} else if (run == 255) {
|
} else if (run == 255) {
|
||||||
int pos = bytestream2_tell_p(pb);
|
int pos = bytestream2_tell_p(pb);
|
||||||
|
|
||||||
|
if (!gbp)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
bytestream2_seek(gbp, pos, SEEK_SET);
|
bytestream2_seek(gbp, pos, SEEK_SET);
|
||||||
|
|
||||||
if (pos + width - w < fill)
|
if (pos + width - w < fill)
|
||||||
@@ -128,11 +131,16 @@ static int decode_frame(AVCodecContext *avctx, AVFrame *frame,
|
|||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
bytestream2_init(&gb, s->decomp_buf, zstream->total_out);
|
bytestream2_init(&gb, s->decomp_buf, zstream->total_out);
|
||||||
bytestream2_init(&gbp, s->prev_frame->data[0], avctx->height * s->prev_frame->linesize[0]);
|
if (s->prev_frame->data[0])
|
||||||
|
bytestream2_init(&gbp, s->prev_frame->data[0], avctx->height * s->prev_frame->linesize[0]);
|
||||||
bytestream2_init_writer(&pb, frame->data[0], avctx->height * frame->linesize[0]);
|
bytestream2_init_writer(&pb, frame->data[0], avctx->height * frame->linesize[0]);
|
||||||
|
|
||||||
if (rle_uncompress(&gb, &pb, &gbp, avctx->width, avctx->height, avctx->width * 3,
|
ret = rle_uncompress(&gb, &pb, s->prev_frame->data[0] ? &gbp : NULL,
|
||||||
frame->linesize[0], s->prev_frame->linesize[0]))
|
avctx->width, avctx->height, avctx->width * 3,
|
||||||
|
frame->linesize[0], s->prev_frame->linesize[0]);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
if (ret)
|
||||||
frame->flags |= AV_FRAME_FLAG_KEY;
|
frame->flags |= AV_FRAME_FLAG_KEY;
|
||||||
else
|
else
|
||||||
frame->flags &= ~AV_FRAME_FLAG_KEY;
|
frame->flags &= ~AV_FRAME_FLAG_KEY;
|
||||||
|
|||||||
+8
-1
@@ -263,8 +263,10 @@ static void nvenc_map_preset(NvencContext *ctx)
|
|||||||
|
|
||||||
static void nvenc_print_driver_requirement(AVCodecContext *avctx, int level)
|
static void nvenc_print_driver_requirement(AVCodecContext *avctx, int level)
|
||||||
{
|
{
|
||||||
#if NVENCAPI_CHECK_VERSION(13, 1)
|
#if NVENCAPI_CHECK_VERSION(13, 2)
|
||||||
const char *minver = "(unknown)";
|
const char *minver = "(unknown)";
|
||||||
|
#elif NVENCAPI_CHECK_VERSION(13, 1)
|
||||||
|
const char *minver = "610.00";
|
||||||
#elif NVENCAPI_CHECK_VERSION(13, 0)
|
#elif NVENCAPI_CHECK_VERSION(13, 0)
|
||||||
const char *minver = "570.0";
|
const char *minver = "570.0";
|
||||||
#elif NVENCAPI_CHECK_VERSION(12, 2)
|
#elif NVENCAPI_CHECK_VERSION(12, 2)
|
||||||
@@ -2526,7 +2528,12 @@ static void nvenc_fill_time_code(AVCodecContext *avctx, const AVFrame *frame, NV
|
|||||||
unsigned hh, mm, ss, ff, drop;
|
unsigned hh, mm, ss, ff, drop;
|
||||||
ff_timecode_set_smpte(&drop, &hh, &mm, &ss, &ff, avctx->framerate, tc[i + 1], 0, 0);
|
ff_timecode_set_smpte(&drop, &hh, &mm, &ss, &ff, avctx->framerate, tc[i + 1], 0, 0);
|
||||||
|
|
||||||
|
#ifdef NVENC_NEW_COUNTING_TYPE
|
||||||
|
time_code->clockTimestamp[i].countingTypeLSB = 0;
|
||||||
|
time_code->clockTimestamp[i].countingTypeMSB = 0;
|
||||||
|
#else
|
||||||
time_code->clockTimestamp[i].countingType = 0;
|
time_code->clockTimestamp[i].countingType = 0;
|
||||||
|
#endif
|
||||||
time_code->clockTimestamp[i].discontinuityFlag = 0;
|
time_code->clockTimestamp[i].discontinuityFlag = 0;
|
||||||
time_code->clockTimestamp[i].cntDroppedFrames = drop;
|
time_code->clockTimestamp[i].cntDroppedFrames = drop;
|
||||||
time_code->clockTimestamp[i].nFrames = ff;
|
time_code->clockTimestamp[i].nFrames = ff;
|
||||||
|
|||||||
@@ -111,6 +111,11 @@ typedef void ID3D11Device;
|
|||||||
#define NVENC_HAVE_MVHEVC
|
#define NVENC_HAVE_MVHEVC
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// SDK 13.1 compile time feature checks
|
||||||
|
#if NVENCAPI_CHECK_VERSION(13, 1)
|
||||||
|
#define NVENC_NEW_COUNTING_TYPE
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct NvencSurface
|
typedef struct NvencSurface
|
||||||
{
|
{
|
||||||
NV_ENC_INPUT_PTR input_surface;
|
NV_ENC_INPUT_PTR input_surface;
|
||||||
|
|||||||
@@ -866,6 +866,12 @@ static int on2avc_decode_frame(AVCodecContext * avctx, AVFrame *frame,
|
|||||||
av_log(avctx, AV_LOG_ERROR, "No subframes present\n");
|
av_log(avctx, AV_LOG_ERROR, "No subframes present\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
|
if (num_frames > INT_MAX / ON2AVC_SUBFRAME_SIZE) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
"Too many subframes (%d); per-frame sample count overflows\n",
|
||||||
|
num_frames);
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
/* get output buffer */
|
/* get output buffer */
|
||||||
frame->nb_samples = ON2AVC_SUBFRAME_SIZE * num_frames;
|
frame->nb_samples = ON2AVC_SUBFRAME_SIZE * num_frames;
|
||||||
|
|||||||
@@ -291,7 +291,9 @@ static const AVOption avcodec_options[] = {
|
|||||||
{"bt709", "BT.709", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT709 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
{"bt709", "BT.709", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_BT709 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
||||||
{"unknown", "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
{"unknown", "Unspecified", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_UNSPECIFIED }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
||||||
{"gamma22", "BT.470 M", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA22 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
{"gamma22", "BT.470 M", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA22 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
||||||
|
{"bt470m", "BT.470 M", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA22 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
||||||
{"gamma28", "BT.470 BG", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA28 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
{"gamma28", "BT.470 BG", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA28 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
||||||
|
{"bt470bg", "BT.470 BG", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_GAMMA28 }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
||||||
{"smpte170m", "SMPTE 170 M", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE170M }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
{"smpte170m", "SMPTE 170 M", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE170M }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
||||||
{"smpte240m", "SMPTE 240 M", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE240M }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
{"smpte240m", "SMPTE 240 M", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_SMPTE240M }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
||||||
{"linear", "Linear", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LINEAR }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
{"linear", "Linear", 0, AV_OPT_TYPE_CONST, {.i64 = AVCOL_TRC_LINEAR }, INT_MIN, INT_MAX, V|E|D, .unit = "color_trc_type"},
|
||||||
|
|||||||
@@ -414,6 +414,11 @@ static int decode_frame(AVCodecContext *avctx,
|
|||||||
/* Flags */
|
/* Flags */
|
||||||
int flags = bytestream2_get_be16(&gb_hdr);
|
int flags = bytestream2_get_be16(&gb_hdr);
|
||||||
int align = (flags >> 1) & 0x7;
|
int align = (flags >> 1) & 0x7;
|
||||||
|
if (align > 4) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
"Invalid tile alignment %d (max 4)\n", align);
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
/* Quantization matrix */
|
/* Quantization matrix */
|
||||||
if (flags & 1)
|
if (flags & 1)
|
||||||
|
|||||||
+2
-1
@@ -415,8 +415,9 @@ static int rv10_decode_packet(AVCodecContext *avctx, const uint8_t *buf,
|
|||||||
H263DecContext *const h = &rv->h;
|
H263DecContext *const h = &rv->h;
|
||||||
int mb_count, mb_pos, left, start_mb_x, active_bits_size, ret;
|
int mb_count, mb_pos, left, start_mb_x, active_bits_size, ret;
|
||||||
|
|
||||||
|
if ((ret = init_get_bits8(&h->gb, buf, FFMAX(buf_size, buf_size2))) < 0)
|
||||||
|
return ret;
|
||||||
active_bits_size = buf_size * 8;
|
active_bits_size = buf_size * 8;
|
||||||
init_get_bits(&h->gb, buf, FFMAX(buf_size, buf_size2) * 8);
|
|
||||||
if (h->c.codec_id == AV_CODEC_ID_RV10)
|
if (h->c.codec_id == AV_CODEC_ID_RV10)
|
||||||
mb_count = rv10_decode_picture_header(h);
|
mb_count = rv10_decode_picture_header(h);
|
||||||
else
|
else
|
||||||
|
|||||||
+8
-3
@@ -1427,7 +1427,9 @@ static int rv34_decode_slice(RV34DecContext *r, int end, const uint8_t* buf, int
|
|||||||
int mb_pos, slice_type;
|
int mb_pos, slice_type;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
init_get_bits(gb, buf, buf_size*8);
|
res = init_get_bits8(gb, buf, buf_size);
|
||||||
|
if (res < 0)
|
||||||
|
return res;
|
||||||
res = r->parse_slice_header(r, gb, &r->si);
|
res = r->parse_slice_header(r, gb, &r->si);
|
||||||
if(res < 0){
|
if(res < 0){
|
||||||
av_log(s->avctx, AV_LOG_ERROR, "Incorrect or unknown slice header\n");
|
av_log(s->avctx, AV_LOG_ERROR, "Incorrect or unknown slice header\n");
|
||||||
@@ -1647,7 +1649,8 @@ int ff_rv34_decode_frame(AVCodecContext *avctx, AVFrame *pict,
|
|||||||
av_log(avctx, AV_LOG_ERROR, "Slice offset is invalid\n");
|
av_log(avctx, AV_LOG_ERROR, "Slice offset is invalid\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
}
|
}
|
||||||
init_get_bits(&r->gb, buf+offset, (buf_size-offset)*8);
|
if ((ret = init_get_bits8(&r->gb, buf+offset, buf_size-offset)) < 0)
|
||||||
|
return ret;
|
||||||
if (r->parse_slice_header(r, &r->gb, &si) < 0 || si.start) {
|
if (r->parse_slice_header(r, &r->gb, &si) < 0 || si.start) {
|
||||||
av_log(avctx, AV_LOG_ERROR, "First slice header is incorrect\n");
|
av_log(avctx, AV_LOG_ERROR, "First slice header is incorrect\n");
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
@@ -1777,7 +1780,9 @@ int ff_rv34_decode_frame(AVCodecContext *avctx, AVFrame *pict,
|
|||||||
av_log(avctx, AV_LOG_ERROR, "Slice offset is invalid\n");
|
av_log(avctx, AV_LOG_ERROR, "Slice offset is invalid\n");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
init_get_bits(&r->gb, buf+offset1, (buf_size-offset1)*8);
|
ret = init_get_bits8(&r->gb, buf+offset1, buf_size-offset1);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
if (r->parse_slice_header(r, &r->gb, &si) < 0) {
|
if (r->parse_slice_header(r, &r->gb, &si) < 0) {
|
||||||
size = offset2 - offset;
|
size = offset2 - offset;
|
||||||
}else
|
}else
|
||||||
|
|||||||
@@ -1228,6 +1228,9 @@ static int old_codec37(SANMVideoContext *ctx, GetByteContext *gb, int top, int l
|
|||||||
if (width > ctx->aligned_width)
|
if (width > ctx->aligned_width)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
|
if (FFALIGN(height, 4) > ctx->aligned_height)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
if (bytestream2_get_bytes_left(gb) < 16)
|
if (bytestream2_get_bytes_left(gb) < 16)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
@@ -1551,6 +1554,9 @@ static int old_codec47(SANMVideoContext *ctx, GetByteContext *gb, int top, int l
|
|||||||
if (width > ctx->aligned_width)
|
if (width > ctx->aligned_width)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
|
if (FFALIGN(height, 8) > ctx->aligned_height)
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
if (bytestream2_get_bytes_left(gb) < 26)
|
if (bytestream2_get_bytes_left(gb) < 26)
|
||||||
return AVERROR_INVALIDDATA;
|
return AVERROR_INVALIDDATA;
|
||||||
|
|
||||||
|
|||||||
+15
-9
@@ -705,13 +705,15 @@ static int get_dc(SnowEncContext *enc, int mb_x, int mb_y, int plane_index)
|
|||||||
|
|
||||||
for(y2= FFMAX(y, 0); y2<FFMIN(h, y+block_h); y2++){
|
for(y2= FFMAX(y, 0); y2<FFMIN(h, y+block_h); y2++){
|
||||||
for(x2= FFMAX(x, 0); x2<FFMIN(w, x+block_w); x2++){
|
for(x2= FFMAX(x, 0); x2<FFMIN(w, x+block_w); x2++){
|
||||||
int index= x2-(block_w*mb_x - block_w/2) + (y2-(block_h*mb_y - block_h/2))*obmc_stride;
|
int col= x2-(block_w*mb_x - block_w/2);
|
||||||
|
int row= y2-(block_h*mb_y - block_h/2);
|
||||||
|
int index= col + row*obmc_stride;
|
||||||
int obmc_v= obmc[index];
|
int obmc_v= obmc[index];
|
||||||
int d;
|
int d;
|
||||||
if(y<0) obmc_v += obmc[index + block_h*obmc_stride];
|
if(y<0) obmc_v += obmc[index + block_h*obmc_stride];
|
||||||
if(x<0) obmc_v += obmc[index + block_w];
|
if(x<0) obmc_v += obmc[index + block_w];
|
||||||
if(y+block_h>h) obmc_v += obmc[index - block_h*obmc_stride];
|
if(y+block_h>h && row-block_h >= 0) obmc_v += obmc[index - block_h*obmc_stride];
|
||||||
if(x+block_w>w) obmc_v += obmc[index - block_w];
|
if(x+block_w>w && col-block_w >= 0) obmc_v += obmc[index - block_w];
|
||||||
//FIXME precalculate this or simplify it somehow else
|
//FIXME precalculate this or simplify it somehow else
|
||||||
|
|
||||||
d = -dst[index] + (1<<(FRAC_BITS-1));
|
d = -dst[index] + (1<<(FRAC_BITS-1));
|
||||||
@@ -723,6 +725,9 @@ static int get_dc(SnowEncContext *enc, int mb_x, int mb_y, int plane_index)
|
|||||||
}
|
}
|
||||||
*b= backup;
|
*b= backup;
|
||||||
|
|
||||||
|
if (!aa)
|
||||||
|
return 0;
|
||||||
|
|
||||||
return av_clip_uint8( ROUNDED_DIV((int64_t)ab<<LOG2_OBMC_MAX, aa) ); //FIXME we should not need clipping
|
return av_clip_uint8( ROUNDED_DIV((int64_t)ab<<LOG2_OBMC_MAX, aa) ); //FIXME we should not need clipping
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -820,13 +825,14 @@ static int get_block_rd(SnowEncContext *enc, int mb_x, int mb_y,
|
|||||||
&& (mb_x == 0 || mb_x == b_stride-1)
|
&& (mb_x == 0 || mb_x == b_stride-1)
|
||||||
&& (mb_y == 0 || mb_y == b_height-1)){
|
&& (mb_y == 0 || mb_y == b_height-1)){
|
||||||
if(mb_x == 0)
|
if(mb_x == 0)
|
||||||
x1 = block_w;
|
x1 = FFMIN(x1, block_w);
|
||||||
else
|
else
|
||||||
x0 = block_w;
|
x0 = FFMAX(x0, block_w);
|
||||||
if(mb_y == 0)
|
if(mb_y == 0)
|
||||||
y1 = block_h;
|
y1 = FFMIN(y1, block_h);
|
||||||
else
|
else
|
||||||
y0 = block_h;
|
y0 = FFMAX(y0, block_h);
|
||||||
|
x0 = FFMIN(x0, x1);
|
||||||
for(y=y0; y<y1; y++)
|
for(y=y0; y<y1; y++)
|
||||||
memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
|
memcpy(dst + sx+x0 + (sy+y)*ref_stride, cur + x0 + y*ref_stride, x1-x0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -127,6 +127,7 @@ static av_cold int tdsc_init(AVCodecContext *avctx)
|
|||||||
ctx->jpeg_avctx->flags = avctx->flags;
|
ctx->jpeg_avctx->flags = avctx->flags;
|
||||||
ctx->jpeg_avctx->flags2 = avctx->flags2;
|
ctx->jpeg_avctx->flags2 = avctx->flags2;
|
||||||
ctx->jpeg_avctx->idct_algo = avctx->idct_algo;
|
ctx->jpeg_avctx->idct_algo = avctx->idct_algo;
|
||||||
|
ctx->jpeg_avctx->max_pixels = avctx->max_pixels;
|
||||||
ret = avcodec_open2(ctx->jpeg_avctx, NULL, NULL);
|
ret = avcodec_open2(ctx->jpeg_avctx, NULL, NULL);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|||||||
@@ -323,6 +323,11 @@ static int truespeech_decode_frame(AVCodecContext *avctx, AVFrame *frame,
|
|||||||
"Too small input buffer (%d bytes), need at least 32 bytes\n", buf_size);
|
"Too small input buffer (%d bytes), need at least 32 bytes\n", buf_size);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
if (iterations > INT_MAX / 240) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
"Too large input buffer (%d bytes); per-block sample count overflows\n", buf_size);
|
||||||
|
return AVERROR_INVALIDDATA;
|
||||||
|
}
|
||||||
|
|
||||||
/* get output buffer */
|
/* get output buffer */
|
||||||
frame->nb_samples = iterations * 240;
|
frame->nb_samples = iterations * 240;
|
||||||
|
|||||||
+33
-33
@@ -56,7 +56,7 @@ static void vc2_subband_dwt_97(VC2TransformContext *t, dwtcoef *data,
|
|||||||
ptrdiff_t stride, int width, int height)
|
ptrdiff_t stride, int width, int height)
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
dwtcoef *datal = data, *synth = t->buffer, *synthl = synth;
|
uint32_t *datal = (uint32_t *)data, *synth = (uint32_t *)t->buffer, *synthl = synth;
|
||||||
const ptrdiff_t synth_width = width << 1;
|
const ptrdiff_t synth_width = width << 1;
|
||||||
const ptrdiff_t synth_height = height << 1;
|
const ptrdiff_t synth_height = height << 1;
|
||||||
|
|
||||||
@@ -75,21 +75,21 @@ static void vc2_subband_dwt_97(VC2TransformContext *t, dwtcoef *data,
|
|||||||
synthl = synth;
|
synthl = synth;
|
||||||
for (y = 0; y < synth_height; y++) {
|
for (y = 0; y < synth_height; y++) {
|
||||||
/* Lifting stage 2. */
|
/* Lifting stage 2. */
|
||||||
synthl[1] -= (8*synthl[0] + 9*synthl[2] - synthl[4] + 8) >> 4;
|
synthl[1] -= (dwtcoef)(8*synthl[0] + 9*synthl[2] - synthl[4] + 8) >> 4;
|
||||||
for (x = 1; x < width - 2; x++)
|
for (x = 1; x < width - 2; x++)
|
||||||
synthl[2*x + 1] -= (9*synthl[2*x] + 9*synthl[2*x + 2] - synthl[2*x + 4] -
|
synthl[2*x + 1] -= (dwtcoef)(9*synthl[2*x] + 9*synthl[2*x + 2] - synthl[2*x + 4] -
|
||||||
synthl[2 * x - 2] + 8) >> 4;
|
synthl[2 * x - 2] + 8) >> 4;
|
||||||
synthl[synth_width - 1] -= (17*synthl[synth_width - 2] -
|
synthl[synth_width - 1] -= (dwtcoef)(17*synthl[synth_width - 2] -
|
||||||
synthl[synth_width - 4] + 8) >> 4;
|
synthl[synth_width - 4] + 8) >> 4;
|
||||||
synthl[synth_width - 3] -= (8*synthl[synth_width - 2] +
|
synthl[synth_width - 3] -= (dwtcoef)(8*synthl[synth_width - 2] +
|
||||||
9*synthl[synth_width - 4] -
|
9*synthl[synth_width - 4] -
|
||||||
synthl[synth_width - 6] + 8) >> 4;
|
synthl[synth_width - 6] + 8) >> 4;
|
||||||
/* Lifting stage 1. */
|
/* Lifting stage 1. */
|
||||||
synthl[0] += (synthl[1] + synthl[1] + 2) >> 2;
|
synthl[0] += (dwtcoef)(synthl[1] + synthl[1] + 2) >> 2;
|
||||||
for (x = 1; x < width - 1; x++)
|
for (x = 1; x < width - 1; x++)
|
||||||
synthl[2*x] += (synthl[2*x - 1] + synthl[2*x + 1] + 2) >> 2;
|
synthl[2*x] += (dwtcoef)(synthl[2*x - 1] + synthl[2*x + 1] + 2) >> 2;
|
||||||
|
|
||||||
synthl[synth_width - 2] += (synthl[synth_width - 3] +
|
synthl[synth_width - 2] += (dwtcoef)(synthl[synth_width - 3] +
|
||||||
synthl[synth_width - 1] + 2) >> 2;
|
synthl[synth_width - 1] + 2) >> 2;
|
||||||
synthl += synth_width;
|
synthl += synth_width;
|
||||||
}
|
}
|
||||||
@@ -97,13 +97,13 @@ static void vc2_subband_dwt_97(VC2TransformContext *t, dwtcoef *data,
|
|||||||
/* Vertical synthesis: Lifting stage 2. */
|
/* Vertical synthesis: Lifting stage 2. */
|
||||||
synthl = synth + synth_width;
|
synthl = synth + synth_width;
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x] -= (8*synthl[x - synth_width] + 9*synthl[x + synth_width] -
|
synthl[x] -= (dwtcoef)(8*synthl[x - synth_width] + 9*synthl[x + synth_width] -
|
||||||
synthl[x + 3 * synth_width] + 8) >> 4;
|
synthl[x + 3 * synth_width] + 8) >> 4;
|
||||||
|
|
||||||
synthl = synth + (synth_width << 1);
|
synthl = synth + (synth_width << 1);
|
||||||
for (y = 1; y < height - 2; y++) {
|
for (y = 1; y < height - 2; y++) {
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x + synth_width] -= (9*synthl[x] +
|
synthl[x + synth_width] -= (dwtcoef)(9*synthl[x] +
|
||||||
9*synthl[x + 2 * synth_width] -
|
9*synthl[x + 2 * synth_width] -
|
||||||
synthl[x - 2 * synth_width] -
|
synthl[x - 2 * synth_width] -
|
||||||
synthl[x + 4 * synth_width] + 8) >> 4;
|
synthl[x + 4 * synth_width] + 8) >> 4;
|
||||||
@@ -112,36 +112,36 @@ static void vc2_subband_dwt_97(VC2TransformContext *t, dwtcoef *data,
|
|||||||
|
|
||||||
synthl = synth + (synth_height - 1) * synth_width;
|
synthl = synth + (synth_height - 1) * synth_width;
|
||||||
for (x = 0; x < synth_width; x++) {
|
for (x = 0; x < synth_width; x++) {
|
||||||
synthl[x] -= (17*synthl[x - synth_width] -
|
synthl[x] -= (dwtcoef)(17*synthl[x - synth_width] -
|
||||||
synthl[x - 3*synth_width] + 8) >> 4;
|
synthl[x - 3*synth_width] + 8) >> 4;
|
||||||
synthl[x - 2*synth_width] -= (9*synthl[x - 3*synth_width] +
|
synthl[x - 2*synth_width] -= (dwtcoef)(9*synthl[x - 3*synth_width] +
|
||||||
8*synthl[x - 1*synth_width] - synthl[x - 5*synth_width] + 8) >> 4;
|
8*synthl[x - 1*synth_width] - synthl[x - 5*synth_width] + 8) >> 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Vertical synthesis: Lifting stage 1. */
|
/* Vertical synthesis: Lifting stage 1. */
|
||||||
synthl = synth;
|
synthl = synth;
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x] += (synthl[x + synth_width] + synthl[x + synth_width] + 2) >> 2;
|
synthl[x] += (dwtcoef)(synthl[x + synth_width] + synthl[x + synth_width] + 2) >> 2;
|
||||||
|
|
||||||
synthl = synth + (synth_width << 1);
|
synthl = synth + (synth_width << 1);
|
||||||
for (y = 1; y < height - 1; y++) {
|
for (y = 1; y < height - 1; y++) {
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x] += (synthl[x - synth_width] + synthl[x + synth_width] + 2) >> 2;
|
synthl[x] += (dwtcoef)(synthl[x - synth_width] + synthl[x + synth_width] + 2) >> 2;
|
||||||
synthl += synth_width << 1;
|
synthl += synth_width << 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
synthl = synth + (synth_height - 2) * synth_width;
|
synthl = synth + (synth_height - 2) * synth_width;
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x] += (synthl[x - synth_width] + synthl[x + synth_width] + 2) >> 2;
|
synthl[x] += (dwtcoef)(synthl[x - synth_width] + synthl[x + synth_width] + 2) >> 2;
|
||||||
|
|
||||||
deinterleave(data, stride, width, height, synth);
|
deinterleave(data, stride, width, height, (dwtcoef *)synth);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vc2_subband_dwt_53(VC2TransformContext *t, dwtcoef *data,
|
static void vc2_subband_dwt_53(VC2TransformContext *t, dwtcoef *data,
|
||||||
ptrdiff_t stride, int width, int height)
|
ptrdiff_t stride, int width, int height)
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
dwtcoef *synth = t->buffer, *synthl = synth, *datal = data;
|
uint32_t *synth = (uint32_t *)t->buffer, *synthl = synth, *datal = (uint32_t *)data;
|
||||||
const ptrdiff_t synth_width = width << 1;
|
const ptrdiff_t synth_width = width << 1;
|
||||||
const ptrdiff_t synth_height = height << 1;
|
const ptrdiff_t synth_height = height << 1;
|
||||||
|
|
||||||
@@ -161,16 +161,16 @@ static void vc2_subband_dwt_53(VC2TransformContext *t, dwtcoef *data,
|
|||||||
for (y = 0; y < synth_height; y++) {
|
for (y = 0; y < synth_height; y++) {
|
||||||
/* Lifting stage 2. */
|
/* Lifting stage 2. */
|
||||||
for (x = 0; x < width - 1; x++)
|
for (x = 0; x < width - 1; x++)
|
||||||
synthl[2 * x + 1] -= (synthl[2 * x] + synthl[2 * x + 2] + 1) >> 1;
|
synthl[2 * x + 1] -= (dwtcoef)(synthl[2 * x] + synthl[2 * x + 2] + 1) >> 1;
|
||||||
|
|
||||||
synthl[synth_width - 1] -= (2*synthl[synth_width - 2] + 1) >> 1;
|
synthl[synth_width - 1] -= (dwtcoef)(2*synthl[synth_width - 2] + 1) >> 1;
|
||||||
|
|
||||||
/* Lifting stage 1. */
|
/* Lifting stage 1. */
|
||||||
synthl[0] += (2*synthl[1] + 2) >> 2;
|
synthl[0] += (dwtcoef)(2*synthl[1] + 2) >> 2;
|
||||||
for (x = 1; x < width - 1; x++)
|
for (x = 1; x < width - 1; x++)
|
||||||
synthl[2 * x] += (synthl[2 * x - 1] + synthl[2 * x + 1] + 2) >> 2;
|
synthl[2 * x] += (dwtcoef)(synthl[2 * x - 1] + synthl[2 * x + 1] + 2) >> 2;
|
||||||
|
|
||||||
synthl[synth_width - 2] += (synthl[synth_width - 3] + synthl[synth_width - 1] + 2) >> 2;
|
synthl[synth_width - 2] += (dwtcoef)(synthl[synth_width - 3] + synthl[synth_width - 1] + 2) >> 2;
|
||||||
|
|
||||||
synthl += synth_width;
|
synthl += synth_width;
|
||||||
}
|
}
|
||||||
@@ -178,37 +178,37 @@ static void vc2_subband_dwt_53(VC2TransformContext *t, dwtcoef *data,
|
|||||||
/* Vertical synthesis: Lifting stage 2. */
|
/* Vertical synthesis: Lifting stage 2. */
|
||||||
synthl = synth + synth_width;
|
synthl = synth + synth_width;
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x] -= (synthl[x - synth_width] + synthl[x + synth_width] + 1) >> 1;
|
synthl[x] -= (dwtcoef)(synthl[x - synth_width] + synthl[x + synth_width] + 1) >> 1;
|
||||||
|
|
||||||
synthl = synth + (synth_width << 1);
|
synthl = synth + (synth_width << 1);
|
||||||
for (y = 1; y < height - 1; y++) {
|
for (y = 1; y < height - 1; y++) {
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x + synth_width] -= (synthl[x] + synthl[x + synth_width * 2] + 1) >> 1;
|
synthl[x + synth_width] -= (dwtcoef)(synthl[x] + synthl[x + synth_width * 2] + 1) >> 1;
|
||||||
synthl += (synth_width << 1);
|
synthl += (synth_width << 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
synthl = synth + (synth_height - 1) * synth_width;
|
synthl = synth + (synth_height - 1) * synth_width;
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x] -= (2*synthl[x - synth_width] + 1) >> 1;
|
synthl[x] -= (dwtcoef)(2*synthl[x - synth_width] + 1) >> 1;
|
||||||
|
|
||||||
/* Vertical synthesis: Lifting stage 1. */
|
/* Vertical synthesis: Lifting stage 1. */
|
||||||
synthl = synth;
|
synthl = synth;
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x] += (2*synthl[synth_width + x] + 2) >> 2;
|
synthl[x] += (dwtcoef)(2*synthl[synth_width + x] + 2) >> 2;
|
||||||
|
|
||||||
synthl = synth + (synth_width << 1);
|
synthl = synth + (synth_width << 1);
|
||||||
for (y = 1; y < height - 1; y++) {
|
for (y = 1; y < height - 1; y++) {
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x] += (synthl[x + synth_width] + synthl[x - synth_width] + 2) >> 2;
|
synthl[x] += (dwtcoef)(synthl[x + synth_width] + synthl[x - synth_width] + 2) >> 2;
|
||||||
synthl += (synth_width << 1);
|
synthl += (synth_width << 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
synthl = synth + (synth_height - 2)*synth_width;
|
synthl = synth + (synth_height - 2)*synth_width;
|
||||||
for (x = 0; x < synth_width; x++)
|
for (x = 0; x < synth_width; x++)
|
||||||
synthl[x] += (synthl[x - synth_width] + synthl[x + synth_width] + 2) >> 2;
|
synthl[x] += (dwtcoef)(synthl[x - synth_width] + synthl[x + synth_width] + 2) >> 2;
|
||||||
|
|
||||||
|
|
||||||
deinterleave(data, stride, width, height, synth);
|
deinterleave(data, stride, width, height, (dwtcoef *)synth);
|
||||||
}
|
}
|
||||||
|
|
||||||
static av_always_inline void dwt_haar(VC2TransformContext *t, dwtcoef *data,
|
static av_always_inline void dwt_haar(VC2TransformContext *t, dwtcoef *data,
|
||||||
@@ -216,7 +216,7 @@ static av_always_inline void dwt_haar(VC2TransformContext *t, dwtcoef *data,
|
|||||||
const int s)
|
const int s)
|
||||||
{
|
{
|
||||||
int x, y;
|
int x, y;
|
||||||
dwtcoef *synth = t->buffer, *synthl = synth, *datal = data;
|
uint32_t *synth = (uint32_t *)t->buffer, *synthl = synth, *datal = (uint32_t *)data;
|
||||||
const ptrdiff_t synth_width = width << 1;
|
const ptrdiff_t synth_width = width << 1;
|
||||||
const ptrdiff_t synth_height = height << 1;
|
const ptrdiff_t synth_height = height << 1;
|
||||||
|
|
||||||
@@ -225,7 +225,7 @@ static av_always_inline void dwt_haar(VC2TransformContext *t, dwtcoef *data,
|
|||||||
for (x = 0; x < synth_width; x += 2) {
|
for (x = 0; x < synth_width; x += 2) {
|
||||||
synthl[y*synth_width + x + 1] = (datal[y*stride + x + 1] - datal[y*stride + x]) * (1 << s);
|
synthl[y*synth_width + x + 1] = (datal[y*stride + x + 1] - datal[y*stride + x]) * (1 << s);
|
||||||
synthl[y*synth_width + x] = datal[y*stride + x + 0] * (1 << s) +
|
synthl[y*synth_width + x] = datal[y*stride + x + 0] * (1 << s) +
|
||||||
((synthl[y*synth_width + x + 1] + 1) >> 1);
|
((dwtcoef)(synthl[y*synth_width + x + 1] + 1) >> 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -235,11 +235,11 @@ static av_always_inline void dwt_haar(VC2TransformContext *t, dwtcoef *data,
|
|||||||
synthl[(y + 1)*synth_width + x] = synthl[(y + 1)*synth_width + x] -
|
synthl[(y + 1)*synth_width + x] = synthl[(y + 1)*synth_width + x] -
|
||||||
synthl[y*synth_width + x];
|
synthl[y*synth_width + x];
|
||||||
synthl[y*synth_width + x] = synthl[y*synth_width + x] +
|
synthl[y*synth_width + x] = synthl[y*synth_width + x] +
|
||||||
((synthl[(y + 1)*synth_width + x] + 1) >> 1);
|
((dwtcoef)(synthl[(y + 1)*synth_width + x] + 1) >> 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
deinterleave(data, stride, width, height, synth);
|
deinterleave(data, stride, width, height, (dwtcoef *)synth);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void vc2_subband_dwt_haar(VC2TransformContext *t, dwtcoef *data,
|
static void vc2_subband_dwt_haar(VC2TransformContext *t, dwtcoef *data,
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
#include "version_major.h"
|
#include "version_major.h"
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_MINOR 28
|
#define LIBAVCODEC_VERSION_MINOR 28
|
||||||
#define LIBAVCODEC_VERSION_MICRO 101
|
#define LIBAVCODEC_VERSION_MICRO 102
|
||||||
|
|
||||||
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
|
||||||
LIBAVCODEC_VERSION_MINOR, \
|
LIBAVCODEC_VERSION_MINOR, \
|
||||||
|
|||||||
@@ -772,14 +772,6 @@ av_cold int ff_vulkan_encode_init(AVCodecContext *avctx, FFVulkanEncodeContext *
|
|||||||
return AVERROR(EINVAL);
|
return AVERROR(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ctx->enc_caps.supportedEncodeFeedbackFlags & feedback_flags) !=
|
|
||||||
feedback_flags) {
|
|
||||||
av_log (avctx, AV_LOG_ERROR,
|
|
||||||
"Driver does not support required encode feedback flags "
|
|
||||||
"(BUFFER_OFFSET and BYTES_WRITTEN).\n");
|
|
||||||
return AVERROR(ENOTSUP);
|
|
||||||
}
|
|
||||||
|
|
||||||
ctx->base.op = &vulkan_base_encode_ops;
|
ctx->base.op = &vulkan_base_encode_ops;
|
||||||
ctx->codec = codec;
|
ctx->codec = codec;
|
||||||
|
|
||||||
@@ -881,6 +873,14 @@ av_cold int ff_vulkan_encode_init(AVCodecContext *avctx, FFVulkanEncodeContext *
|
|||||||
return AVERROR_EXTERNAL;
|
return AVERROR_EXTERNAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((ctx->enc_caps.supportedEncodeFeedbackFlags & feedback_flags) !=
|
||||||
|
feedback_flags) {
|
||||||
|
av_log(avctx, AV_LOG_ERROR,
|
||||||
|
"Driver does not support required encode feedback flags "
|
||||||
|
"(BUFFER_OFFSET and BYTES_WRITTEN).\n");
|
||||||
|
return AVERROR(ENOTSUP);
|
||||||
|
}
|
||||||
|
|
||||||
err = init_rc(avctx, ctx);
|
err = init_rc(avctx, ctx);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|||||||
@@ -41,8 +41,8 @@ align 16
|
|||||||
mova m1, [angq+block_sizeq]
|
mova m1, [angq+block_sizeq]
|
||||||
xorps m2, m2
|
xorps m2, m2
|
||||||
xorps m3, m3
|
xorps m3, m3
|
||||||
cmpleps m2, m0 ; m <= 0.0
|
cmpltps m2, m0 ; m < 0.0
|
||||||
cmpleps m3, m1 ; a <= 0.0
|
cmpltps m3, m1 ; a < 0.0
|
||||||
andps m2, m5 ; keep only the sign bit
|
andps m2, m5 ; keep only the sign bit
|
||||||
xorps m1, m2
|
xorps m1, m2
|
||||||
mova m4, m3
|
mova m4, m3
|
||||||
|
|||||||
+4
-2
@@ -381,8 +381,10 @@ int ff_alsa_get_device_list(AVDeviceInfoList *device_list, snd_pcm_stream_t stre
|
|||||||
ret = AVERROR(ENOMEM);
|
ret = AVERROR(ENOMEM);
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
new_device->device_name = av_strdup(name);
|
new_device->device_name = av_strdup(name ? name : "");
|
||||||
if ((tmp = strrchr(descr, '\n')) && tmp[1])
|
if (!descr)
|
||||||
|
new_device->device_description = av_strdup("");
|
||||||
|
else if ((tmp = strrchr(descr, '\n')) && tmp[1])
|
||||||
new_device->device_description = av_strdup(&tmp[1]);
|
new_device->device_description = av_strdup(&tmp[1]);
|
||||||
else
|
else
|
||||||
new_device->device_description = av_strdup(descr);
|
new_device->device_description = av_strdup(descr);
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
#include "version_major.h"
|
#include "version_major.h"
|
||||||
|
|
||||||
#define LIBAVDEVICE_VERSION_MINOR 3
|
#define LIBAVDEVICE_VERSION_MINOR 3
|
||||||
#define LIBAVDEVICE_VERSION_MICRO 101
|
#define LIBAVDEVICE_VERSION_MICRO 102
|
||||||
|
|
||||||
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
|
#define LIBAVDEVICE_VERSION_INT AV_VERSION_INT(LIBAVDEVICE_VERSION_MAJOR, \
|
||||||
LIBAVDEVICE_VERSION_MINOR, \
|
LIBAVDEVICE_VERSION_MINOR, \
|
||||||
|
|||||||
@@ -196,8 +196,8 @@ static int fn(filter_channels)(AVFilterContext *ctx, void *arg, int jobnr, int n
|
|||||||
{
|
{
|
||||||
AudioAPContext *s = ctx->priv;
|
AudioAPContext *s = ctx->priv;
|
||||||
AVFrame *out = arg;
|
AVFrame *out = arg;
|
||||||
const int start = (out->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(out->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (out->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(out->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int c = start; c < end; c++) {
|
for (int c = start; c < end; c++) {
|
||||||
const ftype *input = (const ftype *)s->frame[0]->extended_data[c];
|
const ftype *input = (const ftype *)s->frame[0]->extended_data[c];
|
||||||
|
|||||||
@@ -269,8 +269,8 @@ static int fn(filter_channels)(AVFilterContext *ctx, void *arg, int jobnr, int n
|
|||||||
const ftype tqfactor = s->tqfactor;
|
const ftype tqfactor = s->tqfactor;
|
||||||
const ftype itqfactor = ONE / tqfactor;
|
const ftype itqfactor = ONE / tqfactor;
|
||||||
const ftype fg = TAN(M_PI * tfrequency / sample_rate);
|
const ftype fg = TAN(M_PI * tfrequency / sample_rate);
|
||||||
const int start = (in->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(in->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (in->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(in->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
const int is_disabled = ctx->is_disabled;
|
const int is_disabled = ctx->is_disabled;
|
||||||
const int detection = s->detection;
|
const int detection = s->detection;
|
||||||
const int tftype = s->tftype;
|
const int tftype = s->tftype;
|
||||||
|
|||||||
@@ -397,8 +397,8 @@ static int filter_channels_## name(AVFilterContext *ctx, void *arg, int jobnr, i
|
|||||||
AudioCrossoverContext *s = ctx->priv; \
|
AudioCrossoverContext *s = ctx->priv; \
|
||||||
AVFrame *in = arg; \
|
AVFrame *in = arg; \
|
||||||
AVFrame **frames = s->frames; \
|
AVFrame **frames = s->frames; \
|
||||||
const int start = (in->ch_layout.nb_channels * jobnr) / nb_jobs; \
|
const int start = ff_slice_pos(in->ch_layout.nb_channels, jobnr, nb_jobs); \
|
||||||
const int end = (in->ch_layout.nb_channels * (jobnr+1)) / nb_jobs; \
|
const int end = ff_slice_pos(in->ch_layout.nb_channels, jobnr + 1, nb_jobs); \
|
||||||
const int nb_samples = in->nb_samples; \
|
const int nb_samples = in->nb_samples; \
|
||||||
const int nb_outs = ctx->nb_outputs; \
|
const int nb_outs = ctx->nb_outputs; \
|
||||||
const int first_order = s->first_order; \
|
const int first_order = s->first_order; \
|
||||||
|
|||||||
@@ -161,8 +161,8 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
|
|||||||
ThreadData *td = arg;
|
ThreadData *td = arg;
|
||||||
AVFrame *out = td->out;
|
AVFrame *out = td->out;
|
||||||
AVFrame *in = td->in;
|
AVFrame *in = td->in;
|
||||||
const int start = (in->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(in->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (in->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(in->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int ch = start; ch < end; ch++)
|
for (int ch = start; ch < end; ch++)
|
||||||
s->filter_channel(ctx, ch, in, out);
|
s->filter_channel(ctx, ch, in, out);
|
||||||
|
|||||||
@@ -188,8 +188,8 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
|
|||||||
ThreadData *td = arg;
|
ThreadData *td = arg;
|
||||||
AVFrame *out = td->out;
|
AVFrame *out = td->out;
|
||||||
AVFrame *in = td->in;
|
AVFrame *in = td->in;
|
||||||
const int start = (in->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(in->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (in->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(in->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int ch = start; ch < end; ch++) {
|
for (int ch = start; ch < end; ch++) {
|
||||||
s->filter[s->type](ctx, out->extended_data[ch],
|
s->filter[s->type](ctx, out->extended_data[ch],
|
||||||
|
|||||||
@@ -349,8 +349,8 @@ static int drc_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
|
|||||||
AudioDRCContext *s = ctx->priv;
|
AudioDRCContext *s = ctx->priv;
|
||||||
AVFrame *in = s->in;
|
AVFrame *in = s->in;
|
||||||
AVFrame *out = arg;
|
AVFrame *out = arg;
|
||||||
const int start = (out->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(out->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (out->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(out->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int ch = start; ch < end; ch++)
|
for (int ch = start; ch < end; ch++)
|
||||||
drc_channel(ctx, in, out, ch);
|
drc_channel(ctx, in, out, ch);
|
||||||
|
|||||||
@@ -105,8 +105,8 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
|
|||||||
ThreadData *td = arg;
|
ThreadData *td = arg;
|
||||||
AVFrame *out = td->out;
|
AVFrame *out = td->out;
|
||||||
AVFrame *in = td->in;
|
AVFrame *in = td->in;
|
||||||
const int start = (in->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(in->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (in->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(in->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int ch = start; ch < end; ch++) {
|
for (int ch = start; ch < end; ch++) {
|
||||||
const double *src = (const double *)in->extended_data[ch];
|
const double *src = (const double *)in->extended_data[ch];
|
||||||
|
|||||||
@@ -1052,8 +1052,8 @@ static int filter_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_job
|
|||||||
{
|
{
|
||||||
AudioFFTDeNoiseContext *s = ctx->priv;
|
AudioFFTDeNoiseContext *s = ctx->priv;
|
||||||
AVFrame *in = arg;
|
AVFrame *in = arg;
|
||||||
const int start = (in->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(in->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (in->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(in->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
const int window_length = s->window_length;
|
const int window_length = s->window_length;
|
||||||
const double *window = s->window;
|
const double *window = s->window;
|
||||||
|
|
||||||
|
|||||||
@@ -233,8 +233,8 @@ static int tx_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
|
|||||||
{
|
{
|
||||||
AFFTFiltContext *s = ctx->priv;
|
AFFTFiltContext *s = ctx->priv;
|
||||||
const int channels = s->channels;
|
const int channels = s->channels;
|
||||||
const int start = (channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(channels, jobnr, nb_jobs);
|
||||||
const int end = (channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int ch = start; ch < end; ch++) {
|
for (int ch = start; ch < end; ch++) {
|
||||||
AVComplexFloat *fft_in = s->fft_in[ch];
|
AVComplexFloat *fft_in = s->fft_in[ch];
|
||||||
@@ -253,8 +253,8 @@ static int filter_channel(AVFilterContext *ctx, void *arg, int jobnr, int nb_job
|
|||||||
const float *window_lut = s->window_func_lut;
|
const float *window_lut = s->window_func_lut;
|
||||||
const float f = sqrtf(1.f - s->overlap);
|
const float f = sqrtf(1.f - s->overlap);
|
||||||
const int channels = s->channels;
|
const int channels = s->channels;
|
||||||
const int start = (channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(channels, jobnr, nb_jobs);
|
||||||
const int end = (channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(channels, jobnr + 1, nb_jobs);
|
||||||
double values[VAR_VARS_NB];
|
double values[VAR_VARS_NB];
|
||||||
|
|
||||||
memcpy(values, arg, sizeof(values));
|
memcpy(values, arg, sizeof(values));
|
||||||
|
|||||||
@@ -156,8 +156,8 @@ static int fir_channel(AVFilterContext *ctx, AVFrame *out, int ch)
|
|||||||
static int fir_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
|
static int fir_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
|
||||||
{
|
{
|
||||||
AVFrame *out = arg;
|
AVFrame *out = arg;
|
||||||
const int start = (out->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(out->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (out->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(out->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int ch = start; ch < end; ch++)
|
for (int ch = start; ch < end; ch++)
|
||||||
fir_channel(ctx, out, ch);
|
fir_channel(ctx, out, ch);
|
||||||
|
|||||||
@@ -292,8 +292,8 @@ static int filter_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jo
|
|||||||
ThreadData *td = arg;
|
ThreadData *td = arg;
|
||||||
AVFrame *out = td->out;
|
AVFrame *out = td->out;
|
||||||
AVFrame *in = td->in;
|
AVFrame *in = td->in;
|
||||||
const int start = (in->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(in->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (in->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(in->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int ch = start; ch < end; ch++)
|
for (int ch = start; ch < end; ch++)
|
||||||
s->filter_channel(ctx, ch, in, out);
|
s->filter_channel(ctx, ch, in, out);
|
||||||
|
|||||||
@@ -687,8 +687,8 @@ static int filter_channels(AVFilterContext *ctx, void *arg,
|
|||||||
{
|
{
|
||||||
AudioNEqualizerContext *s = ctx->priv;
|
AudioNEqualizerContext *s = ctx->priv;
|
||||||
AVFrame *buf = arg;
|
AVFrame *buf = arg;
|
||||||
const int start = (buf->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(buf->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (buf->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(buf->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int i = 0; i < s->nb_filters; i++) {
|
for (int i = 0; i < s->nb_filters; i++) {
|
||||||
EqualizatorFilter *f = &s->filters[i];
|
EqualizatorFilter *f = &s->filters[i];
|
||||||
|
|||||||
@@ -532,8 +532,8 @@ static int psy_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs)
|
|||||||
{
|
{
|
||||||
AudioPsyClipContext *s = ctx->priv;
|
AudioPsyClipContext *s = ctx->priv;
|
||||||
AVFrame *out = arg;
|
AVFrame *out = arg;
|
||||||
const int start = (out->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(out->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (out->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(out->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int ch = start; ch < end; ch++)
|
for (int ch = start; ch < end; ch++)
|
||||||
psy_channel(ctx, s->in, out, ch);
|
psy_channel(ctx, s->in, out, ch);
|
||||||
|
|||||||
@@ -1411,8 +1411,8 @@ static int rnnoise_channels(AVFilterContext *ctx, void *arg, int jobnr, int nb_j
|
|||||||
ThreadData *td = arg;
|
ThreadData *td = arg;
|
||||||
AVFrame *in = td->in;
|
AVFrame *in = td->in;
|
||||||
AVFrame *out = td->out;
|
AVFrame *out = td->out;
|
||||||
const int start = (out->ch_layout.nb_channels * jobnr) / nb_jobs;
|
const int start = ff_slice_pos(out->ch_layout.nb_channels, jobnr, nb_jobs);
|
||||||
const int end = (out->ch_layout.nb_channels * (jobnr+1)) / nb_jobs;
|
const int end = ff_slice_pos(out->ch_layout.nb_channels, jobnr + 1, nb_jobs);
|
||||||
|
|
||||||
for (int ch = start; ch < end; ch++) {
|
for (int ch = start; ch < end; ch++) {
|
||||||
rnnoise_channel(s, &s->st[ch],
|
rnnoise_channel(s, &s->st[ch],
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user