summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/APIchanges3
-rw-r--r--libavcodec/twinvq.c6
-rw-r--r--libavresample/audio_mix.c10
-rw-r--r--libavresample/audio_mix.h2
-rw-r--r--libavresample/audio_mix_matrix.c10
-rw-r--r--libavresample/avresample.h2
-rw-r--r--libavresample/options.c4
-rw-r--r--libavresample/version.h2
-rw-r--r--libavutil/arm/intreadwrite.h16
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;
}