00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "libavutil/attributes.h"
00022 #include "libavutil/samplefmt.h"
00023 #include "flacdsp.h"
00024 #include "config.h"
00025
00026 #define SAMPLE_SIZE 16
00027 #define PLANAR 0
00028 #include "flacdsp_template.c"
00029 #include "flacdsp_lpc_template.c"
00030
00031 #undef PLANAR
00032 #define PLANAR 1
00033 #include "flacdsp_template.c"
00034
00035 #undef SAMPLE_SIZE
00036 #undef PLANAR
00037 #define SAMPLE_SIZE 32
00038 #define PLANAR 0
00039 #include "flacdsp_template.c"
00040 #include "flacdsp_lpc_template.c"
00041
00042 #undef PLANAR
00043 #define PLANAR 1
00044 #include "flacdsp_template.c"
00045
00046 static void flac_lpc_16_c(int32_t *decoded, const int coeffs[32],
00047 int pred_order, int qlevel, int len)
00048 {
00049 int i, j;
00050
00051 for (i = pred_order; i < len - 1; i += 2, decoded += 2) {
00052 int c = coeffs[0];
00053 int d = decoded[0];
00054 int s0 = 0, s1 = 0;
00055 for (j = 1; j < pred_order; j++) {
00056 s0 += c*d;
00057 d = decoded[j];
00058 s1 += c*d;
00059 c = coeffs[j];
00060 }
00061 s0 += c*d;
00062 d = decoded[j] += s0 >> qlevel;
00063 s1 += c*d;
00064 decoded[j + 1] += s1 >> qlevel;
00065 }
00066 if (i < len) {
00067 int sum = 0;
00068 for (j = 0; j < pred_order; j++)
00069 sum += coeffs[j] * decoded[j];
00070 decoded[j] += sum >> qlevel;
00071 }
00072 }
00073
00074 static void flac_lpc_32_c(int32_t *decoded, const int coeffs[32],
00075 int pred_order, int qlevel, int len)
00076 {
00077 int i, j;
00078
00079 for (i = pred_order; i < len; i++, decoded++) {
00080 int64_t sum = 0;
00081 for (j = 0; j < pred_order; j++)
00082 sum += (int64_t)coeffs[j] * decoded[j];
00083 decoded[j] += sum >> qlevel;
00084 }
00085
00086 }
00087
00088 av_cold void ff_flacdsp_init(FLACDSPContext *c, enum AVSampleFormat fmt,
00089 int bps)
00090 {
00091 if (bps > 16) {
00092 c->lpc = flac_lpc_32_c;
00093 c->lpc_encode = flac_lpc_encode_c_32;
00094 } else {
00095 c->lpc = flac_lpc_16_c;
00096 c->lpc_encode = flac_lpc_encode_c_16;
00097 }
00098
00099 switch (fmt) {
00100 case AV_SAMPLE_FMT_S32:
00101 c->decorrelate[0] = flac_decorrelate_indep_c_32;
00102 c->decorrelate[1] = flac_decorrelate_ls_c_32;
00103 c->decorrelate[2] = flac_decorrelate_rs_c_32;
00104 c->decorrelate[3] = flac_decorrelate_ms_c_32;
00105 break;
00106
00107 case AV_SAMPLE_FMT_S32P:
00108 c->decorrelate[0] = flac_decorrelate_indep_c_32p;
00109 c->decorrelate[1] = flac_decorrelate_ls_c_32p;
00110 c->decorrelate[2] = flac_decorrelate_rs_c_32p;
00111 c->decorrelate[3] = flac_decorrelate_ms_c_32p;
00112 break;
00113
00114 case AV_SAMPLE_FMT_S16:
00115 c->decorrelate[0] = flac_decorrelate_indep_c_16;
00116 c->decorrelate[1] = flac_decorrelate_ls_c_16;
00117 c->decorrelate[2] = flac_decorrelate_rs_c_16;
00118 c->decorrelate[3] = flac_decorrelate_ms_c_16;
00119 break;
00120
00121 case AV_SAMPLE_FMT_S16P:
00122 c->decorrelate[0] = flac_decorrelate_indep_c_16p;
00123 c->decorrelate[1] = flac_decorrelate_ls_c_16p;
00124 c->decorrelate[2] = flac_decorrelate_rs_c_16p;
00125 c->decorrelate[3] = flac_decorrelate_ms_c_16p;
00126 break;
00127 }
00128
00129 if (ARCH_ARM)
00130 ff_flacdsp_init_arm(c, fmt, bps);
00131 }