You've already forked FFmpeg
							
							
				mirror of
				https://github.com/FFmpeg/FFmpeg.git
				synced 2025-10-30 23:18:11 +02:00 
			
		
		
		
	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>
This commit is contained in:
		| @@ -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() | ||||
|  | ||||
|   | ||||
| @@ -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], | ||||
|   | ||||
| @@ -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)); | ||||
| } | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
| @@ -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))) | ||||
|   | ||||
| @@ -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      */ | ||||
|   | ||||
| @@ -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 }, | ||||
|   | ||||
| @@ -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, \ | ||||
|   | ||||
| @@ -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; | ||||
| } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user