You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-04 22:03:09 +02:00
swresample/rematrix: Use correct function pointer types for calls
Calling a function via a different function pointer type is undefined behavior (C11, 6.3.2.3 8); two pointer parameters of different type are not equivalent in this regard, although it happens to work in practice; the current code relies on this. This patch brings the code in line with the spec. This fixes the following FATE-tests when run with Clang-UBSan: ac3-fixed-encode-2 audiomatch-afconvert-{16000,44100}-mono-he-{adts,m4a} audiomatch-dolby-44100-mono-he-mp4 filter-metadata-avf-aphase-meter-mono filter-pan-{downmix1,downmix2,mono2,stereo2,stereo3,stereo4,upmix1,upmix2} lavf-dv_{pal,ntsc} matroska-encoding-delay The error was something like src/libswresample/rematrix.c:621:17: runtime error: call to function sum2_float through pointer to incorrect function type 'void (*)(void *, const void *, const void *, void *, int, int, int) Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
This commit is contained in:
@ -494,13 +494,13 @@ av_cold int swri_rematrix_init(SwrContext *s){
|
|||||||
}
|
}
|
||||||
*((int*)s->native_one) = 32768;
|
*((int*)s->native_one) = 32768;
|
||||||
if (maxsum <= 32768) {
|
if (maxsum <= 32768) {
|
||||||
s->mix_1_1_f = (mix_1_1_func_type*)copy_s16;
|
s->mix_1_1_f = copy_s16;
|
||||||
s->mix_2_1_f = (mix_2_1_func_type*)sum2_s16;
|
s->mix_2_1_f = sum2_s16;
|
||||||
s->mix_any_f = (mix_any_func_type*)get_mix_any_func_s16(s);
|
s->mix_any_f = get_mix_any_func_s16(s);
|
||||||
} else {
|
} else {
|
||||||
s->mix_1_1_f = (mix_1_1_func_type*)copy_clip_s16;
|
s->mix_1_1_f = copy_clip_s16;
|
||||||
s->mix_2_1_f = (mix_2_1_func_type*)sum2_clip_s16;
|
s->mix_2_1_f = sum2_clip_s16;
|
||||||
s->mix_any_f = (mix_any_func_type*)get_mix_any_func_clip_s16(s);
|
s->mix_any_f = get_mix_any_func_clip_s16(s);
|
||||||
}
|
}
|
||||||
}else if(s->midbuf.fmt == AV_SAMPLE_FMT_FLTP){
|
}else if(s->midbuf.fmt == AV_SAMPLE_FMT_FLTP){
|
||||||
s->native_matrix = av_calloc(nb_in * nb_out, sizeof(float));
|
s->native_matrix = av_calloc(nb_in * nb_out, sizeof(float));
|
||||||
@ -511,9 +511,9 @@ av_cold int swri_rematrix_init(SwrContext *s){
|
|||||||
for (j = 0; j < nb_in; j++)
|
for (j = 0; j < nb_in; j++)
|
||||||
((float*)s->native_matrix)[i * nb_in + j] = s->matrix[i][j];
|
((float*)s->native_matrix)[i * nb_in + j] = s->matrix[i][j];
|
||||||
*((float*)s->native_one) = 1.0;
|
*((float*)s->native_one) = 1.0;
|
||||||
s->mix_1_1_f = (mix_1_1_func_type*)copy_float;
|
s->mix_1_1_f = copy_float;
|
||||||
s->mix_2_1_f = (mix_2_1_func_type*)sum2_float;
|
s->mix_2_1_f = sum2_float;
|
||||||
s->mix_any_f = (mix_any_func_type*)get_mix_any_func_float(s);
|
s->mix_any_f = get_mix_any_func_float(s);
|
||||||
}else if(s->midbuf.fmt == AV_SAMPLE_FMT_DBLP){
|
}else if(s->midbuf.fmt == AV_SAMPLE_FMT_DBLP){
|
||||||
s->native_matrix = av_calloc(nb_in * nb_out, sizeof(double));
|
s->native_matrix = av_calloc(nb_in * nb_out, sizeof(double));
|
||||||
s->native_one = av_mallocz(sizeof(double));
|
s->native_one = av_mallocz(sizeof(double));
|
||||||
@ -523,9 +523,9 @@ av_cold int swri_rematrix_init(SwrContext *s){
|
|||||||
for (j = 0; j < nb_in; j++)
|
for (j = 0; j < nb_in; j++)
|
||||||
((double*)s->native_matrix)[i * nb_in + j] = s->matrix[i][j];
|
((double*)s->native_matrix)[i * nb_in + j] = s->matrix[i][j];
|
||||||
*((double*)s->native_one) = 1.0;
|
*((double*)s->native_one) = 1.0;
|
||||||
s->mix_1_1_f = (mix_1_1_func_type*)copy_double;
|
s->mix_1_1_f = copy_double;
|
||||||
s->mix_2_1_f = (mix_2_1_func_type*)sum2_double;
|
s->mix_2_1_f = sum2_double;
|
||||||
s->mix_any_f = (mix_any_func_type*)get_mix_any_func_double(s);
|
s->mix_any_f = get_mix_any_func_double(s);
|
||||||
}else if(s->midbuf.fmt == AV_SAMPLE_FMT_S32P){
|
}else if(s->midbuf.fmt == AV_SAMPLE_FMT_S32P){
|
||||||
s->native_one = av_mallocz(sizeof(int));
|
s->native_one = av_mallocz(sizeof(int));
|
||||||
if (!s->native_one)
|
if (!s->native_one)
|
||||||
@ -545,9 +545,9 @@ av_cold int swri_rematrix_init(SwrContext *s){
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
*((int*)s->native_one) = 32768;
|
*((int*)s->native_one) = 32768;
|
||||||
s->mix_1_1_f = (mix_1_1_func_type*)copy_s32;
|
s->mix_1_1_f = copy_s32;
|
||||||
s->mix_2_1_f = (mix_2_1_func_type*)sum2_s32;
|
s->mix_2_1_f = sum2_s32;
|
||||||
s->mix_any_f = (mix_any_func_type*)get_mix_any_func_s32(s);
|
s->mix_any_f = get_mix_any_func_s32(s);
|
||||||
}else
|
}else
|
||||||
av_assert0(0);
|
av_assert0(0);
|
||||||
//FIXME quantize for integeres
|
//FIXME quantize for integeres
|
||||||
|
@ -49,9 +49,12 @@
|
|||||||
# define RENAME(x) x ## _s32
|
# define RENAME(x) x ## _s32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void (RENAME(mix_any_func_type))(SAMPLE **out, const SAMPLE **in1, COEFF *coeffp, integer len);
|
static void RENAME(sum2)(void *out_, const void *in1_, const void *in2_,
|
||||||
|
void *coeffp_, integer index1, integer index2, integer len)
|
||||||
static void RENAME(sum2)(SAMPLE *out, const SAMPLE *in1, const SAMPLE *in2, COEFF *coeffp, integer index1, integer index2, integer len){
|
{
|
||||||
|
const SAMPLE *in1 = in1_, *in2 = in2_;
|
||||||
|
const COEFF *coeffp = coeffp_;
|
||||||
|
SAMPLE *out = out_;
|
||||||
int i;
|
int i;
|
||||||
INTER coeff1 = coeffp[index1];
|
INTER coeff1 = coeffp[index1];
|
||||||
INTER coeff2 = coeffp[index2];
|
INTER coeff2 = coeffp[index2];
|
||||||
@ -60,14 +63,22 @@ static void RENAME(sum2)(SAMPLE *out, const SAMPLE *in1, const SAMPLE *in2, COEF
|
|||||||
out[i] = R(coeff1*in1[i] + coeff2*in2[i]);
|
out[i] = R(coeff1*in1[i] + coeff2*in2[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RENAME(copy)(SAMPLE *out, const SAMPLE *in, COEFF *coeffp, integer index, integer len){
|
static void RENAME(copy)(void *out_, const void *in_, void *coeffp_, integer index, integer len)
|
||||||
|
{
|
||||||
|
const COEFF *coeffp = coeffp_;
|
||||||
|
const SAMPLE *in = in_;
|
||||||
|
SAMPLE *out = out_;
|
||||||
int i;
|
int i;
|
||||||
INTER coeff = coeffp[index];
|
INTER coeff = coeffp[index];
|
||||||
for(i=0; i<len; i++)
|
for(i=0; i<len; i++)
|
||||||
out[i] = R(coeff*in[i]);
|
out[i] = R(coeff*in[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RENAME(mix6to2)(SAMPLE **out, const SAMPLE **in, COEFF *coeffp, integer len){
|
static void RENAME(mix6to2)(uint8_t **out_, const uint8_t **in_, void *coeffp_, integer len)
|
||||||
|
{
|
||||||
|
const SAMPLE *const *const in = (const SAMPLE *const *)in_;
|
||||||
|
SAMPLE *const *const out = (SAMPLE *const*)out_;
|
||||||
|
const COEFF *coeffp = coeffp_;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0; i<len; i++) {
|
for(i=0; i<len; i++) {
|
||||||
@ -77,7 +88,11 @@ static void RENAME(mix6to2)(SAMPLE **out, const SAMPLE **in, COEFF *coeffp, inte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void RENAME(mix8to2)(SAMPLE **out, const SAMPLE **in, COEFF *coeffp, integer len){
|
static void RENAME(mix8to2)(uint8_t **out_, const uint8_t **in_, void *coeffp_, integer len)
|
||||||
|
{
|
||||||
|
const SAMPLE *const *const in = (const SAMPLE *const *)in_;
|
||||||
|
SAMPLE *const *const out = (SAMPLE *const*)out_;
|
||||||
|
const COEFF *coeffp = coeffp_;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for(i=0; i<len; i++) {
|
for(i=0; i<len; i++) {
|
||||||
@ -87,7 +102,8 @@ static void RENAME(mix8to2)(SAMPLE **out, const SAMPLE **in, COEFF *coeffp, inte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static RENAME(mix_any_func_type) *RENAME(get_mix_any_func)(SwrContext *s){
|
static mix_any_func_type *RENAME(get_mix_any_func)(SwrContext *s)
|
||||||
|
{
|
||||||
if ( !av_channel_layout_compare(&s->out_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)
|
if ( !av_channel_layout_compare(&s->out_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)
|
||||||
&& ( !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1)
|
&& ( !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1)
|
||||||
|| !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1_BACK))
|
|| !av_channel_layout_compare(&s->in_ch_layout, &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1_BACK))
|
||||||
|
Reference in New Issue
Block a user