diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-05-02 21:12:34 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-05-02 21:12:34 +0200 |
commit | 2330eb147412b96bef148b120e5a3897c9c87858 (patch) | |
tree | f53aa47a22318e11b2b2cc39784798a9cd3aa9cf | |
parent | 2cda0429aa764d157569d7534777c58dac8a4962 (diff) | |
parent | ababec7b95d84e911ecda6056e8b8c90287a6e7a (diff) | |
download | ffmpeg-2330eb147412b96bef148b120e5a3897c9c87858.tar.gz |
Merge remote-tracking branch 'qatar/master'
* qatar/master:
arm: intreadwrite: disable inline asm for gcc 4.7 and later
arm: intreadwrite: fix inline asm constraints for gcc 4.6 and later
indeo3: fix motion vector validation
pcm_bluray: set bits_per_raw_sample for > 16-bit
twinvq: fix out of bounds array access
lavr: use 8.8 instead of 10.6 as the 16-bit fixed-point mixing coeff type
Conflicts:
doc/APIchanges
libavcodec/indeo3.c
libavcodec/pcm-mpeg.c
Merged-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | doc/APIchanges | 3 | ||||
-rw-r--r-- | libavcodec/twinvq.c | 6 | ||||
-rw-r--r-- | libavresample/audio_mix.c | 10 | ||||
-rw-r--r-- | libavresample/audio_mix.h | 2 | ||||
-rw-r--r-- | libavresample/audio_mix_matrix.c | 10 | ||||
-rw-r--r-- | libavresample/avresample.h | 2 | ||||
-rw-r--r-- | libavresample/options.c | 4 | ||||
-rw-r--r-- | libavresample/version.h | 2 | ||||
-rw-r--r-- | libavutil/arm/intreadwrite.h | 16 |
9 files changed, 34 insertions, 21 deletions
diff --git a/doc/APIchanges b/doc/APIchanges index 1151a51356..eb70449844 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -24,6 +24,9 @@ API changes, most recent first: 2012-03-26 - a67d9cf - lavfi 2.66.100 Add avfilter_fill_frame_from_{audio_,}buffer_ref() functions. +2012-xx-xx - xxxxxxx - lavr 0.0.1 + Change AV_MIX_COEFF_TYPE_Q6 to AV_MIX_COEFF_TYPE_Q8. + 2012-04-25 - 3527a73 - lavu 51.29.0 - cpu.h Add av_parse_cpu_flags() diff --git a/libavcodec/twinvq.c b/libavcodec/twinvq.c index 88f29d8726..d1ee695bce 100644 --- a/libavcodec/twinvq.c +++ b/libavcodec/twinvq.c @@ -1000,14 +1000,16 @@ static av_cold void construct_perm_table(TwinContext *tctx,enum FrameType ftype) { int block_size; const ModeTab *mtab = tctx->mtab; - int size = tctx->avctx->channels*mtab->fmode[ftype].sub; + int size; int16_t *tmp_perm = (int16_t *) tctx->tmp_buf; if (ftype == FT_PPC) { size = tctx->avctx->channels; block_size = mtab->ppc_shape_len; - } else + } else { + size = tctx->avctx->channels * mtab->fmode[ftype].sub; block_size = mtab->size / mtab->fmode[ftype].sub; + } permutate_in_line(tmp_perm, tctx->n_div[ftype], size, block_size, tctx->length[ftype], diff --git a/libavresample/audio_mix.c b/libavresample/audio_mix.c index 34252bf68d..76f10eaab2 100644 --- a/libavresample/audio_mix.c +++ b/libavresample/audio_mix.c @@ -27,7 +27,7 @@ #include "audio_data.h" #include "audio_mix.h" -static const char *coeff_type_names[] = { "q6", "q15", "flt" }; +static const char *coeff_type_names[] = { "q8", "q15", "flt" }; void ff_audio_mix_set_func(AudioMix *am, enum AVSampleFormat fmt, enum AVMixCoeffType coeff_type, int in_channels, @@ -89,7 +89,7 @@ static void MIX_FUNC_NAME(fmt, cfmt)(stype **samples, ctype **matrix, \ MIX_FUNC_GENERIC(FLTP, FLT, float, float, float, sum) MIX_FUNC_GENERIC(S16P, FLT, int16_t, float, float, av_clip_int16(lrintf(sum))) MIX_FUNC_GENERIC(S16P, Q15, int16_t, int32_t, int64_t, av_clip_int16(sum >> 15)) -MIX_FUNC_GENERIC(S16P, Q6, int16_t, int16_t, int32_t, av_clip_int16(sum >> 6)) +MIX_FUNC_GENERIC(S16P, Q8, int16_t, int16_t, int32_t, av_clip_int16(sum >> 8)) /* TODO: templatize the channel-specific C functions */ @@ -221,8 +221,8 @@ static int mix_function_init(AudioMix *am) ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_Q15, 0, 0, 1, 1, "C", MIX_FUNC_NAME(S16P, Q15)); - ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_Q6, - 0, 0, 1, 1, "C", MIX_FUNC_NAME(S16P, Q6)); + ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_Q8, + 0, 0, 1, 1, "C", MIX_FUNC_NAME(S16P, Q8)); /* channel-specific C versions */ @@ -320,7 +320,7 @@ void ff_audio_mix_close(AudioMix *am) av_free(am->matrix[0]); am->matrix = NULL; } - memset(am->matrix_q6, 0, sizeof(am->matrix_q6 )); + memset(am->matrix_q8, 0, sizeof(am->matrix_q8 )); memset(am->matrix_q15, 0, sizeof(am->matrix_q15)); memset(am->matrix_flt, 0, sizeof(am->matrix_flt)); } diff --git a/libavresample/audio_mix.h b/libavresample/audio_mix.h index ffa1b23842..61db33047d 100644 --- a/libavresample/audio_mix.h +++ b/libavresample/audio_mix.h @@ -47,7 +47,7 @@ typedef struct AudioMix { mix_func *mix; mix_func *mix_generic; - int16_t *matrix_q6[AVRESAMPLE_MAX_CHANNELS]; + int16_t *matrix_q8[AVRESAMPLE_MAX_CHANNELS]; int32_t *matrix_q15[AVRESAMPLE_MAX_CHANNELS]; float *matrix_flt[AVRESAMPLE_MAX_CHANNELS]; void **matrix; diff --git a/libavresample/audio_mix_matrix.c b/libavresample/audio_mix_matrix.c index 96c49ef26f..6135b02422 100644 --- a/libavresample/audio_mix_matrix.c +++ b/libavresample/audio_mix_matrix.c @@ -257,14 +257,14 @@ int avresample_get_matrix(AVAudioResampleContext *avr, double *matrix, } switch (avr->mix_coeff_type) { - case AV_MIX_COEFF_TYPE_Q6: - if (!avr->am->matrix_q6[0]) { + case AV_MIX_COEFF_TYPE_Q8: + if (!avr->am->matrix_q8[0]) { av_log(avr, AV_LOG_ERROR, "matrix is not set\n"); return AVERROR(EINVAL); } for (o = 0; o < out_channels; o++) for (i = 0; i < in_channels; i++) - matrix[o * stride + i] = avr->am->matrix_q6[o][i] / 64.0; + matrix[o * stride + i] = avr->am->matrix_q8[o][i] / 256.0; break; case AV_MIX_COEFF_TYPE_Q15: if (!avr->am->matrix_q15[0]) { @@ -325,8 +325,8 @@ int avresample_set_matrix(AVAudioResampleContext *avr, const double *matrix, avr->am->matrix = (void **)avr->am->matrix_## type; switch (avr->mix_coeff_type) { - case AV_MIX_COEFF_TYPE_Q6: - CONVERT_MATRIX(q6, av_clip_int16(lrint(64.0 * v))) + case AV_MIX_COEFF_TYPE_Q8: + CONVERT_MATRIX(q8, av_clip_int16(lrint(256.0 * v))) break; case AV_MIX_COEFF_TYPE_Q15: CONVERT_MATRIX(q15, av_clipl_int32(llrint(32768.0 * v))) diff --git a/libavresample/avresample.h b/libavresample/avresample.h index 41688ed555..7350805e41 100644 --- a/libavresample/avresample.h +++ b/libavresample/avresample.h @@ -39,7 +39,7 @@ typedef struct AVAudioResampleContext AVAudioResampleContext; /** Mixing Coefficient Types */ enum AVMixCoeffType { - AV_MIX_COEFF_TYPE_Q6, /** 16-bit 10.6 fixed-point */ + AV_MIX_COEFF_TYPE_Q8, /** 16-bit 8.8 fixed-point */ AV_MIX_COEFF_TYPE_Q15, /** 32-bit 17.15 fixed-point */ AV_MIX_COEFF_TYPE_FLT, /** floating-point */ AV_MIX_COEFF_TYPE_NB, /** Number of coeff types. Not part of ABI */ diff --git a/libavresample/options.c b/libavresample/options.c index 0be1a26117..5430c4ddf2 100644 --- a/libavresample/options.c +++ b/libavresample/options.c @@ -40,8 +40,8 @@ static const AVOption options[] = { { "out_sample_fmt", "Output Sample Format", OFFSET(out_sample_fmt), AV_OPT_TYPE_INT, { AV_SAMPLE_FMT_S16 }, AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_NB-1, PARAM }, { "out_sample_rate", "Output Sample Rate", OFFSET(out_sample_rate), AV_OPT_TYPE_INT, { 48000 }, 1, INT_MAX, PARAM }, { "internal_sample_fmt", "Internal Sample Format", OFFSET(internal_sample_fmt), AV_OPT_TYPE_INT, { AV_SAMPLE_FMT_FLTP }, AV_SAMPLE_FMT_NONE, AV_SAMPLE_FMT_NB-1, PARAM }, - { "mix_coeff_type", "Mixing Coefficient Type", OFFSET(mix_coeff_type), AV_OPT_TYPE_INT, { AV_MIX_COEFF_TYPE_FLT }, AV_MIX_COEFF_TYPE_Q6, AV_MIX_COEFF_TYPE_NB-1, PARAM, "mix_coeff_type" }, - { "q6", "16-bit 10.6 Fixed-Point", 0, AV_OPT_TYPE_CONST, { AV_MIX_COEFF_TYPE_Q6 }, INT_MIN, INT_MAX, PARAM, "mix_coeff_type" }, + { "mix_coeff_type", "Mixing Coefficient Type", OFFSET(mix_coeff_type), AV_OPT_TYPE_INT, { AV_MIX_COEFF_TYPE_FLT }, AV_MIX_COEFF_TYPE_Q8, AV_MIX_COEFF_TYPE_NB-1, PARAM, "mix_coeff_type" }, + { "q8", "16-bit 8.8 Fixed-Point", 0, AV_OPT_TYPE_CONST, { AV_MIX_COEFF_TYPE_Q8 }, INT_MIN, INT_MAX, PARAM, "mix_coeff_type" }, { "q15", "32-bit 17.15 Fixed-Point", 0, AV_OPT_TYPE_CONST, { AV_MIX_COEFF_TYPE_Q15 }, INT_MIN, INT_MAX, PARAM, "mix_coeff_type" }, { "flt", "Floating-Point", 0, AV_OPT_TYPE_CONST, { AV_MIX_COEFF_TYPE_FLT }, INT_MIN, INT_MAX, PARAM, "mix_coeff_type" }, { "center_mix_level", "Center Mix Level", OFFSET(center_mix_level), AV_OPT_TYPE_DOUBLE, { M_SQRT1_2 }, -32.0, 32.0, PARAM }, diff --git a/libavresample/version.h b/libavresample/version.h index 4113edc21d..47504c9380 100644 --- a/libavresample/version.h +++ b/libavresample/version.h @@ -21,7 +21,7 @@ #define LIBAVRESAMPLE_VERSION_MAJOR 0 #define LIBAVRESAMPLE_VERSION_MINOR 0 -#define LIBAVRESAMPLE_VERSION_MICRO 0 +#define LIBAVRESAMPLE_VERSION_MICRO 1 #define LIBAVRESAMPLE_VERSION_INT AV_VERSION_INT(LIBAVRESAMPLE_VERSION_MAJOR, \ LIBAVRESAMPLE_VERSION_MINOR, \ diff --git a/libavutil/arm/intreadwrite.h b/libavutil/arm/intreadwrite.h index 0292aabafd..4a19a0cc22 100644 --- a/libavutil/arm/intreadwrite.h +++ b/libavutil/arm/intreadwrite.h @@ -21,14 +21,20 @@ #include <stdint.h> #include "config.h" +#include "libavutil/attributes.h" -#if HAVE_FAST_UNALIGNED && HAVE_INLINE_ASM +#if HAVE_FAST_UNALIGNED && HAVE_INLINE_ASM && !AV_GCC_VERSION_AT_LEAST(4,7) #define AV_RN16 AV_RN16 static av_always_inline unsigned AV_RN16(const void *p) { + const uint8_t *q = p; unsigned v; - __asm__ ("ldrh %0, %1" : "=r"(v) : "m"(*(const uint16_t *)p)); +#ifdef __thumb__ + __asm__ ("ldrh %0, %1" : "=r"(v) : "m"(q[0]), "m"(q[1])); +#else + __asm__ ("ldrh %0, %1" : "=r"(v) : "Uq"(q[0]), "m"(q[1])); +#endif return v; } @@ -41,8 +47,9 @@ static av_always_inline void AV_WN16(void *p, uint16_t v) #define AV_RN32 AV_RN32 static av_always_inline uint32_t AV_RN32(const void *p) { + const struct __attribute__((packed)) { uint32_t v; } *q = p; uint32_t v; - __asm__ ("ldr %0, %1" : "=r"(v) : "m"(*(const uint32_t *)p)); + __asm__ ("ldr %0, %1" : "=r"(v) : "m"(*q)); return v; } @@ -55,11 +62,12 @@ static av_always_inline void AV_WN32(void *p, uint32_t v) #define AV_RN64 AV_RN64 static av_always_inline uint64_t AV_RN64(const void *p) { + const struct __attribute__((packed)) { uint32_t v; } *q = p; uint64_t v; __asm__ ("ldr %Q0, %1 \n\t" "ldr %R0, %2 \n\t" : "=&r"(v) - : "m"(*(const uint32_t*)p), "m"(*((const uint32_t*)p+1))); + : "m"(q[0]), "m"(q[1])); return v; } |