History

avcodec/pixblockdsp: Improve 8 vs 16 bit check

Before this commit, the input in get_pixels and get_pixels_unaligned has been treated inconsistenly: - The generic code treated 9, 10, 12 and 14 bits as 16bit input (these bits correspond to what FFmpeg's dsputils supported), everything with <= 8 bits as 8 bit and everything else as 8 bit when used via AVDCT (which exposes these functions and purports to support up to 14 bits). - AARCH64, ARM, PPC and RISC-V, x86 ignore this AVDCT special case. - RISC-V also ignored the restriction to 9, 10, 12 and 14 for its 16bit check and treated everything > 8 bits as 16bit. - The mmi MIPS code treats everything as 8 bit when used via AVDCT (this is certainly broken); otherwise it checks for <= 8 bits. The msa MIPS code behaves like the generic code. This commit changes this to treat 9..16 bits as 16 bit input, everything else as 8 bit (the former because it makes sense, the latter to preserve the behaviour for external users*). *: The only internal user of AVDCT (the spp filter) always uses 8, 9 or 10 bits.

Andreas Rheinhardt committed 1 year ago

Commit 20ddada1 parent 61a70e88 files · +22 −52Browse files

Unified · Split

8 files
  1. libavcodec/aarch64/pixblockdsp_init_aarch64.c +0 −2
  2. libavcodec/arm/pixblockdsp_init_arm.c +0 −2
  3. libavcodec/mips/pixblockdsp_init_mips.c +3 −17
  4. libavcodec/pixblockdsp.c +13 −20
  5. libavcodec/pixblockdsp.h +6 −6
  6. libavcodec/ppc/pixblockdsp.c +0 −2
  7. libavcodec/riscv/pixblockdsp_init.c +0 −2
  8. libavcodec/x86/pixblockdsp_init.c +0 −1
libavcodec/aarch64/pixblockdsp_init_aarch64.c+0−2
@@ -21,7 +21,6 @@ · 20 unmodified lines
21#include "libavutil/attributes.h"21#include "libavutil/attributes.h"
22#include "libavutil/cpu.h"22#include "libavutil/cpu.h"
23#include "libavutil/aarch64/cpu.h"23#include "libavutil/aarch64/cpu.h"
24#include "libavcodec/avcodec.h"
25#include "libavcodec/pixblockdsp.h"24#include "libavcodec/pixblockdsp.h"
26 25
27void ff_get_pixels_neon(int16_t *block, const uint8_t *pixels,26void ff_get_pixels_neon(int16_t *block, const uint8_t *pixels,
@@ -30,7 +29,6 @@ void ff_diff_pixels_neon(int16_t *block, const uint8_t *s1, · 2 unmodified lines
30 const uint8_t *s2, ptrdiff_t stride);29 const uint8_t *s2, ptrdiff_t stride);
31 30
32av_cold void ff_pixblockdsp_init_aarch64(PixblockDSPContext *c,31av_cold void ff_pixblockdsp_init_aarch64(PixblockDSPContext *c,
33 AVCodecContext *avctx,
34 unsigned high_bit_depth)32 unsigned high_bit_depth)
35{33{
36 int cpu_flags = av_get_cpu_flags();34 int cpu_flags = av_get_cpu_flags();
libavcodec/arm/pixblockdsp_init_arm.c+0−2
@@ -21,7 +21,6 @@ · 20 unmodified lines
21#include "libavutil/attributes.h"21#include "libavutil/attributes.h"
22#include "libavutil/cpu.h"22#include "libavutil/cpu.h"
23#include "libavutil/arm/cpu.h"23#include "libavutil/arm/cpu.h"
24#include "libavcodec/avcodec.h"
25#include "libavcodec/pixblockdsp.h"24#include "libavcodec/pixblockdsp.h"
26 25
27void ff_get_pixels_armv6(int16_t *block, const uint8_t *pixels,26void ff_get_pixels_armv6(int16_t *block, const uint8_t *pixels,
@@ -39,7 +38,6 @@ void ff_diff_pixels_unaligned_neon(int16_t *block, const uint8_t *s1, · 11 unmodified lines
39 const uint8_t *s2, ptrdiff_t stride);38 const uint8_t *s2, ptrdiff_t stride);
40 39
41av_cold void ff_pixblockdsp_init_arm(PixblockDSPContext *c,40av_cold void ff_pixblockdsp_init_arm(PixblockDSPContext *c,
42 AVCodecContext *avctx,
43 unsigned high_bit_depth)41 unsigned high_bit_depth)
44{42{
45 int cpu_flags = av_get_cpu_flags();43 int cpu_flags = av_get_cpu_flags();
libavcodec/mips/pixblockdsp_init_mips.c+3−17
@@ -23,7 +23,7 @@ · 22 unmodified lines
23#include "libavcodec/pixblockdsp.h"23#include "libavcodec/pixblockdsp.h"
24#include "pixblockdsp_mips.h"24#include "pixblockdsp_mips.h"
25 25
26void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx,26void ff_pixblockdsp_init_mips(PixblockDSPContext *c,
27 unsigned high_bit_depth)27 unsigned high_bit_depth)
28{28{
29 int cpu_flags = av_get_cpu_flags();29 int cpu_flags = av_get_cpu_flags();
@@ -31,27 +31,13 @@ void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx, · 1 unmodified line
31 if (have_mmi(cpu_flags)) {31 if (have_mmi(cpu_flags)) {
32 c->diff_pixels = ff_diff_pixels_mmi;32 c->diff_pixels = ff_diff_pixels_mmi;
33 33
34 if (!high_bit_depth || avctx->codec_type != AVMEDIA_TYPE_VIDEO) {34 if (!high_bit_depth)
35 c->get_pixels = ff_get_pixels_8_mmi;35 c->get_pixels = ff_get_pixels_8_mmi;
36 }
37 }36 }
38 37
39 if (have_msa(cpu_flags)) {38 if (have_msa(cpu_flags)) {
40 c->diff_pixels = ff_diff_pixels_msa;39 c->diff_pixels = ff_diff_pixels_msa;
41 40
42 switch (avctx->bits_per_raw_sample) {41 c->get_pixels = high_bit_depth ? ff_get_pixels_16_msa : ff_get_pixels_8_msa;
43 case 9:
44 case 10:
45 case 12:
46 case 14:
47 c->get_pixels = ff_get_pixels_16_msa;
48 break;
49 default:
50 if (avctx->bits_per_raw_sample <= 8 || avctx->codec_type !=
51 AVMEDIA_TYPE_VIDEO) {
52 c->get_pixels = ff_get_pixels_8_msa;
53 }
54 break;
55 }
56 }42 }
57}43}
libavcodec/pixblockdsp.c+13−20
@@ -87,38 +87,31 @@ static void diff_pixels_c(int16_t *restrict block, const uint8_t *s1, · 86 unmodified lines
87 87
88av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx)88av_cold void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx)
89{89{
90 av_unused const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8;90 const unsigned high_bit_depth = avctx->bits_per_raw_sample > 8 &&
91 avctx->bits_per_raw_sample <= 16;
91 92
92 c->diff_pixels_unaligned =93 c->diff_pixels_unaligned =
93 c->diff_pixels = diff_pixels_c;94 c->diff_pixels = diff_pixels_c;
94 95
95 switch (avctx->bits_per_raw_sample) {96 if (high_bit_depth) {
96 case 9:
97 case 10:
98 case 12:
99 case 14:
100 c->get_pixels_unaligned = get_pixels_unaligned_16_c;97 c->get_pixels_unaligned = get_pixels_unaligned_16_c;
101 c->get_pixels = get_pixels_16_c;98 c->get_pixels = get_pixels_16_c;
102 break;99 } else {
103 default:100 c->get_pixels_unaligned =
104 if (avctx->bits_per_raw_sample<=8 || avctx->codec_type != AVMEDIA_TYPE_VIDEO) {101 c->get_pixels = get_pixels_8_c;
105 c->get_pixels_unaligned =
106 c->get_pixels = get_pixels_8_c;
107 }
108 break;
109 }102 }
110 103
111#if ARCH_AARCH64104#if ARCH_AARCH64
112 ff_pixblockdsp_init_aarch64(c, avctx, high_bit_depth);105 ff_pixblockdsp_init_aarch64(c, high_bit_depth);
113#elif ARCH_ARM106#elif ARCH_ARM
114 ff_pixblockdsp_init_arm(c, avctx, high_bit_depth);107 ff_pixblockdsp_init_arm(c, high_bit_depth);
115#elif ARCH_PPC108#elif ARCH_PPC
116 ff_pixblockdsp_init_ppc(c, avctx, high_bit_depth);109 ff_pixblockdsp_init_ppc(c, high_bit_depth);
117#elif ARCH_RISCV110#elif ARCH_RISCV
118 ff_pixblockdsp_init_riscv(c, avctx, high_bit_depth);111 ff_pixblockdsp_init_riscv(c, high_bit_depth);
119#elif ARCH_X86112#elif ARCH_X86
120 ff_pixblockdsp_init_x86(c, avctx, high_bit_depth);113 ff_pixblockdsp_init_x86(c, high_bit_depth);
121#elif ARCH_MIPS114#elif ARCH_MIPS
122 ff_pixblockdsp_init_mips(c, avctx, high_bit_depth);115 ff_pixblockdsp_init_mips(c, high_bit_depth);
123#endif116#endif
124}117}
libavcodec/pixblockdsp.h+6−6
@@ -42,17 +42,17 @@ typedef struct PixblockDSPContext { · 41 unmodified lines
42} PixblockDSPContext;42} PixblockDSPContext;
43 43
44void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx);44void ff_pixblockdsp_init(PixblockDSPContext *c, AVCodecContext *avctx);
45void ff_pixblockdsp_init_aarch64(PixblockDSPContext *c, AVCodecContext *avctx,45void ff_pixblockdsp_init_aarch64(PixblockDSPContext *c,
46 unsigned high_bit_depth);46 unsigned high_bit_depth);
47void ff_pixblockdsp_init_arm(PixblockDSPContext *c, AVCodecContext *avctx,47void ff_pixblockdsp_init_arm(PixblockDSPContext *c,
48 unsigned high_bit_depth);48 unsigned high_bit_depth);
49void ff_pixblockdsp_init_ppc(PixblockDSPContext *c, AVCodecContext *avctx,49void ff_pixblockdsp_init_ppc(PixblockDSPContext *c,
50 unsigned high_bit_depth);50 unsigned high_bit_depth);
51void ff_pixblockdsp_init_riscv(PixblockDSPContext *c, AVCodecContext *avctx,51void ff_pixblockdsp_init_riscv(PixblockDSPContext *c,
52 unsigned high_bit_depth);52 unsigned high_bit_depth);
53void ff_pixblockdsp_init_x86(PixblockDSPContext *c, AVCodecContext *avctx,53void ff_pixblockdsp_init_x86(PixblockDSPContext *c,
54 unsigned high_bit_depth);54 unsigned high_bit_depth);
55void ff_pixblockdsp_init_mips(PixblockDSPContext *c, AVCodecContext *avctx,55void ff_pixblockdsp_init_mips(PixblockDSPContext *c,
56 unsigned high_bit_depth);56 unsigned high_bit_depth);
57 57
58#endif /* AVCODEC_PIXBLOCKDSP_H */58#endif /* AVCODEC_PIXBLOCKDSP_H */
libavcodec/ppc/pixblockdsp.c+0−2
@@ -27,7 +27,6 @@ · 26 unmodified lines
27#include "libavutil/ppc/cpu.h"27#include "libavutil/ppc/cpu.h"
28#include "libavutil/ppc/util_altivec.h"28#include "libavutil/ppc/util_altivec.h"
29 29
30#include "libavcodec/avcodec.h"
31#include "libavcodec/pixblockdsp.h"30#include "libavcodec/pixblockdsp.h"
32 31
33#if HAVE_ALTIVEC32#if HAVE_ALTIVEC
@@ -263,7 +262,6 @@ static void diff_pixels_vsx(int16_t *restrict block, const uint8_t *s1, · 229 unmodified lines
263#endif /* HAVE_VSX */262#endif /* HAVE_VSX */
264 263
265av_cold void ff_pixblockdsp_init_ppc(PixblockDSPContext *c,264av_cold void ff_pixblockdsp_init_ppc(PixblockDSPContext *c,
266 AVCodecContext *avctx,
267 unsigned high_bit_depth)265 unsigned high_bit_depth)
268{266{
269#if HAVE_ALTIVEC267#if HAVE_ALTIVEC
libavcodec/riscv/pixblockdsp_init.c+0−2
@@ -24,7 +24,6 @@ · 23 unmodified lines
24#include "libavutil/attributes.h"24#include "libavutil/attributes.h"
25#include "libavutil/cpu.h"25#include "libavutil/cpu.h"
26#include "libavutil/riscv/cpu.h"26#include "libavutil/riscv/cpu.h"
27#include "libavcodec/avcodec.h"
28#include "libavcodec/pixblockdsp.h"27#include "libavcodec/pixblockdsp.h"
29 28
30void ff_get_pixels_8_rvi(int16_t *block, const uint8_t *pixels,29void ff_get_pixels_8_rvi(int16_t *block, const uint8_t *pixels,
@@ -42,7 +41,6 @@ void ff_diff_pixels_unaligned_rvv(int16_t *block, const uint8_t *s1, · 11 unmodified lines
42 const uint8_t *s2, ptrdiff_t stride);41 const uint8_t *s2, ptrdiff_t stride);
43 42
44av_cold void ff_pixblockdsp_init_riscv(PixblockDSPContext *c,43av_cold void ff_pixblockdsp_init_riscv(PixblockDSPContext *c,
45 AVCodecContext *avctx,
46 unsigned high_bit_depth)44 unsigned high_bit_depth)
47{45{
48#if HAVE_RV46#if HAVE_RV
libavcodec/x86/pixblockdsp_init.c+0−1
@@ -28,7 +28,6 @@ void ff_diff_pixels_sse2(int16_t *block, const uint8_t *s1, const uint8_t *s2, · 27 unmodified lines
28 ptrdiff_t stride);28 ptrdiff_t stride);
29 29
30av_cold void ff_pixblockdsp_init_x86(PixblockDSPContext *c,30av_cold void ff_pixblockdsp_init_x86(PixblockDSPContext *c,
31 AVCodecContext *avctx,
32 unsigned high_bit_depth)31 unsigned high_bit_depth)
33{32{
34 int cpu_flags = av_get_cpu_flags();33 int cpu_flags = av_get_cpu_flags();

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t