summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2016-01-14 22:14:14 +0100
committerWolfgang Wiedmeyer <wolfgit@wiedmeyer.de>2016-01-14 22:14:14 +0100
commit998f3a696f0d671832624637c771e3bda3e0c9f5 (patch)
tree67c89508c2eaad57389ffac29d673a09bc8bfaba
parent1c47b26b1ae695c355e4ec0c317716a397588206 (diff)
parent8ad656861c764ea4f8bf8539cb568b01edbf647d (diff)
downloadframeworks_av-998f3a696f0d671832624637c771e3bda3e0c9f5.zip
frameworks_av-998f3a696f0d671832624637c771e3bda3e0c9f5.tar.gz
frameworks_av-998f3a696f0d671832624637c771e3bda3e0c9f5.tar.bz2
Merge branch 'cm-13.0' of https://github.com/CyanogenMod/android_frameworks_av into replicant-6.0replicant-6.0-alpha-0001
-rw-r--r--drm/drmserver/DrmManagerService.cpp3
-rw-r--r--include/media/stagefright/MPEG4Writer.h3
-rw-r--r--include/media/stagefright/MetaData.h4
-rw-r--r--media/libavextensions/stagefright/AVExtensions.h70
-rw-r--r--media/libavextensions/stagefright/AVUtils.cpp152
-rw-r--r--media/libeffects/factory/EffectsFactory.c4
-rw-r--r--media/libmedia/AudioRecord.cpp3
-rw-r--r--media/libmediaplayerservice/StagefrightRecorder.cpp15
-rw-r--r--media/libmediaplayerservice/StagefrightRecorder.h4
-rw-r--r--media/libstagefright/ACodec.cpp37
-rw-r--r--media/libstagefright/Android.mk1
-rw-r--r--media/libstagefright/CameraSource.cpp4
-rw-r--r--media/libstagefright/MPEG4Writer.cpp15
-rw-r--r--media/libstagefright/MediaCodecSource.cpp5
-rw-r--r--media/libstagefright/codecs/aacenc/Android.mk52
-rw-r--r--media/libstagefright/codecs/amrwbenc/Android.mk85
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/acelp.h406
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/basic_op.h652
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/bits.h34
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/cod_main.h28
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/dtx.h4
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/log2.h18
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/main.h4
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/math_op.h40
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/mem_align.h6
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/p_med_o.h40
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/q_pulse.h42
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/stream.h18
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/wb_vad.h38
-rw-r--r--media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h4
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s5
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s2
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/autocorr.c182
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/az_isp.c334
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/bits.c322
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/c2t64fx.c442
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/c4t64fx.c1876
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/convolve.c146
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/cor_h_x.c166
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/decim54.c164
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/deemph.c156
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/dtx.c964
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/g_pitch.c72
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/gpclip.c94
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/homing.c20
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/hp400.c86
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/hp50.c86
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/hp6k.c88
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/hp_wsp.c170
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/int_lpc.c50
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/isp_az.c356
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/isp_isf.c94
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/lag_wind.c30
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/levinson.c286
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/log2.c64
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/lp_dec2.c60
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/math_op.c167
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/mem_align.c84
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/oper_32b.c66
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/p_med_ol.c384
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/pit_shrp.c34
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/pitch_f4.c448
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/pred_lt4.c144
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/preemph.c113
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/q_gain2.c544
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/q_pulse.c668
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/qisf_ns.c104
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c852
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/random.c6
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/residu.c64
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/scale.c50
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/stream.c42
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/syn_filt.c240
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/updt_tar.c35
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/util.c48
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c3354
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/voicefac.c88
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/wb_vad.c1156
-rw-r--r--media/libstagefright/codecs/amrwbenc/src/weight_a.c30
-rw-r--r--media/libstagefright/codecs/common/Config.mk24
-rw-r--r--media/libstagefright/codecs/mp3dec/Android.mk13
-rw-r--r--media/libstagefright/codecs/on2/h264dec/Android.mk16
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Average_4x_Align_unsafe_s.S6
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingChroma_unsafe_s.S4
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingLuma_unsafe_s.S4
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DecodeCoeffsToPair_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Align_unsafe_s.S4
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Copy_unsafe_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_DiagCopy_unsafe_s.S4
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagHorVer4x4_unsafe_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagVerHor4x4_unsafe_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfHor4x4_unsafe_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfVer4x4_unsafe_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Interpolate_Chroma_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_TransformResidual4x4_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_UnpackBlock4x4_s.S11
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DeblockLuma_I.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DequantTransformResidualFromPairAndAdd_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_HorEdge_I_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_VerEdge_I_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_HorEdge_I_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_VerEdge_I_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_InterpolateLuma_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntraChroma_8x8_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_16x16_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_4x4_s.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantChromaDCFromPair_s.S11
-rw-r--r--media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantLumaDCFromPair_s.S4
-rw-r--r--media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/asm_common.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdClearMbLayer.S14
-rw-r--r--media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdCountLeadingZeros.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFillRow7.S40
-rw-r--r--media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFlushBits.S2
-rw-r--r--media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdWriteMacroblock.S161
-rw-r--r--media/mtp/MtpUtils.cpp38
-rw-r--r--media/utils/BatteryNotifier.cpp3
-rw-r--r--services/audiopolicy/service/AudioPolicyEffects.cpp4
-rw-r--r--services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp16
-rw-r--r--services/camera/libcameraservice/api1/Camera2Client.cpp2
139 files changed, 8734 insertions, 8554 deletions
diff --git a/drm/drmserver/DrmManagerService.cpp b/drm/drmserver/DrmManagerService.cpp
index 857d73e..df08f32 100644
--- a/drm/drmserver/DrmManagerService.cpp
+++ b/drm/drmserver/DrmManagerService.cpp
@@ -93,6 +93,9 @@ bool DrmManagerService::isProtectedCallAllowed(drm_perm_t perm) {
return selinuxIsProtectedCallAllowed(spid, perm);
}
}
+ if (checkCallingPermission(String16("com.oma.drm.permission.ACCESS_OMA_DRM")) == true) {
+ return true;
+ }
return false;
}
diff --git a/include/media/stagefright/MPEG4Writer.h b/include/media/stagefright/MPEG4Writer.h
index 055c079..aeaad8f 100644
--- a/include/media/stagefright/MPEG4Writer.h
+++ b/include/media/stagefright/MPEG4Writer.h
@@ -186,6 +186,9 @@ private:
// To use 3gp4 box for clips with AMR audio
bool mIsAudioAMR;
+ // HFR scale
+ uint32_t mHFRRatio;
+
void lock();
void unlock();
diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h
index 0dd5995..2a3df22 100644
--- a/include/media/stagefright/MetaData.h
+++ b/include/media/stagefright/MetaData.h
@@ -205,6 +205,10 @@ enum {
kKeyPCMFormat = 'pfmt',
kKeyArbitraryMode = 'ArbM',
+
+ // Indicate if it is OK to hold on to the MediaBuffer and not
+ // release it immediately
+ kKeyCanDeferRelease = 'drel', // bool (int32_t)
};
enum {
diff --git a/media/libavextensions/stagefright/AVExtensions.h b/media/libavextensions/stagefright/AVExtensions.h
index f14d217..b0e4bb5 100644
--- a/media/libavextensions/stagefright/AVExtensions.h
+++ b/media/libavextensions/stagefright/AVExtensions.h
@@ -36,10 +36,10 @@
#include <media/mediarecorder.h>
#include <media/IOMX.h>
#include <media/AudioParameter.h>
+#include <media/stagefright/MetaData.h>
namespace android {
-class MetaData;
class MediaExtractor;
class MPEG4Writer;
struct ABuffer;
@@ -153,15 +153,21 @@ struct AVUtils {
uint64_t /*eAacProfile*/);
virtual void extractCustomCameraKeys(
- const CameraParameters& /*params*/, sp<MetaData> &/*meta*/) {}
+ const CameraParameters& /*params*/, sp<MetaData> &/*meta*/);
virtual void printFileName(int /*fd*/) {}
virtual void addDecodingTimesFromBatch(MediaBuffer * /*buf*/,
List<int64_t> &/*decodeTimeQueue*/) {}
virtual bool useQCHWEncoder(const sp<AMessage> &, AString &) { return false; }
- virtual bool canDeferRelease(const sp<MetaData> &/*meta*/) { return false; }
- virtual void setDeferRelease(sp<MetaData> &/*meta*/) {}
+ virtual bool canDeferRelease(const sp<MetaData> &meta) {
+ int32_t deferRelease = false;
+ return meta->findInt32(kKeyCanDeferRelease, &deferRelease) && deferRelease;
+ }
+
+ virtual void setDeferRelease(sp<MetaData> &meta) {
+ meta->setInt32(kKeyCanDeferRelease, true);
+ }
struct HEVCMuxer {
@@ -226,12 +232,66 @@ struct AVUtils {
int nPFrames, int nBFrames, const sp<IOMX> OMXhandle,
IOMX::node_id nodeID);
+ /*
+ * This class is a placeholder for the set of methods used
+ * to enable HFR (High Frame Rate) Recording
+ *
+ * HFR is a slow-motion recording feature where framerate
+ * is increased at capture, but file is composed to play
+ * back at normal rate, giving a net result of slow-motion.
+ * If HFR factor = N
+ * framerate (at capture and encoder) = N * actual value
+ * bitrate = N * actual value
+ * (as the encoder still gets actual timestamps)
+ * timeStamps (at composition) = actual value
+ * timeScale (at composition) = actual value / N
+ * (when parser re-generates timestamps, they will be
+ * up-scaled by factor N, which results in slow-motion)
+ *
+ * HSR is a high-framerate recording variant where timestamps
+ * are not meddled with, yielding a video mux'ed at captured
+ * fps
+ */
+ struct HFR {
+ // set kKeyHFR when 'video-hfr' paramater is enabled
+ // or set kKeyHSR when 'video-hsr' paramater is enabled
+ virtual void setHFRIfEnabled(
+ const CameraParameters& params, sp<MetaData> &meta);
+
+ // recalculate file-duration when HFR is enabled
+ virtual status_t initializeHFR(
+ const sp<MetaData> &meta, sp<AMessage> &format,
+ int64_t &maxFileDurationUs, video_encoder videoEncoder);
+
+ virtual void setHFRRatio(
+ sp<MetaData> &meta, const int32_t hfrRatio);
+
+ virtual int32_t getHFRRatio(
+ const sp<MetaData> &meta);
+
+ protected:
+ HFR() {};
+ virtual ~HFR() {};
+ friend struct AVUtils;
+
+ private:
+ // Query supported capabilities from target-specific profiles
+ virtual int32_t getHFRCapabilities(
+ video_encoder codec,
+ int& maxHFRWidth, int& maxHFRHeight, int& maxHFRFps,
+ int& maxBitrate);
+ };
+ virtual inline HFR& HFRUtils() {
+ return mHFR;
+ }
+
private:
HEVCMuxer mHEVCMuxer;
+ HFR mHFR;
// ----- NO TRESSPASSING BEYOND THIS LINE ------
DECLARE_LOADABLE_SINGLETON(AVUtils);
-};
+};
}
#endif // _AV_EXTENSIONS__H_
diff --git a/media/libavextensions/stagefright/AVUtils.cpp b/media/libavextensions/stagefright/AVUtils.cpp
index 35ae36b..bdf5eb6 100644
--- a/media/libavextensions/stagefright/AVUtils.cpp
+++ b/media/libavextensions/stagefright/AVUtils.cpp
@@ -41,6 +41,7 @@
#include <media/stagefright/MediaCodec.h>
#include <media/stagefright/MPEG4Writer.h>
#include <media/stagefright/Utils.h>
+#include <media/MediaProfiles.h>
#if defined(QCOM_HARDWARE) || defined(FLAC_OFFLOAD_ENABLED)
#include "QCMediaDefs.h"
@@ -974,6 +975,157 @@ void AVUtils::setIntraPeriod(
return;
}
+#ifdef QCOM_HARDWARE
+void AVUtils::HFR::setHFRIfEnabled(
+ const CameraParameters& params,
+ sp<MetaData> &meta) {
+ const char *hfrParam = params.get("video-hfr");
+ int32_t hfr = -1;
+ if (hfrParam != NULL) {
+ hfr = atoi(hfrParam);
+ if (hfr > 0) {
+ ALOGI("Enabling HFR @ %d fps", hfr);
+ meta->setInt32(kKeyHFR, hfr);
+ return;
+ } else {
+ ALOGI("Invalid HFR rate specified : %d", hfr);
+ }
+ }
+
+ const char *hsrParam = params.get("video-hsr");
+ int32_t hsr = -1;
+ if (hsrParam != NULL ) {
+ hsr = atoi(hsrParam);
+ if (hsr > 0) {
+ ALOGI("Enabling HSR @ %d fps", hsr);
+ meta->setInt32(kKeyHSR, hsr);
+ } else {
+ ALOGI("Invalid HSR rate specified : %d", hfr);
+ }
+ }
+}
+
+status_t AVUtils::HFR::initializeHFR(
+ const sp<MetaData> &meta, sp<AMessage> &format,
+ int64_t & /*maxFileDurationUs*/, video_encoder videoEncoder) {
+ status_t retVal = OK;
+
+ int32_t hsr = 0;
+ if (meta->findInt32(kKeyHSR, &hsr) && hsr > 0) {
+ ALOGI("HSR cue found. Override encode fps to %d", hsr);
+ format->setInt32("frame-rate", hsr);
+ return retVal;
+ }
+
+ int32_t hfr = 0;
+ if (!meta->findInt32(kKeyHFR, &hfr) || (hfr <= 0)) {
+ ALOGW("Invalid HFR rate specified");
+ return retVal;
+ }
+
+ int32_t width = 0, height = 0;
+ CHECK(meta->findInt32(kKeyWidth, &width));
+ CHECK(meta->findInt32(kKeyHeight, &height));
+
+ int maxW, maxH, MaxFrameRate, maxBitRate = 0;
+ if (getHFRCapabilities(videoEncoder,
+ maxW, maxH, MaxFrameRate, maxBitRate) < 0) {
+ ALOGE("Failed to query HFR target capabilities");
+ return ERROR_UNSUPPORTED;
+ }
+
+ if ((width * height * hfr) > (maxW * maxH * MaxFrameRate)) {
+ ALOGE("HFR request [%d x %d @%d fps] exceeds "
+ "[%d x %d @%d fps]. Will stay disabled",
+ width, height, hfr, maxW, maxH, MaxFrameRate);
+ return ERROR_UNSUPPORTED;
+ }
+
+ int32_t frameRate = 0, bitRate = 0;
+ CHECK(meta->findInt32(kKeyFrameRate, &frameRate));
+ CHECK(format->findInt32("bitrate", &bitRate));
+
+ if (frameRate) {
+ // scale the bitrate proportional to the hfr ratio
+ // to maintain quality, but cap it to max-supported.
+ bitRate = (hfr * bitRate) / frameRate;
+ bitRate = bitRate > maxBitRate ? maxBitRate : bitRate;
+ format->setInt32("bitrate", bitRate);
+
+ int32_t hfrRatio = hfr / frameRate;
+ format->setInt32("frame-rate", hfr);
+ format->setInt32("hfr-ratio", hfrRatio);
+ } else {
+ ALOGE("HFR: Invalid framerate");
+ return BAD_VALUE;
+ }
+
+ return retVal;
+}
+
+void AVUtils::HFR::setHFRRatio(
+ sp<MetaData> &meta, const int32_t hfrRatio) {
+ if (hfrRatio > 0) {
+ meta->setInt32(kKeyHFR, hfrRatio);
+ }
+}
+
+int32_t AVUtils::HFR::getHFRRatio(
+ const sp<MetaData> &meta) {
+ int32_t hfrRatio = 0;
+ meta->findInt32(kKeyHFR, &hfrRatio);
+ return hfrRatio ? hfrRatio : 1;
+}
+
+int32_t AVUtils::HFR::getHFRCapabilities(
+ video_encoder codec,
+ int& maxHFRWidth, int& maxHFRHeight, int& maxHFRFps,
+ int& maxBitRate) {
+ maxHFRWidth = maxHFRHeight = maxHFRFps = maxBitRate = 0;
+ MediaProfiles *profiles = MediaProfiles::getInstance();
+
+ if (profiles) {
+ maxHFRWidth = profiles->getVideoEncoderParamByName("enc.vid.hfr.width.max", codec);
+ maxHFRHeight = profiles->getVideoEncoderParamByName("enc.vid.hfr.height.max", codec);
+ maxHFRFps = profiles->getVideoEncoderParamByName("enc.vid.hfr.mode.max", codec);
+ maxBitRate = profiles->getVideoEncoderParamByName("enc.vid.bps.max", codec);
+ }
+
+ return (maxHFRWidth > 0) && (maxHFRHeight > 0) &&
+ (maxHFRFps > 0) && (maxBitRate > 0) ? 1 : -1;
+}
+#else
+void AVUtils::HFR::setHFRIfEnabled(
+ const CameraParameters& /*params*/,
+ sp<MetaData> & /*meta*/) {}
+
+status_t AVUtils::HFR::initializeHFR(
+ const sp<MetaData> & /*meta*/, sp<AMessage> & /*format*/,
+ int64_t & /*maxFileDurationUs*/, video_encoder /*videoEncoder*/) {
+ return OK;
+}
+
+void AVUtils::HFR::setHFRRatio(
+ sp<MetaData> & /*meta*/, const int32_t /*hfrRatio*/) {}
+
+int32_t AVUtils::HFR::getHFRRatio(
+ const sp<MetaData> & /*meta */) {
+ return 1;
+}
+
+int32_t AVUtils::HFR::getHFRCapabilities(
+ video_encoder /*codec*/,
+ int& /*maxHFRWidth*/, int& /*maxHFRHeight*/, int& /*maxHFRFps*/,
+ int& /*maxBitRate*/) {
+ return -1;
+}
+#endif
+
+void AVUtils::extractCustomCameraKeys(
+ const CameraParameters& params, sp<MetaData> &meta) {
+ mHFR.setHFRIfEnabled(params, meta);
+}
+
// ----- NO TRESSPASSING BEYOND THIS LINE ------
AVUtils::AVUtils() {}
diff --git a/media/libeffects/factory/EffectsFactory.c b/media/libeffects/factory/EffectsFactory.c
index db7865a..c0a1c57 100644
--- a/media/libeffects/factory/EffectsFactory.c
+++ b/media/libeffects/factory/EffectsFactory.c
@@ -456,7 +456,9 @@ int init() {
if (ignoreFxConfFiles) {
ALOGI("Audio effects in configuration files will be ignored");
} else {
- if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE, R_OK) == 0) {
+ if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE2, R_OK) == 0) {
+ loadEffectConfigFile(AUDIO_EFFECT_VENDOR_CONFIG_FILE2);
+ } else if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE, R_OK) == 0) {
loadEffectConfigFile(AUDIO_EFFECT_VENDOR_CONFIG_FILE);
} else if (access(AUDIO_EFFECT_DEFAULT_CONFIG_FILE, R_OK) == 0) {
loadEffectConfigFile(AUDIO_EFFECT_DEFAULT_CONFIG_FILE);
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp
index 66903b3..40f6c44 100644
--- a/media/libmedia/AudioRecord.cpp
+++ b/media/libmedia/AudioRecord.cpp
@@ -276,7 +276,8 @@ status_t AudioRecord::set(
mActive = false;
mUserData = user;
// TODO: add audio hardware input latency here
- if (mTransfer == TRANSFER_CALLBACK) {
+ if (mTransfer == TRANSFER_CALLBACK ||
+ mTransfer == TRANSFER_SYNC) {
mLatency = (1000*mNotificationFramesAct) / sampleRate;
} else {
mLatency = (1000*mFrameCount) / sampleRate;
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index 6baca4d..c4c5741 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -1622,12 +1622,14 @@ status_t StagefrightRecorder::setupVideoEncoder(
}
}
- setupCustomVideoEncoderParams(cameraSource, format);
-
format->setInt32("bitrate", mVideoBitRate);
format->setInt32("frame-rate", mFrameRate);
format->setInt32("i-frame-interval", mIFramesIntervalSec);
+ if (cameraSource != NULL) {
+ setupCustomVideoEncoderParams(cameraSource, format);
+ }
+
if (mVideoTimeScale > 0) {
format->setInt32("time-scale", mVideoTimeScale);
}
@@ -2094,4 +2096,13 @@ status_t StagefrightRecorder::setSourcePause(bool pause) {
}
return err;
}
+
+void StagefrightRecorder::setupCustomVideoEncoderParams(sp<MediaSource> cameraSource,
+ sp<AMessage> &format) {
+
+ // Setup HFR if needed
+ AVUtils::get()->HFRUtils().initializeHFR(cameraSource->getFormat(), format,
+ mMaxFileDurationUs, mVideoEncoder);
+}
+
} // namespace android
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index 72dc77b..d93fc3b 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -154,8 +154,8 @@ protected:
status_t setupCameraSource(sp<CameraSource> *cameraSource);
status_t setupAudioEncoder(const sp<MediaWriter>& writer);
virtual status_t setupVideoEncoder(sp<MediaSource> cameraSource, sp<MediaSource> *source);
- virtual void setupCustomVideoEncoderParams(sp<MediaSource> /*cameraSource*/,
- sp<AMessage> &/*format*/) {}
+ virtual void setupCustomVideoEncoderParams(sp<MediaSource> cameraSource,
+ sp<AMessage> &format);
virtual bool setCustomVideoEncoderMime(const video_encoder videoEncoder, sp<AMessage> format);
// Encoding parameter handling utilities
diff --git a/media/libstagefright/ACodec.cpp b/media/libstagefright/ACodec.cpp
index 4286d3c..ad4676f 100644
--- a/media/libstagefright/ACodec.cpp
+++ b/media/libstagefright/ACodec.cpp
@@ -6654,8 +6654,34 @@ bool ACodec::OutputPortSettingsChangedState::onMessageReceived(
bool handled = false;
switch (msg->what()) {
- case kWhatFlush:
case kWhatShutdown:
+ {
+ int32_t keepComponentAllocated;
+ CHECK(msg->findInt32(
+ "keepComponentAllocated", &keepComponentAllocated));
+
+ mCodec->mShutdownInProgress = true;
+ mCodec->mExplicitShutdown = true;
+ mCodec->mKeepComponentAllocated = keepComponentAllocated;
+
+ status_t err = mCodec->mOMX->sendCommand(
+ mCodec->mNode, OMX_CommandStateSet, OMX_StateIdle);
+ if (err != OK) {
+ if (keepComponentAllocated) {
+ mCodec->signalError(OMX_ErrorUndefined, FAILED_TRANSACTION);
+ }
+ // TODO: do some recovery here.
+ } else {
+ // This is technically not correct, but appears to be
+ // the only way to free the component instance using
+ // ExectingToIdleState.
+ mCodec->changeState(mCodec->mExecutingToIdleState);
+ }
+
+ handled = true;
+ break;
+ }
+ case kWhatFlush:
case kWhatResume:
case kWhatSetParameters:
{
@@ -6722,15 +6748,6 @@ bool ACodec::OutputPortSettingsChangedState::onOMXEvent(
if (err != OK) {
mCodec->signalError(OMX_ErrorUndefined, makeNoSideEffectStatus(err));
-
- // This is technically not correct, but appears to be
- // the only way to free the component instance.
- // Controlled transitioning from excecuting->idle
- // and idle->loaded seem impossible probably because
- // the output port never finishes re-enabling.
- mCodec->mShutdownInProgress = true;
- mCodec->mKeepComponentAllocated = false;
- mCodec->changeState(mCodec->mLoadedState);
}
return true;
diff --git a/media/libstagefright/Android.mk b/media/libstagefright/Android.mk
index 86fc66b..29fb418 100644
--- a/media/libstagefright/Android.mk
+++ b/media/libstagefright/Android.mk
@@ -1,7 +1,6 @@
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
-include frameworks/av/media/libstagefright/codecs/common/Config.mk
LOCAL_SRC_FILES:= \
ACodec.cpp \
diff --git a/media/libstagefright/CameraSource.cpp b/media/libstagefright/CameraSource.cpp
index 10269b8..4ee878a 100644
--- a/media/libstagefright/CameraSource.cpp
+++ b/media/libstagefright/CameraSource.cpp
@@ -145,6 +145,10 @@ static int32_t getColorFormat(const char* colorFormat) {
return OMX_COLOR_FormatAndroidOpaque;
}
+ if (!strcmp(colorFormat, "YVU420SemiPlanar")) {
+ return OMX_QCOM_COLOR_FormatYVU420SemiPlanar;
+ }
+
ALOGE("Uknown color format (%s), please add it to "
"CameraSource::getColorFormat", colorFormat);
diff --git a/media/libstagefright/MPEG4Writer.cpp b/media/libstagefright/MPEG4Writer.cpp
index 7f7ddf7..2f1b6ac 100644
--- a/media/libstagefright/MPEG4Writer.cpp
+++ b/media/libstagefright/MPEG4Writer.cpp
@@ -321,6 +321,7 @@ private:
// Simple validation on the codec specific data
status_t checkCodecSpecificData() const;
int32_t mRotation;
+ int32_t mHFRRatio;
void updateTrackSizeEstimate();
void addOneStscTableEntry(size_t chunkId, size_t sampleId);
@@ -390,7 +391,8 @@ MPEG4Writer::MPEG4Writer(int fd)
mStartTimeOffsetMs(-1),
mMetaKeys(new AMessage()),
mIsVideoHEVC(false),
- mIsAudioAMR(false) {
+ mIsAudioAMR(false),
+ mHFRRatio(1) {
addDeviceMeta();
// Verify mFd is seekable
@@ -532,6 +534,8 @@ status_t MPEG4Writer::addSource(const sp<MediaSource> &source) {
Track *track = new Track(this, source, 1 + mTracks.size());
mTracks.push_back(track);
+ mHFRRatio = AVUtils::get()->HFRUtils().getHFRRatio(source->getFormat());
+
return OK;
}
@@ -1029,7 +1033,7 @@ void MPEG4Writer::writeMvhdBox(int64_t durationUs) {
writeInt32(0); // version=0, flags=0
writeInt32(now); // creation time
writeInt32(now); // modification time
- writeInt32(mTimeScale); // mvhd timescale
+ writeInt32(mTimeScale / mHFRRatio); // mvhd timescale
int32_t duration = (durationUs * mTimeScale + 5E5) / 1E6;
writeInt32(duration);
writeInt32(0x10000); // rate: 1.0
@@ -1477,7 +1481,8 @@ MPEG4Writer::Track::Track(
mCodecSpecificDataSize(0),
mGotAllCodecSpecificData(false),
mReachedEOS(false),
- mRotation(0) {
+ mRotation(0),
+ mHFRRatio(1) {
getCodecSpecificDataFromInputFormatIfPossible();
const char *mime;
@@ -1882,6 +1887,8 @@ status_t MPEG4Writer::Track::start(MetaData *params) {
pthread_create(&mThread, &attr, ThreadWrapper, this);
pthread_attr_destroy(&attr);
+ mHFRRatio = AVUtils::get()->HFRUtils().getHFRRatio(mMeta);
+
return OK;
}
@@ -3069,7 +3076,7 @@ void MPEG4Writer::Track::writeMdhdBox(uint32_t now) {
mOwner->writeInt32(0); // version=0, flags=0
mOwner->writeInt32(now); // creation time
mOwner->writeInt32(now); // modification time
- mOwner->writeInt32(mTimeScale); // media timescale
+ mOwner->writeInt32(mTimeScale / mHFRRatio); // media timescale
int32_t mdhdDuration = (trakDurationUs * mTimeScale + 5E5) / 1E6;
mOwner->writeInt32(mdhdDuration); // use media timescale
// Language follows the three letter standard ISO-639-2/T
diff --git a/media/libstagefright/MediaCodecSource.cpp b/media/libstagefright/MediaCodecSource.cpp
index aef6715..adbde54 100644
--- a/media/libstagefright/MediaCodecSource.cpp
+++ b/media/libstagefright/MediaCodecSource.cpp
@@ -429,9 +429,14 @@ status_t MediaCodecSource::initEncoder() {
return err;
}
+ int32_t hfrRatio = 0;
+ mOutputFormat->findInt32("hfr-ratio", &hfrRatio);
+
mEncoder->getOutputFormat(&mOutputFormat);
convertMessageToMetaData(mOutputFormat, mMeta);
+ AVUtils::get()->HFRUtils().setHFRRatio(mMeta, hfrRatio);
+
if (mFlags & FLAG_USE_SURFACE_INPUT) {
CHECK(mIsVideo);
diff --git a/media/libstagefright/codecs/aacenc/Android.mk b/media/libstagefright/codecs/aacenc/Android.mk
index 58ec3ba..530f6a7 100644
--- a/media/libstagefright/codecs/aacenc/Android.mk
+++ b/media/libstagefright/codecs/aacenc/Android.mk
@@ -1,6 +1,5 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-include frameworks/av/media/libstagefright/codecs/common/Config.mk
AAC_LIBRARY = fraunhofer
@@ -35,24 +34,28 @@ LOCAL_SRC_FILES += \
src/transform.c \
src/memalign.c
-ifeq ($(VOTT), v5)
-LOCAL_SRC_FILES += \
- src/asm/ARMV5E/AutoCorrelation_v5.s \
- src/asm/ARMV5E/band_nrg_v5.s \
- src/asm/ARMV5E/CalcWindowEnergy_v5.s \
- src/asm/ARMV5E/PrePostMDCT_v5.s \
- src/asm/ARMV5E/R4R8First_v5.s \
- src/asm/ARMV5E/Radix4FFT_v5.s
-endif
-
-ifeq ($(VOTT), v7)
-LOCAL_SRC_FILES += \
- src/asm/ARMV5E/AutoCorrelation_v5.s \
- src/asm/ARMV5E/band_nrg_v5.s \
- src/asm/ARMV5E/CalcWindowEnergy_v5.s \
- src/asm/ARMV7/PrePostMDCT_v7.s \
- src/asm/ARMV7/R4R8First_v7.s \
- src/asm/ARMV7/Radix4FFT_v7.s
+ifneq ($(ARCH_ARM_HAVE_NEON),true)
+ LOCAL_SRC_FILES_arm := \
+ src/asm/ARMV5E/AutoCorrelation_v5.s \
+ src/asm/ARMV5E/band_nrg_v5.s \
+ src/asm/ARMV5E/CalcWindowEnergy_v5.s \
+ src/asm/ARMV5E/PrePostMDCT_v5.s \
+ src/asm/ARMV5E/R4R8First_v5.s \
+ src/asm/ARMV5E/Radix4FFT_v5.s
+
+ LOCAL_CFLAGS_arm := -DARMV5E -DARM_INASM -DARMV5_INASM
+ LOCAL_C_INCLUDES_arm := $(LOCAL_PATH)/src/asm/ARMV5E
+else
+ LOCAL_SRC_FILES_arm := \
+ src/asm/ARMV5E/AutoCorrelation_v5.s \
+ src/asm/ARMV5E/band_nrg_v5.s \
+ src/asm/ARMV5E/CalcWindowEnergy_v5.s \
+ src/asm/ARMV7/PrePostMDCT_v7.s \
+ src/asm/ARMV7/R4R8First_v7.s \
+ src/asm/ARMV7/Radix4FFT_v7.s
+ LOCAL_CFLAGS_arm := -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM -DARMV6_INASM
+ LOCAL_C_INCLUDES_arm := $(LOCAL_PATH)/src/asm/ARMV5E
+ LOCAL_C_INCLUDES_arm += $(LOCAL_PATH)/src/asm/ARMV7
endif
LOCAL_MODULE := libstagefright_aacenc
@@ -71,17 +74,6 @@ LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/inc \
$(LOCAL_PATH)/basic_op
-ifeq ($(VOTT), v5)
-LOCAL_CFLAGS += -DARMV5E -DARM_INASM -DARMV5_INASM
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
-endif
-
-ifeq ($(VOTT), v7)
-LOCAL_CFLAGS += -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM -DARMV6_INASM
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV7
-endif
-
LOCAL_CFLAGS += -Werror
include $(BUILD_STATIC_LIBRARY)
diff --git a/media/libstagefright/codecs/amrwbenc/Android.mk b/media/libstagefright/codecs/amrwbenc/Android.mk
index 024a292..8ded6df 100644
--- a/media/libstagefright/codecs/amrwbenc/Android.mk
+++ b/media/libstagefright/codecs/amrwbenc/Android.mk
@@ -1,8 +1,5 @@
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
-include frameworks/av/media/libstagefright/codecs/common/Config.mk
-
-
LOCAL_SRC_FILES := \
src/autocorr.c \
@@ -53,42 +50,41 @@ LOCAL_SRC_FILES := \
src/weight_a.c \
src/mem_align.c
-
-ifeq ($(VOTT), v5)
-LOCAL_SRC_FILES += \
- src/asm/ARMV5E/convolve_opt.s \
- src/asm/ARMV5E/cor_h_vec_opt.s \
- src/asm/ARMV5E/Deemph_32_opt.s \
- src/asm/ARMV5E/Dot_p_opt.s \
- src/asm/ARMV5E/Filt_6k_7k_opt.s \
- src/asm/ARMV5E/Norm_Corr_opt.s \
- src/asm/ARMV5E/pred_lt4_1_opt.s \
- src/asm/ARMV5E/residu_asm_opt.s \
- src/asm/ARMV5E/scale_sig_opt.s \
- src/asm/ARMV5E/Syn_filt_32_opt.s \
- src/asm/ARMV5E/syn_filt_opt.s
-
-endif
-
-ifeq ($(VOTT), v7)
-LOCAL_SRC_FILES += \
- src/asm/ARMV7/convolve_neon.s \
- src/asm/ARMV7/cor_h_vec_neon.s \
- src/asm/ARMV7/Deemph_32_neon.s \
- src/asm/ARMV7/Dot_p_neon.s \
- src/asm/ARMV7/Filt_6k_7k_neon.s \
- src/asm/ARMV7/Norm_Corr_neon.s \
- src/asm/ARMV7/pred_lt4_1_neon.s \
- src/asm/ARMV7/residu_asm_neon.s \
- src/asm/ARMV7/scale_sig_neon.s \
- src/asm/ARMV7/Syn_filt_32_neon.s \
- src/asm/ARMV7/syn_filt_neon.s
-
+ifneq ($(ARCH_ARM_HAVE_NEON),true)
+ LOCAL_SRC_FILES_arm := \
+ src/asm/ARMV5E/convolve_opt.s \
+ src/asm/ARMV5E/cor_h_vec_opt.s \
+ src/asm/ARMV5E/Deemph_32_opt.s \
+ src/asm/ARMV5E/Dot_p_opt.s \
+ src/asm/ARMV5E/Filt_6k_7k_opt.s \
+ src/asm/ARMV5E/Norm_Corr_opt.s \
+ src/asm/ARMV5E/pred_lt4_1_opt.s \
+ src/asm/ARMV5E/residu_asm_opt.s \
+ src/asm/ARMV5E/scale_sig_opt.s \
+ src/asm/ARMV5E/Syn_filt_32_opt.s \
+ src/asm/ARMV5E/syn_filt_opt.s
+
+ LOCAL_CFLAGS_arm := -DARM -DASM_OPT
+ LOCAL_C_INCLUDES_arm = $(LOCAL_PATH)/src/asm/ARMV5E
+else
+ LOCAL_SRC_FILES_arm := \
+ src/asm/ARMV7/convolve_neon.s \
+ src/asm/ARMV7/cor_h_vec_neon.s \
+ src/asm/ARMV7/Deemph_32_neon.s \
+ src/asm/ARMV7/Dot_p_neon.s \
+ src/asm/ARMV7/Filt_6k_7k_neon.s \
+ src/asm/ARMV7/Norm_Corr_neon.s \
+ src/asm/ARMV7/pred_lt4_1_neon.s \
+ src/asm/ARMV7/residu_asm_neon.s \
+ src/asm/ARMV7/scale_sig_neon.s \
+ src/asm/ARMV7/Syn_filt_32_neon.s \
+ src/asm/ARMV7/syn_filt_neon.s
+
+ LOCAL_CFLAGS_arm := -DARM -DARMV7 -DASM_OPT
+ LOCAL_C_INCLUDES_arm := $(LOCAL_PATH)/src/asm/ARMV5E
+ LOCAL_C_INCLUDES_arm += $(LOCAL_PATH)/src/asm/ARMV7
endif
-# ARMV5E/Filt_6k_7k_opt.s does not compile with Clang.
-LOCAL_CLANG_ASFLAGS_arm += -no-integrated-as
-
LOCAL_MODULE := libstagefright_amrwbenc
LOCAL_ARM_MODE := arm
@@ -104,18 +100,9 @@ LOCAL_C_INCLUDES := \
$(LOCAL_PATH)/src \
$(LOCAL_PATH)/inc
-ifeq ($(VOTT), v5)
-LOCAL_CFLAGS += -DARM -DASM_OPT
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
-endif
-
-ifeq ($(VOTT), v7)
-LOCAL_CFLAGS += -DARM -DARMV7 -DASM_OPT
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
-LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV7
-endif
-
LOCAL_CFLAGS += -Werror
+LOCAL_CLANG := true
+#LOCAL_SANITIZE := signed-integer-overflow
include $(BUILD_STATIC_LIBRARY)
@@ -132,6 +119,8 @@ LOCAL_C_INCLUDES := \
frameworks/native/include/media/openmax
LOCAL_CFLAGS += -Werror
+LOCAL_CLANG := true
+#LOCAL_SANITIZE := signed-integer-overflow
LOCAL_STATIC_LIBRARIES := \
libstagefright_amrwbenc
diff --git a/media/libstagefright/codecs/amrwbenc/inc/acelp.h b/media/libstagefright/codecs/amrwbenc/inc/acelp.h
index 5a1e536..97555d5 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/acelp.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/acelp.h
@@ -18,7 +18,7 @@
/*--------------------------------------------------------------------------*
* ACELP.H *
*--------------------------------------------------------------------------*
- * Function *
+ * Function *
*--------------------------------------------------------------------------*/
#ifndef __ACELP_H__
#define __ACELP_H__
@@ -33,68 +33,68 @@
Word16 median5(Word16 x[]);
void Autocorr(
- Word16 x[], /* (i) : Input signal */
- Word16 m, /* (i) : LPC order */
- Word16 r_h[], /* (o) : Autocorrelations (msb) */
- Word16 r_l[] /* (o) : Autocorrelations (lsb) */
- );
+ Word16 x[], /* (i) : Input signal */
+ Word16 m, /* (i) : LPC order */
+ Word16 r_h[], /* (o) : Autocorrelations (msb) */
+ Word16 r_l[] /* (o) : Autocorrelations (lsb) */
+ );
void Lag_window(
- Word16 r_h[], /* (i/o) : Autocorrelations (msb) */
- Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */
- );
+ Word16 r_h[], /* (i/o) : Autocorrelations (msb) */
+ Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */
+ );
void Init_Levinson(
- Word16 * mem /* output :static memory (18 words) */
- );
+ Word16 * mem /* output :static memory (18 words) */
+ );
void Levinson(
- Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */
- Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */
- Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */
- Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */
- Word16 * mem /* (i/o) :static memory (18 words) */
- );
+ Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */
+ Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */
+ Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */
+ Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */
+ Word16 * mem /* (i/o) :static memory (18 words) */
+ );
void Az_isp(
- Word16 a[], /* (i) Q12 : predictor coefficients */
- Word16 isp[], /* (o) Q15 : Immittance spectral pairs */
- Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */
- );
+ Word16 a[], /* (i) Q12 : predictor coefficients */
+ Word16 isp[], /* (o) Q15 : Immittance spectral pairs */
+ Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */
+ );
void Isp_Az(
- Word16 isp[], /* (i) Q15 : Immittance spectral pairs */
- Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */
- Word16 m,
- Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */
- /* 1 : adaptive scaling enabled */
- );
+ Word16 isp[], /* (i) Q15 : Immittance spectral pairs */
+ Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */
+ Word16 m,
+ Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */
+ /* 1 : adaptive scaling enabled */
+ );
void Isp_isf(
- Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */
- Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
- Word16 m /* (i) : LPC order */
- );
+ Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */
+ Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+ Word16 m /* (i) : LPC order */
+ );
void Isf_isp(
- Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
- Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */
- Word16 m /* (i) : LPC order */
- );
+ Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+ Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */
+ Word16 m /* (i) : LPC order */
+ );
void Int_isp(
- Word16 isp_old[], /* input : isps from past frame */
- Word16 isp_new[], /* input : isps from present frame */
- Word16 frac[], /* input : fraction for 3 first subfr (Q15) */
- Word16 Az[] /* output: LP coefficients in 4 subframes */
- );
+ Word16 isp_old[], /* input : isps from past frame */
+ Word16 isp_new[], /* input : isps from present frame */
+ Word16 frac[], /* input : fraction for 3 first subfr (Q15) */
+ Word16 Az[] /* output: LP coefficients in 4 subframes */
+ );
void Weight_a(
- Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */
- Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */
- Word16 gamma, /* (i) Q15 : Spectral expansion factor. */
- Word16 m /* (i) : LPC order. */
- );
+ Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */
+ Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */
+ Word16 gamma, /* (i) Q15 : Spectral expansion factor. */
+ Word16 m /* (i) : LPC order. */
+ );
/*-----------------------------------------------------------------*
@@ -102,214 +102,214 @@ void Weight_a(
*-----------------------------------------------------------------*/
void Qpisf_2s_46b(
- Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
- Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
- Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
- Word16 * indice, /* (o) : quantization indices */
- Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
- );
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ );
void Qpisf_2s_36b(
- Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
- Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
- Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
- Word16 * indice, /* (o) : quantization indices */
- Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
- );
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ );
void Dpisf_2s_46b(
- Word16 * indice, /* input: quantization indices */
- Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
- Word16 * past_isfq, /* i/0 : past ISF quantizer */
- Word16 * isfold, /* input : past quantized ISF */
- Word16 * isf_buf, /* input : isf buffer */
- Word16 bfi, /* input : Bad frame indicator */
- Word16 enc_dec
- );
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ );
void Dpisf_2s_36b(
- Word16 * indice, /* input: quantization indices */
- Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
- Word16 * past_isfq, /* i/0 : past ISF quantizer */
- Word16 * isfold, /* input : past quantized ISF */
- Word16 * isf_buf, /* input : isf buffer */
- Word16 bfi, /* input : Bad frame indicator */
- Word16 enc_dec
- );
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ );
void Qisf_ns(
- Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */
- Word16 * isf_q, /* output: quantized ISF */
- Word16 * indice /* output: quantization indices */
- );
+ Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* output: quantized ISF */
+ Word16 * indice /* output: quantization indices */
+ );
void Disf_ns(
- Word16 * indice, /* input: quantization indices */
- Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */
- );
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */
+ );
Word16 Sub_VQ( /* output: return quantization index */
- Word16 * x, /* input : ISF residual vector */
- Word16 * dico, /* input : quantization codebook */
- Word16 dim, /* input : dimention of vector */
- Word16 dico_size, /* input : size of quantization codebook */
- Word32 * distance /* output: error of quantization */
- );
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word32 * distance /* output: error of quantization */
+ );
void Reorder_isf(
- Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
- Word16 min_dist, /* (i) Q15 : minimum distance to keep */
- Word16 n /* (i) : number of ISF */
- );
+ Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
+ Word16 min_dist, /* (i) Q15 : minimum distance to keep */
+ Word16 n /* (i) : number of ISF */
+ );
/*-----------------------------------------------------------------*
* filter prototypes *
*-----------------------------------------------------------------*/
void Init_Decim_12k8(
- Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */
- );
+ Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */
+ );
void Decim_12k8(
- Word16 sig16k[], /* input: signal to downsampling */
- Word16 lg, /* input: length of input */
- Word16 sig12k8[], /* output: decimated signal */
- Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */
- );
+ Word16 sig16k[], /* input: signal to downsampling */
+ Word16 lg, /* input: length of input */
+ Word16 sig12k8[], /* output: decimated signal */
+ Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */
+ );
void Init_HP50_12k8(Word16 mem[]);
void HP50_12k8(
- Word16 signal[], /* input/output signal */
- Word16 lg, /* lenght of signal */
- Word16 mem[] /* filter memory [6] */
- );
+ Word16 signal[], /* input/output signal */
+ Word16 lg, /* lenght of signal */
+ Word16 mem[] /* filter memory [6] */
+ );
void Init_HP400_12k8(Word16 mem[]);
void HP400_12k8(
- Word16 signal[], /* input/output signal */
- Word16 lg, /* lenght of signal */
- Word16 mem[] /* filter memory [6] */
- );
+ Word16 signal[], /* input/output signal */
+ Word16 lg, /* lenght of signal */
+ Word16 mem[] /* filter memory [6] */
+ );
void Init_Filt_6k_7k(Word16 mem[]);
void Filt_6k_7k(
- Word16 signal[], /* input: signal */
- Word16 lg, /* input: length of input */
- Word16 mem[] /* in/out: memory (size=30) */
- );
+ Word16 signal[], /* input: signal */
+ Word16 lg, /* input: length of input */
+ Word16 mem[] /* in/out: memory (size=30) */
+ );
void Filt_6k_7k_asm(
- Word16 signal[], /* input: signal */
- Word16 lg, /* input: length of input */
- Word16 mem[] /* in/out: memory (size=30) */
- );
+ Word16 signal[], /* input: signal */
+ Word16 lg, /* input: length of input */
+ Word16 mem[] /* in/out: memory (size=30) */
+ );
void LP_Decim2(
- Word16 x[], /* in/out: signal to process */
- Word16 l, /* input : size of filtering */
- Word16 mem[] /* in/out: memory (size=3) */
- );
+ Word16 x[], /* in/out: signal to process */
+ Word16 l, /* input : size of filtering */
+ Word16 mem[] /* in/out: memory (size=3) */
+ );
void Preemph(
- Word16 x[], /* (i/o) : input signal overwritten by the output */
- Word16 mu, /* (i) Q15 : preemphasis coefficient */
- Word16 lg, /* (i) : lenght of filtering */
- Word16 * mem /* (i/o) : memory (x[-1]) */
- );
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : preemphasis coefficient */
+ Word16 lg, /* (i) : lenght of filtering */
+ Word16 * mem /* (i/o) : memory (x[-1]) */
+ );
void Preemph2(
- Word16 x[], /* (i/o) : input signal overwritten by the output */
- Word16 mu, /* (i) Q15 : preemphasis coefficient */
- Word16 lg, /* (i) : lenght of filtering */
- Word16 * mem /* (i/o) : memory (x[-1]) */
- );
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : preemphasis coefficient */
+ Word16 lg, /* (i) : lenght of filtering */
+ Word16 * mem /* (i/o) : memory (x[-1]) */
+ );
void Deemph(
- Word16 x[], /* (i/o) : input signal overwritten by the output */
- Word16 mu, /* (i) Q15 : deemphasis factor */
- Word16 L, /* (i) : vector size */
- Word16 * mem /* (i/o) : memory (y[-1]) */
- );
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ );
void Deemph2(
- Word16 x[], /* (i/o) : input signal overwritten by the output */
- Word16 mu, /* (i) Q15 : deemphasis factor */
- Word16 L, /* (i) : vector size */
- Word16 * mem /* (i/o) : memory (y[-1]) */
- );
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ );
void Deemph_32(
- Word16 x_hi[], /* (i) : input signal (bit31..16) */
- Word16 x_lo[], /* (i) : input signal (bit15..4) */
- Word16 y[], /* (o) : output signal (x16) */
- Word16 mu, /* (i) Q15 : deemphasis factor */
- Word16 L, /* (i) : vector size */
- Word16 * mem /* (i/o) : memory (y[-1]) */
- );
+ Word16 x_hi[], /* (i) : input signal (bit31..16) */
+ Word16 x_lo[], /* (i) : input signal (bit15..4) */
+ Word16 y[], /* (o) : output signal (x16) */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ );
void Deemph_32_asm(
- Word16 x_hi[], /* (i) : input signal (bit31..16) */
- Word16 x_lo[], /* (i) : input signal (bit15..4) */
- Word16 y[], /* (o) : output signal (x16) */
- Word16 * mem /* (i/o) : memory (y[-1]) */
- );
+ Word16 x_hi[], /* (i) : input signal (bit31..16) */
+ Word16 x_lo[], /* (i) : input signal (bit15..4) */
+ Word16 y[], /* (o) : output signal (x16) */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ );
void Convolve(
- Word16 x[], /* (i) : input vector */
- Word16 h[], /* (i) Q15 : impulse response */
- Word16 y[], /* (o) 12 bits: output vector */
- Word16 L /* (i) : vector size */
- );
+ Word16 x[], /* (i) : input vector */
+ Word16 h[], /* (i) Q15 : impulse response */
+ Word16 y[], /* (o) 12 bits: output vector */
+ Word16 L /* (i) : vector size */
+ );
void Convolve_asm(
- Word16 x[], /* (i) : input vector */
- Word16 h[], /* (i) Q15 : impulse response */
- Word16 y[], /* (o) 12 bits: output vector */
- Word16 L /* (i) : vector size */
- );
+ Word16 x[], /* (i) : input vector */
+ Word16 h[], /* (i) Q15 : impulse response */
+ Word16 y[], /* (o) 12 bits: output vector */
+ Word16 L /* (i) : vector size */
+ );
void Residu(
- Word16 a[], /* (i) Q12 : prediction coefficients */
- Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
- Word16 y[], /* (o) : residual signal */
- Word16 lg /* (i) : size of filtering */
- );
+ Word16 a[], /* (i) Q12 : prediction coefficients */
+ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
+ Word16 y[], /* (o) : residual signal */
+ Word16 lg /* (i) : size of filtering */
+ );
void Residu_opt(
- Word16 a[], /* (i) Q12 : prediction coefficients */
- Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
- Word16 y[], /* (o) : residual signal */
- Word16 lg /* (i) : size of filtering */
- );
+ Word16 a[], /* (i) Q12 : prediction coefficients */
+ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
+ Word16 y[], /* (o) : residual signal */
+ Word16 lg /* (i) : size of filtering */
+ );
void Syn_filt(
- Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
- Word16 x[], /* (i) : input signal */
- Word16 y[], /* (o) : output signal */
- Word16 lg, /* (i) : size of filtering */
- Word16 mem[], /* (i/o) : memory associated with this filtering. */
- Word16 update /* (i) : 0=no update, 1=update of memory. */
- );
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 x[], /* (i) : input signal */
+ Word16 y[], /* (o) : output signal */
+ Word16 lg, /* (i) : size of filtering */
+ Word16 mem[], /* (i/o) : memory associated with this filtering. */
+ Word16 update /* (i) : 0=no update, 1=update of memory. */
+ );
void Syn_filt_asm(
- Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
- Word16 x[], /* (i) : input signal */
- Word16 y[], /* (o) : output signal */
- Word16 mem[] /* (i/o) : memory associated with this filtering. */
- );
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 x[], /* (i) : input signal */
+ Word16 y[], /* (o) : output signal */
+ Word16 mem[] /* (i/o) : memory associated with this filtering. */
+ );
void Syn_filt_32(
- Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
- Word16 m, /* (i) : order of LP filter */
- Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
- Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
- Word16 sig_hi[], /* (o) /16 : synthesis high */
- Word16 sig_lo[], /* (o) /16 : synthesis low */
- Word16 lg /* (i) : size of filtering */
- );
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 m, /* (i) : order of LP filter */
+ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
+ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
+ Word16 sig_hi[], /* (o) /16 : synthesis high */
+ Word16 sig_lo[], /* (o) /16 : synthesis low */
+ Word16 lg /* (i) : size of filtering */
+ );
void Syn_filt_32_asm(
- Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
- Word16 m, /* (i) : order of LP filter */
- Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
- Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
- Word16 sig_hi[], /* (o) /16 : synthesis high */
- Word16 sig_lo[], /* (o) /16 : synthesis low */
- Word16 lg /* (i) : size of filtering */
- );
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 m, /* (i) : order of LP filter */
+ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
+ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
+ Word16 sig_hi[], /* (o) /16 : synthesis high */
+ Word16 sig_lo[], /* (o) /16 : synthesis low */
+ Word16 lg /* (i) : size of filtering */
+ );
/*-----------------------------------------------------------------*
* pitch prototypes *
*-----------------------------------------------------------------*/
@@ -443,12 +443,12 @@ void ACELP_4t64_fx(
Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */
Word16 ser_size, /* (i) : bit rate */
Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */
- /* (o) : index (36): 9+9+9+9 = 36 bits. */
- /* (o) : index (44): 13+9+13+9 = 44 bits. */
- /* (o) : index (52): 13+13+13+13 = 52 bits. */
- /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */
- /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */
- /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
+ /* (o) : index (36): 9+9+9+9 = 36 bits. */
+ /* (o) : index (44): 13+9+13+9 = 44 bits. */
+ /* (o) : index (52): 13+13+13+13 = 52 bits. */
+ /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */
+ /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */
+ /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
);
void Pit_shrp(
diff --git a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h
index f42a27c..e63a55a 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/basic_op.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/basic_op.h
@@ -25,8 +25,8 @@
#define MAX_32 (Word32)0x7fffffffL
#define MIN_32 (Word32)0x80000000L
-#define MAX_16 (Word16)+32767 /* 0x7fff */
-#define MIN_16 (Word16)-32768 /* 0x8000 */
+#define MAX_16 (Word16)+32767 /* 0x7fff */
+#define MIN_16 (Word16)-32768 /* 0x8000 */
#define static_vo static __inline
@@ -41,22 +41,22 @@
#define L_negate(L_var1) (((L_var1) == (MIN_32)) ? (MAX_32) : (-(L_var1))) /* Long negate, 2*/
-#define extract_h(a) ((Word16)(a >> 16))
-#define extract_l(x) (Word16)((x))
-#define add1(a,b) (a + b)
-#define vo_L_msu(a,b,c) ( a - (( b * c ) << 1) )
+#define extract_h(a) ((Word16)(a >> 16))
+#define extract_l(x) (Word16)((x))
+#define add1(a,b) (a + b)
+#define vo_L_msu(a,b,c) ( a - (( b * c ) << 1) )
#define vo_mult32(a, b) ((a) * (b))
-#define vo_mult(a,b) (( a * b ) >> 15 )
-#define vo_L_mult(a,b) (((a) * (b)) << 1)
-#define vo_shr_r(var1, var2) ((var1+((Word16)(1L<<(var2-1))))>>var2)
-#define vo_sub(a,b) (a - b)
-#define vo_L_deposit_h(a) ((Word32)((a) << 16))
-#define vo_round(a) ((a + 0x00008000) >> 16)
-#define vo_extract_l(a) ((Word16)(a))
-#define vo_L_add(a,b) (a + b)
-#define vo_L_sub(a,b) (a - b)
-#define vo_mult_r(a,b) ((( a * b ) + 0x4000 ) >> 15 )
-#define vo_negate(a) (-a)
+#define vo_mult(a,b) (( a * b ) >> 15 )
+#define vo_L_mult(a,b) (((a) * (b)) << 1)
+#define vo_shr_r(var1, var2) ((var1+((Word16)(1L<<(var2-1))))>>var2)
+#define vo_sub(a,b) (a - b)
+#define vo_L_deposit_h(a) ((Word32)((a) << 16))
+#define vo_round(a) ((a + 0x00008000) >> 16)
+#define vo_extract_l(a) ((Word16)(a))
+#define vo_L_add(a,b) (a + b)
+#define vo_L_sub(a,b) (a - b)
+#define vo_mult_r(a,b) ((( a * b ) + 0x4000 ) >> 15 )
+#define vo_negate(a) (-a)
#define vo_L_shr_r(L_var1, var2) ((L_var1+((Word32)(1L<<(var2-1))))>>var2)
@@ -65,25 +65,25 @@
| Prototypes for basic arithmetic operators |
|___________________________________________________________________________|
*/
-static_vo Word16 add (Word16 var1, Word16 var2); /* Short add,1 */
-static_vo Word16 sub (Word16 var1, Word16 var2); /* Short sub,1 */
+static_vo Word16 add (Word16 var1, Word16 var2); /* Short add,1 */
+static_vo Word16 sub (Word16 var1, Word16 var2); /* Short sub,1 */
static_vo Word16 shl (Word16 var1, Word16 var2); /* Short shift left, 1 */
static_vo Word16 shr (Word16 var1, Word16 var2); /* Short shift right, 1 */
static_vo Word16 mult (Word16 var1, Word16 var2); /* Short mult, 1 */
static_vo Word32 L_mult (Word16 var1, Word16 var2); /* Long mult, 1 */
static_vo Word16 voround (Word32 L_var1); /* Round, 1 */
-static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); /* Mac, 1 */
-static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2); /* Msu, 1 */
-static_vo Word32 L_add (Word32 L_var1, Word32 L_var2); /* Long add, 2 */
-static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2); /* Long sub, 2 */
-static_vo Word16 mult_r (Word16 var1, Word16 var2); /* Mult with round, 2 */
-static_vo Word32 L_shl2(Word32 L_var1, Word16 var2); /* var2 > 0*/
-static_vo Word32 L_shl (Word32 L_var1, Word16 var2); /* Long shift left, 2 */
-static_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right, 2*/
-static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */
-static_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */
-static_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */
-static_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */
+static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2); /* Mac, 1 */
+static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2); /* Msu, 1 */
+static_vo Word32 L_add (Word32 L_var1, Word32 L_var2); /* Long add, 2 */
+static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2); /* Long sub, 2 */
+static_vo Word16 mult_r (Word16 var1, Word16 var2); /* Mult with round, 2 */
+static_vo Word32 L_shl2(Word32 L_var1, Word16 var2); /* var2 > 0*/
+static_vo Word32 L_shl (Word32 L_var1, Word16 var2); /* Long shift left, 2 */
+static_vo Word32 L_shr (Word32 L_var1, Word16 var2); /* Long shift right, 2*/
+static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2); /* Long shift right with round, 3 */
+static_vo Word16 norm_s (Word16 var1); /* Short norm, 15 */
+static_vo Word16 div_s (Word16 var1, Word16 var2); /* Short division, 18 */
+static_vo Word16 norm_l (Word32 L_var1); /* Long norm, 30 */
/*___________________________________________________________________________
| |
@@ -125,11 +125,11 @@ static_vo Word16 norm_l (Word32 L_var1); /* Long norm,
*/
static_vo Word16 add (Word16 var1, Word16 var2)
{
- Word16 var_out;
- Word32 L_sum;
- L_sum = (Word32) var1 + var2;
- var_out = saturate (L_sum);
- return (var_out);
+ Word16 var_out;
+ Word32 L_sum;
+ L_sum = (Word32) var1 + var2;
+ var_out = saturate (L_sum);
+ return (var_out);
}
/*___________________________________________________________________________
@@ -168,11 +168,11 @@ static_vo Word16 add (Word16 var1, Word16 var2)
static_vo Word16 sub (Word16 var1, Word16 var2)
{
- Word16 var_out;
- Word32 L_diff;
- L_diff = (Word32) var1 - var2;
- var_out = saturate (L_diff);
- return (var_out);
+ Word16 var_out;
+ Word32 L_diff;
+ L_diff = (Word32) var1 - var2;
+ var_out = saturate (L_diff);
+ return (var_out);
}
/*___________________________________________________________________________
@@ -212,27 +212,27 @@ static_vo Word16 sub (Word16 var1, Word16 var2)
static_vo Word16 shl (Word16 var1, Word16 var2)
{
- Word16 var_out;
- Word32 result;
- if (var2 < 0)
- {
- if (var2 < -16)
- var2 = -16;
- var_out = var1 >> ((Word16)-var2);
- }
- else
- {
- result = (Word32) var1 *((Word32) 1 << var2);
- if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
- {
- var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
- }
- else
- {
- var_out = extract_l (result);
- }
- }
- return (var_out);
+ Word16 var_out;
+ Word32 result;
+ if (var2 < 0)
+ {
+ if (var2 < -16)
+ var2 = -16;
+ var_out = var1 >> ((Word16)-var2);
+ }
+ else
+ {
+ result = (Word32) var1 *((Word32) 1 << var2);
+ if ((var2 > 15 && var1 != 0) || (result != (Word32) ((Word16) result)))
+ {
+ var_out = (Word16)((var1 > 0) ? MAX_16 : MIN_16);
+ }
+ else
+ {
+ var_out = extract_l (result);
+ }
+ }
+ return (var_out);
}
/*___________________________________________________________________________
@@ -272,32 +272,32 @@ static_vo Word16 shl (Word16 var1, Word16 var2)
static_vo Word16 shr (Word16 var1, Word16 var2)
{
- Word16 var_out;
- if (var2 < 0)
- {
- if (var2 < -16)
- var2 = -16;
- var_out = shl(var1, (Word16)-var2);
- }
- else
- {
- if (var2 >= 15)
- {
- var_out = (Word16)((var1 < 0) ? -1 : 0);
- }
- else
- {
- if (var1 < 0)
- {
- var_out = (Word16)(~((~var1) >> var2));
- }
- else
- {
- var_out = (Word16)(var1 >> var2);
- }
- }
- }
- return (var_out);
+ Word16 var_out;
+ if (var2 < 0)
+ {
+ if (var2 < -16)
+ var2 = -16;
+ var_out = shl(var1, (Word16)-var2);
+ }
+ else
+ {
+ if (var2 >= 15)
+ {
+ var_out = (Word16)((var1 < 0) ? -1 : 0);
+ }
+ else
+ {
+ if (var1 < 0)
+ {
+ var_out = (Word16)(~((~var1) >> var2));
+ }
+ else
+ {
+ var_out = (Word16)(var1 >> var2);
+ }
+ }
+ }
+ return (var_out);
}
/*___________________________________________________________________________
@@ -337,14 +337,14 @@ static_vo Word16 shr (Word16 var1, Word16 var2)
static_vo Word16 mult (Word16 var1, Word16 var2)
{
- Word16 var_out;
- Word32 L_product;
- L_product = (Word32) var1 *(Word32) var2;
- L_product = (L_product & (Word32) 0xffff8000L) >> 15;
- if (L_product & (Word32) 0x00010000L)
- L_product = L_product | (Word32) 0xffff0000L;
- var_out = saturate (L_product);
- return (var_out);
+ Word16 var_out;
+ Word32 L_product;
+ L_product = (Word32) var1 *(Word32) var2;
+ L_product = (L_product & (Word32) 0xffff8000L) >> 15;
+ if (L_product & (Word32) 0x00010000L)
+ L_product = L_product | (Word32) 0xffff0000L;
+ var_out = saturate (L_product);
+ return (var_out);
}
/*___________________________________________________________________________
@@ -384,17 +384,17 @@ static_vo Word16 mult (Word16 var1, Word16 var2)
static_vo Word32 L_mult (Word16 var1, Word16 var2)
{
- Word32 L_var_out;
- L_var_out = (Word32) var1 *(Word32) var2;
- if (L_var_out != (Word32) 0x40000000L)
- {
- L_var_out *= 2;
- }
- else
- {
- L_var_out = MAX_32;
- }
- return (L_var_out);
+ Word32 L_var_out;
+ L_var_out = (Word32) var1 *(Word32) var2;
+ if (L_var_out != (Word32) 0x40000000L)
+ {
+ L_var_out *= 2;
+ }
+ else
+ {
+ L_var_out = MAX_32;
+ }
+ return (L_var_out);
}
/*___________________________________________________________________________
@@ -430,11 +430,11 @@ static_vo Word32 L_mult (Word16 var1, Word16 var2)
static_vo Word16 voround (Word32 L_var1)
{
- Word16 var_out;
- Word32 L_rounded;
- L_rounded = L_add (L_var1, (Word32) 0x00008000L);
- var_out = extract_h (L_rounded);
- return (var_out);
+ Word16 var_out;
+ Word32 L_rounded;
+ L_rounded = L_add (L_var1, (Word32) 0x00008000L);
+ var_out = extract_h (L_rounded);
+ return (var_out);
}
/*___________________________________________________________________________
@@ -476,11 +476,11 @@ static_vo Word16 voround (Word32 L_var1)
static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
{
- Word32 L_var_out;
- Word32 L_product;
- L_product = ((var1 * var2) << 1);
- L_var_out = L_add (L_var3, L_product);
- return (L_var_out);
+ Word32 L_var_out;
+ Word32 L_product;
+ L_product = ((var1 * var2) << 1);
+ L_var_out = L_add (L_var3, L_product);
+ return (L_var_out);
}
/*___________________________________________________________________________
@@ -522,11 +522,11 @@ static_vo Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
{
- Word32 L_var_out;
- Word32 L_product;
- L_product = (var1 * var2)<<1;
- L_var_out = L_sub (L_var3, L_product);
- return (L_var_out);
+ Word32 L_var_out;
+ Word32 L_product;
+ L_product = (var1 * var2)<<1;
+ L_var_out = L_sub (L_var3, L_product);
+ return (L_var_out);
}
/*___________________________________________________________________________
@@ -563,16 +563,16 @@ static_vo Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
static_vo Word32 L_add (Word32 L_var1, Word32 L_var2)
{
- Word32 L_var_out;
- L_var_out = L_var1 + L_var2;
- if (((L_var1 ^ L_var2) & MIN_32) == 0)
- {
- if ((L_var_out ^ L_var1) & MIN_32)
- {
- L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
- }
- }
- return (L_var_out);
+ Word32 L_var_out;
+ L_var_out = L_var1 + L_var2;
+ if (((L_var1 ^ L_var2) & MIN_32) == 0)
+ {
+ if ((L_var_out ^ L_var1) & MIN_32)
+ {
+ L_var_out = (L_var1 < 0) ? MIN_32 : MAX_32;
+ }
+ }
+ return (L_var_out);
}
/*___________________________________________________________________________
@@ -609,16 +609,16 @@ static_vo Word32 L_add (Word32 L_var1, Word32 L_var2)
static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2)
{
- Word32 L_var_out;
- L_var_out = L_var1 - L_var2;
- if (((L_var1 ^ L_var2) & MIN_32) != 0)
- {
- if ((L_var_out ^ L_var1) & MIN_32)
- {
- L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
- }
- }
- return (L_var_out);
+ Word32 L_var_out;
+ L_var_out = L_var1 - L_var2;
+ if (((L_var1 ^ L_var2) & MIN_32) != 0)
+ {
+ if ((L_var_out ^ L_var1) & MIN_32)
+ {
+ L_var_out = (L_var1 < 0L) ? MIN_32 : MAX_32;
+ }
+ }
+ return (L_var_out);
}
@@ -658,18 +658,18 @@ static_vo Word32 L_sub (Word32 L_var1, Word32 L_var2)
static_vo Word16 mult_r (Word16 var1, Word16 var2)
{
- Word16 var_out;
- Word32 L_product_arr;
- L_product_arr = (Word32) var1 *(Word32) var2; /* product */
- L_product_arr += (Word32) 0x00004000L; /* round */
- L_product_arr &= (Word32) 0xffff8000L;
- L_product_arr >>= 15; /* shift */
- if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */
- {
- L_product_arr |= (Word32) 0xffff0000L;
- }
- var_out = saturate (L_product_arr);
- return (var_out);
+ Word16 var_out;
+ Word32 L_product_arr;
+ L_product_arr = (Word32) var1 *(Word32) var2; /* product */
+ L_product_arr += (Word32) 0x00004000L; /* round */
+ L_product_arr &= (Word32) 0xffff8000L;
+ L_product_arr >>= 15; /* shift */
+ if (L_product_arr & (Word32) 0x00010000L) /* sign extend when necessary */
+ {
+ L_product_arr |= (Word32) 0xffff0000L;
+ }
+ var_out = saturate (L_product_arr);
+ return (var_out);
}
/*___________________________________________________________________________
@@ -708,61 +708,61 @@ static_vo Word16 mult_r (Word16 var1, Word16 var2)
static_vo Word32 L_shl (Word32 L_var1, Word16 var2)
{
- Word32 L_var_out = 0L;
- if (var2 <= 0)
- {
- if (var2 < -32)
- var2 = -32;
- L_var_out = (L_var1 >> (Word16)-var2);
- }
- else
- {
- for (; var2 > 0; var2--)
- {
- if (L_var1 > (Word32) 0X3fffffffL)
- {
- L_var_out = MAX_32;
- break;
- }
- else
- {
- if (L_var1 < (Word32) 0xc0000000L)
- {
- //Overflow = 1;
- L_var_out = MIN_32;
- break;
- }
- }
- L_var1 *= 2;
- L_var_out = L_var1;
- }
- }
- return (L_var_out);
+ Word32 L_var_out = 0L;
+ if (var2 <= 0)
+ {
+ if (var2 < -32)
+ var2 = -32;
+ L_var_out = (L_var1 >> (Word16)-var2);
+ }
+ else
+ {
+ for (; var2 > 0; var2--)
+ {
+ if (L_var1 > (Word32) 0X3fffffffL)
+ {
+ L_var_out = MAX_32;
+ break;
+ }
+ else
+ {
+ if (L_var1 < (Word32) 0xc0000000L)
+ {
+ //Overflow = 1;
+ L_var_out = MIN_32;
+ break;
+ }
+ }
+ L_var1 *= 2;
+ L_var_out = L_var1;
+ }
+ }
+ return (L_var_out);
}
static_vo Word32 L_shl2(Word32 L_var1, Word16 var2)
{
- Word32 L_var_out = 0L;
+ Word32 L_var_out = 0L;
- for (; var2 > 0; var2--)
- {
- if (L_var1 > (Word32) 0X3fffffffL)
- {
- L_var_out = MAX_32;
- break;
- }
- else
- {
- if (L_var1 < (Word32) 0xc0000000L)
- {
- L_var_out = MIN_32;
- break;
- }
- }
- L_var1 <<=1 ;
- L_var_out = L_var1;
- }
- return (L_var_out);
+ for (; var2 > 0; var2--)
+ {
+ if (L_var1 > (Word32) 0X3fffffffL)
+ {
+ L_var_out = MAX_32;
+ break;
+ }
+ else
+ {
+ if (L_var1 < (Word32) 0xc0000000L)
+ {
+ L_var_out = MIN_32;
+ break;
+ }
+ }
+ L_var1 <<=1 ;
+ L_var_out = L_var1;
+ }
+ return (L_var_out);
}
/*___________________________________________________________________________
@@ -801,32 +801,32 @@ static_vo Word32 L_shl2(Word32 L_var1, Word16 var2)
static_vo Word32 L_shr (Word32 L_var1, Word16 var2)
{
- Word32 L_var_out;
- if (var2 < 0)
- {
- if (var2 < -32)
- var2 = -32;
- L_var_out = L_shl2(L_var1, (Word16)-var2);
- }
- else
- {
- if (var2 >= 31)
- {
- L_var_out = (L_var1 < 0L) ? -1 : 0;
- }
- else
- {
- if (L_var1 < 0)
- {
- L_var_out = ~((~L_var1) >> var2);
- }
- else
- {
- L_var_out = L_var1 >> var2;
- }
- }
- }
- return (L_var_out);
+ Word32 L_var_out;
+ if (var2 < 0)
+ {
+ if (var2 < -32)
+ var2 = -32;
+ L_var_out = L_shl2(L_var1, (Word16)-var2);
+ }
+ else
+ {
+ if (var2 >= 31)
+ {
+ L_var_out = (L_var1 < 0L) ? -1 : 0;
+ }
+ else
+ {
+ if (L_var1 < 0)
+ {
+ L_var_out = ~((~L_var1) >> var2);
+ }
+ else
+ {
+ L_var_out = L_var1 >> var2;
+ }
+ }
+ }
+ return (L_var_out);
}
/*___________________________________________________________________________
@@ -873,23 +873,23 @@ static_vo Word32 L_shr (Word32 L_var1, Word16 var2)
static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2)
{
- Word32 L_var_out;
- if (var2 > 31)
- {
- L_var_out = 0;
- }
- else
- {
- L_var_out = L_shr (L_var1, var2);
- if (var2 > 0)
- {
- if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
- {
- L_var_out++;
- }
- }
- }
- return (L_var_out);
+ Word32 L_var_out;
+ if (var2 > 31)
+ {
+ L_var_out = 0;
+ }
+ else
+ {
+ L_var_out = L_shr (L_var1, var2);
+ if (var2 > 0)
+ {
+ if ((L_var1 & ((Word32) 1 << (var2 - 1))) != 0)
+ {
+ L_var_out++;
+ }
+ }
+ }
+ return (L_var_out);
}
/*___________________________________________________________________________
@@ -927,30 +927,30 @@ static_vo Word32 L_shr_r (Word32 L_var1, Word16 var2)
static_vo Word16 norm_s (Word16 var1)
{
- Word16 var_out = 0;
- if (var1 == 0)
- {
- var_out = 0;
- }
- else
- {
- if (var1 == -1)
- {
- var_out = 15;
- }
- else
- {
- if (var1 < 0)
- {
- var1 = (Word16)~var1;
- }
- for (var_out = 0; var1 < 0x4000; var_out++)
- {
- var1 <<= 1;
- }
- }
- }
- return (var_out);
+ Word16 var_out = 0;
+ if (var1 == 0)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ if (var1 == -1)
+ {
+ var_out = 15;
+ }
+ else
+ {
+ if (var1 < 0)
+ {
+ var1 = (Word16)~var1;
+ }
+ for (var_out = 0; var1 < 0x4000; var_out++)
+ {
+ var1 <<= 1;
+ }
+ }
+ }
+ return (var_out);
}
/*___________________________________________________________________________
@@ -992,47 +992,47 @@ static_vo Word16 norm_s (Word16 var1)
static_vo Word16 div_s (Word16 var1, Word16 var2)
{
- Word16 var_out = 0;
- Word16 iteration;
- Word32 L_num;
- Word32 L_denom;
- if ((var1 < 0) || (var2 < 0))
- {
- var_out = MAX_16;
- return var_out;
- }
- if (var2 == 0)
- {
- var_out = MAX_16;
- return var_out;
- }
- if (var1 == 0)
- {
- var_out = 0;
- }
- else
- {
- if (var1 == var2)
- {
- var_out = MAX_16;
- }
- else
- {
- L_num = L_deposit_l (var1);
- L_denom = L_deposit_l(var2);
- for (iteration = 0; iteration < 15; iteration++)
- {
- var_out <<= 1;
- L_num <<= 1;
- if (L_num >= L_denom)
- {
- L_num -= L_denom;
- var_out += 1;
- }
- }
- }
- }
- return (var_out);
+ Word16 var_out = 0;
+ Word16 iteration;
+ Word32 L_num;
+ Word32 L_denom;
+ if ((var1 < 0) || (var2 < 0))
+ {
+ var_out = MAX_16;
+ return var_out;
+ }
+ if (var2 == 0)
+ {
+ var_out = MAX_16;
+ return var_out;
+ }
+ if (var1 == 0)
+ {
+ var_out = 0;
+ }
+ else
+ {
+ if (var1 == var2)
+ {
+ var_out = MAX_16;
+ }
+ else
+ {
+ L_num = L_deposit_l (var1);
+ L_denom = L_deposit_l(var2);
+ for (iteration = 0; iteration < 15; iteration++)
+ {
+ var_out <<= 1;
+ L_num <<= 1;
+ if (L_num >= L_denom)
+ {
+ L_num -= L_denom;
+ var_out += 1;
+ }
+ }
+ }
+ }
+ return (var_out);
}
/*___________________________________________________________________________
@@ -1070,20 +1070,20 @@ static_vo Word16 div_s (Word16 var1, Word16 var2)
static_vo Word16 norm_l (Word32 L_var1)
{
- Word16 var_out = 0;
- if (L_var1 != 0)
- {
- var_out = 31;
- if (L_var1 != (Word32) 0xffffffffL)
- {
- L_var1 ^= (L_var1 >>31);
- for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
- {
- L_var1 <<= 1;
- }
- }
- }
- return (var_out);
+ Word16 var_out = 0;
+ if (L_var1 != 0)
+ {
+ var_out = 31;
+ if (L_var1 != (Word32) 0xffffffffL)
+ {
+ L_var1 ^= (L_var1 >>31);
+ for (var_out = 0; L_var1 < (Word32) 0x40000000L; var_out++)
+ {
+ L_var1 <<= 1;
+ }
+ }
+ }
+ return (var_out);
}
#endif //__BASIC_OP_H__
diff --git a/media/libstagefright/codecs/amrwbenc/inc/bits.h b/media/libstagefright/codecs/amrwbenc/inc/bits.h
index e880684..ff9c0c1 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/bits.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/bits.h
@@ -18,7 +18,7 @@
/*--------------------------------------------------------------------------*
* BITS.H *
*--------------------------------------------------------------------------*
-* Number of bits for different modes *
+* Number of bits for different modes *
*--------------------------------------------------------------------------*/
#ifndef __BITS_H__
@@ -52,16 +52,16 @@
#define RX_FRAME_TYPE (Word16)0x6b20
static const Word16 nb_of_bits[NUM_OF_MODES] = {
- NBBITS_7k,
- NBBITS_9k,
- NBBITS_12k,
- NBBITS_14k,
- NBBITS_16k,
- NBBITS_18k,
- NBBITS_20k,
- NBBITS_23k,
- NBBITS_24k,
- NBBITS_SID
+ NBBITS_7k,
+ NBBITS_9k,
+ NBBITS_12k,
+ NBBITS_14k,
+ NBBITS_16k,
+ NBBITS_18k,
+ NBBITS_20k,
+ NBBITS_23k,
+ NBBITS_24k,
+ NBBITS_SID
};
/*typedef struct
@@ -74,18 +74,18 @@ Word16 prev_ft;
//typedef struct
//{
-// Word16 prev_ft;
-// Word16 prev_mode;
+// Word16 prev_ft;
+// Word16 prev_mode;
//} RX_State;
int PackBits(Word16 prms[], Word16 coding_mode, Word16 mode, Coder_State *st);
void Parm_serial(
- Word16 value, /* input : parameter value */
- Word16 no_of_bits, /* input : number of bits */
- Word16 ** prms
- );
+ Word16 value, /* input : parameter value */
+ Word16 no_of_bits, /* input : number of bits */
+ Word16 ** prms
+ );
#endif //__BITS_H__
diff --git a/media/libstagefright/codecs/amrwbenc/inc/cod_main.h b/media/libstagefright/codecs/amrwbenc/inc/cod_main.h
index 53ca55e..170981e 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/cod_main.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/cod_main.h
@@ -18,7 +18,7 @@
/*--------------------------------------------------------------------------*
* COD_MAIN.H *
*--------------------------------------------------------------------------*
- * Static memory in the encoder *
+ * Static memory in the encoder *
*--------------------------------------------------------------------------*/
#ifndef __COD_MAIN_H__
#define __COD_MAIN_H__
@@ -79,21 +79,21 @@ typedef struct
Word16 vad_hist;
Word16 gain_alpha;
/* TX_State structure */
- Word16 sid_update_counter;
+ Word16 sid_update_counter;
Word16 sid_handover_debt;
Word16 prev_ft;
- Word16 allow_dtx;
- /*some input/output buffer parameters */
- unsigned char *inputStream;
- int inputSize;
- VOAMRWBMODE mode;
- VOAMRWBFRAMETYPE frameType;
- unsigned short *outputStream;
- int outputSize;
- FrameStream *stream;
- VO_MEM_OPERATOR *pvoMemop;
- VO_MEM_OPERATOR voMemoprator;
- VO_PTR hCheck;
+ Word16 allow_dtx;
+ /*some input/output buffer parameters */
+ unsigned char *inputStream;
+ int inputSize;
+ VOAMRWBMODE mode;
+ VOAMRWBFRAMETYPE frameType;
+ unsigned short *outputStream;
+ int outputSize;
+ FrameStream *stream;
+ VO_MEM_OPERATOR *pvoMemop;
+ VO_MEM_OPERATOR voMemoprator;
+ VO_PTR hCheck;
} Coder_State;
typedef void* HAMRENC;
diff --git a/media/libstagefright/codecs/amrwbenc/inc/dtx.h b/media/libstagefright/codecs/amrwbenc/inc/dtx.h
index 0bdda67..82a9bf4 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/dtx.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/dtx.h
@@ -16,9 +16,9 @@
/*--------------------------------------------------------------------------*
- * DTX.H *
+ * DTX.H *
*--------------------------------------------------------------------------*
- * Static memory, constants and frametypes for the DTX *
+ * Static memory, constants and frametypes for the DTX *
*--------------------------------------------------------------------------*/
#ifndef __DTX_H__
diff --git a/media/libstagefright/codecs/amrwbenc/inc/log2.h b/media/libstagefright/codecs/amrwbenc/inc/log2.h
index b065eb4..3d9a6c4 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/log2.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/log2.h
@@ -45,17 +45,17 @@
********************************************************************************
*/
void Log2 (
- Word32 L_x, /* (i) : input value */
- Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
- Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1)*/
- );
+ Word32 L_x, /* (i) : input value */
+ Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
+ Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1)*/
+ );
void Log2_norm (
- Word32 L_x, /* (i) : input value (normalized) */
- Word16 exp, /* (i) : norm_l (L_x) */
- Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
- Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
- );
+ Word32 L_x, /* (i) : input value (normalized) */
+ Word16 exp, /* (i) : norm_l (L_x) */
+ Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
+ Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+ );
#endif //__LOG2_H__
diff --git a/media/libstagefright/codecs/amrwbenc/inc/main.h b/media/libstagefright/codecs/amrwbenc/inc/main.h
index 3a6f963..adef2df 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/main.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/main.h
@@ -17,9 +17,9 @@
/*--------------------------------------------------------------------------*
- * MAIN.H *
+ * MAIN.H *
*--------------------------------------------------------------------------*
- * Main functions *
+ * Main functions *
*--------------------------------------------------------------------------*/
#ifndef __MAIN_H__
diff --git a/media/libstagefright/codecs/amrwbenc/inc/math_op.h b/media/libstagefright/codecs/amrwbenc/inc/math_op.h
index 7b6196b..c3c00bc 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/math_op.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/math_op.h
@@ -16,40 +16,40 @@
/*--------------------------------------------------------------------------*
- * MATH_OP.H *
+ * MATH_OP.H *
*--------------------------------------------------------------------------*
- * Mathematical operations *
+ * Mathematical operations *
*--------------------------------------------------------------------------*/
#ifndef __MATH_OP_H__
#define __MATH_OP_H__
Word32 Isqrt( /* (o) Q31 : output value (range: 0<=val<1) */
- Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */
- );
+ Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */
+ );
void Isqrt_n(
- Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
- Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */
- );
+ Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
+ Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */
+ );
Word32 Pow2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */
- Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */
- Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */
- );
+ Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */
+ Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */
+ );
Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */
- Word16 x[], /* (i) 12bits: x vector */
- Word16 y[], /* (i) 12bits: y vector */
- Word16 lg, /* (i) : vector length */
- Word16 * exp /* (o) : exponent of result (0..+30) */
- );
+ Word16 x[], /* (i) 12bits: x vector */
+ Word16 y[], /* (i) 12bits: y vector */
+ Word16 lg, /* (i) : vector length */
+ Word16 * exp /* (o) : exponent of result (0..+30) */
+ );
Word32 Dot_product12_asm( /* (o) Q31: normalized result (1 < val <= -1) */
- Word16 x[], /* (i) 12bits: x vector */
- Word16 y[], /* (i) 12bits: y vector */
- Word16 lg, /* (i) : vector length */
- Word16 * exp /* (o) : exponent of result (0..+30) */
- );
+ Word16 x[], /* (i) 12bits: x vector */
+ Word16 y[], /* (i) 12bits: y vector */
+ Word16 lg, /* (i) : vector length */
+ Word16 * exp /* (o) : exponent of result (0..+30) */
+ );
#endif //__MATH_OP_H__
diff --git a/media/libstagefright/codecs/amrwbenc/inc/mem_align.h b/media/libstagefright/codecs/amrwbenc/inc/mem_align.h
index 442786a..2ae5a6c 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/mem_align.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/mem_align.h
@@ -14,9 +14,9 @@
** limitations under the License.
*/
/*******************************************************************************
- File: mem_align.h
+ File: mem_align.h
- Content: Memory alloc alignments functions
+ Content: Memory alloc alignments functions
*******************************************************************************/
@@ -29,7 +29,7 @@
extern void *mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID);
extern void mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID);
-#endif /* __VO_MEM_ALIGN_H__ */
+#endif /* __VO_MEM_ALIGN_H__ */
diff --git a/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h b/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h
index 4a13f16..77487ed 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/p_med_o.h
@@ -17,36 +17,36 @@
/*--------------------------------------------------------------------------*
* P_MED_O.H *
*--------------------------------------------------------------------------*
- * Median open-loop lag search *
+ * Median open-loop lag search *
*--------------------------------------------------------------------------*/
#ifndef __P_MED_O_H__
#define __P_MED_O_H__
Word16 Pitch_med_ol( /* output: open loop pitch lag */
- Word16 wsp[], /* input : signal used to compute the open loop pitch */
- /* wsp[-pit_max] to wsp[-1] should be known */
- Word16 L_min, /* input : minimum pitch lag */
- Word16 L_max, /* input : maximum pitch lag */
- Word16 L_frame, /* input : length of frame to compute pitch */
- Word16 L_0, /* input : old_ open-loop pitch */
- Word16 * gain, /* output: normalize correlation of hp_wsp for the Lag */
- Word16 * hp_wsp_mem, /* i:o : memory of the hypass filter for hp_wsp[] (lg=9) */
- Word16 * old_hp_wsp, /* i:o : hypass wsp[] */
- Word16 wght_flg /* input : is weighting function used */
- );
+ Word16 wsp[], /* input : signal used to compute the open loop pitch */
+ /* wsp[-pit_max] to wsp[-1] should be known */
+ Word16 L_min, /* input : minimum pitch lag */
+ Word16 L_max, /* input : maximum pitch lag */
+ Word16 L_frame, /* input : length of frame to compute pitch */
+ Word16 L_0, /* input : old_ open-loop pitch */
+ Word16 * gain, /* output: normalize correlation of hp_wsp for the Lag */
+ Word16 * hp_wsp_mem, /* i:o : memory of the hypass filter for hp_wsp[] (lg=9) */
+ Word16 * old_hp_wsp, /* i:o : hypass wsp[] */
+ Word16 wght_flg /* input : is weighting function used */
+ );
Word16 Med_olag( /* output : median of 5 previous open-loop lags */
- Word16 prev_ol_lag, /* input : previous open-loop lag */
- Word16 old_ol_lag[5]
- );
+ Word16 prev_ol_lag, /* input : previous open-loop lag */
+ Word16 old_ol_lag[5]
+ );
void Hp_wsp(
- Word16 wsp[], /* i : wsp[] signal */
- Word16 hp_wsp[], /* o : hypass wsp[] */
- Word16 lg, /* i : lenght of signal */
- Word16 mem[] /* i/o : filter memory [9] */
- );
+ Word16 wsp[], /* i : wsp[] signal */
+ Word16 hp_wsp[], /* o : hypass wsp[] */
+ Word16 lg, /* i : lenght of signal */
+ Word16 mem[] /* i/o : filter memory [9] */
+ );
#endif //__P_MED_O_H__
diff --git a/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h b/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h
index b5d5280..67140fc 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/q_pulse.h
@@ -19,7 +19,7 @@
/*--------------------------------------------------------------------------*
* Q_PULSE.H *
*--------------------------------------------------------------------------*
- * Coding and decoding of algebraic codebook *
+ * Coding and decoding of algebraic codebook *
*--------------------------------------------------------------------------*/
#ifndef __Q_PULSE_H__
@@ -28,38 +28,38 @@
#include "typedef.h"
Word32 quant_1p_N1( /* (o) return (N+1) bits */
- Word16 pos, /* (i) position of the pulse */
- Word16 N); /* (i) number of bits for position */
+ Word16 pos, /* (i) position of the pulse */
+ Word16 N); /* (i) number of bits for position */
Word32 quant_2p_2N1( /* (o) return (2*N)+1 bits */
- Word16 pos1, /* (i) position of the pulse 1 */
- Word16 pos2, /* (i) position of the pulse 2 */
- Word16 N); /* (i) number of bits for position */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 N); /* (i) number of bits for position */
Word32 quant_3p_3N1( /* (o) return (3*N)+1 bits */
- Word16 pos1, /* (i) position of the pulse 1 */
- Word16 pos2, /* (i) position of the pulse 2 */
- Word16 pos3, /* (i) position of the pulse 3 */
- Word16 N); /* (i) number of bits for position */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 pos3, /* (i) position of the pulse 3 */
+ Word16 N); /* (i) number of bits for position */
Word32 quant_4p_4N1( /* (o) return (4*N)+1 bits */
- Word16 pos1, /* (i) position of the pulse 1 */
- Word16 pos2, /* (i) position of the pulse 2 */
- Word16 pos3, /* (i) position of the pulse 3 */
- Word16 pos4, /* (i) position of the pulse 4 */
- Word16 N); /* (i) number of bits for position */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 pos3, /* (i) position of the pulse 3 */
+ Word16 pos4, /* (i) position of the pulse 4 */
+ Word16 N); /* (i) number of bits for position */
Word32 quant_4p_4N( /* (o) return 4*N bits */
- Word16 pos[], /* (i) position of the pulse 1..4 */
- Word16 N); /* (i) number of bits for position */
+ Word16 pos[], /* (i) position of the pulse 1..4 */
+ Word16 N); /* (i) number of bits for position */
Word32 quant_5p_5N( /* (o) return 5*N bits */
- Word16 pos[], /* (i) position of the pulse 1..5 */
- Word16 N); /* (i) number of bits for position */
+ Word16 pos[], /* (i) position of the pulse 1..5 */
+ Word16 N); /* (i) number of bits for position */
Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */
- Word16 pos[], /* (i) position of the pulse 1..6 */
- Word16 N); /* (i) number of bits for position */
+ Word16 pos[], /* (i) position of the pulse 1..6 */
+ Word16 N); /* (i) number of bits for position */
#endif //__Q_PULSE_H__
diff --git a/media/libstagefright/codecs/amrwbenc/inc/stream.h b/media/libstagefright/codecs/amrwbenc/inc/stream.h
index 4c1d0f0..ec1a700 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/stream.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/stream.h
@@ -17,7 +17,7 @@
/***********************************************************************
-File: stream.h
+File: stream.h
Contains: VOME API Buffer Operator Implement Header
@@ -28,16 +28,16 @@ Contains: VOME API Buffer Operator Implement Header
#include "voMem.h"
#define Frame_Maxsize 1024 * 2 //Work Buffer 10K
#define Frame_MaxByte 640 //AMR_WB Encoder one frame 320 samples = 640 Bytes
-#define MIN(a,b) ((a) < (b)? (a) : (b))
+#define MIN(a,b) ((a) < (b)? (a) : (b))
typedef struct{
- unsigned char *set_ptr;
- unsigned char *frame_ptr;
- unsigned char *frame_ptr_bk;
- int set_len;
- int framebuffer_len;
- int frame_storelen;
- int used_len;
+ unsigned char *set_ptr;
+ unsigned char *frame_ptr;
+ unsigned char *frame_ptr_bk;
+ int set_len;
+ int framebuffer_len;
+ int frame_storelen;
+ int used_len;
}FrameStream;
void voAWB_UpdateFrameBuffer(FrameStream *stream, VO_MEM_OPERATOR *pMemOP);
diff --git a/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h b/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h
index 6822f48..9a9af4f 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/wb_vad.h
@@ -37,28 +37,28 @@
typedef struct
{
- Word16 bckr_est[COMPLEN]; /* background noise estimate */
- Word16 ave_level[COMPLEN]; /* averaged input components for stationary */
- /* estimation */
- Word16 old_level[COMPLEN]; /* input levels of the previous frame */
- Word16 sub_level[COMPLEN]; /* input levels calculated at the end of a frame (lookahead) */
- Word16 a_data5[F_5TH_CNT][2]; /* memory for the filter bank */
- Word16 a_data3[F_3TH_CNT]; /* memory for the filter bank */
+ Word16 bckr_est[COMPLEN]; /* background noise estimate */
+ Word16 ave_level[COMPLEN]; /* averaged input components for stationary */
+ /* estimation */
+ Word16 old_level[COMPLEN]; /* input levels of the previous frame */
+ Word16 sub_level[COMPLEN]; /* input levels calculated at the end of a frame (lookahead) */
+ Word16 a_data5[F_5TH_CNT][2]; /* memory for the filter bank */
+ Word16 a_data3[F_3TH_CNT]; /* memory for the filter bank */
- Word16 burst_count; /* counts length of a speech burst */
- Word16 hang_count; /* hangover counter */
- Word16 stat_count; /* stationary counter */
+ Word16 burst_count; /* counts length of a speech burst */
+ Word16 hang_count; /* hangover counter */
+ Word16 stat_count; /* stationary counter */
- /* Note that each of the following two variables holds 15 flags. Each flag reserves 1 bit of the
- * variable. The newest flag is in the bit 15 (assuming that LSB is bit 1 and MSB is bit 16). */
- Word16 vadreg; /* flags for intermediate VAD decisions */
- Word16 tone_flag; /* tone detection flags */
+ /* Note that each of the following two variables holds 15 flags. Each flag reserves 1 bit of the
+ * variable. The newest flag is in the bit 15 (assuming that LSB is bit 1 and MSB is bit 16). */
+ Word16 vadreg; /* flags for intermediate VAD decisions */
+ Word16 tone_flag; /* tone detection flags */
- Word16 sp_est_cnt; /* counter for speech level estimation */
- Word16 sp_max; /* maximum level */
- Word16 sp_max_cnt; /* counts frames that contains speech */
- Word16 speech_level; /* estimated speech level */
- Word32 prev_pow_sum; /* power of previous frame */
+ Word16 sp_est_cnt; /* counter for speech level estimation */
+ Word16 sp_max; /* maximum level */
+ Word16 sp_max_cnt; /* counts frames that contains speech */
+ Word16 speech_level; /* estimated speech level */
+ Word32 prev_pow_sum; /* power of previous frame */
} VadVars;
diff --git a/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h b/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h
index 04fd318..00b1779 100644
--- a/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h
+++ b/media/libstagefright/codecs/amrwbenc/inc/wb_vad_c.h
@@ -16,9 +16,9 @@
/*-------------------------------------------------------------------*
- * WB_VAD_C.H *
+ * WB_VAD_C.H *
*-------------------------------------------------------------------*
- * Constants for Voice Activity Detection. *
+ * Constants for Voice Activity Detection. *
*-------------------------------------------------------------------*/
#ifndef __WB_VAD_C_H__
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s
index 282db92..42ebc32 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Deemph_32_opt.s
@@ -99,6 +99,6 @@ LOOP:
LDMFD r13!, {r4 - r12, r15}
@ENDP
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s
index 4aa317e..3f060ff 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Dot_p_opt.s
@@ -75,6 +75,6 @@ Dot_product12_end:
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s
index f23b5a0..9cad479 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Filt_6k_7k_opt.s
@@ -183,6 +183,6 @@ Filt_6k_7k_end:
Lable1:
.word fir_6k_7k-Lable1
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s
index 49bdc2b..ffedbde 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Norm_Corr_opt.s
@@ -226,6 +226,6 @@ Norm_corr_asm_end:
ADD r13, r13, #voSTACK
LDMFD r13!, {r4 - r12, r15}
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s
index 3f4930c..9743b9e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/Syn_filt_32_opt.s
@@ -221,6 +221,6 @@ Syn_filt_32_end:
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s
index 71bb532..cd75179 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/convolve_opt.s
@@ -181,6 +181,6 @@ Convolve_asm_end:
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s
index 2d4c7cc..eedccc7 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/cor_h_vec_opt.s
@@ -143,7 +143,7 @@ the_end:
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s
index deb7efc..60c2a47 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/pred_lt4_1_opt.s
@@ -45,7 +45,8 @@ pred_lt4_asm:
SUBLT r5, r5, #2 @x--
SUB r5, r5, #30 @x -= 15
RSB r4, r2, #3 @k = 3 - frac
- ADRL r8, Table
+ ADR r8, Table
+ NOP @space for fixed up relative address of ADR
LDR r6, [r8]
ADD r6, r8
MOV r8, r4, LSL #6
@@ -456,7 +457,7 @@ pred_lt4_end:
Table:
.word inter4_2-Table
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s
index 5ff0964..d71d790 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/residu_asm_opt.s
@@ -220,7 +220,7 @@ end:
LDMFD r13!, {r4 -r12,pc}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s
index b300224..e8802f5 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/scale_sig_opt.s
@@ -67,7 +67,7 @@ The_end:
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s
index 0c287a4..2a1e0d7 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV5E/syn_filt_opt.s
@@ -233,6 +233,6 @@ Syn_filt_asm_end:
ADD r13, r13, #700
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s
index 1d5893f..91feea0 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Deemph_32_neon.s
@@ -98,5 +98,5 @@ LOOP:
LDMFD r13!, {r4 - r12, r15}
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s
index 8230944..7149a49 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Dot_p_neon.s
@@ -123,5 +123,5 @@ Dot_product12_end:
LDMFD r13!, {r4 - r12, r15}
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s
index 8df0caa..e0f992f 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Filt_6k_7k_neon.s
@@ -226,6 +226,6 @@ Filt_6k_7k_end:
Lable1:
.word fir_6k_7k-Lable1
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s
index 4263cd4..28e6d6c 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Norm_Corr_neon.s
@@ -265,6 +265,6 @@ Norm_corr_asm_end:
ADD r13, r13, #voSTACK
LDMFD r13!, {r4 - r12, r15}
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s
index e786dde..9687431 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/Syn_filt_32_neon.s
@@ -128,6 +128,6 @@ Syn_filt_32_end:
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s
index 8efa9fb..9fb3a6e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/convolve_neon.s
@@ -174,5 +174,5 @@ Convolve_asm_end:
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s
index 8904289..a4deda3 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/cor_h_vec_neon.s
@@ -143,7 +143,7 @@ LOOPj2:
the_end:
LDMFD r13!, {r4 - r12, r15}
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s
index 67be1ed..f8b634f 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/pred_lt4_1_neon.s
@@ -99,5 +99,5 @@ pred_lt4_end:
Lable1:
.word inter4_2-Lable1
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s
index 394fa83..bc3d780 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/residu_asm_neon.s
@@ -122,6 +122,6 @@ Residu_asm_end:
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s
index e45daac..89c0572 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/scale_sig_neon.s
@@ -133,6 +133,6 @@ Scale_sig_asm_end:
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s
index 5731bdb..029560e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s
+++ b/media/libstagefright/codecs/amrwbenc/src/asm/ARMV7/syn_filt_neon.s
@@ -101,6 +101,6 @@ Syn_filt_asm_end:
ADD r13, r13, #700
LDMFD r13!, {r4 - r12, r15}
@ENDFUNC
- .END
+ .end
diff --git a/media/libstagefright/codecs/amrwbenc/src/autocorr.c b/media/libstagefright/codecs/amrwbenc/src/autocorr.c
index 0b2ea89..3ea53f7 100644
--- a/media/libstagefright/codecs/amrwbenc/src/autocorr.c
+++ b/media/libstagefright/codecs/amrwbenc/src/autocorr.c
@@ -31,100 +31,100 @@
#define UNUSED(x) (void)(x)
void Autocorr(
- Word16 x[], /* (i) : Input signal */
- Word16 m, /* (i) : LPC order */
- Word16 r_h[], /* (o) Q15: Autocorrelations (msb) */
- Word16 r_l[] /* (o) : Autocorrelations (lsb) */
- )
+ Word16 x[], /* (i) : Input signal */
+ Word16 m, /* (i) : LPC order */
+ Word16 r_h[], /* (o) Q15: Autocorrelations (msb) */
+ Word16 r_l[] /* (o) : Autocorrelations (lsb) */
+ )
{
- Word32 i, norm, shift;
- Word16 y[L_WINDOW];
- Word32 L_sum, L_sum1, L_tmp, F_LEN;
- Word16 *p1,*p2,*p3;
- const Word16 *p4;
+ Word32 i, norm, shift;
+ Word16 y[L_WINDOW];
+ Word32 L_sum, L_sum1, L_tmp, F_LEN;
+ Word16 *p1,*p2,*p3;
+ const Word16 *p4;
UNUSED(m);
- /* Windowing of signal */
- p1 = x;
- p4 = vo_window;
- p3 = y;
-
- for (i = 0; i < L_WINDOW; i+=4)
- {
- *p3++ = vo_mult_r((*p1++), (*p4++));
- *p3++ = vo_mult_r((*p1++), (*p4++));
- *p3++ = vo_mult_r((*p1++), (*p4++));
- *p3++ = vo_mult_r((*p1++), (*p4++));
- }
-
- /* calculate energy of signal */
- L_sum = vo_L_deposit_h(16); /* sqrt(256), avoid overflow after rounding */
- for (i = 0; i < L_WINDOW; i++)
- {
- L_tmp = vo_L_mult(y[i], y[i]);
- L_tmp = (L_tmp >> 8);
- L_sum += L_tmp;
- }
-
- /* scale signal to avoid overflow in autocorrelation */
- norm = norm_l(L_sum);
- shift = 4 - (norm >> 1);
- if(shift > 0)
- {
- p1 = y;
- for (i = 0; i < L_WINDOW; i+=4)
- {
- *p1 = vo_shr_r(*p1, shift);
- p1++;
- *p1 = vo_shr_r(*p1, shift);
- p1++;
- *p1 = vo_shr_r(*p1, shift);
- p1++;
- *p1 = vo_shr_r(*p1, shift);
- p1++;
- }
- }
-
- /* Compute and normalize r[0] */
- L_sum = 1;
- for (i = 0; i < L_WINDOW; i+=4)
- {
- L_sum += vo_L_mult(y[i], y[i]);
- L_sum += vo_L_mult(y[i+1], y[i+1]);
- L_sum += vo_L_mult(y[i+2], y[i+2]);
- L_sum += vo_L_mult(y[i+3], y[i+3]);
- }
-
- norm = norm_l(L_sum);
- L_sum = (L_sum << norm);
-
- r_h[0] = L_sum >> 16;
- r_l[0] = (L_sum & 0xffff)>>1;
-
- /* Compute r[1] to r[m] */
- for (i = 1; i <= 8; i++)
- {
- L_sum1 = 0;
- L_sum = 0;
- F_LEN = (Word32)(L_WINDOW - 2*i);
- p1 = y;
- p2 = y + (2*i)-1;
- do{
- L_sum1 += *p1 * *p2++;
- L_sum += *p1++ * *p2;
- }while(--F_LEN!=0);
-
- L_sum1 += *p1 * *p2++;
-
- L_sum1 = L_sum1<<norm;
- L_sum = L_sum<<norm;
-
- r_h[(2*i)-1] = L_sum1 >> 15;
- r_l[(2*i)-1] = L_sum1 & 0x00007fff;
- r_h[(2*i)] = L_sum >> 15;
- r_l[(2*i)] = L_sum & 0x00007fff;
- }
- return;
+ /* Windowing of signal */
+ p1 = x;
+ p4 = vo_window;
+ p3 = y;
+
+ for (i = 0; i < L_WINDOW; i+=4)
+ {
+ *p3++ = vo_mult_r((*p1++), (*p4++));
+ *p3++ = vo_mult_r((*p1++), (*p4++));
+ *p3++ = vo_mult_r((*p1++), (*p4++));
+ *p3++ = vo_mult_r((*p1++), (*p4++));
+ }
+
+ /* calculate energy of signal */
+ L_sum = vo_L_deposit_h(16); /* sqrt(256), avoid overflow after rounding */
+ for (i = 0; i < L_WINDOW; i++)
+ {
+ L_tmp = vo_L_mult(y[i], y[i]);
+ L_tmp = (L_tmp >> 8);
+ L_sum += L_tmp;
+ }
+
+ /* scale signal to avoid overflow in autocorrelation */
+ norm = norm_l(L_sum);
+ shift = 4 - (norm >> 1);
+ if(shift > 0)
+ {
+ p1 = y;
+ for (i = 0; i < L_WINDOW; i+=4)
+ {
+ *p1 = vo_shr_r(*p1, shift);
+ p1++;
+ *p1 = vo_shr_r(*p1, shift);
+ p1++;
+ *p1 = vo_shr_r(*p1, shift);
+ p1++;
+ *p1 = vo_shr_r(*p1, shift);
+ p1++;
+ }
+ }
+
+ /* Compute and normalize r[0] */
+ L_sum = 1;
+ for (i = 0; i < L_WINDOW; i+=4)
+ {
+ L_sum += vo_L_mult(y[i], y[i]);
+ L_sum += vo_L_mult(y[i+1], y[i+1]);
+ L_sum += vo_L_mult(y[i+2], y[i+2]);
+ L_sum += vo_L_mult(y[i+3], y[i+3]);
+ }
+
+ norm = norm_l(L_sum);
+ L_sum = (L_sum << norm);
+
+ r_h[0] = L_sum >> 16;
+ r_l[0] = (L_sum & 0xffff)>>1;
+
+ /* Compute r[1] to r[m] */
+ for (i = 1; i <= 8; i++)
+ {
+ L_sum1 = 0;
+ L_sum = 0;
+ F_LEN = (Word32)(L_WINDOW - 2*i);
+ p1 = y;
+ p2 = y + (2*i)-1;
+ do{
+ L_sum1 += *p1 * *p2++;
+ L_sum += *p1++ * *p2;
+ }while(--F_LEN!=0);
+
+ L_sum1 += *p1 * *p2++;
+
+ L_sum1 = L_sum1<<norm;
+ L_sum = L_sum<<norm;
+
+ r_h[(2*i)-1] = L_sum1 >> 15;
+ r_l[(2*i)-1] = L_sum1 & 0x00007fff;
+ r_h[(2*i)] = L_sum >> 15;
+ r_l[(2*i)] = L_sum & 0x00007fff;
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/az_isp.c b/media/libstagefright/codecs/amrwbenc/src/az_isp.c
index 43db27a..d7074f0 100644
--- a/media/libstagefright/codecs/amrwbenc/src/az_isp.c
+++ b/media/libstagefright/codecs/amrwbenc/src/az_isp.c
@@ -58,138 +58,138 @@
static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n);
void Az_isp(
- Word16 a[], /* (i) Q12 : predictor coefficients */
- Word16 isp[], /* (o) Q15 : Immittance spectral pairs */
- Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */
- )
+ Word16 a[], /* (i) Q12 : predictor coefficients */
+ Word16 isp[], /* (o) Q15 : Immittance spectral pairs */
+ Word16 old_isp[] /* (i) : old isp[] (in case not found M roots) */
+ )
{
- Word32 i, j, nf, ip, order;
- Word16 xlow, ylow, xhigh, yhigh, xmid, ymid, xint;
- Word16 x, y, sign, exp;
- Word16 *coef;
- Word16 f1[NC + 1], f2[NC];
- Word32 t0;
- /*-------------------------------------------------------------*
- * find the sum and diff polynomials F1(z) and F2(z) *
- * F1(z) = [A(z) + z^M A(z^-1)] *
- * F2(z) = [A(z) - z^M A(z^-1)]/(1-z^-2) *
- * *
- * for (i=0; i<NC; i++) *
- * { *
- * f1[i] = a[i] + a[M-i]; *
- * f2[i] = a[i] - a[M-i]; *
- * } *
- * f1[NC] = 2.0*a[NC]; *
- * *
- * for (i=2; i<NC; i++) Divide by (1-z^-2) *
- * f2[i] += f2[i-2]; *
- *-------------------------------------------------------------*/
- for (i = 0; i < NC; i++)
- {
- t0 = a[i] << 15;
- f1[i] = vo_round(t0 + (a[M - i] << 15)); /* =(a[i]+a[M-i])/2 */
- f2[i] = vo_round(t0 - (a[M - i] << 15)); /* =(a[i]-a[M-i])/2 */
- }
- f1[NC] = a[NC];
- for (i = 2; i < NC; i++) /* Divide by (1-z^-2) */
- f2[i] = add1(f2[i], f2[i - 2]);
+ Word32 i, j, nf, ip, order;
+ Word16 xlow, ylow, xhigh, yhigh, xmid, ymid, xint;
+ Word16 x, y, sign, exp;
+ Word16 *coef;
+ Word16 f1[NC + 1], f2[NC];
+ Word32 t0;
+ /*-------------------------------------------------------------*
+ * find the sum and diff polynomials F1(z) and F2(z) *
+ * F1(z) = [A(z) + z^M A(z^-1)] *
+ * F2(z) = [A(z) - z^M A(z^-1)]/(1-z^-2) *
+ * *
+ * for (i=0; i<NC; i++) *
+ * { *
+ * f1[i] = a[i] + a[M-i]; *
+ * f2[i] = a[i] - a[M-i]; *
+ * } *
+ * f1[NC] = 2.0*a[NC]; *
+ * *
+ * for (i=2; i<NC; i++) Divide by (1-z^-2) *
+ * f2[i] += f2[i-2]; *
+ *-------------------------------------------------------------*/
+ for (i = 0; i < NC; i++)
+ {
+ t0 = a[i] << 15;
+ f1[i] = vo_round(t0 + (a[M - i] << 15)); /* =(a[i]+a[M-i])/2 */
+ f2[i] = vo_round(t0 - (a[M - i] << 15)); /* =(a[i]-a[M-i])/2 */
+ }
+ f1[NC] = a[NC];
+ for (i = 2; i < NC; i++) /* Divide by (1-z^-2) */
+ f2[i] = add1(f2[i], f2[i - 2]);
- /*---------------------------------------------------------------------*
- * Find the ISPs (roots of F1(z) and F2(z) ) using the *
- * Chebyshev polynomial evaluation. *
- * The roots of F1(z) and F2(z) are alternatively searched. *
- * We start by finding the first root of F1(z) then we switch *
- * to F2(z) then back to F1(z) and so on until all roots are found. *
- * *
- * - Evaluate Chebyshev pol. at grid points and check for sign change.*
- * - If sign change track the root by subdividing the interval *
- * 2 times and ckecking sign change. *
- *---------------------------------------------------------------------*/
- nf = 0; /* number of found frequencies */
- ip = 0; /* indicator for f1 or f2 */
- coef = f1;
- order = NC;
- xlow = vogrid[0];
- ylow = Chebps2(xlow, coef, order);
- j = 0;
- while ((nf < M - 1) && (j < GRID_POINTS))
- {
- j ++;
- xhigh = xlow;
- yhigh = ylow;
- xlow = vogrid[j];
- ylow = Chebps2(xlow, coef, order);
- if ((ylow * yhigh) <= (Word32) 0)
- {
- /* divide 2 times the interval */
- for (i = 0; i < 2; i++)
- {
- xmid = (xlow >> 1) + (xhigh >> 1); /* xmid = (xlow + xhigh)/2 */
- ymid = Chebps2(xmid, coef, order);
- if ((ylow * ymid) <= (Word32) 0)
- {
- yhigh = ymid;
- xhigh = xmid;
- } else
- {
- ylow = ymid;
- xlow = xmid;
- }
- }
- /*-------------------------------------------------------------*
- * Linear interpolation *
- * xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow); *
- *-------------------------------------------------------------*/
- x = xhigh - xlow;
- y = yhigh - ylow;
- if (y == 0)
- {
- xint = xlow;
- } else
- {
- sign = y;
- y = abs_s(y);
- exp = norm_s(y);
- y = y << exp;
- y = div_s((Word16) 16383, y);
- t0 = x * y;
- t0 = (t0 >> (19 - exp));
- y = vo_extract_l(t0); /* y= (xhigh-xlow)/(yhigh-ylow) in Q11 */
- if (sign < 0)
- y = -y;
- t0 = ylow * y; /* result in Q26 */
- t0 = (t0 >> 10); /* result in Q15 */
- xint = vo_sub(xlow, vo_extract_l(t0)); /* xint = xlow - ylow*y */
- }
- isp[nf] = xint;
- xlow = xint;
- nf++;
- if (ip == 0)
- {
- ip = 1;
- coef = f2;
- order = NC - 1;
- } else
- {
- ip = 0;
- coef = f1;
- order = NC;
- }
- ylow = Chebps2(xlow, coef, order);
- }
- }
- /* Check if M-1 roots found */
- if(nf < M - 1)
- {
- for (i = 0; i < M; i++)
- {
- isp[i] = old_isp[i];
- }
- } else
- {
- isp[M - 1] = a[M] << 3; /* From Q12 to Q15 with saturation */
- }
- return;
+ /*---------------------------------------------------------------------*
+ * Find the ISPs (roots of F1(z) and F2(z) ) using the *
+ * Chebyshev polynomial evaluation. *
+ * The roots of F1(z) and F2(z) are alternatively searched. *
+ * We start by finding the first root of F1(z) then we switch *
+ * to F2(z) then back to F1(z) and so on until all roots are found. *
+ * *
+ * - Evaluate Chebyshev pol. at grid points and check for sign change.*
+ * - If sign change track the root by subdividing the interval *
+ * 2 times and ckecking sign change. *
+ *---------------------------------------------------------------------*/
+ nf = 0; /* number of found frequencies */
+ ip = 0; /* indicator for f1 or f2 */
+ coef = f1;
+ order = NC;
+ xlow = vogrid[0];
+ ylow = Chebps2(xlow, coef, order);
+ j = 0;
+ while ((nf < M - 1) && (j < GRID_POINTS))
+ {
+ j ++;
+ xhigh = xlow;
+ yhigh = ylow;
+ xlow = vogrid[j];
+ ylow = Chebps2(xlow, coef, order);
+ if ((ylow * yhigh) <= (Word32) 0)
+ {
+ /* divide 2 times the interval */
+ for (i = 0; i < 2; i++)
+ {
+ xmid = (xlow >> 1) + (xhigh >> 1); /* xmid = (xlow + xhigh)/2 */
+ ymid = Chebps2(xmid, coef, order);
+ if ((ylow * ymid) <= (Word32) 0)
+ {
+ yhigh = ymid;
+ xhigh = xmid;
+ } else
+ {
+ ylow = ymid;
+ xlow = xmid;
+ }
+ }
+ /*-------------------------------------------------------------*
+ * Linear interpolation *
+ * xint = xlow - ylow*(xhigh-xlow)/(yhigh-ylow); *
+ *-------------------------------------------------------------*/
+ x = xhigh - xlow;
+ y = yhigh - ylow;
+ if (y == 0)
+ {
+ xint = xlow;
+ } else
+ {
+ sign = y;
+ y = abs_s(y);
+ exp = norm_s(y);
+ y = y << exp;
+ y = div_s((Word16) 16383, y);
+ t0 = x * y;
+ t0 = (t0 >> (19 - exp));
+ y = vo_extract_l(t0); /* y= (xhigh-xlow)/(yhigh-ylow) in Q11 */
+ if (sign < 0)
+ y = -y;
+ t0 = ylow * y; /* result in Q26 */
+ t0 = (t0 >> 10); /* result in Q15 */
+ xint = vo_sub(xlow, vo_extract_l(t0)); /* xint = xlow - ylow*y */
+ }
+ isp[nf] = xint;
+ xlow = xint;
+ nf++;
+ if (ip == 0)
+ {
+ ip = 1;
+ coef = f2;
+ order = NC - 1;
+ } else
+ {
+ ip = 0;
+ coef = f1;
+ order = NC;
+ }
+ ylow = Chebps2(xlow, coef, order);
+ }
+ }
+ /* Check if M-1 roots found */
+ if(nf < M - 1)
+ {
+ for (i = 0; i < M; i++)
+ {
+ isp[i] = old_isp[i];
+ }
+ } else
+ {
+ isp[M - 1] = a[M] << 3; /* From Q12 to Q15 with saturation */
+ }
+ return;
}
/*--------------------------------------------------------------*
@@ -213,55 +213,55 @@ void Az_isp(
static __inline Word16 Chebps2(Word16 x, Word16 f[], Word32 n)
{
- Word32 i, cheb;
- Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l;
- Word32 t0;
+ Word32 i, cheb;
+ Word16 b0_h, b0_l, b1_h, b1_l, b2_h, b2_l;
+ Word32 t0;
- /* Note: All computation are done in Q24. */
+ /* Note: All computation are done in Q24. */
- t0 = f[0] << 13;
- b2_h = t0 >> 16;
- b2_l = (t0 & 0xffff)>>1;
+ t0 = f[0] << 13;
+ b2_h = t0 >> 16;
+ b2_l = (t0 & 0xffff)>>1;
- t0 = ((b2_h * x)<<1) + (((b2_l * x)>>15)<<1);
- t0 <<= 1;
- t0 += (f[1] << 13); /* + f[1] in Q24 */
+ t0 = ((b2_h * x)<<1) + (((b2_l * x)>>15)<<1);
+ t0 <<= 1;
+ t0 += (f[1] << 13); /* + f[1] in Q24 */
- b1_h = t0 >> 16;
- b1_l = (t0 & 0xffff) >> 1;
+ b1_h = t0 >> 16;
+ b1_l = (t0 & 0xffff) >> 1;
- for (i = 2; i < n; i++)
- {
- t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);
+ for (i = 2; i < n; i++)
+ {
+ t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);
- t0 += (b2_h * (-16384))<<1;
- t0 += (f[i] << 12);
- t0 <<= 1;
- t0 -= (b2_l << 1); /* t0 = 2.0*x*b1 - b2 + f[i]; */
+ t0 += (b2_h * (-16384))<<1;
+ t0 += (f[i] << 12);
+ t0 <<= 1;
+ t0 -= (b2_l << 1); /* t0 = 2.0*x*b1 - b2 + f[i]; */
- b0_h = t0 >> 16;
- b0_l = (t0 & 0xffff) >> 1;
+ b0_h = t0 >> 16;
+ b0_l = (t0 & 0xffff) >> 1;
- b2_l = b1_l; /* b2 = b1; */
- b2_h = b1_h;
- b1_l = b0_l; /* b1 = b0; */
- b1_h = b0_h;
- }
+ b2_l = b1_l; /* b2 = b1; */
+ b2_h = b1_h;
+ b1_l = b0_l; /* b1 = b0; */
+ b1_h = b0_h;
+ }
- t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);
- t0 += (b2_h * (-32768))<<1; /* t0 = x*b1 - b2 */
- t0 -= (b2_l << 1);
- t0 += (f[n] << 12); /* t0 = x*b1 - b2 + f[i]/2 */
+ t0 = ((b1_h * x)<<1) + (((b1_l * x)>>15)<<1);
+ t0 += (b2_h * (-32768))<<1; /* t0 = x*b1 - b2 */
+ t0 -= (b2_l << 1);
+ t0 += (f[n] << 12); /* t0 = x*b1 - b2 + f[i]/2 */
- t0 = L_shl2(t0, 6); /* Q24 to Q30 with saturation */
+ t0 = L_shl2(t0, 6); /* Q24 to Q30 with saturation */
- cheb = extract_h(t0); /* Result in Q14 */
+ cheb = extract_h(t0); /* Result in Q14 */
- if (cheb == -32768)
- {
- cheb = -32767; /* to avoid saturation in Az_isp */
- }
- return (cheb);
+ if (cheb == -32768)
+ {
+ cheb = -32767; /* to avoid saturation in Az_isp */
+ }
+ return (cheb);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/bits.c b/media/libstagefright/codecs/amrwbenc/src/bits.c
index e78dc1f..6b8bddd 100644
--- a/media/libstagefright/codecs/amrwbenc/src/bits.c
+++ b/media/libstagefright/codecs/amrwbenc/src/bits.c
@@ -17,7 +17,7 @@
/***********************************************************************
File: bits.c
- Description: Performs bit stream manipulation
+ Description: Performs bit stream manipulation
************************************************************************/
@@ -33,151 +33,151 @@
int PackBits(Word16 prms[], /* i: analysis parameters */
- Word16 coding_mode, /* i: coding bit-stream ratio mode */
- Word16 mode, /* i: coding bit-stream ratio mode*/
- Coder_State *st /*i/o: coder global parameters struct */
- )
+ Word16 coding_mode, /* i: coding bit-stream ratio mode */
+ Word16 mode, /* i: coding bit-stream ratio mode*/
+ Coder_State *st /*i/o: coder global parameters struct */
+ )
{
- Word16 i, frame_type;
- UWord8 temp;
- UWord8 *stream_ptr;
- Word16 bitstreamformat = st->frameType;
-
- unsigned short* dataOut = st->outputStream;
-
- if (coding_mode == MRDTX)
- {
- st->sid_update_counter--;
-
- if (st->prev_ft == TX_SPEECH)
- {
- frame_type = TX_SID_FIRST;
- st->sid_update_counter = 3;
- } else
- {
- if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2))
- {
- /* ensure extra updates are properly delayed after a possible SID_FIRST */
- frame_type = TX_SID_UPDATE;
- st->sid_handover_debt--;
- } else
- {
- if (st->sid_update_counter == 0)
- {
- frame_type = TX_SID_UPDATE;
- st->sid_update_counter = 8;
- } else
- {
- frame_type = TX_NO_DATA;
- }
- }
- }
- } else
- {
- st->sid_update_counter = 8;
- frame_type = TX_SPEECH;
- }
- st->prev_ft = frame_type;
-
- if(bitstreamformat == 0) /* default file format */
- {
- *(dataOut) = TX_FRAME_TYPE;
- *(dataOut + 1) = frame_type;
- *(dataOut + 2) = mode;
- for (i = 0; i < nb_of_bits[coding_mode]; i++)
- {
- *(dataOut + 3 + i) = prms[i];
- }
- return (3 + nb_of_bits[coding_mode])<<1;
- } else
- {
- if (bitstreamformat == 1) /* ITU file format */
- {
- *(dataOut) = 0x6b21;
- if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST)
- {
- *(dataOut + 1) = nb_of_bits[coding_mode];
- for (i = 0; i < nb_of_bits[coding_mode]; i++)
- {
- if(prms[i] == BIT_0){
- *(dataOut + 2 + i) = BIT_0_ITU;
- }
- else{
- *(dataOut + 2 + i) = BIT_1_ITU;
- }
- }
- return (2 + nb_of_bits[coding_mode])<<1;
- } else
- {
- *(dataOut + 1) = 0;
- return 2<<1;
- }
- } else /* MIME/storage file format */
- {
+ Word16 i, frame_type;
+ UWord8 temp;
+ UWord8 *stream_ptr;
+ Word16 bitstreamformat = st->frameType;
+
+ unsigned short* dataOut = st->outputStream;
+
+ if (coding_mode == MRDTX)
+ {
+ st->sid_update_counter--;
+
+ if (st->prev_ft == TX_SPEECH)
+ {
+ frame_type = TX_SID_FIRST;
+ st->sid_update_counter = 3;
+ } else
+ {
+ if ((st->sid_handover_debt > 0) && (st->sid_update_counter > 2))
+ {
+ /* ensure extra updates are properly delayed after a possible SID_FIRST */
+ frame_type = TX_SID_UPDATE;
+ st->sid_handover_debt--;
+ } else
+ {
+ if (st->sid_update_counter == 0)
+ {
+ frame_type = TX_SID_UPDATE;
+ st->sid_update_counter = 8;
+ } else
+ {
+ frame_type = TX_NO_DATA;
+ }
+ }
+ }
+ } else
+ {
+ st->sid_update_counter = 8;
+ frame_type = TX_SPEECH;
+ }
+ st->prev_ft = frame_type;
+
+ if(bitstreamformat == 0) /* default file format */
+ {
+ *(dataOut) = TX_FRAME_TYPE;
+ *(dataOut + 1) = frame_type;
+ *(dataOut + 2) = mode;
+ for (i = 0; i < nb_of_bits[coding_mode]; i++)
+ {
+ *(dataOut + 3 + i) = prms[i];
+ }
+ return (3 + nb_of_bits[coding_mode])<<1;
+ } else
+ {
+ if (bitstreamformat == 1) /* ITU file format */
+ {
+ *(dataOut) = 0x6b21;
+ if(frame_type != TX_NO_DATA && frame_type != TX_SID_FIRST)
+ {
+ *(dataOut + 1) = nb_of_bits[coding_mode];
+ for (i = 0; i < nb_of_bits[coding_mode]; i++)
+ {
+ if(prms[i] == BIT_0){
+ *(dataOut + 2 + i) = BIT_0_ITU;
+ }
+ else{
+ *(dataOut + 2 + i) = BIT_1_ITU;
+ }
+ }
+ return (2 + nb_of_bits[coding_mode])<<1;
+ } else
+ {
+ *(dataOut + 1) = 0;
+ return 2<<1;
+ }
+ } else /* MIME/storage file format */
+ {
#define MRSID 9
- /* change mode index in case of SID frame */
- if (coding_mode == MRDTX)
- {
- coding_mode = MRSID;
- if (frame_type == TX_SID_FIRST)
- {
- for (i = 0; i < NBBITS_SID; i++) prms[i] = BIT_0;
- }
- }
- /* -> force NO_DATA frame */
- if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14))
- {
- coding_mode = 15;
- }
- /* mark empty frames between SID updates as NO_DATA frames */
- if (coding_mode == MRSID && frame_type == TX_NO_DATA)
- {
- coding_mode = 15;
- }
- /* set pointer for packed frame, note that we handle data as bytes */
- stream_ptr = (UWord8*)dataOut;
- /* insert table of contents (ToC) byte at the beginning of the packet */
- *stream_ptr = toc_byte[coding_mode];
- stream_ptr++;
- temp = 0;
- /* sort and pack AMR-WB speech or SID bits */
- for (i = 1; i < unpacked_size[coding_mode] + 1; i++)
- {
- if (prms[sort_ptr[coding_mode][i-1]] == BIT_1)
- {
- temp++;
- }
- if (i&0x7)
- {
- temp <<= 1;
- }
- else
- {
- *stream_ptr = temp;
- stream_ptr++;
- temp = 0;
- }
- }
- /* insert SID type indication and speech mode in case of SID frame */
- if (coding_mode == MRSID)
- {
- if (frame_type == TX_SID_UPDATE)
- {
- temp++;
- }
- temp <<= 4;
- temp += mode & 0x000F;
- }
- /* insert unused bits (zeros) at the tail of the last byte */
- if (unused_size[coding_mode])
- {
- temp <<= (unused_size[coding_mode] - 1);
- }
- *stream_ptr = temp;
- /* write packed frame into file (1 byte added to cover ToC entry) */
- return (1 + packed_size[coding_mode]);
- }
- }
+ /* change mode index in case of SID frame */
+ if (coding_mode == MRDTX)
+ {
+ coding_mode = MRSID;
+ if (frame_type == TX_SID_FIRST)
+ {
+ for (i = 0; i < NBBITS_SID; i++) prms[i] = BIT_0;
+ }
+ }
+ /* -> force NO_DATA frame */
+ if (coding_mode < 0 || coding_mode > 15 || (coding_mode > MRSID && coding_mode < 14))
+ {
+ coding_mode = 15;
+ }
+ /* mark empty frames between SID updates as NO_DATA frames */
+ if (coding_mode == MRSID && frame_type == TX_NO_DATA)
+ {
+ coding_mode = 15;
+ }
+ /* set pointer for packed frame, note that we handle data as bytes */
+ stream_ptr = (UWord8*)dataOut;
+ /* insert table of contents (ToC) byte at the beginning of the packet */
+ *stream_ptr = toc_byte[coding_mode];
+ stream_ptr++;
+ temp = 0;
+ /* sort and pack AMR-WB speech or SID bits */
+ for (i = 1; i < unpacked_size[coding_mode] + 1; i++)
+ {
+ if (prms[sort_ptr[coding_mode][i-1]] == BIT_1)
+ {
+ temp++;
+ }
+ if (i&0x7)
+ {
+ temp <<= 1;
+ }
+ else
+ {
+ *stream_ptr = temp;
+ stream_ptr++;
+ temp = 0;
+ }
+ }
+ /* insert SID type indication and speech mode in case of SID frame */
+ if (coding_mode == MRSID)
+ {
+ if (frame_type == TX_SID_UPDATE)
+ {
+ temp++;
+ }
+ temp <<= 4;
+ temp += mode & 0x000F;
+ }
+ /* insert unused bits (zeros) at the tail of the last byte */
+ if (unused_size[coding_mode])
+ {
+ temp <<= (unused_size[coding_mode] - 1);
+ }
+ *stream_ptr = temp;
+ /* write packed frame into file (1 byte added to cover ToC entry) */
+ return (1 + packed_size[coding_mode]);
+ }
+ }
}
/*-----------------------------------------------------*
@@ -185,24 +185,24 @@ int PackBits(Word16 prms[], /* i: analysis parameters */
*-----------------------------------------------------*/
void Parm_serial(
- Word16 value, /* input : parameter value */
- Word16 no_of_bits, /* input : number of bits */
- Word16 ** prms
- )
+ Word16 value, /* input : parameter value */
+ Word16 no_of_bits, /* input : number of bits */
+ Word16 ** prms
+ )
{
- Word16 i, bit;
- *prms += no_of_bits;
- for (i = 0; i < no_of_bits; i++)
- {
- bit = (Word16) (value & 0x0001); /* get lsb */
- if (bit == 0)
- *--(*prms) = BIT_0;
- else
- *--(*prms) = BIT_1;
- value >>= 1;
- }
- *prms += no_of_bits;
- return;
+ Word16 i, bit;
+ *prms += no_of_bits;
+ for (i = 0; i < no_of_bits; i++)
+ {
+ bit = (Word16) (value & 0x0001); /* get lsb */
+ if (bit == 0)
+ *--(*prms) = BIT_0;
+ else
+ *--(*prms) = BIT_1;
+ value >>= 1;
+ }
+ *prms += no_of_bits;
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
index 519924d..c7c9279 100644
--- a/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
+++ b/media/libstagefright/codecs/amrwbenc/src/c2t64fx.c
@@ -17,7 +17,7 @@
/************************************************************************
* File: c2t64fx.c *
* *
-* Description:Performs algebraic codebook search for 6.60kbits mode*
+* Description:Performs algebraic codebook search for 6.60kbits mode*
* *
*************************************************************************/
@@ -45,255 +45,255 @@
**************************************************************************/
void ACELP_2t64_fx(
- Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
- Word16 cn[], /* (i) <12b : residual after long term prediction */
- Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
- Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
- Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
- Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */
- )
+ Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
+ Word16 cn[], /* (i) <12b : residual after long term prediction */
+ Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
+ Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
+ Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
+ Word16 * index /* (o) : index (12): 5+1+5+1 = 11 bits. */
+ )
{
- Word32 i, j, k, i0, i1, ix, iy, pos, pos2;
- Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;
- Word16 alp, val, exp, k_cn, k_dn;
- Word16 *p0, *p1, *p2, *psign;
- Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
+ Word32 i, j, k, i0, i1, ix, iy, pos, pos2;
+ Word16 ps, psk, ps1, ps2, alpk, alp1, alp2, sq;
+ Word16 alp, val, exp, k_cn, k_dn;
+ Word16 *p0, *p1, *p2, *psign;
+ Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf;
- Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];
- Word16 h_buf[4 * L_SUBFR] = {0};
- Word16 rrixix[NB_TRACK][NB_POS];
- Word16 rrixiy[MSIZE];
- Word32 s, cor;
+ Word16 sign[L_SUBFR], vec[L_SUBFR], dn2[L_SUBFR];
+ Word16 h_buf[4 * L_SUBFR] = {0};
+ Word16 rrixix[NB_TRACK][NB_POS];
+ Word16 rrixiy[MSIZE];
+ Word32 s, cor;
- /*----------------------------------------------------------------*
- * Find sign for each pulse position. *
- *----------------------------------------------------------------*/
- alp = 8192; /* alp = 2.0 (Q12) */
+ /*----------------------------------------------------------------*
+ * Find sign for each pulse position. *
+ *----------------------------------------------------------------*/
+ alp = 8192; /* alp = 2.0 (Q12) */
- /* calculate energy for normalization of cn[] and dn[] */
- /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
+ /* calculate energy for normalization of cn[] and dn[] */
+ /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
#ifdef ASM_OPT /* asm optimization branch */
- s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
+ s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
#else
- s = Dot_product12(cn, cn, L_SUBFR, &exp);
+ s = Dot_product12(cn, cn, L_SUBFR, &exp);
#endif
- Isqrt_n(&s, &exp);
- s = L_shl(s, add1(exp, 5));
- if (s > INT_MAX - 0x8000) {
- s = INT_MAX - 0x8000;
- }
- k_cn = vo_round(s);
+ Isqrt_n(&s, &exp);
+ s = L_shl(s, add1(exp, 5));
+ if (s > INT_MAX - 0x8000) {
+ s = INT_MAX - 0x8000;
+ }
+ k_cn = vo_round(s);
- /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
+ /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
#ifdef ASM_OPT /* asm optimization branch */
- s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
+ s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
#else
- s = Dot_product12(dn, dn, L_SUBFR, &exp);
+ s = Dot_product12(dn, dn, L_SUBFR, &exp);
#endif
- Isqrt_n(&s, &exp);
- k_dn = vo_round(L_shl(s, (exp + 8))); /* k_dn = 256..4096 */
- k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */
+ Isqrt_n(&s, &exp);
+ k_dn = vo_round(L_shl(s, (exp + 8))); /* k_dn = 256..4096 */
+ k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */
- /* mix normalized cn[] and dn[] */
- p0 = cn;
- p1 = dn;
- p2 = dn2;
+ /* mix normalized cn[] and dn[] */
+ p0 = cn;
+ p1 = dn;
+ p2 = dn2;
- for (i = 0; i < L_SUBFR/4; i++)
- {
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- }
+ for (i = 0; i < L_SUBFR/4; i++)
+ {
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ }
- /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */
- for (i = 0; i < L_SUBFR; i ++)
- {
- val = dn[i];
- ps = dn2[i];
- if (ps >= 0)
- {
- sign[i] = 32767; /* sign = +1 (Q12) */
- vec[i] = -32768;
- } else
- {
- sign[i] = -32768; /* sign = -1 (Q12) */
- vec[i] = 32767;
- dn[i] = -val;
- }
- }
- /*------------------------------------------------------------*
- * Compute h_inv[i]. *
- *------------------------------------------------------------*/
- /* impulse response buffer for fast computation */
- h = h_buf + L_SUBFR;
- h_inv = h + (L_SUBFR<<1);
+ /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */
+ for (i = 0; i < L_SUBFR; i ++)
+ {
+ val = dn[i];
+ ps = dn2[i];
+ if (ps >= 0)
+ {
+ sign[i] = 32767; /* sign = +1 (Q12) */
+ vec[i] = -32768;
+ } else
+ {
+ sign[i] = -32768; /* sign = -1 (Q12) */
+ vec[i] = 32767;
+ dn[i] = -val;
+ }
+ }
+ /*------------------------------------------------------------*
+ * Compute h_inv[i]. *
+ *------------------------------------------------------------*/
+ /* impulse response buffer for fast computation */
+ h = h_buf + L_SUBFR;
+ h_inv = h + (L_SUBFR<<1);
- for (i = 0; i < L_SUBFR; i++)
- {
- h[i] = H[i];
- h_inv[i] = vo_negate(h[i]);
- }
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ h[i] = H[i];
+ h_inv[i] = vo_negate(h[i]);
+ }
- /*------------------------------------------------------------*
- * Compute rrixix[][] needed for the codebook search. *
- * Result is multiplied by 0.5 *
- *------------------------------------------------------------*/
- /* Init pointers to last position of rrixix[] */
- p0 = &rrixix[0][NB_POS - 1];
- p1 = &rrixix[1][NB_POS - 1];
+ /*------------------------------------------------------------*
+ * Compute rrixix[][] needed for the codebook search. *
+ * Result is multiplied by 0.5 *
+ *------------------------------------------------------------*/
+ /* Init pointers to last position of rrixix[] */
+ p0 = &rrixix[0][NB_POS - 1];
+ p1 = &rrixix[1][NB_POS - 1];
- ptr_h1 = h;
- cor = 0x00010000L; /* for rounding */
- for (i = 0; i < NB_POS; i++)
- {
- cor += ((*ptr_h1) * (*ptr_h1) << 1);
- ptr_h1++;
- *p1-- = (extract_h(cor) >> 1);
- cor += ((*ptr_h1) * (*ptr_h1) << 1);
- ptr_h1++;
- *p0-- = (extract_h(cor) >> 1);
- }
+ ptr_h1 = h;
+ cor = 0x00010000L; /* for rounding */
+ for (i = 0; i < NB_POS; i++)
+ {
+ cor += ((*ptr_h1) * (*ptr_h1) << 1);
+ ptr_h1++;
+ *p1-- = (extract_h(cor) >> 1);
+ cor += ((*ptr_h1) * (*ptr_h1) << 1);
+ ptr_h1++;
+ *p0-- = (extract_h(cor) >> 1);
+ }
- /*------------------------------------------------------------*
- * Compute rrixiy[][] needed for the codebook search. *
- *------------------------------------------------------------*/
- pos = MSIZE - 1;
- pos2 = MSIZE - 2;
- ptr_hf = h + 1;
+ /*------------------------------------------------------------*
+ * Compute rrixiy[][] needed for the codebook search. *
+ *------------------------------------------------------------*/
+ pos = MSIZE - 1;
+ pos2 = MSIZE - 2;
+ ptr_hf = h + 1;
- for (k = 0; k < NB_POS; k++)
- {
- p1 = &rrixiy[pos];
- p0 = &rrixiy[pos2];
- cor = 0x00008000L; /* for rounding */
- ptr_h1 = h;
- ptr_h2 = ptr_hf;
+ for (k = 0; k < NB_POS; k++)
+ {
+ p1 = &rrixiy[pos];
+ p0 = &rrixiy[pos2];
+ cor = 0x00008000L; /* for rounding */
+ ptr_h1 = h;
+ ptr_h2 = ptr_hf;
- for (i = (k + 1); i < NB_POS; i++)
- {
- cor += ((*ptr_h1) * (*ptr_h2))<<1;
- ptr_h1++;
- ptr_h2++;
- *p1 = extract_h(cor);
- cor += ((*ptr_h1) * (*ptr_h2))<<1;
- ptr_h1++;
- ptr_h2++;
- *p0 = extract_h(cor);
+ for (i = (k + 1); i < NB_POS; i++)
+ {
+ cor += ((*ptr_h1) * (*ptr_h2))<<1;
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+ cor += ((*ptr_h1) * (*ptr_h2))<<1;
+ ptr_h1++;
+ ptr_h2++;
+ *p0 = extract_h(cor);
- p1 -= (NB_POS + 1);
- p0 -= (NB_POS + 1);
- }
- cor += ((*ptr_h1) * (*ptr_h2))<<1;
- ptr_h1++;
- ptr_h2++;
- *p1 = extract_h(cor);
+ p1 -= (NB_POS + 1);
+ p0 -= (NB_POS + 1);
+ }
+ cor += ((*ptr_h1) * (*ptr_h2))<<1;
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
- pos -= NB_POS;
- pos2--;
- ptr_hf += STEP;
- }
+ pos -= NB_POS;
+ pos2--;
+ ptr_hf += STEP;
+ }
- /*------------------------------------------------------------*
- * Modification of rrixiy[][] to take signs into account. *
- *------------------------------------------------------------*/
- p0 = rrixiy;
- for (i = 0; i < L_SUBFR; i += STEP)
- {
- psign = sign;
- if (psign[i] < 0)
- {
- psign = vec;
- }
- for (j = 1; j < L_SUBFR; j += STEP)
- {
- *p0 = vo_mult(*p0, psign[j]);
- p0++;
- }
- }
- /*-------------------------------------------------------------------*
- * search 2 pulses: *
- * ~@~~~~~~~~~~~~~~ *
- * 32 pos x 32 pos = 1024 tests (all combinaisons is tested) *
- *-------------------------------------------------------------------*/
- p0 = rrixix[0];
- p1 = rrixix[1];
- p2 = rrixiy;
+ /*------------------------------------------------------------*
+ * Modification of rrixiy[][] to take signs into account. *
+ *------------------------------------------------------------*/
+ p0 = rrixiy;
+ for (i = 0; i < L_SUBFR; i += STEP)
+ {
+ psign = sign;
+ if (psign[i] < 0)
+ {
+ psign = vec;
+ }
+ for (j = 1; j < L_SUBFR; j += STEP)
+ {
+ *p0 = vo_mult(*p0, psign[j]);
+ p0++;
+ }
+ }
+ /*-------------------------------------------------------------------*
+ * search 2 pulses: *
+ * ~@~~~~~~~~~~~~~~ *
+ * 32 pos x 32 pos = 1024 tests (all combinaisons is tested) *
+ *-------------------------------------------------------------------*/
+ p0 = rrixix[0];
+ p1 = rrixix[1];
+ p2 = rrixiy;
- psk = -1;
- alpk = 1;
- ix = 0;
- iy = 1;
+ psk = -1;
+ alpk = 1;
+ ix = 0;
+ iy = 1;
- for (i0 = 0; i0 < L_SUBFR; i0 += STEP)
- {
- ps1 = dn[i0];
- alp1 = (*p0++);
- pos = -1;
- for (i1 = 1; i1 < L_SUBFR; i1 += STEP)
- {
- ps2 = add1(ps1, dn[i1]);
- alp2 = add1(alp1, add1(*p1++, *p2++));
- sq = vo_mult(ps2, ps2);
- s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1);
- if (s > 0)
- {
- psk = sq;
- alpk = alp2;
- pos = i1;
- }
- }
- p1 -= NB_POS;
- if (pos >= 0)
- {
- ix = i0;
- iy = pos;
- }
- }
- /*-------------------------------------------------------------------*
- * Build the codeword, the filtered codeword and index of codevector.*
- *-------------------------------------------------------------------*/
+ for (i0 = 0; i0 < L_SUBFR; i0 += STEP)
+ {
+ ps1 = dn[i0];
+ alp1 = (*p0++);
+ pos = -1;
+ for (i1 = 1; i1 < L_SUBFR; i1 += STEP)
+ {
+ ps2 = add1(ps1, dn[i1]);
+ alp2 = add1(alp1, add1(*p1++, *p2++));
+ sq = vo_mult(ps2, ps2);
+ s = vo_L_mult(alpk, sq) - ((psk * alp2)<<1);
+ if (s > 0)
+ {
+ psk = sq;
+ alpk = alp2;
+ pos = i1;
+ }
+ }
+ p1 -= NB_POS;
+ if (pos >= 0)
+ {
+ ix = i0;
+ iy = pos;
+ }
+ }
+ /*-------------------------------------------------------------------*
+ * Build the codeword, the filtered codeword and index of codevector.*
+ *-------------------------------------------------------------------*/
- for (i = 0; i < L_SUBFR; i++)
- {
- code[i] = 0;
- }
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ code[i] = 0;
+ }
- i0 = (ix >> 1); /* pos of pulse 1 (0..31) */
- i1 = (iy >> 1); /* pos of pulse 2 (0..31) */
- if (sign[ix] > 0)
- {
- code[ix] = 512; /* codeword in Q9 format */
- p0 = h - ix;
- } else
- {
- code[ix] = -512;
- i0 += NB_POS;
- p0 = h_inv - ix;
- }
- if (sign[iy] > 0)
- {
- code[iy] = 512;
- p1 = h - iy;
- } else
- {
- code[iy] = -512;
- i1 += NB_POS;
- p1 = h_inv - iy;
- }
- *index = add1((i0 << 6), i1);
- for (i = 0; i < L_SUBFR; i++)
- {
- y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3);
- }
- return;
+ i0 = (ix >> 1); /* pos of pulse 1 (0..31) */
+ i1 = (iy >> 1); /* pos of pulse 2 (0..31) */
+ if (sign[ix] > 0)
+ {
+ code[ix] = 512; /* codeword in Q9 format */
+ p0 = h - ix;
+ } else
+ {
+ code[ix] = -512;
+ i0 += NB_POS;
+ p0 = h_inv - ix;
+ }
+ if (sign[iy] > 0)
+ {
+ code[iy] = 512;
+ p1 = h - iy;
+ } else
+ {
+ code[iy] = -512;
+ i1 += NB_POS;
+ p1 = h_inv - iy;
+ }
+ *index = add1((i0 << 6), i1);
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ y[i] = vo_shr_r(add1((*p0++), (*p1++)), 3);
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c
index 6505e5d..b9a9e26 100644
--- a/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c
+++ b/media/libstagefright/codecs/amrwbenc/src/c4t64fx.c
@@ -17,7 +17,7 @@
/***********************************************************************
* File: c4t64fx.c *
* *
-* Description:Performs algebraic codebook search for higher modes *
+* Description:Performs algebraic codebook search for higher modes *
* *
************************************************************************/
@@ -48,15 +48,15 @@
#include "q_pulse.h"
static Word16 tipos[36] = {
- 0, 1, 2, 3, /* starting point &ipos[0], 1st iter */
- 1, 2, 3, 0, /* starting point &ipos[4], 2nd iter */
- 2, 3, 0, 1, /* starting point &ipos[8], 3rd iter */
- 3, 0, 1, 2, /* starting point &ipos[12], 4th iter */
- 0, 1, 2, 3,
- 1, 2, 3, 0,
- 2, 3, 0, 1,
- 3, 0, 1, 2,
- 0, 1, 2, 3}; /* end point for 24 pulses &ipos[35], 4th iter */
+ 0, 1, 2, 3, /* starting point &ipos[0], 1st iter */
+ 1, 2, 3, 0, /* starting point &ipos[4], 2nd iter */
+ 2, 3, 0, 1, /* starting point &ipos[8], 3rd iter */
+ 3, 0, 1, 2, /* starting point &ipos[12], 4th iter */
+ 0, 1, 2, 3,
+ 1, 2, 3, 0,
+ 2, 3, 0, 1,
+ 3, 0, 1, 2,
+ 0, 1, 2, 3}; /* end point for 24 pulses &ipos[35], 4th iter */
#define NB_PULSE_MAX 24
@@ -70,759 +70,759 @@ static Word16 tipos[36] = {
/* Private functions */
void cor_h_vec_012(
- Word16 h[], /* (i) scaled impulse response */
- Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
- Word16 track, /* (i) track to use */
- Word16 sign[], /* (i) sign vector */
- Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
- Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
- Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
- );
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ );
void cor_h_vec_012_asm(
- Word16 h[], /* (i) scaled impulse response */
- Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
- Word16 track, /* (i) track to use */
- Word16 sign[], /* (i) sign vector */
- Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
- Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
- Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
- );
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ );
void cor_h_vec_30(
- Word16 h[], /* (i) scaled impulse response */
- Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
- Word16 track, /* (i) track to use */
- Word16 sign[], /* (i) sign vector */
- Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
- Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
- Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
- );
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ );
void search_ixiy(
- Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */
- Word16 track_x, /* (i) track of pulse 1 */
- Word16 track_y, /* (i) track of pulse 2 */
- Word16 * ps, /* (i/o) correlation of all fixed pulses */
- Word16 * alp, /* (i/o) energy of all fixed pulses */
- Word16 * ix, /* (o) position of pulse 1 */
- Word16 * iy, /* (o) position of pulse 2 */
- Word16 dn[], /* (i) corr. between target and h[] */
- Word16 dn2[], /* (i) vector of selected positions */
- Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */
- Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */
- Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */
- );
+ Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */
+ Word16 track_x, /* (i) track of pulse 1 */
+ Word16 track_y, /* (i) track of pulse 2 */
+ Word16 * ps, /* (i/o) correlation of all fixed pulses */
+ Word16 * alp, /* (i/o) energy of all fixed pulses */
+ Word16 * ix, /* (o) position of pulse 1 */
+ Word16 * iy, /* (o) position of pulse 2 */
+ Word16 dn[], /* (i) corr. between target and h[] */
+ Word16 dn2[], /* (i) vector of selected positions */
+ Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */
+ Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */
+ Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */
+ );
void ACELP_4t64_fx(
- Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
- Word16 cn[], /* (i) <12b : residual after long term prediction */
- Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
- Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
- Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
- Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */
- Word16 ser_size, /* (i) : bit rate */
- Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */
- /* (o) : index (36): 9+9+9+9 = 36 bits. */
- /* (o) : index (44): 13+9+13+9 = 44 bits. */
- /* (o) : index (52): 13+13+13+13 = 52 bits. */
- /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */
- /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */
- /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
- )
+ Word16 dn[], /* (i) <12b : correlation between target x[] and H[] */
+ Word16 cn[], /* (i) <12b : residual after long term prediction */
+ Word16 H[], /* (i) Q12: impulse response of weighted synthesis filter */
+ Word16 code[], /* (o) Q9 : algebraic (fixed) codebook excitation */
+ Word16 y[], /* (o) Q9 : filtered fixed codebook excitation */
+ Word16 nbbits, /* (i) : 20, 36, 44, 52, 64, 72 or 88 bits */
+ Word16 ser_size, /* (i) : bit rate */
+ Word16 _index[] /* (o) : index (20): 5+5+5+5 = 20 bits. */
+ /* (o) : index (36): 9+9+9+9 = 36 bits. */
+ /* (o) : index (44): 13+9+13+9 = 44 bits. */
+ /* (o) : index (52): 13+13+13+13 = 52 bits. */
+ /* (o) : index (64): 2+2+2+2+14+14+14+14 = 64 bits. */
+ /* (o) : index (72): 10+2+10+2+10+14+10+14 = 72 bits. */
+ /* (o) : index (88): 11+11+11+11+11+11+11+11 = 88 bits. */
+ )
{
- Word32 i, j, k;
- Word16 st, ix, iy, pos, index, track, nb_pulse, nbiter, j_temp;
- Word16 psk, ps, alpk, alp, val, k_cn, k_dn, exp;
- Word16 *p0, *p1, *p2, *p3, *psign;
- Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf, h_shift;
- Word32 s, cor, L_tmp, L_index;
- Word16 dn2[L_SUBFR], sign[L_SUBFR], vec[L_SUBFR];
- Word16 ind[NPMAXPT * NB_TRACK];
- Word16 codvec[NB_PULSE_MAX], nbpos[10];
- Word16 cor_x[NB_POS], cor_y[NB_POS], pos_max[NB_TRACK];
- Word16 h_buf[4 * L_SUBFR];
- Word16 rrixix[NB_TRACK][NB_POS], rrixiy[NB_TRACK][MSIZE];
- Word16 ipos[NB_PULSE_MAX];
-
- switch (nbbits)
- {
- case 20: /* 20 bits, 4 pulses, 4 tracks */
- nbiter = 4; /* 4x16x16=1024 loop */
- alp = 8192; /* alp = 2.0 (Q12) */
- nb_pulse = 4;
- nbpos[0] = 4;
- nbpos[1] = 8;
- break;
- case 36: /* 36 bits, 8 pulses, 4 tracks */
- nbiter = 4; /* 4x20x16=1280 loop */
- alp = 4096; /* alp = 1.0 (Q12) */
- nb_pulse = 8;
- nbpos[0] = 4;
- nbpos[1] = 8;
- nbpos[2] = 8;
- break;
- case 44: /* 44 bits, 10 pulses, 4 tracks */
- nbiter = 4; /* 4x26x16=1664 loop */
- alp = 4096; /* alp = 1.0 (Q12) */
- nb_pulse = 10;
- nbpos[0] = 4;
- nbpos[1] = 6;
- nbpos[2] = 8;
- nbpos[3] = 8;
- break;
- case 52: /* 52 bits, 12 pulses, 4 tracks */
- nbiter = 4; /* 4x26x16=1664 loop */
- alp = 4096; /* alp = 1.0 (Q12) */
- nb_pulse = 12;
- nbpos[0] = 4;
- nbpos[1] = 6;
- nbpos[2] = 8;
- nbpos[3] = 8;
- break;
- case 64: /* 64 bits, 16 pulses, 4 tracks */
- nbiter = 3; /* 3x36x16=1728 loop */
- alp = 3277; /* alp = 0.8 (Q12) */
- nb_pulse = 16;
- nbpos[0] = 4;
- nbpos[1] = 4;
- nbpos[2] = 6;
- nbpos[3] = 6;
- nbpos[4] = 8;
- nbpos[5] = 8;
- break;
- case 72: /* 72 bits, 18 pulses, 4 tracks */
- nbiter = 3; /* 3x35x16=1680 loop */
- alp = 3072; /* alp = 0.75 (Q12) */
- nb_pulse = 18;
- nbpos[0] = 2;
- nbpos[1] = 3;
- nbpos[2] = 4;
- nbpos[3] = 5;
- nbpos[4] = 6;
- nbpos[5] = 7;
- nbpos[6] = 8;
- break;
- case 88: /* 88 bits, 24 pulses, 4 tracks */
- if(ser_size > 462)
- nbiter = 1;
- else
- nbiter = 2; /* 2x53x16=1696 loop */
-
- alp = 2048; /* alp = 0.5 (Q12) */
- nb_pulse = 24;
- nbpos[0] = 2;
- nbpos[1] = 2;
- nbpos[2] = 3;
- nbpos[3] = 4;
- nbpos[4] = 5;
- nbpos[5] = 6;
- nbpos[6] = 7;
- nbpos[7] = 8;
- nbpos[8] = 8;
- nbpos[9] = 8;
- break;
- default:
- nbiter = 0;
- alp = 0;
- nb_pulse = 0;
- }
-
- for (i = 0; i < nb_pulse; i++)
- {
- codvec[i] = i;
- }
-
- /*----------------------------------------------------------------*
- * Find sign for each pulse position. *
- *----------------------------------------------------------------*/
- /* calculate energy for normalization of cn[] and dn[] */
- /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
+ Word32 i, j, k;
+ Word16 st, ix, iy, pos, index, track, nb_pulse, nbiter, j_temp;
+ Word16 psk, ps, alpk, alp, val, k_cn, k_dn, exp;
+ Word16 *p0, *p1, *p2, *p3, *psign;
+ Word16 *h, *h_inv, *ptr_h1, *ptr_h2, *ptr_hf, h_shift;
+ Word32 s, cor, L_tmp, L_index;
+ Word16 dn2[L_SUBFR], sign[L_SUBFR], vec[L_SUBFR];
+ Word16 ind[NPMAXPT * NB_TRACK];
+ Word16 codvec[NB_PULSE_MAX], nbpos[10];
+ Word16 cor_x[NB_POS], cor_y[NB_POS], pos_max[NB_TRACK];
+ Word16 h_buf[4 * L_SUBFR];
+ Word16 rrixix[NB_TRACK][NB_POS], rrixiy[NB_TRACK][MSIZE];
+ Word16 ipos[NB_PULSE_MAX];
+
+ switch (nbbits)
+ {
+ case 20: /* 20 bits, 4 pulses, 4 tracks */
+ nbiter = 4; /* 4x16x16=1024 loop */
+ alp = 8192; /* alp = 2.0 (Q12) */
+ nb_pulse = 4;
+ nbpos[0] = 4;
+ nbpos[1] = 8;
+ break;
+ case 36: /* 36 bits, 8 pulses, 4 tracks */
+ nbiter = 4; /* 4x20x16=1280 loop */
+ alp = 4096; /* alp = 1.0 (Q12) */
+ nb_pulse = 8;
+ nbpos[0] = 4;
+ nbpos[1] = 8;
+ nbpos[2] = 8;
+ break;
+ case 44: /* 44 bits, 10 pulses, 4 tracks */
+ nbiter = 4; /* 4x26x16=1664 loop */
+ alp = 4096; /* alp = 1.0 (Q12) */
+ nb_pulse = 10;
+ nbpos[0] = 4;
+ nbpos[1] = 6;
+ nbpos[2] = 8;
+ nbpos[3] = 8;
+ break;
+ case 52: /* 52 bits, 12 pulses, 4 tracks */
+ nbiter = 4; /* 4x26x16=1664 loop */
+ alp = 4096; /* alp = 1.0 (Q12) */
+ nb_pulse = 12;
+ nbpos[0] = 4;
+ nbpos[1] = 6;
+ nbpos[2] = 8;
+ nbpos[3] = 8;
+ break;
+ case 64: /* 64 bits, 16 pulses, 4 tracks */
+ nbiter = 3; /* 3x36x16=1728 loop */
+ alp = 3277; /* alp = 0.8 (Q12) */
+ nb_pulse = 16;
+ nbpos[0] = 4;
+ nbpos[1] = 4;
+ nbpos[2] = 6;
+ nbpos[3] = 6;
+ nbpos[4] = 8;
+ nbpos[5] = 8;
+ break;
+ case 72: /* 72 bits, 18 pulses, 4 tracks */
+ nbiter = 3; /* 3x35x16=1680 loop */
+ alp = 3072; /* alp = 0.75 (Q12) */
+ nb_pulse = 18;
+ nbpos[0] = 2;
+ nbpos[1] = 3;
+ nbpos[2] = 4;
+ nbpos[3] = 5;
+ nbpos[4] = 6;
+ nbpos[5] = 7;
+ nbpos[6] = 8;
+ break;
+ case 88: /* 88 bits, 24 pulses, 4 tracks */
+ if(ser_size > 462)
+ nbiter = 1;
+ else
+ nbiter = 2; /* 2x53x16=1696 loop */
+
+ alp = 2048; /* alp = 0.5 (Q12) */
+ nb_pulse = 24;
+ nbpos[0] = 2;
+ nbpos[1] = 2;
+ nbpos[2] = 3;
+ nbpos[3] = 4;
+ nbpos[4] = 5;
+ nbpos[5] = 6;
+ nbpos[6] = 7;
+ nbpos[7] = 8;
+ nbpos[8] = 8;
+ nbpos[9] = 8;
+ break;
+ default:
+ nbiter = 0;
+ alp = 0;
+ nb_pulse = 0;
+ }
+
+ for (i = 0; i < nb_pulse; i++)
+ {
+ codvec[i] = i;
+ }
+
+ /*----------------------------------------------------------------*
+ * Find sign for each pulse position. *
+ *----------------------------------------------------------------*/
+ /* calculate energy for normalization of cn[] and dn[] */
+ /* set k_cn = 32..32767 (ener_cn = 2^30..256-0) */
#ifdef ASM_OPT /* asm optimization branch */
- s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
+ s = Dot_product12_asm(cn, cn, L_SUBFR, &exp);
#else
- s = Dot_product12(cn, cn, L_SUBFR, &exp);
+ s = Dot_product12(cn, cn, L_SUBFR, &exp);
#endif
- Isqrt_n(&s, &exp);
- s = L_shl(s, (exp + 5));
- k_cn = extract_h(L_add(s, 0x8000));
+ Isqrt_n(&s, &exp);
+ s = L_shl(s, (exp + 5));
+ k_cn = extract_h(L_add(s, 0x8000));
- /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
+ /* set k_dn = 32..512 (ener_dn = 2^30..2^22) */
#ifdef ASM_OPT /* asm optimization branch */
- s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
+ s = Dot_product12_asm(dn, dn, L_SUBFR, &exp);
#else
- s = Dot_product12(dn, dn, L_SUBFR, &exp);
+ s = Dot_product12(dn, dn, L_SUBFR, &exp);
#endif
- Isqrt_n(&s, &exp);
- k_dn = (L_shl(s, (exp + 5 + 3)) + 0x8000) >> 16; /* k_dn = 256..4096 */
- k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */
-
- /* mix normalized cn[] and dn[] */
- p0 = cn;
- p1 = dn;
- p2 = dn2;
-
- for (i = 0; i < L_SUBFR/4; i++)
- {
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- s = (k_cn* (*p0++))+(k_dn * (*p1++));
- *p2++ = s >> 7;
- }
-
- /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */
- for(i = 0; i < L_SUBFR; i++)
- {
- val = dn[i];
- ps = dn2[i];
- if (ps >= 0)
- {
- sign[i] = 32767; /* sign = +1 (Q12) */
- vec[i] = -32768;
- } else
- {
- sign[i] = -32768; /* sign = -1 (Q12) */
- vec[i] = 32767;
- dn[i] = -val;
- dn2[i] = -ps;
- }
- }
- /*----------------------------------------------------------------*
- * Select NB_MAX position per track according to max of dn2[]. *
- *----------------------------------------------------------------*/
- pos = 0;
- for (i = 0; i < NB_TRACK; i++)
- {
- for (k = 0; k < NB_MAX; k++)
- {
- ps = -1;
- for (j = i; j < L_SUBFR; j += STEP)
- {
- if(dn2[j] > ps)
- {
- ps = dn2[j];
- pos = j;
- }
- }
- dn2[pos] = (k - NB_MAX); /* dn2 < 0 when position is selected */
- if (k == 0)
- {
- pos_max[i] = pos;
- }
- }
- }
-
- /*--------------------------------------------------------------*
- * Scale h[] to avoid overflow and to get maximum of precision *
- * on correlation. *
- * *
- * Maximum of h[] (h[0]) is fixed to 2048 (MAX16 / 16). *
- * ==> This allow addition of 16 pulses without saturation. *
- * *
- * Energy worst case (on resonant impulse response), *
- * - energy of h[] is approximately MAX/16. *
- * - During search, the energy is divided by 8 to avoid *
- * overflow on "alp". (energy of h[] = MAX/128). *
- * ==> "alp" worst case detected is 22854 on sinusoidal wave. *
- *--------------------------------------------------------------*/
-
- /* impulse response buffer for fast computation */
-
- h = h_buf;
- h_inv = h_buf + (2 * L_SUBFR);
- L_tmp = 0;
- for (i = 0; i < L_SUBFR; i++)
- {
- *h++ = 0;
- *h_inv++ = 0;
- L_tmp += (H[i] * H[i]) << 1;
- }
- /* scale h[] down (/2) when energy of h[] is high with many pulses used */
- val = extract_h(L_tmp);
- h_shift = 0;
-
- if ((nb_pulse >= 12) && (val > 1024))
- {
- h_shift = 1;
- }
- p0 = H;
- p1 = h;
- p2 = h_inv;
-
- for (i = 0; i < L_SUBFR/4; i++)
- {
- *p1 = *p0++ >> h_shift;
- *p2++ = -(*p1++);
- *p1 = *p0++ >> h_shift;
- *p2++ = -(*p1++);
- *p1 = *p0++ >> h_shift;
- *p2++ = -(*p1++);
- *p1 = *p0++ >> h_shift;
- *p2++ = -(*p1++);
- }
-
- /*------------------------------------------------------------*
- * Compute rrixix[][] needed for the codebook search. *
- * This algorithm compute impulse response energy of all *
- * positions (16) in each track (4). Total = 4x16 = 64. *
- *------------------------------------------------------------*/
-
- /* storage order --> i3i3, i2i2, i1i1, i0i0 */
-
- /* Init pointers to last position of rrixix[] */
- p0 = &rrixix[0][NB_POS - 1];
- p1 = &rrixix[1][NB_POS - 1];
- p2 = &rrixix[2][NB_POS - 1];
- p3 = &rrixix[3][NB_POS - 1];
-
- ptr_h1 = h;
- cor = 0x00008000L; /* for rounding */
- for (i = 0; i < NB_POS; i++)
- {
- cor += vo_L_mult((*ptr_h1), (*ptr_h1));
- ptr_h1++;
- *p3-- = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h1));
- ptr_h1++;
- *p2-- = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h1));
- ptr_h1++;
- *p1-- = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h1));
- ptr_h1++;
- *p0-- = extract_h(cor);
- }
-
- /*------------------------------------------------------------*
- * Compute rrixiy[][] needed for the codebook search. *
- * This algorithm compute correlation between 2 pulses *
- * (2 impulses responses) in 4 possible adjacents tracks. *
- * (track 0-1, 1-2, 2-3 and 3-0). Total = 4x16x16 = 1024. *
- *------------------------------------------------------------*/
-
- /* storage order --> i2i3, i1i2, i0i1, i3i0 */
-
- pos = MSIZE - 1;
- ptr_hf = h + 1;
-
- for (k = 0; k < NB_POS; k++)
- {
- p3 = &rrixiy[2][pos];
- p2 = &rrixiy[1][pos];
- p1 = &rrixiy[0][pos];
- p0 = &rrixiy[3][pos - NB_POS];
-
- cor = 0x00008000L; /* for rounding */
- ptr_h1 = h;
- ptr_h2 = ptr_hf;
-
- for (i = k + 1; i < NB_POS; i++)
- {
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p3 = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p2 = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p1 = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p0 = extract_h(cor);
-
- p3 -= (NB_POS + 1);
- p2 -= (NB_POS + 1);
- p1 -= (NB_POS + 1);
- p0 -= (NB_POS + 1);
- }
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p3 = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p2 = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p1 = extract_h(cor);
-
- pos -= NB_POS;
- ptr_hf += STEP;
- }
-
- /* storage order --> i3i0, i2i3, i1i2, i0i1 */
-
- pos = MSIZE - 1;
- ptr_hf = h + 3;
-
- for (k = 0; k < NB_POS; k++)
- {
- p3 = &rrixiy[3][pos];
- p2 = &rrixiy[2][pos - 1];
- p1 = &rrixiy[1][pos - 1];
- p0 = &rrixiy[0][pos - 1];
-
- cor = 0x00008000L; /* for rounding */
- ptr_h1 = h;
- ptr_h2 = ptr_hf;
-
- for (i = k + 1; i < NB_POS; i++)
- {
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p3 = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p2 = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p1 = extract_h(cor);
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p0 = extract_h(cor);
-
- p3 -= (NB_POS + 1);
- p2 -= (NB_POS + 1);
- p1 -= (NB_POS + 1);
- p0 -= (NB_POS + 1);
- }
- cor += vo_L_mult((*ptr_h1), (*ptr_h2));
- ptr_h1++;
- ptr_h2++;
- *p3 = extract_h(cor);
-
- pos--;
- ptr_hf += STEP;
- }
-
- /*------------------------------------------------------------*
- * Modification of rrixiy[][] to take signs into account. *
- *------------------------------------------------------------*/
-
- p0 = &rrixiy[0][0];
-
- for (k = 0; k < NB_TRACK; k++)
- {
- j_temp = (k + 1)&0x03;
- for (i = k; i < L_SUBFR; i += STEP)
- {
- psign = sign;
- if (psign[i] < 0)
- {
- psign = vec;
- }
- j = j_temp;
- for (; j < L_SUBFR; j += STEP)
- {
- *p0 = vo_mult(*p0, psign[j]);
- p0++;
- }
- }
- }
-
- /*-------------------------------------------------------------------*
- * Deep first search *
- *-------------------------------------------------------------------*/
-
- psk = -1;
- alpk = 1;
-
- for (k = 0; k < nbiter; k++)
- {
- j_temp = k<<2;
- for (i = 0; i < nb_pulse; i++)
- ipos[i] = tipos[j_temp + i];
-
- if(nbbits == 20)
- {
- pos = 0;
- ps = 0;
- alp = 0;
- for (i = 0; i < L_SUBFR; i++)
- {
- vec[i] = 0;
- }
- } else if ((nbbits == 36) || (nbbits == 44))
- {
- /* first stage: fix 2 pulses */
- pos = 2;
-
- ix = ind[0] = pos_max[ipos[0]];
- iy = ind[1] = pos_max[ipos[1]];
- ps = dn[ix] + dn[iy];
- i = ix >> 2; /* ix / STEP */
- j = iy >> 2; /* iy / STEP */
- s = rrixix[ipos[0]][i] << 13;
- s += rrixix[ipos[1]][j] << 13;
- i = (i << 4) + j; /* (ix/STEP)*NB_POS + (iy/STEP) */
- s += rrixiy[ipos[0]][i] << 14;
- alp = (s + 0x8000) >> 16;
- if (sign[ix] < 0)
- p0 = h_inv - ix;
- else
- p0 = h - ix;
- if (sign[iy] < 0)
- p1 = h_inv - iy;
- else
- p1 = h - iy;
-
- for (i = 0; i < L_SUBFR; i++)
- {
- vec[i] = (*p0++) + (*p1++);
- }
-
- if(nbbits == 44)
- {
- ipos[8] = 0;
- ipos[9] = 1;
- }
- } else
- {
- /* first stage: fix 4 pulses */
- pos = 4;
-
- ix = ind[0] = pos_max[ipos[0]];
- iy = ind[1] = pos_max[ipos[1]];
- i = ind[2] = pos_max[ipos[2]];
- j = ind[3] = pos_max[ipos[3]];
- ps = add1(add1(add1(dn[ix], dn[iy]), dn[i]), dn[j]);
-
- if (sign[ix] < 0)
- p0 = h_inv - ix;
- else
- p0 = h - ix;
-
- if (sign[iy] < 0)
- p1 = h_inv - iy;
- else
- p1 = h - iy;
-
- if (sign[i] < 0)
- p2 = h_inv - i;
- else
- p2 = h - i;
-
- if (sign[j] < 0)
- p3 = h_inv - j;
- else
- p3 = h - j;
-
- L_tmp = 0L;
- for(i = 0; i < L_SUBFR; i++)
- {
- Word32 vecSq2;
- vec[i] = add1(add1(add1(*p0++, *p1++), *p2++), *p3++);
- vecSq2 = (vec[i] * vec[i]) << 1;
- if (vecSq2 > 0 && L_tmp > INT_MAX - vecSq2) {
- L_tmp = INT_MAX;
- } else if (vecSq2 < 0 && L_tmp < INT_MIN - vecSq2) {
- L_tmp = INT_MIN;
- } else {
- L_tmp += vecSq2;
- }
- }
-
- alp = ((L_tmp >> 3) + 0x8000) >> 16;
-
- if(nbbits == 72)
- {
- ipos[16] = 0;
- ipos[17] = 1;
- }
- }
-
- /* other stages of 2 pulses */
-
- for (j = pos, st = 0; j < nb_pulse; j += 2, st++)
- {
- /*--------------------------------------------------*
- * Calculate correlation of all possible positions *
- * of the next 2 pulses with previous fixed pulses. *
- * Each pulse can have 16 possible positions. *
- *--------------------------------------------------*/
- if(ipos[j] == 3)
- {
- cor_h_vec_30(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
- }
- else
- {
+ Isqrt_n(&s, &exp);
+ k_dn = (L_shl(s, (exp + 5 + 3)) + 0x8000) >> 16; /* k_dn = 256..4096 */
+ k_dn = vo_mult_r(alp, k_dn); /* alp in Q12 */
+
+ /* mix normalized cn[] and dn[] */
+ p0 = cn;
+ p1 = dn;
+ p2 = dn2;
+
+ for (i = 0; i < L_SUBFR/4; i++)
+ {
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ s = (k_cn* (*p0++))+(k_dn * (*p1++));
+ *p2++ = s >> 7;
+ }
+
+ /* set sign according to dn2[] = k_cn*cn[] + k_dn*dn[] */
+ for(i = 0; i < L_SUBFR; i++)
+ {
+ val = dn[i];
+ ps = dn2[i];
+ if (ps >= 0)
+ {
+ sign[i] = 32767; /* sign = +1 (Q12) */
+ vec[i] = -32768;
+ } else
+ {
+ sign[i] = -32768; /* sign = -1 (Q12) */
+ vec[i] = 32767;
+ dn[i] = -val;
+ dn2[i] = -ps;
+ }
+ }
+ /*----------------------------------------------------------------*
+ * Select NB_MAX position per track according to max of dn2[]. *
+ *----------------------------------------------------------------*/
+ pos = 0;
+ for (i = 0; i < NB_TRACK; i++)
+ {
+ for (k = 0; k < NB_MAX; k++)
+ {
+ ps = -1;
+ for (j = i; j < L_SUBFR; j += STEP)
+ {
+ if(dn2[j] > ps)
+ {
+ ps = dn2[j];
+ pos = j;
+ }
+ }
+ dn2[pos] = (k - NB_MAX); /* dn2 < 0 when position is selected */
+ if (k == 0)
+ {
+ pos_max[i] = pos;
+ }
+ }
+ }
+
+ /*--------------------------------------------------------------*
+ * Scale h[] to avoid overflow and to get maximum of precision *
+ * on correlation. *
+ * *
+ * Maximum of h[] (h[0]) is fixed to 2048 (MAX16 / 16). *
+ * ==> This allow addition of 16 pulses without saturation. *
+ * *
+ * Energy worst case (on resonant impulse response), *
+ * - energy of h[] is approximately MAX/16. *
+ * - During search, the energy is divided by 8 to avoid *
+ * overflow on "alp". (energy of h[] = MAX/128). *
+ * ==> "alp" worst case detected is 22854 on sinusoidal wave. *
+ *--------------------------------------------------------------*/
+
+ /* impulse response buffer for fast computation */
+
+ h = h_buf;
+ h_inv = h_buf + (2 * L_SUBFR);
+ L_tmp = 0;
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ *h++ = 0;
+ *h_inv++ = 0;
+ L_tmp += (H[i] * H[i]) << 1;
+ }
+ /* scale h[] down (/2) when energy of h[] is high with many pulses used */
+ val = extract_h(L_tmp);
+ h_shift = 0;
+
+ if ((nb_pulse >= 12) && (val > 1024))
+ {
+ h_shift = 1;
+ }
+ p0 = H;
+ p1 = h;
+ p2 = h_inv;
+
+ for (i = 0; i < L_SUBFR/4; i++)
+ {
+ *p1 = *p0++ >> h_shift;
+ *p2++ = -(*p1++);
+ *p1 = *p0++ >> h_shift;
+ *p2++ = -(*p1++);
+ *p1 = *p0++ >> h_shift;
+ *p2++ = -(*p1++);
+ *p1 = *p0++ >> h_shift;
+ *p2++ = -(*p1++);
+ }
+
+ /*------------------------------------------------------------*
+ * Compute rrixix[][] needed for the codebook search. *
+ * This algorithm compute impulse response energy of all *
+ * positions (16) in each track (4). Total = 4x16 = 64. *
+ *------------------------------------------------------------*/
+
+ /* storage order --> i3i3, i2i2, i1i1, i0i0 */
+
+ /* Init pointers to last position of rrixix[] */
+ p0 = &rrixix[0][NB_POS - 1];
+ p1 = &rrixix[1][NB_POS - 1];
+ p2 = &rrixix[2][NB_POS - 1];
+ p3 = &rrixix[3][NB_POS - 1];
+
+ ptr_h1 = h;
+ cor = 0x00008000L; /* for rounding */
+ for (i = 0; i < NB_POS; i++)
+ {
+ cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+ ptr_h1++;
+ *p3-- = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+ ptr_h1++;
+ *p2-- = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+ ptr_h1++;
+ *p1-- = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h1));
+ ptr_h1++;
+ *p0-- = extract_h(cor);
+ }
+
+ /*------------------------------------------------------------*
+ * Compute rrixiy[][] needed for the codebook search. *
+ * This algorithm compute correlation between 2 pulses *
+ * (2 impulses responses) in 4 possible adjacents tracks. *
+ * (track 0-1, 1-2, 2-3 and 3-0). Total = 4x16x16 = 1024. *
+ *------------------------------------------------------------*/
+
+ /* storage order --> i2i3, i1i2, i0i1, i3i0 */
+
+ pos = MSIZE - 1;
+ ptr_hf = h + 1;
+
+ for (k = 0; k < NB_POS; k++)
+ {
+ p3 = &rrixiy[2][pos];
+ p2 = &rrixiy[1][pos];
+ p1 = &rrixiy[0][pos];
+ p0 = &rrixiy[3][pos - NB_POS];
+
+ cor = 0x00008000L; /* for rounding */
+ ptr_h1 = h;
+ ptr_h2 = ptr_hf;
+
+ for (i = k + 1; i < NB_POS; i++)
+ {
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p3 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p2 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p0 = extract_h(cor);
+
+ p3 -= (NB_POS + 1);
+ p2 -= (NB_POS + 1);
+ p1 -= (NB_POS + 1);
+ p0 -= (NB_POS + 1);
+ }
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p3 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p2 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+
+ pos -= NB_POS;
+ ptr_hf += STEP;
+ }
+
+ /* storage order --> i3i0, i2i3, i1i2, i0i1 */
+
+ pos = MSIZE - 1;
+ ptr_hf = h + 3;
+
+ for (k = 0; k < NB_POS; k++)
+ {
+ p3 = &rrixiy[3][pos];
+ p2 = &rrixiy[2][pos - 1];
+ p1 = &rrixiy[1][pos - 1];
+ p0 = &rrixiy[0][pos - 1];
+
+ cor = 0x00008000L; /* for rounding */
+ ptr_h1 = h;
+ ptr_h2 = ptr_hf;
+
+ for (i = k + 1; i < NB_POS; i++)
+ {
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p3 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p2 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p1 = extract_h(cor);
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p0 = extract_h(cor);
+
+ p3 -= (NB_POS + 1);
+ p2 -= (NB_POS + 1);
+ p1 -= (NB_POS + 1);
+ p0 -= (NB_POS + 1);
+ }
+ cor += vo_L_mult((*ptr_h1), (*ptr_h2));
+ ptr_h1++;
+ ptr_h2++;
+ *p3 = extract_h(cor);
+
+ pos--;
+ ptr_hf += STEP;
+ }
+
+ /*------------------------------------------------------------*
+ * Modification of rrixiy[][] to take signs into account. *
+ *------------------------------------------------------------*/
+
+ p0 = &rrixiy[0][0];
+
+ for (k = 0; k < NB_TRACK; k++)
+ {
+ j_temp = (k + 1)&0x03;
+ for (i = k; i < L_SUBFR; i += STEP)
+ {
+ psign = sign;
+ if (psign[i] < 0)
+ {
+ psign = vec;
+ }
+ j = j_temp;
+ for (; j < L_SUBFR; j += STEP)
+ {
+ *p0 = vo_mult(*p0, psign[j]);
+ p0++;
+ }
+ }
+ }
+
+ /*-------------------------------------------------------------------*
+ * Deep first search *
+ *-------------------------------------------------------------------*/
+
+ psk = -1;
+ alpk = 1;
+
+ for (k = 0; k < nbiter; k++)
+ {
+ j_temp = k<<2;
+ for (i = 0; i < nb_pulse; i++)
+ ipos[i] = tipos[j_temp + i];
+
+ if(nbbits == 20)
+ {
+ pos = 0;
+ ps = 0;
+ alp = 0;
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ vec[i] = 0;
+ }
+ } else if ((nbbits == 36) || (nbbits == 44))
+ {
+ /* first stage: fix 2 pulses */
+ pos = 2;
+
+ ix = ind[0] = pos_max[ipos[0]];
+ iy = ind[1] = pos_max[ipos[1]];
+ ps = dn[ix] + dn[iy];
+ i = ix >> 2; /* ix / STEP */
+ j = iy >> 2; /* iy / STEP */
+ s = rrixix[ipos[0]][i] << 13;
+ s += rrixix[ipos[1]][j] << 13;
+ i = (i << 4) + j; /* (ix/STEP)*NB_POS + (iy/STEP) */
+ s += rrixiy[ipos[0]][i] << 14;
+ alp = (s + 0x8000) >> 16;
+ if (sign[ix] < 0)
+ p0 = h_inv - ix;
+ else
+ p0 = h - ix;
+ if (sign[iy] < 0)
+ p1 = h_inv - iy;
+ else
+ p1 = h - iy;
+
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ vec[i] = (*p0++) + (*p1++);
+ }
+
+ if(nbbits == 44)
+ {
+ ipos[8] = 0;
+ ipos[9] = 1;
+ }
+ } else
+ {
+ /* first stage: fix 4 pulses */
+ pos = 4;
+
+ ix = ind[0] = pos_max[ipos[0]];
+ iy = ind[1] = pos_max[ipos[1]];
+ i = ind[2] = pos_max[ipos[2]];
+ j = ind[3] = pos_max[ipos[3]];
+ ps = add1(add1(add1(dn[ix], dn[iy]), dn[i]), dn[j]);
+
+ if (sign[ix] < 0)
+ p0 = h_inv - ix;
+ else
+ p0 = h - ix;
+
+ if (sign[iy] < 0)
+ p1 = h_inv - iy;
+ else
+ p1 = h - iy;
+
+ if (sign[i] < 0)
+ p2 = h_inv - i;
+ else
+ p2 = h - i;
+
+ if (sign[j] < 0)
+ p3 = h_inv - j;
+ else
+ p3 = h - j;
+
+ L_tmp = 0L;
+ for(i = 0; i < L_SUBFR; i++)
+ {
+ Word32 vecSq2;
+ vec[i] = add1(add1(add1(*p0++, *p1++), *p2++), *p3++);
+ vecSq2 = (vec[i] * vec[i]) << 1;
+ if (vecSq2 > 0 && L_tmp > INT_MAX - vecSq2) {
+ L_tmp = INT_MAX;
+ } else if (vecSq2 < 0 && L_tmp < INT_MIN - vecSq2) {
+ L_tmp = INT_MIN;
+ } else {
+ L_tmp += vecSq2;
+ }
+ }
+
+ alp = ((L_tmp >> 3) + 0x8000) >> 16;
+
+ if(nbbits == 72)
+ {
+ ipos[16] = 0;
+ ipos[17] = 1;
+ }
+ }
+
+ /* other stages of 2 pulses */
+
+ for (j = pos, st = 0; j < nb_pulse; j += 2, st++)
+ {
+ /*--------------------------------------------------*
+ * Calculate correlation of all possible positions *
+ * of the next 2 pulses with previous fixed pulses. *
+ * Each pulse can have 16 possible positions. *
+ *--------------------------------------------------*/
+ if(ipos[j] == 3)
+ {
+ cor_h_vec_30(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
+ }
+ else
+ {
#ifdef ASM_OPT /* asm optimization branch */
- cor_h_vec_012_asm(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
+ cor_h_vec_012_asm(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
#else
- cor_h_vec_012(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
+ cor_h_vec_012(h, vec, ipos[j], sign, rrixix, cor_x, cor_y);
#endif
- }
- /*--------------------------------------------------*
- * Find best positions of 2 pulses. *
- *--------------------------------------------------*/
- search_ixiy(nbpos[st], ipos[j], ipos[j + 1], &ps, &alp,
- &ix, &iy, dn, dn2, cor_x, cor_y, rrixiy);
-
- ind[j] = ix;
- ind[j + 1] = iy;
-
- if (sign[ix] < 0)
- p0 = h_inv - ix;
- else
- p0 = h - ix;
- if (sign[iy] < 0)
- p1 = h_inv - iy;
- else
- p1 = h - iy;
-
- for (i = 0; i < L_SUBFR; i+=4)
- {
- vec[i] += add1((*p0++), (*p1++));
- vec[i+1] += add1((*p0++), (*p1++));
- vec[i+2] += add1((*p0++), (*p1++));
- vec[i+3] += add1((*p0++), (*p1++));
- }
- }
- /* memorise the best codevector */
- ps = vo_mult(ps, ps);
- s = vo_L_msu(vo_L_mult(alpk, ps), psk, alp);
- if (s > 0)
- {
- psk = ps;
- alpk = alp;
- for (i = 0; i < nb_pulse; i++)
- {
- codvec[i] = ind[i];
- }
- for (i = 0; i < L_SUBFR; i++)
- {
- y[i] = vec[i];
- }
- }
- }
- /*-------------------------------------------------------------------*
- * Build the codeword, the filtered codeword and index of codevector.*
- *-------------------------------------------------------------------*/
- for (i = 0; i < NPMAXPT * NB_TRACK; i++)
- {
- ind[i] = -1;
- }
- for (i = 0; i < L_SUBFR; i++)
- {
- code[i] = 0;
- y[i] = vo_shr_r(y[i], 3); /* Q12 to Q9 */
- }
- val = (512 >> h_shift); /* codeword in Q9 format */
- for (k = 0; k < nb_pulse; k++)
- {
- i = codvec[k]; /* read pulse position */
- j = sign[i]; /* read sign */
- index = i >> 2; /* index = pos of pulse (0..15) */
- track = (Word16) (i & 0x03); /* track = i % NB_TRACK (0..3) */
-
- if (j > 0)
- {
- code[i] += val;
- codvec[k] += 128;
- } else
- {
- code[i] -= val;
- index += NB_POS;
- }
-
- i = (Word16)((vo_L_mult(track, NPMAXPT) >> 1));
-
- while (ind[i] >= 0)
- {
- i += 1;
- }
- ind[i] = index;
- }
-
- k = 0;
- /* Build index of codevector */
- if(nbbits == 20)
- {
- for (track = 0; track < NB_TRACK; track++)
- {
- _index[track] = (Word16)(quant_1p_N1(ind[k], 4));
- k += NPMAXPT;
- }
- } else if(nbbits == 36)
- {
- for (track = 0; track < NB_TRACK; track++)
- {
- _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
- k += NPMAXPT;
- }
- } else if(nbbits == 44)
- {
- for (track = 0; track < NB_TRACK - 2; track++)
- {
- _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
- k += NPMAXPT;
- }
- for (track = 2; track < NB_TRACK; track++)
- {
- _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
- k += NPMAXPT;
- }
- } else if(nbbits == 52)
- {
- for (track = 0; track < NB_TRACK; track++)
- {
- _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
- k += NPMAXPT;
- }
- } else if(nbbits == 64)
- {
- for (track = 0; track < NB_TRACK; track++)
- {
- L_index = quant_4p_4N(&ind[k], 4);
- _index[track] = (Word16)((L_index >> 14) & 3);
- _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
- k += NPMAXPT;
- }
- } else if(nbbits == 72)
- {
- for (track = 0; track < NB_TRACK - 2; track++)
- {
- L_index = quant_5p_5N(&ind[k], 4);
- _index[track] = (Word16)((L_index >> 10) & 0x03FF);
- _index[track + NB_TRACK] = (Word16)(L_index & 0x03FF);
- k += NPMAXPT;
- }
- for (track = 2; track < NB_TRACK; track++)
- {
- L_index = quant_4p_4N(&ind[k], 4);
- _index[track] = (Word16)((L_index >> 14) & 3);
- _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
- k += NPMAXPT;
- }
- } else if(nbbits == 88)
- {
- for (track = 0; track < NB_TRACK; track++)
- {
- L_index = quant_6p_6N_2(&ind[k], 4);
- _index[track] = (Word16)((L_index >> 11) & 0x07FF);
- _index[track + NB_TRACK] = (Word16)(L_index & 0x07FF);
- k += NPMAXPT;
- }
- }
- return;
+ }
+ /*--------------------------------------------------*
+ * Find best positions of 2 pulses. *
+ *--------------------------------------------------*/
+ search_ixiy(nbpos[st], ipos[j], ipos[j + 1], &ps, &alp,
+ &ix, &iy, dn, dn2, cor_x, cor_y, rrixiy);
+
+ ind[j] = ix;
+ ind[j + 1] = iy;
+
+ if (sign[ix] < 0)
+ p0 = h_inv - ix;
+ else
+ p0 = h - ix;
+ if (sign[iy] < 0)
+ p1 = h_inv - iy;
+ else
+ p1 = h - iy;
+
+ for (i = 0; i < L_SUBFR; i+=4)
+ {
+ vec[i] += add1((*p0++), (*p1++));
+ vec[i+1] += add1((*p0++), (*p1++));
+ vec[i+2] += add1((*p0++), (*p1++));
+ vec[i+3] += add1((*p0++), (*p1++));
+ }
+ }
+ /* memorise the best codevector */
+ ps = vo_mult(ps, ps);
+ s = vo_L_msu(vo_L_mult(alpk, ps), psk, alp);
+ if (s > 0)
+ {
+ psk = ps;
+ alpk = alp;
+ for (i = 0; i < nb_pulse; i++)
+ {
+ codvec[i] = ind[i];
+ }
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ y[i] = vec[i];
+ }
+ }
+ }
+ /*-------------------------------------------------------------------*
+ * Build the codeword, the filtered codeword and index of codevector.*
+ *-------------------------------------------------------------------*/
+ for (i = 0; i < NPMAXPT * NB_TRACK; i++)
+ {
+ ind[i] = -1;
+ }
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ code[i] = 0;
+ y[i] = vo_shr_r(y[i], 3); /* Q12 to Q9 */
+ }
+ val = (512 >> h_shift); /* codeword in Q9 format */
+ for (k = 0; k < nb_pulse; k++)
+ {
+ i = codvec[k]; /* read pulse position */
+ j = sign[i]; /* read sign */
+ index = i >> 2; /* index = pos of pulse (0..15) */
+ track = (Word16) (i & 0x03); /* track = i % NB_TRACK (0..3) */
+
+ if (j > 0)
+ {
+ code[i] += val;
+ codvec[k] += 128;
+ } else
+ {
+ code[i] -= val;
+ index += NB_POS;
+ }
+
+ i = (Word16)((vo_L_mult(track, NPMAXPT) >> 1));
+
+ while (ind[i] >= 0)
+ {
+ i += 1;
+ }
+ ind[i] = index;
+ }
+
+ k = 0;
+ /* Build index of codevector */
+ if(nbbits == 20)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ _index[track] = (Word16)(quant_1p_N1(ind[k], 4));
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 36)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 44)
+ {
+ for (track = 0; track < NB_TRACK - 2; track++)
+ {
+ _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
+ k += NPMAXPT;
+ }
+ for (track = 2; track < NB_TRACK; track++)
+ {
+ _index[track] = (Word16)(quant_2p_2N1(ind[k], ind[k + 1], 4));
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 52)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ _index[track] = (Word16)(quant_3p_3N1(ind[k], ind[k + 1], ind[k + 2], 4));
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 64)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ L_index = quant_4p_4N(&ind[k], 4);
+ _index[track] = (Word16)((L_index >> 14) & 3);
+ _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 72)
+ {
+ for (track = 0; track < NB_TRACK - 2; track++)
+ {
+ L_index = quant_5p_5N(&ind[k], 4);
+ _index[track] = (Word16)((L_index >> 10) & 0x03FF);
+ _index[track + NB_TRACK] = (Word16)(L_index & 0x03FF);
+ k += NPMAXPT;
+ }
+ for (track = 2; track < NB_TRACK; track++)
+ {
+ L_index = quant_4p_4N(&ind[k], 4);
+ _index[track] = (Word16)((L_index >> 14) & 3);
+ _index[track + NB_TRACK] = (Word16)(L_index & 0x3FFF);
+ k += NPMAXPT;
+ }
+ } else if(nbbits == 88)
+ {
+ for (track = 0; track < NB_TRACK; track++)
+ {
+ L_index = quant_6p_6N_2(&ind[k], 4);
+ _index[track] = (Word16)((L_index >> 11) & 0x07FF);
+ _index[track + NB_TRACK] = (Word16)(L_index & 0x07FF);
+ k += NPMAXPT;
+ }
+ }
+ return;
}
@@ -832,135 +832,135 @@ void ACELP_4t64_fx(
* Compute correlations of h[] with vec[] for the specified track. *
*-------------------------------------------------------------------*/
void cor_h_vec_30(
- Word16 h[], /* (i) scaled impulse response */
- Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
- Word16 track, /* (i) track to use */
- Word16 sign[], /* (i) sign vector */
- Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
- Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
- Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
- )
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ )
{
- Word32 i, j, pos, corr;
- Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
- Word32 L_sum1,L_sum2;
- cor_x = cor_1;
- cor_y = cor_2;
- p0 = rrixix[track];
- p3 = rrixix[0];
- pos = track;
-
- for (i = 0; i < NB_POS; i+=2)
- {
- L_sum1 = L_sum2 = 0L;
- p1 = h;
- p2 = &vec[pos];
- for (j=pos;j < L_SUBFR; j++)
- {
- L_sum1 += *p1 * *p2;
- p2-=3;
- L_sum2 += *p1++ * *p2;
- p2+=4;
- }
- p2-=3;
- L_sum2 += *p1++ * *p2++;
- L_sum2 += *p1++ * *p2++;
- L_sum2 += *p1++ * *p2++;
-
- L_sum1 = (L_sum1 << 2);
- L_sum2 = (L_sum2 << 2);
-
- corr = vo_round(L_sum1);
- *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);
- corr = vo_round(L_sum2);
- *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);
- pos += STEP;
-
- L_sum1 = L_sum2 = 0L;
- p1 = h;
- p2 = &vec[pos];
- for (j=pos;j < L_SUBFR; j++)
- {
- L_sum1 += *p1 * *p2;
- p2-=3;
- L_sum2 += *p1++ * *p2;
- p2+=4;
- }
- p2-=3;
- L_sum2 += *p1++ * *p2++;
- L_sum2 += *p1++ * *p2++;
- L_sum2 += *p1++ * *p2++;
-
- L_sum1 = (L_sum1 << 2);
- L_sum2 = (L_sum2 << 2);
-
- corr = vo_round(L_sum1);
- *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);
- corr = vo_round(L_sum2);
- *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);
- pos += STEP;
- }
- return;
+ Word32 i, j, pos, corr;
+ Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
+ Word32 L_sum1,L_sum2;
+ cor_x = cor_1;
+ cor_y = cor_2;
+ p0 = rrixix[track];
+ p3 = rrixix[0];
+ pos = track;
+
+ for (i = 0; i < NB_POS; i+=2)
+ {
+ L_sum1 = L_sum2 = 0L;
+ p1 = h;
+ p2 = &vec[pos];
+ for (j=pos;j < L_SUBFR; j++)
+ {
+ L_sum1 += *p1 * *p2;
+ p2-=3;
+ L_sum2 += *p1++ * *p2;
+ p2+=4;
+ }
+ p2-=3;
+ L_sum2 += *p1++ * *p2++;
+ L_sum2 += *p1++ * *p2++;
+ L_sum2 += *p1++ * *p2++;
+
+ L_sum1 = (L_sum1 << 2);
+ L_sum2 = (L_sum2 << 2);
+
+ corr = vo_round(L_sum1);
+ *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);
+ corr = vo_round(L_sum2);
+ *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);
+ pos += STEP;
+
+ L_sum1 = L_sum2 = 0L;
+ p1 = h;
+ p2 = &vec[pos];
+ for (j=pos;j < L_SUBFR; j++)
+ {
+ L_sum1 += *p1 * *p2;
+ p2-=3;
+ L_sum2 += *p1++ * *p2;
+ p2+=4;
+ }
+ p2-=3;
+ L_sum2 += *p1++ * *p2++;
+ L_sum2 += *p1++ * *p2++;
+ L_sum2 += *p1++ * *p2++;
+
+ L_sum1 = (L_sum1 << 2);
+ L_sum2 = (L_sum2 << 2);
+
+ corr = vo_round(L_sum1);
+ *cor_x++ = vo_mult(corr, sign[pos]) + (*p0++);
+ corr = vo_round(L_sum2);
+ *cor_y++ = vo_mult(corr, sign[pos-3]) + (*p3++);
+ pos += STEP;
+ }
+ return;
}
void cor_h_vec_012(
- Word16 h[], /* (i) scaled impulse response */
- Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
- Word16 track, /* (i) track to use */
- Word16 sign[], /* (i) sign vector */
- Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
- Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
- Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
- )
+ Word16 h[], /* (i) scaled impulse response */
+ Word16 vec[], /* (i) scaled vector (/8) to correlate with h[] */
+ Word16 track, /* (i) track to use */
+ Word16 sign[], /* (i) sign vector */
+ Word16 rrixix[][NB_POS], /* (i) correlation of h[x] with h[x] */
+ Word16 cor_1[], /* (o) result of correlation (NB_POS elements) */
+ Word16 cor_2[] /* (o) result of correlation (NB_POS elements) */
+ )
{
- Word32 i, j, pos, corr;
- Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
- Word32 L_sum1,L_sum2;
- cor_x = cor_1;
- cor_y = cor_2;
- p0 = rrixix[track];
- p3 = rrixix[track+1];
- pos = track;
-
- for (i = 0; i < NB_POS; i+=2)
- {
- L_sum1 = L_sum2 = 0L;
- p1 = h;
- p2 = &vec[pos];
- for (j=62-pos ;j >= 0; j--)
- {
- L_sum1 += *p1 * *p2++;
- L_sum2 += *p1++ * *p2;
- }
- L_sum1 += *p1 * *p2;
- L_sum1 = (L_sum1 << 2);
- L_sum2 = (L_sum2 << 2);
-
- corr = (L_sum1 + 0x8000) >> 16;
- cor_x[i] = vo_mult(corr, sign[pos]) + (*p0++);
- corr = (L_sum2 + 0x8000) >> 16;
- cor_y[i] = vo_mult(corr, sign[pos + 1]) + (*p3++);
- pos += STEP;
-
- L_sum1 = L_sum2 = 0L;
- p1 = h;
- p2 = &vec[pos];
- for (j= 62-pos;j >= 0; j--)
- {
- L_sum1 += *p1 * *p2++;
- L_sum2 += *p1++ * *p2;
- }
- L_sum1 += *p1 * *p2;
- L_sum1 = (L_sum1 << 2);
- L_sum2 = (L_sum2 << 2);
-
- corr = (L_sum1 + 0x8000) >> 16;
- cor_x[i+1] = vo_mult(corr, sign[pos]) + (*p0++);
- corr = (L_sum2 + 0x8000) >> 16;
- cor_y[i+1] = vo_mult(corr, sign[pos + 1]) + (*p3++);
- pos += STEP;
- }
- return;
+ Word32 i, j, pos, corr;
+ Word16 *p0, *p1, *p2,*p3,*cor_x,*cor_y;
+ Word32 L_sum1,L_sum2;
+ cor_x = cor_1;
+ cor_y = cor_2;
+ p0 = rrixix[track];
+ p3 = rrixix[track+1];
+ pos = track;
+
+ for (i = 0; i < NB_POS; i+=2)
+ {
+ L_sum1 = L_sum2 = 0L;
+ p1 = h;
+ p2 = &vec[pos];
+ for (j=62-pos ;j >= 0; j--)
+ {
+ L_sum1 += *p1 * *p2++;
+ L_sum2 += *p1++ * *p2;
+ }
+ L_sum1 += *p1 * *p2;
+ L_sum1 = (L_sum1 << 2);
+ L_sum2 = (L_sum2 << 2);
+
+ corr = (L_sum1 + 0x8000) >> 16;
+ cor_x[i] = vo_mult(corr, sign[pos]) + (*p0++);
+ corr = (L_sum2 + 0x8000) >> 16;
+ cor_y[i] = vo_mult(corr, sign[pos + 1]) + (*p3++);
+ pos += STEP;
+
+ L_sum1 = L_sum2 = 0L;
+ p1 = h;
+ p2 = &vec[pos];
+ for (j= 62-pos;j >= 0; j--)
+ {
+ L_sum1 += *p1 * *p2++;
+ L_sum2 += *p1++ * *p2;
+ }
+ L_sum1 += *p1 * *p2;
+ L_sum1 = (L_sum1 << 2);
+ L_sum2 = (L_sum2 << 2);
+
+ corr = (L_sum1 + 0x8000) >> 16;
+ cor_x[i+1] = vo_mult(corr, sign[pos]) + (*p0++);
+ corr = (L_sum2 + 0x8000) >> 16;
+ cor_y[i+1] = vo_mult(corr, sign[pos + 1]) + (*p3++);
+ pos += STEP;
+ }
+ return;
}
/*-------------------------------------------------------------------*
@@ -970,80 +970,80 @@ void cor_h_vec_012(
*-------------------------------------------------------------------*/
void search_ixiy(
- Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */
- Word16 track_x, /* (i) track of pulse 1 */
- Word16 track_y, /* (i) track of pulse 2 */
- Word16 * ps, /* (i/o) correlation of all fixed pulses */
- Word16 * alp, /* (i/o) energy of all fixed pulses */
- Word16 * ix, /* (o) position of pulse 1 */
- Word16 * iy, /* (o) position of pulse 2 */
- Word16 dn[], /* (i) corr. between target and h[] */
- Word16 dn2[], /* (i) vector of selected positions */
- Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */
- Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */
- Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */
- )
+ Word16 nb_pos_ix, /* (i) nb of pos for pulse 1 (1..8) */
+ Word16 track_x, /* (i) track of pulse 1 */
+ Word16 track_y, /* (i) track of pulse 2 */
+ Word16 * ps, /* (i/o) correlation of all fixed pulses */
+ Word16 * alp, /* (i/o) energy of all fixed pulses */
+ Word16 * ix, /* (o) position of pulse 1 */
+ Word16 * iy, /* (o) position of pulse 2 */
+ Word16 dn[], /* (i) corr. between target and h[] */
+ Word16 dn2[], /* (i) vector of selected positions */
+ Word16 cor_x[], /* (i) corr. of pulse 1 with fixed pulses */
+ Word16 cor_y[], /* (i) corr. of pulse 2 with fixed pulses */
+ Word16 rrixiy[][MSIZE] /* (i) corr. of pulse 1 with pulse 2 */
+ )
{
- Word32 x, y, pos, thres_ix;
- Word16 ps1, ps2, sq, sqk;
- Word16 alp_16, alpk;
- Word16 *p0, *p1, *p2;
- Word32 s, alp0, alp1, alp2;
-
- p0 = cor_x;
- p1 = cor_y;
- p2 = rrixiy[track_x];
-
- thres_ix = nb_pos_ix - NB_MAX;
-
- alp0 = L_deposit_h(*alp);
- alp0 = (alp0 + 0x00008000L); /* for rounding */
-
- sqk = -1;
- alpk = 1;
-
- for (x = track_x; x < L_SUBFR; x += STEP)
- {
- ps1 = *ps + dn[x];
- alp1 = alp0 + ((*p0++)<<13);
-
- if (dn2[x] < thres_ix)
- {
- pos = -1;
- for (y = track_y; y < L_SUBFR; y += STEP)
- {
- ps2 = add1(ps1, dn[y]);
-
- alp2 = alp1 + ((*p1++)<<13);
- alp2 = alp2 + ((*p2++)<<14);
- alp_16 = extract_h(alp2);
- sq = vo_mult(ps2, ps2);
- s = vo_L_mult(alpk, sq) - ((sqk * alp_16)<<1);
-
- if (s > 0)
- {
- sqk = sq;
- alpk = alp_16;
- pos = y;
- }
- }
- p1 -= NB_POS;
-
- if (pos >= 0)
- {
- *ix = x;
- *iy = pos;
- }
- } else
- {
- p2 += NB_POS;
- }
- }
-
- *ps = add1(*ps, add1(dn[*ix], dn[*iy]));
- *alp = alpk;
-
- return;
+ Word32 x, y, pos, thres_ix;
+ Word16 ps1, ps2, sq, sqk;
+ Word16 alp_16, alpk;
+ Word16 *p0, *p1, *p2;
+ Word32 s, alp0, alp1, alp2;
+
+ p0 = cor_x;
+ p1 = cor_y;
+ p2 = rrixiy[track_x];
+
+ thres_ix = nb_pos_ix - NB_MAX;
+
+ alp0 = L_deposit_h(*alp);
+ alp0 = (alp0 + 0x00008000L); /* for rounding */
+
+ sqk = -1;
+ alpk = 1;
+
+ for (x = track_x; x < L_SUBFR; x += STEP)
+ {
+ ps1 = *ps + dn[x];
+ alp1 = alp0 + ((*p0++)<<13);
+
+ if (dn2[x] < thres_ix)
+ {
+ pos = -1;
+ for (y = track_y; y < L_SUBFR; y += STEP)
+ {
+ ps2 = add1(ps1, dn[y]);
+
+ alp2 = alp1 + ((*p1++)<<13);
+ alp2 = alp2 + ((*p2++)<<14);
+ alp_16 = extract_h(alp2);
+ sq = vo_mult(ps2, ps2);
+ s = vo_L_mult(alpk, sq) - ((sqk * alp_16)<<1);
+
+ if (s > 0)
+ {
+ sqk = sq;
+ alpk = alp_16;
+ pos = y;
+ }
+ }
+ p1 -= NB_POS;
+
+ if (pos >= 0)
+ {
+ *ix = x;
+ *iy = pos;
+ }
+ } else
+ {
+ p2 += NB_POS;
+ }
+ }
+
+ *ps = add1(*ps, add1(dn[*ix], dn[*iy]));
+ *alp = alpk;
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/convolve.c b/media/libstagefright/codecs/amrwbenc/src/convolve.c
index 4c1f7d4..9b8b3aa 100644
--- a/media/libstagefright/codecs/amrwbenc/src/convolve.c
+++ b/media/libstagefright/codecs/amrwbenc/src/convolve.c
@@ -17,8 +17,8 @@
/***********************************************************************
File: convolve.c
- Description:Perform the convolution between two vectors x[] and h[]
- and write the result in the vector y[]
+ Description:Perform the convolution between two vectors x[] and h[]
+ and write the result in the vector y[]
************************************************************************/
@@ -28,85 +28,85 @@
#define UNUSED(x) (void)(x)
void Convolve (
- Word16 x[], /* (i) : input vector */
- Word16 h[], /* (i) : impulse response */
- Word16 y[], /* (o) : output vector */
- Word16 L /* (i) : vector size */
- )
+ Word16 x[], /* (i) : input vector */
+ Word16 h[], /* (i) : impulse response */
+ Word16 y[], /* (o) : output vector */
+ Word16 L /* (i) : vector size */
+ )
{
- Word32 i, n;
- Word16 *tmpH,*tmpX;
- Word32 s;
+ Word32 i, n;
+ Word16 *tmpH,*tmpX;
+ Word32 s;
UNUSED(L);
- for (n = 0; n < 64;)
- {
- tmpH = h+n;
- tmpX = x;
- i=n+1;
- s = vo_mult32((*tmpX++), (*tmpH--));i--;
- while(i>0)
- {
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- i -= 4;
- }
- y[n] = ((s<<1) + 0x8000)>>16;
- n++;
+ for (n = 0; n < 64;)
+ {
+ tmpH = h+n;
+ tmpX = x;
+ i=n+1;
+ s = vo_mult32((*tmpX++), (*tmpH--));i--;
+ while(i>0)
+ {
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ i -= 4;
+ }
+ y[n] = ((s<<1) + 0x8000)>>16;
+ n++;
- tmpH = h+n;
- tmpX = x;
- i=n+1;
- s = vo_mult32((*tmpX++), (*tmpH--));i--;
- s += vo_mult32((*tmpX++), (*tmpH--));i--;
+ tmpH = h+n;
+ tmpX = x;
+ i=n+1;
+ s = vo_mult32((*tmpX++), (*tmpH--));i--;
+ s += vo_mult32((*tmpX++), (*tmpH--));i--;
- while(i>0)
- {
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- i -= 4;
- }
- y[n] = ((s<<1) + 0x8000)>>16;
- n++;
+ while(i>0)
+ {
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ i -= 4;
+ }
+ y[n] = ((s<<1) + 0x8000)>>16;
+ n++;
- tmpH = h+n;
- tmpX = x;
- i=n+1;
- s = vo_mult32((*tmpX++), (*tmpH--));i--;
- s += vo_mult32((*tmpX++), (*tmpH--));i--;
- s += vo_mult32((*tmpX++), (*tmpH--));i--;
+ tmpH = h+n;
+ tmpX = x;
+ i=n+1;
+ s = vo_mult32((*tmpX++), (*tmpH--));i--;
+ s += vo_mult32((*tmpX++), (*tmpH--));i--;
+ s += vo_mult32((*tmpX++), (*tmpH--));i--;
- while(i>0)
- {
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- i -= 4;
- }
- y[n] = ((s<<1) + 0x8000)>>16;
- n++;
+ while(i>0)
+ {
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ i -= 4;
+ }
+ y[n] = ((s<<1) + 0x8000)>>16;
+ n++;
- s = 0;
- tmpH = h+n;
- tmpX = x;
- i=n+1;
- while(i>0)
- {
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- s += vo_mult32((*tmpX++), (*tmpH--));
- i -= 4;
- }
- y[n] = ((s<<1) + 0x8000)>>16;
- n++;
- }
- return;
+ s = 0;
+ tmpH = h+n;
+ tmpX = x;
+ i=n+1;
+ while(i>0)
+ {
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ s += vo_mult32((*tmpX++), (*tmpH--));
+ i -= 4;
+ }
+ y[n] = ((s<<1) + 0x8000)>>16;
+ n++;
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c b/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c
index d9245ed..b2aa759 100644
--- a/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c
+++ b/media/libstagefright/codecs/amrwbenc/src/cor_h_x.c
@@ -17,10 +17,10 @@
/***********************************************************************
* File: cor_h_x.c *
* *
-* Description:Compute correlation between target "x[]" and "h[]" *
-* Designed for codebook search (24 pulses, 4 tracks, *
-* 4 pulses per track, 16 positions in each track) to *
-* avoid saturation. *
+* Description:Compute correlation between target "x[]" and "h[]" *
+* Designed for codebook search (24 pulses, 4 tracks, *
+* 4 pulses per track, 16 positions in each track) to *
+* avoid saturation. *
* *
************************************************************************/
@@ -33,94 +33,94 @@
#define STEP 4
void cor_h_x(
- Word16 h[], /* (i) Q12 : impulse response of weighted synthesis filter */
- Word16 x[], /* (i) Q0 : target vector */
- Word16 dn[] /* (o) <12bit : correlation between target and h[] */
- )
+ Word16 h[], /* (i) Q12 : impulse response of weighted synthesis filter */
+ Word16 x[], /* (i) Q0 : target vector */
+ Word16 dn[] /* (o) <12bit : correlation between target and h[] */
+ )
{
- Word32 i, j;
- Word32 L_tmp, y32[L_SUBFR], L_tot;
- Word16 *p1, *p2;
- Word32 *p3;
- Word32 L_max, L_max1, L_max2, L_max3;
- /* first keep the result on 32 bits and find absolute maximum */
- L_tot = 1;
- L_max = 0;
- L_max1 = 0;
- L_max2 = 0;
- L_max3 = 0;
- for (i = 0; i < L_SUBFR; i += STEP)
- {
- L_tmp = 1; /* 1 -> to avoid null dn[] */
- p1 = &x[i];
- p2 = &h[0];
- for (j = i; j < L_SUBFR; j++)
- L_tmp += vo_L_mult(*p1++, *p2++);
+ Word32 i, j;
+ Word32 L_tmp, y32[L_SUBFR], L_tot;
+ Word16 *p1, *p2;
+ Word32 *p3;
+ Word32 L_max, L_max1, L_max2, L_max3;
+ /* first keep the result on 32 bits and find absolute maximum */
+ L_tot = 1;
+ L_max = 0;
+ L_max1 = 0;
+ L_max2 = 0;
+ L_max3 = 0;
+ for (i = 0; i < L_SUBFR; i += STEP)
+ {
+ L_tmp = 1; /* 1 -> to avoid null dn[] */
+ p1 = &x[i];
+ p2 = &h[0];
+ for (j = i; j < L_SUBFR; j++)
+ L_tmp += vo_L_mult(*p1++, *p2++);
- y32[i] = L_tmp;
- L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
- if(L_tmp > L_max)
- {
- L_max = L_tmp;
- }
+ y32[i] = L_tmp;
+ L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+ if(L_tmp > L_max)
+ {
+ L_max = L_tmp;
+ }
- L_tmp = 1L;
- p1 = &x[i+1];
- p2 = &h[0];
- for (j = i+1; j < L_SUBFR; j++)
- L_tmp += vo_L_mult(*p1++, *p2++);
+ L_tmp = 1L;
+ p1 = &x[i+1];
+ p2 = &h[0];
+ for (j = i+1; j < L_SUBFR; j++)
+ L_tmp += vo_L_mult(*p1++, *p2++);
- y32[i+1] = L_tmp;
- L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
- if(L_tmp > L_max1)
- {
- L_max1 = L_tmp;
- }
+ y32[i+1] = L_tmp;
+ L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+ if(L_tmp > L_max1)
+ {
+ L_max1 = L_tmp;
+ }
- L_tmp = 1;
- p1 = &x[i+2];
- p2 = &h[0];
- for (j = i+2; j < L_SUBFR; j++)
- L_tmp += vo_L_mult(*p1++, *p2++);
+ L_tmp = 1;
+ p1 = &x[i+2];
+ p2 = &h[0];
+ for (j = i+2; j < L_SUBFR; j++)
+ L_tmp += vo_L_mult(*p1++, *p2++);
- y32[i+2] = L_tmp;
- L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
- if(L_tmp > L_max2)
- {
- L_max2 = L_tmp;
- }
+ y32[i+2] = L_tmp;
+ L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+ if(L_tmp > L_max2)
+ {
+ L_max2 = L_tmp;
+ }
- L_tmp = 1;
- p1 = &x[i+3];
- p2 = &h[0];
- for (j = i+3; j < L_SUBFR; j++)
- L_tmp += vo_L_mult(*p1++, *p2++);
+ L_tmp = 1;
+ p1 = &x[i+3];
+ p2 = &h[0];
+ for (j = i+3; j < L_SUBFR; j++)
+ L_tmp += vo_L_mult(*p1++, *p2++);
- y32[i+3] = L_tmp;
- L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
- if(L_tmp > L_max3)
- {
- L_max3 = L_tmp;
- }
- }
- /* tot += 3*max / 8 */
- L_max = ((L_max + L_max1 + L_max2 + L_max3) >> 2);
- L_tot = vo_L_add(L_tot, L_max); /* +max/4 */
- L_tot = vo_L_add(L_tot, (L_max >> 1)); /* +max/8 */
+ y32[i+3] = L_tmp;
+ L_tmp = (L_tmp > 0)? L_tmp:-L_tmp;
+ if(L_tmp > L_max3)
+ {
+ L_max3 = L_tmp;
+ }
+ }
+ /* tot += 3*max / 8 */
+ L_max = ((L_max + L_max1 + L_max2 + L_max3) >> 2);
+ L_tot = vo_L_add(L_tot, L_max); /* +max/4 */
+ L_tot = vo_L_add(L_tot, (L_max >> 1)); /* +max/8 */
- /* Find the number of right shifts to do on y32[] so that */
- /* 6.0 x sumation of max of dn[] in each track not saturate. */
- j = norm_l(L_tot) - 4; /* 4 -> 16 x tot */
- p1 = dn;
- p3 = y32;
- for (i = 0; i < L_SUBFR; i+=4)
- {
- *p1++ = vo_round(L_shl(*p3++, j));
- *p1++ = vo_round(L_shl(*p3++, j));
- *p1++ = vo_round(L_shl(*p3++, j));
- *p1++ = vo_round(L_shl(*p3++, j));
- }
- return;
+ /* Find the number of right shifts to do on y32[] so that */
+ /* 6.0 x sumation of max of dn[] in each track not saturate. */
+ j = norm_l(L_tot) - 4; /* 4 -> 16 x tot */
+ p1 = dn;
+ p3 = y32;
+ for (i = 0; i < L_SUBFR; i+=4)
+ {
+ *p1++ = vo_round(L_shl(*p3++, j));
+ *p1++ = vo_round(L_shl(*p3++, j));
+ *p1++ = vo_round(L_shl(*p3++, j));
+ *p1++ = vo_round(L_shl(*p3++, j));
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/decim54.c b/media/libstagefright/codecs/amrwbenc/src/decim54.c
index 3b88514..e4c7940 100644
--- a/media/libstagefright/codecs/amrwbenc/src/decim54.c
+++ b/media/libstagefright/codecs/amrwbenc/src/decim54.c
@@ -17,7 +17,7 @@
/***********************************************************************
* File: decim54.c *
* *
-* Description:Decimation of 16kHz signal to 12.8kHz *
+* Description:Decimation of 16kHz signal to 12.8kHz *
* *
************************************************************************/
@@ -33,114 +33,114 @@
/* Local functions */
static void Down_samp(
- Word16 * sig, /* input: signal to downsampling */
- Word16 * sig_d, /* output: downsampled signal */
- Word16 L_frame_d /* input: length of output */
- );
+ Word16 * sig, /* input: signal to downsampling */
+ Word16 * sig_d, /* output: downsampled signal */
+ Word16 L_frame_d /* input: length of output */
+ );
/* 1/5 resolution interpolation filter (in Q14) */
/* -1.5dB @ 6kHz, -6dB @ 6.4kHz, -10dB @ 6.6kHz, -20dB @ 6.9kHz, -25dB @ 7kHz, -55dB @ 8kHz */
static Word16 fir_down1[4][30] =
{
- {-5, 24, -50, 54, 0, -128, 294, -408, 344, 0, -647, 1505, -2379, 3034, 13107, 3034, -2379, 1505, -647, 0, 344, -408,
- 294, -128, 0, 54, -50, 24, -5, 0},
+ {-5, 24, -50, 54, 0, -128, 294, -408, 344, 0, -647, 1505, -2379, 3034, 13107, 3034, -2379, 1505, -647, 0, 344, -408,
+ 294, -128, 0, 54, -50, 24, -5, 0},
- {-6, 19, -26, 0, 77, -188, 270, -233, 0, 434, -964, 1366, -1293, 0, 12254, 6575, -2746, 1030, 0, -507, 601, -441,
- 198, 0, -95, 99, -58, 18, 0, -1},
+ {-6, 19, -26, 0, 77, -188, 270, -233, 0, 434, -964, 1366, -1293, 0, 12254, 6575, -2746, 1030, 0, -507, 601, -441,
+ 198, 0, -95, 99, -58, 18, 0, -1},
- {-3, 9, 0, -41, 111, -170, 153, 0, -295, 649, -888, 770, 0, -1997, 9894, 9894, -1997, 0, 770, -888, 649, -295, 0,
- 153, -170, 111, -41, 0, 9, -3},
+ {-3, 9, 0, -41, 111, -170, 153, 0, -295, 649, -888, 770, 0, -1997, 9894, 9894, -1997, 0, 770, -888, 649, -295, 0,
+ 153, -170, 111, -41, 0, 9, -3},
- {-1, 0, 18, -58, 99, -95, 0, 198, -441, 601, -507, 0, 1030, -2746, 6575, 12254, 0, -1293, 1366, -964, 434, 0,
- -233, 270, -188, 77, 0, -26, 19, -6}
+ {-1, 0, 18, -58, 99, -95, 0, 198, -441, 601, -507, 0, 1030, -2746, 6575, 12254, 0, -1293, 1366, -964, 434, 0,
+ -233, 270, -188, 77, 0, -26, 19, -6}
};
void Init_Decim_12k8(
- Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */
- )
+ Word16 mem[] /* output: memory (2*NB_COEF_DOWN) set to zeros */
+ )
{
- Set_zero(mem, 2 * NB_COEF_DOWN);
- return;
+ Set_zero(mem, 2 * NB_COEF_DOWN);
+ return;
}
void Decim_12k8(
- Word16 sig16k[], /* input: signal to downsampling */
- Word16 lg, /* input: length of input */
- Word16 sig12k8[], /* output: decimated signal */
- Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */
- )
+ Word16 sig16k[], /* input: signal to downsampling */
+ Word16 lg, /* input: length of input */
+ Word16 sig12k8[], /* output: decimated signal */
+ Word16 mem[] /* in/out: memory (2*NB_COEF_DOWN) */
+ )
{
- Word16 lg_down;
- Word16 signal[L_FRAME16k + (2 * NB_COEF_DOWN)];
+ Word16 lg_down;
+ Word16 signal[L_FRAME16k + (2 * NB_COEF_DOWN)];
- Copy(mem, signal, 2 * NB_COEF_DOWN);
+ Copy(mem, signal, 2 * NB_COEF_DOWN);
- Copy(sig16k, signal + (2 * NB_COEF_DOWN), lg);
+ Copy(sig16k, signal + (2 * NB_COEF_DOWN), lg);
- lg_down = (lg * DOWN_FAC)>>15;
+ lg_down = (lg * DOWN_FAC)>>15;
- Down_samp(signal + NB_COEF_DOWN, sig12k8, lg_down);
+ Down_samp(signal + NB_COEF_DOWN, sig12k8, lg_down);
- Copy(signal + lg, mem, 2 * NB_COEF_DOWN);
+ Copy(signal + lg, mem, 2 * NB_COEF_DOWN);
- return;
+ return;
}
static void Down_samp(
- Word16 * sig, /* input: signal to downsampling */
- Word16 * sig_d, /* output: downsampled signal */
- Word16 L_frame_d /* input: length of output */
- )
+ Word16 * sig, /* input: signal to downsampling */
+ Word16 * sig_d, /* output: downsampled signal */
+ Word16 L_frame_d /* input: length of output */
+ )
{
- Word32 i, j, frac, pos;
- Word16 *x, *y;
- Word32 L_sum;
-
- pos = 0; /* position is in Q2 -> 1/4 resolution */
- for (j = 0; j < L_frame_d; j++)
- {
- i = (pos >> 2); /* integer part */
- frac = pos & 3; /* fractional part */
- x = sig + i - NB_COEF_DOWN + 1;
- y = (Word16 *)(fir_down1 + frac);
-
- L_sum = vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x++),(*y++));
- L_sum += vo_mult32((*x),(*y));
-
- L_sum = L_shl2(L_sum, 2);
- sig_d[j] = extract_h(L_add(L_sum, 0x8000));
- pos += FAC5; /* pos + 5/4 */
- }
- return;
+ Word32 i, j, frac, pos;
+ Word16 *x, *y;
+ Word32 L_sum;
+
+ pos = 0; /* position is in Q2 -> 1/4 resolution */
+ for (j = 0; j < L_frame_d; j++)
+ {
+ i = (pos >> 2); /* integer part */
+ frac = pos & 3; /* fractional part */
+ x = sig + i - NB_COEF_DOWN + 1;
+ y = (Word16 *)(fir_down1 + frac);
+
+ L_sum = vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x++),(*y++));
+ L_sum += vo_mult32((*x),(*y));
+
+ L_sum = L_shl2(L_sum, 2);
+ sig_d[j] = extract_h(L_add(L_sum, 0x8000));
+ pos += FAC5; /* pos + 5/4 */
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/deemph.c b/media/libstagefright/codecs/amrwbenc/src/deemph.c
index 5eae6a7..cc27f6e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/deemph.c
+++ b/media/libstagefright/codecs/amrwbenc/src/deemph.c
@@ -17,9 +17,9 @@
/***********************************************************************
* File: deemph.c *
* *
-* Description:filtering through 1/(1-mu z^ -1) *
-* Deemph2 --> signal is divided by 2 *
-* Deemph_32 --> for 32 bits signal. *
+* Description:filtering through 1/(1-mu z^ -1) *
+* Deemph2 --> signal is divided by 2 *
+* Deemph_32 --> for 32 bits signal. *
* *
************************************************************************/
@@ -28,100 +28,92 @@
#include "math_op.h"
void Deemph(
- Word16 x[], /* (i/o) : input signal overwritten by the output */
- Word16 mu, /* (i) Q15 : deemphasis factor */
- Word16 L, /* (i) : vector size */
- Word16 * mem /* (i/o) : memory (y[-1]) */
- )
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ )
{
- Word32 i;
- Word32 L_tmp;
+ Word32 i;
+ Word32 L_tmp;
- L_tmp = L_deposit_h(x[0]);
- L_tmp = L_mac(L_tmp, *mem, mu);
- x[0] = vo_round(L_tmp);
+ L_tmp = L_deposit_h(x[0]);
+ L_tmp = L_mac(L_tmp, *mem, mu);
+ x[0] = vo_round(L_tmp);
- for (i = 1; i < L; i++)
- {
- L_tmp = L_deposit_h(x[i]);
- L_tmp = L_mac(L_tmp, x[i - 1], mu);
- x[i] = voround(L_tmp);
- }
+ for (i = 1; i < L; i++)
+ {
+ L_tmp = L_deposit_h(x[i]);
+ L_tmp = L_mac(L_tmp, x[i - 1], mu);
+ x[i] = voround(L_tmp);
+ }
- *mem = x[L - 1];
+ *mem = x[L - 1];
- return;
+ return;
}
void Deemph2(
- Word16 x[], /* (i/o) : input signal overwritten by the output */
- Word16 mu, /* (i) Q15 : deemphasis factor */
- Word16 L, /* (i) : vector size */
- Word16 * mem /* (i/o) : memory (y[-1]) */
- )
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ )
{
- Word32 i;
- Word32 L_tmp;
- L_tmp = x[0] << 15;
- L_tmp += ((*mem) * mu)<<1;
- x[0] = (L_tmp + 0x8000)>>16;
- for (i = 1; i < L; i++)
- {
- Word32 tmp;
- L_tmp = x[i] << 15;
- tmp = (x[i - 1] * mu)<<1;
- if (tmp > 0 && L_tmp > INT_MAX - tmp) {
- L_tmp = INT_MAX;
- } else if (tmp < 0 && L_tmp < INT_MIN - tmp) {
- L_tmp = INT_MIN;
- } else {
- L_tmp += tmp;
- }
- if (L_tmp > INT32_MAX - 0x8000) {
- L_tmp = INT_MAX - 0x8000;
- }
- x[i] = (L_tmp + 0x8000)>>16;
- }
- *mem = x[L - 1];
- return;
+ Word32 i;
+ Word32 L_tmp;
+ L_tmp = x[0] << 15;
+ i = L_mult(*mem, mu);
+ L_tmp = L_add(L_tmp, i);
+ x[0] = voround(L_tmp);
+ for (i = 1; i < L; i++)
+ {
+ Word32 tmp;
+ L_tmp = x[i] << 15;
+ tmp = (x[i - 1] * mu)<<1;
+ L_tmp = L_add(L_tmp, tmp);
+ x[i] = voround(L_tmp);
+ }
+ *mem = x[L - 1];
+ return;
}
void Deemph_32(
- Word16 x_hi[], /* (i) : input signal (bit31..16) */
- Word16 x_lo[], /* (i) : input signal (bit15..4) */
- Word16 y[], /* (o) : output signal (x16) */
- Word16 mu, /* (i) Q15 : deemphasis factor */
- Word16 L, /* (i) : vector size */
- Word16 * mem /* (i/o) : memory (y[-1]) */
- )
+ Word16 x_hi[], /* (i) : input signal (bit31..16) */
+ Word16 x_lo[], /* (i) : input signal (bit15..4) */
+ Word16 y[], /* (o) : output signal (x16) */
+ Word16 mu, /* (i) Q15 : deemphasis factor */
+ Word16 L, /* (i) : vector size */
+ Word16 * mem /* (i/o) : memory (y[-1]) */
+ )
{
- Word16 fac;
- Word32 i, L_tmp;
-
- fac = mu >> 1; /* Q15 --> Q14 */
-
- L_tmp = L_deposit_h(x_hi[0]);
- L_tmp += (x_lo[0] * 8)<<1;
- L_tmp = (L_tmp << 3);
- L_tmp += ((*mem) * fac)<<1;
- L_tmp = (L_tmp << 1);
- y[0] = (L_tmp + 0x8000)>>16;
-
- for (i = 1; i < L; i++)
- {
- L_tmp = L_deposit_h(x_hi[i]);
- L_tmp += (x_lo[i] * 8)<<1;
- L_tmp = (L_tmp << 3);
- L_tmp += (y[i - 1] * fac)<<1;
- L_tmp = (L_tmp << 1);
- y[i] = (L_tmp + 0x8000)>>16;
- }
-
- *mem = y[L - 1];
-
- return;
+ Word16 fac;
+ Word32 i, L_tmp;
+
+ fac = mu >> 1; /* Q15 --> Q14 */
+
+ L_tmp = L_deposit_h(x_hi[0]);
+ L_tmp += (x_lo[0] * 8)<<1;
+ L_tmp = (L_tmp << 3);
+ L_tmp += ((*mem) * fac)<<1;
+ L_tmp = (L_tmp << 1);
+ y[0] = (L_tmp + 0x8000)>>16;
+
+ for (i = 1; i < L; i++)
+ {
+ L_tmp = L_deposit_h(x_hi[i]);
+ L_tmp += (x_lo[i] * 8)<<1;
+ L_tmp = (L_tmp << 3);
+ L_tmp += (y[i - 1] * fac)<<1;
+ L_tmp = (L_tmp << 1);
+ y[i] = (L_tmp + 0x8000)>>16;
+ }
+
+ *mem = y[L - 1];
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/dtx.c b/media/libstagefright/codecs/amrwbenc/src/dtx.c
index 2cfaced..6be8683 100644
--- a/media/libstagefright/codecs/amrwbenc/src/dtx.c
+++ b/media/libstagefright/codecs/amrwbenc/src/dtx.c
@@ -17,7 +17,7 @@
/***********************************************************************
* File: dtx.c *
* *
-* Description:DTX functions *
+* Description:DTX functions *
* *
************************************************************************/
@@ -35,33 +35,33 @@
#include "mem_align.h"
static void aver_isf_history(
- Word16 isf_old[],
- Word16 indices[],
- Word32 isf_aver[]
- );
+ Word16 isf_old[],
+ Word16 indices[],
+ Word32 isf_aver[]
+ );
static void find_frame_indices(
- Word16 isf_old_tx[],
- Word16 indices[],
- dtx_encState * st
- );
+ Word16 isf_old_tx[],
+ Word16 indices[],
+ dtx_encState * st
+ );
static Word16 dithering_control(
- dtx_encState * st
- );
+ dtx_encState * st
+ );
/* excitation energy adjustment depending on speech coder mode used, Q7 */
static Word16 en_adjust[9] =
{
- 230, /* mode0 = 7k : -5.4dB */
- 179, /* mode1 = 9k : -4.2dB */
- 141, /* mode2 = 12k : -3.3dB */
- 128, /* mode3 = 14k : -3.0dB */
- 122, /* mode4 = 16k : -2.85dB */
- 115, /* mode5 = 18k : -2.7dB */
- 115, /* mode6 = 20k : -2.7dB */
- 115, /* mode7 = 23k : -2.7dB */
- 115 /* mode8 = 24k : -2.7dB */
+ 230, /* mode0 = 7k : -5.4dB */
+ 179, /* mode1 = 9k : -4.2dB */
+ 141, /* mode2 = 12k : -3.3dB */
+ 128, /* mode3 = 14k : -3.0dB */
+ 122, /* mode4 = 16k : -2.85dB */
+ 115, /* mode5 = 18k : -2.7dB */
+ 115, /* mode6 = 20k : -2.7dB */
+ 115, /* mode7 = 23k : -2.7dB */
+ 115 /* mode8 = 24k : -2.7dB */
};
/**************************************************************************
@@ -71,24 +71,24 @@ static Word16 en_adjust[9] =
**************************************************************************/
Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMemOP)
{
- dtx_encState *s;
-
- if (st == (dtx_encState **) NULL)
- {
- fprintf(stderr, "dtx_enc_init: invalid parameter\n");
- return -1;
- }
- *st = NULL;
-
- /* allocate memory */
- if ((s = (dtx_encState *)mem_malloc(pMemOP, sizeof(dtx_encState), 32, VO_INDEX_ENC_AMRWB)) == NULL)
- {
- fprintf(stderr, "dtx_enc_init: can not malloc state structure\n");
- return -1;
- }
- dtx_enc_reset(s, isf_init);
- *st = s;
- return 0;
+ dtx_encState *s;
+
+ if (st == (dtx_encState **) NULL)
+ {
+ fprintf(stderr, "dtx_enc_init: invalid parameter\n");
+ return -1;
+ }
+ *st = NULL;
+
+ /* allocate memory */
+ if ((s = (dtx_encState *)mem_malloc(pMemOP, sizeof(dtx_encState), 32, VO_INDEX_ENC_AMRWB)) == NULL)
+ {
+ fprintf(stderr, "dtx_enc_init: can not malloc state structure\n");
+ return -1;
+ }
+ dtx_enc_reset(s, isf_init);
+ *st = s;
+ return 0;
}
/**************************************************************************
@@ -98,40 +98,40 @@ Word16 dtx_enc_init(dtx_encState ** st, Word16 isf_init[], VO_MEM_OPERATOR *pMem
**************************************************************************/
Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[])
{
- Word32 i;
-
- if (st == (dtx_encState *) NULL)
- {
- fprintf(stderr, "dtx_enc_reset: invalid parameter\n");
- return -1;
- }
- st->hist_ptr = 0;
- st->log_en_index = 0;
-
- /* Init isf_hist[] */
- for (i = 0; i < DTX_HIST_SIZE; i++)
- {
- Copy(isf_init, &st->isf_hist[i * M], M);
- }
- st->cng_seed = RANDOM_INITSEED;
-
- /* Reset energy history */
- Set_zero(st->log_en_hist, DTX_HIST_SIZE);
-
- st->dtxHangoverCount = DTX_HANG_CONST;
- st->decAnaElapsedCount = 32767;
-
- for (i = 0; i < 28; i++)
- {
- st->D[i] = 0;
- }
-
- for (i = 0; i < DTX_HIST_SIZE - 1; i++)
- {
- st->sumD[i] = 0;
- }
-
- return 1;
+ Word32 i;
+
+ if (st == (dtx_encState *) NULL)
+ {
+ fprintf(stderr, "dtx_enc_reset: invalid parameter\n");
+ return -1;
+ }
+ st->hist_ptr = 0;
+ st->log_en_index = 0;
+
+ /* Init isf_hist[] */
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ Copy(isf_init, &st->isf_hist[i * M], M);
+ }
+ st->cng_seed = RANDOM_INITSEED;
+
+ /* Reset energy history */
+ Set_zero(st->log_en_hist, DTX_HIST_SIZE);
+
+ st->dtxHangoverCount = DTX_HANG_CONST;
+ st->decAnaElapsedCount = 32767;
+
+ for (i = 0; i < 28; i++)
+ {
+ st->D[i] = 0;
+ }
+
+ for (i = 0; i < DTX_HIST_SIZE - 1; i++)
+ {
+ st->sumD[i] = 0;
+ }
+
+ return 1;
}
/**************************************************************************
@@ -141,12 +141,12 @@ Word16 dtx_enc_reset(dtx_encState * st, Word16 isf_init[])
**************************************************************************/
void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP)
{
- if (st == NULL || *st == NULL)
- return;
- /* deallocate memory */
- mem_free(pMemOP, *st, VO_INDEX_ENC_AMRWB);
- *st = NULL;
- return;
+ if (st == NULL || *st == NULL)
+ return;
+ /* deallocate memory */
+ mem_free(pMemOP, *st, VO_INDEX_ENC_AMRWB);
+ *st = NULL;
+ return;
}
@@ -156,133 +156,133 @@ void dtx_enc_exit(dtx_encState ** st, VO_MEM_OPERATOR *pMemOP)
*
**************************************************************************/
Word16 dtx_enc(
- dtx_encState * st, /* i/o : State struct */
- Word16 isf[M], /* o : CN ISF vector */
- Word16 * exc2, /* o : CN excitation */
- Word16 ** prms
- )
+ dtx_encState * st, /* i/o : State struct */
+ Word16 isf[M], /* o : CN ISF vector */
+ Word16 * exc2, /* o : CN excitation */
+ Word16 ** prms
+ )
{
- Word32 i, j;
- Word16 indice[7];
- Word16 log_en, gain, level, exp, exp0, tmp;
- Word16 log_en_int_e, log_en_int_m;
- Word32 L_isf[M], ener32, level32;
- Word16 isf_order[3];
- Word16 CN_dith;
-
- /* VOX mode computation of SID parameters */
- log_en = 0;
- for (i = 0; i < M; i++)
- {
- L_isf[i] = 0;
- }
- /* average energy and isf */
- for (i = 0; i < DTX_HIST_SIZE; i++)
- {
- /* Division by DTX_HIST_SIZE = 8 has been done in dtx_buffer. log_en is in Q10 */
- log_en = add(log_en, st->log_en_hist[i]);
-
- }
- find_frame_indices(st->isf_hist, isf_order, st);
- aver_isf_history(st->isf_hist, isf_order, L_isf);
-
- for (j = 0; j < M; j++)
- {
- isf[j] = (Word16)(L_isf[j] >> 3); /* divide by 8 */
- }
-
- /* quantize logarithmic energy to 6 bits (-6 : 66 dB) which corresponds to -2:22 in log2(E). */
- /* st->log_en_index = (short)( (log_en + 2.0) * 2.625 ); */
-
- /* increase dynamics to 7 bits (Q8) */
- log_en = (log_en >> 2);
-
- /* Add 2 in Q8 = 512 to get log2(E) between 0:24 */
- log_en = add(log_en, 512);
-
- /* Multiply by 2.625 to get full 6 bit range. 2.625 = 21504 in Q13. The result is in Q6 */
- log_en = mult(log_en, 21504);
-
- /* Quantize Energy */
- st->log_en_index = shr(log_en, 6);
-
- if(st->log_en_index > 63)
- {
- st->log_en_index = 63;
- }
- if (st->log_en_index < 0)
- {
- st->log_en_index = 0;
- }
- /* Quantize ISFs */
- Qisf_ns(isf, isf, indice);
-
-
- Parm_serial(indice[0], 6, prms);
- Parm_serial(indice[1], 6, prms);
- Parm_serial(indice[2], 6, prms);
- Parm_serial(indice[3], 5, prms);
- Parm_serial(indice[4], 5, prms);
-
- Parm_serial((st->log_en_index), 6, prms);
-
- CN_dith = dithering_control(st);
- Parm_serial(CN_dith, 1, prms);
-
- /* level = (float)( pow( 2.0f, (float)st->log_en_index / 2.625 - 2.0 ) ); */
- /* log2(E) in Q9 (log2(E) lies in between -2:22) */
- log_en = shl(st->log_en_index, 15 - 6);
-
- /* Divide by 2.625; log_en will be between 0:24 */
- log_en = mult(log_en, 12483);
- /* the result corresponds to log2(gain) in Q10 */
-
- /* Find integer part */
- log_en_int_e = (log_en >> 10);
-
- /* Find fractional part */
- log_en_int_m = (Word16) (log_en & 0x3ff);
- log_en_int_m = shl(log_en_int_m, 5);
-
- /* Subtract 2 from log_en in Q9, i.e divide the gain by 2 (energy by 4) */
- /* Add 16 in order to have the result of pow2 in Q16 */
- log_en_int_e = add(log_en_int_e, 16 - 1);
-
- level32 = Pow2(log_en_int_e, log_en_int_m); /* Q16 */
- exp0 = norm_l(level32);
- level32 = (level32 << exp0); /* level in Q31 */
- exp0 = (15 - exp0);
- level = extract_h(level32); /* level in Q15 */
-
- /* generate white noise vector */
- for (i = 0; i < L_FRAME; i++)
- {
- exc2[i] = (Random(&(st->cng_seed)) >> 4);
- }
-
- /* gain = level / sqrt(ener) * sqrt(L_FRAME) */
-
- /* energy of generated excitation */
- ener32 = Dot_product12(exc2, exc2, L_FRAME, &exp);
+ Word32 i, j;
+ Word16 indice[7];
+ Word16 log_en, gain, level, exp, exp0, tmp;
+ Word16 log_en_int_e, log_en_int_m;
+ Word32 L_isf[M], ener32, level32;
+ Word16 isf_order[3];
+ Word16 CN_dith;
+
+ /* VOX mode computation of SID parameters */
+ log_en = 0;
+ for (i = 0; i < M; i++)
+ {
+ L_isf[i] = 0;
+ }
+ /* average energy and isf */
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ /* Division by DTX_HIST_SIZE = 8 has been done in dtx_buffer. log_en is in Q10 */
+ log_en = add(log_en, st->log_en_hist[i]);
+
+ }
+ find_frame_indices(st->isf_hist, isf_order, st);
+ aver_isf_history(st->isf_hist, isf_order, L_isf);
+
+ for (j = 0; j < M; j++)
+ {
+ isf[j] = (Word16)(L_isf[j] >> 3); /* divide by 8 */
+ }
+
+ /* quantize logarithmic energy to 6 bits (-6 : 66 dB) which corresponds to -2:22 in log2(E). */
+ /* st->log_en_index = (short)( (log_en + 2.0) * 2.625 ); */
+
+ /* increase dynamics to 7 bits (Q8) */
+ log_en = (log_en >> 2);
+
+ /* Add 2 in Q8 = 512 to get log2(E) between 0:24 */
+ log_en = add(log_en, 512);
+
+ /* Multiply by 2.625 to get full 6 bit range. 2.625 = 21504 in Q13. The result is in Q6 */
+ log_en = mult(log_en, 21504);
+
+ /* Quantize Energy */
+ st->log_en_index = shr(log_en, 6);
+
+ if(st->log_en_index > 63)
+ {
+ st->log_en_index = 63;
+ }
+ if (st->log_en_index < 0)
+ {
+ st->log_en_index = 0;
+ }
+ /* Quantize ISFs */
+ Qisf_ns(isf, isf, indice);
+
+
+ Parm_serial(indice[0], 6, prms);
+ Parm_serial(indice[1], 6, prms);
+ Parm_serial(indice[2], 6, prms);
+ Parm_serial(indice[3], 5, prms);
+ Parm_serial(indice[4], 5, prms);
+
+ Parm_serial((st->log_en_index), 6, prms);
+
+ CN_dith = dithering_control(st);
+ Parm_serial(CN_dith, 1, prms);
+
+ /* level = (float)( pow( 2.0f, (float)st->log_en_index / 2.625 - 2.0 ) ); */
+ /* log2(E) in Q9 (log2(E) lies in between -2:22) */
+ log_en = shl(st->log_en_index, 15 - 6);
+
+ /* Divide by 2.625; log_en will be between 0:24 */
+ log_en = mult(log_en, 12483);
+ /* the result corresponds to log2(gain) in Q10 */
+
+ /* Find integer part */
+ log_en_int_e = (log_en >> 10);
+
+ /* Find fractional part */
+ log_en_int_m = (Word16) (log_en & 0x3ff);
+ log_en_int_m = shl(log_en_int_m, 5);
+
+ /* Subtract 2 from log_en in Q9, i.e divide the gain by 2 (energy by 4) */
+ /* Add 16 in order to have the result of pow2 in Q16 */
+ log_en_int_e = add(log_en_int_e, 16 - 1);
+
+ level32 = Pow2(log_en_int_e, log_en_int_m); /* Q16 */
+ exp0 = norm_l(level32);
+ level32 = (level32 << exp0); /* level in Q31 */
+ exp0 = (15 - exp0);
+ level = extract_h(level32); /* level in Q15 */
+
+ /* generate white noise vector */
+ for (i = 0; i < L_FRAME; i++)
+ {
+ exc2[i] = (Random(&(st->cng_seed)) >> 4);
+ }
+
+ /* gain = level / sqrt(ener) * sqrt(L_FRAME) */
+
+ /* energy of generated excitation */
+ ener32 = Dot_product12(exc2, exc2, L_FRAME, &exp);
- Isqrt_n(&ener32, &exp);
+ Isqrt_n(&ener32, &exp);
- gain = extract_h(ener32);
+ gain = extract_h(ener32);
- gain = mult(level, gain); /* gain in Q15 */
+ gain = mult(level, gain); /* gain in Q15 */
- exp = add(exp0, exp);
+ exp = add(exp0, exp);
- /* Multiply by sqrt(L_FRAME)=16, i.e. shift left by 4 */
- exp += 4;
+ /* Multiply by sqrt(L_FRAME)=16, i.e. shift left by 4 */
+ exp += 4;
- for (i = 0; i < L_FRAME; i++)
- {
- tmp = mult(exc2[i], gain); /* Q0 * Q15 */
- exc2[i] = shl(tmp, exp);
- }
+ for (i = 0; i < L_FRAME; i++)
+ {
+ tmp = mult(exc2[i], gain); /* Q0 * Q15 */
+ exc2[i] = shl(tmp, exp);
+ }
- return 0;
+ return 0;
}
/**************************************************************************
@@ -291,45 +291,45 @@ Word16 dtx_enc(
*
**************************************************************************/
Word16 dtx_buffer(
- dtx_encState * st, /* i/o : State struct */
- Word16 isf_new[], /* i : isf vector */
- Word32 enr, /* i : residual energy (in L_FRAME) */
- Word16 codec_mode
- )
+ dtx_encState * st, /* i/o : State struct */
+ Word16 isf_new[], /* i : isf vector */
+ Word32 enr, /* i : residual energy (in L_FRAME) */
+ Word16 codec_mode
+ )
{
- Word16 log_en;
-
- Word16 log_en_e;
- Word16 log_en_m;
- st->hist_ptr = add(st->hist_ptr, 1);
- if(st->hist_ptr == DTX_HIST_SIZE)
- {
- st->hist_ptr = 0;
- }
- /* copy lsp vector into buffer */
- Copy(isf_new, &st->isf_hist[st->hist_ptr * M], M);
-
- /* log_en = (float)log10(enr*0.0059322)/(float)log10(2.0f); */
- Log2(enr, &log_en_e, &log_en_m);
-
- /* convert exponent and mantissa to Word16 Q7. Q7 is used to simplify averaging in dtx_enc */
- log_en = shl(log_en_e, 7); /* Q7 */
- log_en = add(log_en, shr(log_en_m, 15 - 7));
-
- /* Find energy per sample by multiplying with 0.0059322, i.e subtract log2(1/0.0059322) = 7.39722 The
- * constant 0.0059322 takes into account windowings and analysis length from autocorrelation
- * computations; 7.39722 in Q7 = 947 */
- /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */
- /* log_en = sub( log_en, 947 + en_adjust[codec_mode] ); */
-
- /* Find energy per sample (divide by L_FRAME=256), i.e subtract log2(256) = 8.0 (1024 in Q7) */
- /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */
-
- log_en = sub(log_en, add(1024, en_adjust[codec_mode]));
-
- /* Insert into the buffer */
- st->log_en_hist[st->hist_ptr] = log_en;
- return 0;
+ Word16 log_en;
+
+ Word16 log_en_e;
+ Word16 log_en_m;
+ st->hist_ptr = add(st->hist_ptr, 1);
+ if(st->hist_ptr == DTX_HIST_SIZE)
+ {
+ st->hist_ptr = 0;
+ }
+ /* copy lsp vector into buffer */
+ Copy(isf_new, &st->isf_hist[st->hist_ptr * M], M);
+
+ /* log_en = (float)log10(enr*0.0059322)/(float)log10(2.0f); */
+ Log2(enr, &log_en_e, &log_en_m);
+
+ /* convert exponent and mantissa to Word16 Q7. Q7 is used to simplify averaging in dtx_enc */
+ log_en = shl(log_en_e, 7); /* Q7 */
+ log_en = add(log_en, shr(log_en_m, 15 - 7));
+
+ /* Find energy per sample by multiplying with 0.0059322, i.e subtract log2(1/0.0059322) = 7.39722 The
+ * constant 0.0059322 takes into account windowings and analysis length from autocorrelation
+ * computations; 7.39722 in Q7 = 947 */
+ /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */
+ /* log_en = sub( log_en, 947 + en_adjust[codec_mode] ); */
+
+ /* Find energy per sample (divide by L_FRAME=256), i.e subtract log2(256) = 8.0 (1024 in Q7) */
+ /* Subtract 3 dB = 0.99658 in log2(E) = 127 in Q7. */
+
+ log_en = sub(log_en, add(1024, en_adjust[codec_mode]));
+
+ /* Insert into the buffer */
+ st->log_en_hist[st->hist_ptr] = log_en;
+ return 0;
}
/**************************************************************************
@@ -339,267 +339,267 @@ Word16 dtx_buffer(
* the decoding side.
**************************************************************************/
void tx_dtx_handler(dtx_encState * st, /* i/o : State struct */
- Word16 vad_flag, /* i : vad decision */
- Word16 * usedMode /* i/o : mode changed or not */
- )
+ Word16 vad_flag, /* i : vad decision */
+ Word16 * usedMode /* i/o : mode changed or not */
+ )
{
- /* this state machine is in synch with the GSMEFR txDtx machine */
- st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1);
-
- if (vad_flag != 0)
- {
- st->dtxHangoverCount = DTX_HANG_CONST;
- } else
- { /* non-speech */
- if (st->dtxHangoverCount == 0)
- { /* out of decoder analysis hangover */
- st->decAnaElapsedCount = 0;
- *usedMode = MRDTX;
- } else
- { /* in possible analysis hangover */
- st->dtxHangoverCount = sub(st->dtxHangoverCount, 1);
-
- /* decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH */
- if (sub(add(st->decAnaElapsedCount, st->dtxHangoverCount),
- DTX_ELAPSED_FRAMES_THRESH) < 0)
- {
- *usedMode = MRDTX;
- /* if short time since decoder update, do not add extra HO */
- }
- /* else override VAD and stay in speech mode *usedMode and add extra hangover */
- }
- }
-
- return;
+ /* this state machine is in synch with the GSMEFR txDtx machine */
+ st->decAnaElapsedCount = add(st->decAnaElapsedCount, 1);
+
+ if (vad_flag != 0)
+ {
+ st->dtxHangoverCount = DTX_HANG_CONST;
+ } else
+ { /* non-speech */
+ if (st->dtxHangoverCount == 0)
+ { /* out of decoder analysis hangover */
+ st->decAnaElapsedCount = 0;
+ *usedMode = MRDTX;
+ } else
+ { /* in possible analysis hangover */
+ st->dtxHangoverCount = sub(st->dtxHangoverCount, 1);
+
+ /* decAnaElapsedCount + dtxHangoverCount < DTX_ELAPSED_FRAMES_THRESH */
+ if (sub(add(st->decAnaElapsedCount, st->dtxHangoverCount),
+ DTX_ELAPSED_FRAMES_THRESH) < 0)
+ {
+ *usedMode = MRDTX;
+ /* if short time since decoder update, do not add extra HO */
+ }
+ /* else override VAD and stay in speech mode *usedMode and add extra hangover */
+ }
+ }
+
+ return;
}
static void aver_isf_history(
- Word16 isf_old[],
- Word16 indices[],
- Word32 isf_aver[]
- )
+ Word16 isf_old[],
+ Word16 indices[],
+ Word32 isf_aver[]
+ )
{
- Word32 i, j, k;
- Word16 isf_tmp[2 * M];
- Word32 L_tmp;
-
- /* Memorize in isf_tmp[][] the ISF vectors to be replaced by */
- /* the median ISF vector prior to the averaging */
- for (k = 0; k < 2; k++)
- {
- if ((indices[k] + 1) != 0)
- {
- for (i = 0; i < M; i++)
- {
- isf_tmp[k * M + i] = isf_old[indices[k] * M + i];
- isf_old[indices[k] * M + i] = isf_old[indices[2] * M + i];
- }
- }
- }
-
- /* Perform the ISF averaging */
- for (j = 0; j < M; j++)
- {
- L_tmp = 0;
-
- for (i = 0; i < DTX_HIST_SIZE; i++)
- {
- L_tmp = L_add(L_tmp, L_deposit_l(isf_old[i * M + j]));
- }
- isf_aver[j] = L_tmp;
- }
-
- /* Retrieve from isf_tmp[][] the ISF vectors saved prior to averaging */
- for (k = 0; k < 2; k++)
- {
- if ((indices[k] + 1) != 0)
- {
- for (i = 0; i < M; i++)
- {
- isf_old[indices[k] * M + i] = isf_tmp[k * M + i];
- }
- }
- }
-
- return;
+ Word32 i, j, k;
+ Word16 isf_tmp[2 * M];
+ Word32 L_tmp;
+
+ /* Memorize in isf_tmp[][] the ISF vectors to be replaced by */
+ /* the median ISF vector prior to the averaging */
+ for (k = 0; k < 2; k++)
+ {
+ if ((indices[k] + 1) != 0)
+ {
+ for (i = 0; i < M; i++)
+ {
+ isf_tmp[k * M + i] = isf_old[indices[k] * M + i];
+ isf_old[indices[k] * M + i] = isf_old[indices[2] * M + i];
+ }
+ }
+ }
+
+ /* Perform the ISF averaging */
+ for (j = 0; j < M; j++)
+ {
+ L_tmp = 0;
+
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ L_tmp = L_add(L_tmp, L_deposit_l(isf_old[i * M + j]));
+ }
+ isf_aver[j] = L_tmp;
+ }
+
+ /* Retrieve from isf_tmp[][] the ISF vectors saved prior to averaging */
+ for (k = 0; k < 2; k++)
+ {
+ if ((indices[k] + 1) != 0)
+ {
+ for (i = 0; i < M; i++)
+ {
+ isf_old[indices[k] * M + i] = isf_tmp[k * M + i];
+ }
+ }
+ }
+
+ return;
}
static void find_frame_indices(
- Word16 isf_old_tx[],
- Word16 indices[],
- dtx_encState * st
- )
+ Word16 isf_old_tx[],
+ Word16 indices[],
+ dtx_encState * st
+ )
{
- Word32 L_tmp, summin, summax, summax2nd;
- Word16 i, j, tmp;
- Word16 ptr;
-
- /* Remove the effect of the oldest frame from the column */
- /* sum sumD[0..DTX_HIST_SIZE-1]. sumD[DTX_HIST_SIZE] is */
- /* not updated since it will be removed later. */
-
- tmp = DTX_HIST_SIZE_MIN_ONE;
- j = -1;
- for (i = 0; i < DTX_HIST_SIZE_MIN_ONE; i++)
- {
- j = add(j, tmp);
- st->sumD[i] = L_sub(st->sumD[i], st->D[j]);
- tmp = sub(tmp, 1);
- }
-
- /* Shift the column sum sumD. The element sumD[DTX_HIST_SIZE-1] */
- /* corresponding to the oldest frame is removed. The sum of */
- /* the distances between the latest isf and other isfs, */
- /* i.e. the element sumD[0], will be computed during this call. */
- /* Hence this element is initialized to zero. */
-
- for (i = DTX_HIST_SIZE_MIN_ONE; i > 0; i--)
- {
- st->sumD[i] = st->sumD[i - 1];
- }
- st->sumD[0] = 0;
-
- /* Remove the oldest frame from the distance matrix. */
- /* Note that the distance matrix is replaced by a one- */
- /* dimensional array to save static memory. */
-
- tmp = 0;
- for (i = 27; i >= 12; i = (Word16) (i - tmp))
- {
- tmp = add(tmp, 1);
- for (j = tmp; j > 0; j--)
- {
- st->D[i - j + 1] = st->D[i - j - tmp];
- }
- }
-
- /* Compute the first column of the distance matrix D */
- /* (squared Euclidean distances from isf1[] to isf_old_tx[][]). */
-
- ptr = st->hist_ptr;
- for (i = 1; i < DTX_HIST_SIZE; i++)
- {
- /* Compute the distance between the latest isf and the other isfs. */
- ptr = sub(ptr, 1);
- if (ptr < 0)
- {
- ptr = DTX_HIST_SIZE_MIN_ONE;
- }
- L_tmp = 0;
- for (j = 0; j < M; j++)
- {
- tmp = sub(isf_old_tx[st->hist_ptr * M + j], isf_old_tx[ptr * M + j]);
- L_tmp = L_mac(L_tmp, tmp, tmp);
- }
- st->D[i - 1] = L_tmp;
-
- /* Update also the column sums. */
- st->sumD[0] = L_add(st->sumD[0], st->D[i - 1]);
- st->sumD[i] = L_add(st->sumD[i], st->D[i - 1]);
- }
-
- /* Find the minimum and maximum distances */
- summax = st->sumD[0];
- summin = st->sumD[0];
- indices[0] = 0;
- indices[2] = 0;
- for (i = 1; i < DTX_HIST_SIZE; i++)
- {
- if (L_sub(st->sumD[i], summax) > 0)
- {
- indices[0] = i;
- summax = st->sumD[i];
- }
- if (L_sub(st->sumD[i], summin) < 0)
- {
- indices[2] = i;
- summin = st->sumD[i];
- }
- }
-
- /* Find the second largest distance */
- summax2nd = -2147483647L;
- indices[1] = -1;
- for (i = 0; i < DTX_HIST_SIZE; i++)
- {
- if ((L_sub(st->sumD[i], summax2nd) > 0) && (sub(i, indices[0]) != 0))
- {
- indices[1] = i;
- summax2nd = st->sumD[i];
- }
- }
-
- for (i = 0; i < 3; i++)
- {
- indices[i] = sub(st->hist_ptr, indices[i]);
- if (indices[i] < 0)
- {
- indices[i] = add(indices[i], DTX_HIST_SIZE);
- }
- }
-
- /* If maximum distance/MED_THRESH is smaller than minimum distance */
- /* then the median ISF vector replacement is not performed */
- tmp = norm_l(summax);
- summax = (summax << tmp);
- summin = (summin << tmp);
- L_tmp = L_mult(voround(summax), INV_MED_THRESH);
- if(L_tmp <= summin)
- {
- indices[0] = -1;
- }
- /* If second largest distance/MED_THRESH is smaller than */
- /* minimum distance then the median ISF vector replacement is */
- /* not performed */
- summax2nd = L_shl(summax2nd, tmp);
- L_tmp = L_mult(voround(summax2nd), INV_MED_THRESH);
- if(L_tmp <= summin)
- {
- indices[1] = -1;
- }
- return;
+ Word32 L_tmp, summin, summax, summax2nd;
+ Word16 i, j, tmp;
+ Word16 ptr;
+
+ /* Remove the effect of the oldest frame from the column */
+ /* sum sumD[0..DTX_HIST_SIZE-1]. sumD[DTX_HIST_SIZE] is */
+ /* not updated since it will be removed later. */
+
+ tmp = DTX_HIST_SIZE_MIN_ONE;
+ j = -1;
+ for (i = 0; i < DTX_HIST_SIZE_MIN_ONE; i++)
+ {
+ j = add(j, tmp);
+ st->sumD[i] = L_sub(st->sumD[i], st->D[j]);
+ tmp = sub(tmp, 1);
+ }
+
+ /* Shift the column sum sumD. The element sumD[DTX_HIST_SIZE-1] */
+ /* corresponding to the oldest frame is removed. The sum of */
+ /* the distances between the latest isf and other isfs, */
+ /* i.e. the element sumD[0], will be computed during this call. */
+ /* Hence this element is initialized to zero. */
+
+ for (i = DTX_HIST_SIZE_MIN_ONE; i > 0; i--)
+ {
+ st->sumD[i] = st->sumD[i - 1];
+ }
+ st->sumD[0] = 0;
+
+ /* Remove the oldest frame from the distance matrix. */
+ /* Note that the distance matrix is replaced by a one- */
+ /* dimensional array to save static memory. */
+
+ tmp = 0;
+ for (i = 27; i >= 12; i = (Word16) (i - tmp))
+ {
+ tmp = add(tmp, 1);
+ for (j = tmp; j > 0; j--)
+ {
+ st->D[i - j + 1] = st->D[i - j - tmp];
+ }
+ }
+
+ /* Compute the first column of the distance matrix D */
+ /* (squared Euclidean distances from isf1[] to isf_old_tx[][]). */
+
+ ptr = st->hist_ptr;
+ for (i = 1; i < DTX_HIST_SIZE; i++)
+ {
+ /* Compute the distance between the latest isf and the other isfs. */
+ ptr = sub(ptr, 1);
+ if (ptr < 0)
+ {
+ ptr = DTX_HIST_SIZE_MIN_ONE;
+ }
+ L_tmp = 0;
+ for (j = 0; j < M; j++)
+ {
+ tmp = sub(isf_old_tx[st->hist_ptr * M + j], isf_old_tx[ptr * M + j]);
+ L_tmp = L_mac(L_tmp, tmp, tmp);
+ }
+ st->D[i - 1] = L_tmp;
+
+ /* Update also the column sums. */
+ st->sumD[0] = L_add(st->sumD[0], st->D[i - 1]);
+ st->sumD[i] = L_add(st->sumD[i], st->D[i - 1]);
+ }
+
+ /* Find the minimum and maximum distances */
+ summax = st->sumD[0];
+ summin = st->sumD[0];
+ indices[0] = 0;
+ indices[2] = 0;
+ for (i = 1; i < DTX_HIST_SIZE; i++)
+ {
+ if (L_sub(st->sumD[i], summax) > 0)
+ {
+ indices[0] = i;
+ summax = st->sumD[i];
+ }
+ if (L_sub(st->sumD[i], summin) < 0)
+ {
+ indices[2] = i;
+ summin = st->sumD[i];
+ }
+ }
+
+ /* Find the second largest distance */
+ summax2nd = -2147483647L;
+ indices[1] = -1;
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ if ((L_sub(st->sumD[i], summax2nd) > 0) && (sub(i, indices[0]) != 0))
+ {
+ indices[1] = i;
+ summax2nd = st->sumD[i];
+ }
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ indices[i] = sub(st->hist_ptr, indices[i]);
+ if (indices[i] < 0)
+ {
+ indices[i] = add(indices[i], DTX_HIST_SIZE);
+ }
+ }
+
+ /* If maximum distance/MED_THRESH is smaller than minimum distance */
+ /* then the median ISF vector replacement is not performed */
+ tmp = norm_l(summax);
+ summax = (summax << tmp);
+ summin = (summin << tmp);
+ L_tmp = L_mult(voround(summax), INV_MED_THRESH);
+ if(L_tmp <= summin)
+ {
+ indices[0] = -1;
+ }
+ /* If second largest distance/MED_THRESH is smaller than */
+ /* minimum distance then the median ISF vector replacement is */
+ /* not performed */
+ summax2nd = L_shl(summax2nd, tmp);
+ L_tmp = L_mult(voround(summax2nd), INV_MED_THRESH);
+ if(L_tmp <= summin)
+ {
+ indices[1] = -1;
+ }
+ return;
}
static Word16 dithering_control(
- dtx_encState * st
- )
+ dtx_encState * st
+ )
{
- Word16 tmp, mean, CN_dith, gain_diff;
- Word32 i, ISF_diff;
-
- /* determine how stationary the spectrum of background noise is */
- ISF_diff = 0;
- for (i = 0; i < 8; i++)
- {
- ISF_diff = L_add(ISF_diff, st->sumD[i]);
- }
- if ((ISF_diff >> 26) > 0)
- {
- CN_dith = 1;
- } else
- {
- CN_dith = 0;
- }
-
- /* determine how stationary the energy of background noise is */
- mean = 0;
- for (i = 0; i < DTX_HIST_SIZE; i++)
- {
- mean = add(mean, st->log_en_hist[i]);
- }
- mean = (mean >> 3);
- gain_diff = 0;
- for (i = 0; i < DTX_HIST_SIZE; i++)
- {
- tmp = abs_s(sub(st->log_en_hist[i], mean));
- gain_diff = add(gain_diff, tmp);
- }
- if (gain_diff > GAIN_THR)
- {
- CN_dith = 1;
- }
- return CN_dith;
+ Word16 tmp, mean, CN_dith, gain_diff;
+ Word32 i, ISF_diff;
+
+ /* determine how stationary the spectrum of background noise is */
+ ISF_diff = 0;
+ for (i = 0; i < 8; i++)
+ {
+ ISF_diff = L_add(ISF_diff, st->sumD[i]);
+ }
+ if ((ISF_diff >> 26) > 0)
+ {
+ CN_dith = 1;
+ } else
+ {
+ CN_dith = 0;
+ }
+
+ /* determine how stationary the energy of background noise is */
+ mean = 0;
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ mean = add(mean, st->log_en_hist[i]);
+ }
+ mean = (mean >> 3);
+ gain_diff = 0;
+ for (i = 0; i < DTX_HIST_SIZE; i++)
+ {
+ tmp = abs_s(sub(st->log_en_hist[i], mean));
+ gain_diff = add(gain_diff, tmp);
+ }
+ if (gain_diff > GAIN_THR)
+ {
+ CN_dith = 1;
+ }
+ return CN_dith;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/g_pitch.c b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c
index d681f2e..98ee87e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/g_pitch.c
+++ b/media/libstagefright/codecs/amrwbenc/src/g_pitch.c
@@ -17,9 +17,9 @@
/***********************************************************************
* File: g_pitch.c *
* *
-* Description:Compute the gain of pitch. Result in Q12 *
-* if(gain < 0) gain = 0 *
-* if(gain > 1.2) gain = 1.2 *
+* Description:Compute the gain of pitch. Result in Q12 *
+* if(gain < 0) gain = 0 *
+* if(gain > 1.2) gain = 1.2 *
************************************************************************/
#include "typedef.h"
@@ -27,52 +27,52 @@
#include "math_op.h"
Word16 G_pitch( /* (o) Q14 : Gain of pitch lag saturated to 1.2 */
- Word16 xn[], /* (i) : Pitch target. */
- Word16 y1[], /* (i) : filtered adaptive codebook. */
- Word16 g_coeff[], /* : Correlations need for gain quantization. */
- Word16 L_subfr /* : Length of subframe. */
- )
+ Word16 xn[], /* (i) : Pitch target. */
+ Word16 y1[], /* (i) : filtered adaptive codebook. */
+ Word16 g_coeff[], /* : Correlations need for gain quantization. */
+ Word16 L_subfr /* : Length of subframe. */
+ )
{
- Word32 i;
- Word16 xy, yy, exp_xy, exp_yy, gain;
- /* Compute scalar product <y1[],y1[]> */
+ Word32 i;
+ Word16 xy, yy, exp_xy, exp_yy, gain;
+ /* Compute scalar product <y1[],y1[]> */
#ifdef ASM_OPT /* asm optimization branch */
- /* Compute scalar product <xn[],y1[]> */
- xy = extract_h(Dot_product12_asm(xn, y1, L_subfr, &exp_xy));
- yy = extract_h(Dot_product12_asm(y1, y1, L_subfr, &exp_yy));
+ /* Compute scalar product <xn[],y1[]> */
+ xy = extract_h(Dot_product12_asm(xn, y1, L_subfr, &exp_xy));
+ yy = extract_h(Dot_product12_asm(y1, y1, L_subfr, &exp_yy));
#else
- /* Compute scalar product <xn[],y1[]> */
- xy = extract_h(Dot_product12(xn, y1, L_subfr, &exp_xy));
- yy = extract_h(Dot_product12(y1, y1, L_subfr, &exp_yy));
+ /* Compute scalar product <xn[],y1[]> */
+ xy = extract_h(Dot_product12(xn, y1, L_subfr, &exp_xy));
+ yy = extract_h(Dot_product12(y1, y1, L_subfr, &exp_yy));
#endif
- g_coeff[0] = yy;
- g_coeff[1] = exp_yy;
- g_coeff[2] = xy;
- g_coeff[3] = exp_xy;
+ g_coeff[0] = yy;
+ g_coeff[1] = exp_yy;
+ g_coeff[2] = xy;
+ g_coeff[3] = exp_xy;
- /* If (xy < 0) gain = 0 */
- if (xy < 0)
- return ((Word16) 0);
+ /* If (xy < 0) gain = 0 */
+ if (xy < 0)
+ return ((Word16) 0);
- /* compute gain = xy/yy */
+ /* compute gain = xy/yy */
- xy >>= 1; /* Be sure xy < yy */
- gain = div_s(xy, yy);
+ xy >>= 1; /* Be sure xy < yy */
+ gain = div_s(xy, yy);
- i = exp_xy;
- i -= exp_yy;
+ i = exp_xy;
+ i -= exp_yy;
- gain = shl(gain, i);
+ gain = shl(gain, i);
- /* if (gain > 1.2) gain = 1.2 in Q14 */
- if(gain > 19661)
- {
- gain = 19661;
- }
- return (gain);
+ /* if (gain > 1.2) gain = 1.2 in Q14 */
+ if(gain > 19661)
+ {
+ gain = 19661;
+ }
+ return (gain);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/gpclip.c b/media/libstagefright/codecs/amrwbenc/src/gpclip.c
index 800b3f9..4ce3daa 100644
--- a/media/libstagefright/codecs/amrwbenc/src/gpclip.c
+++ b/media/libstagefright/codecs/amrwbenc/src/gpclip.c
@@ -35,75 +35,75 @@
void Init_gp_clip(
- Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */
- )
+ Word16 mem[] /* (o) : memory of gain of pitch clipping algorithm */
+ )
{
- mem[0] = DIST_ISF_MAX;
- mem[1] = GAIN_PIT_MIN;
+ mem[0] = DIST_ISF_MAX;
+ mem[1] = GAIN_PIT_MIN;
}
Word16 Gp_clip(
- Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
- )
+ Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
+ )
{
- Word16 clip = 0;
- if ((mem[0] < DIST_ISF_THRES) && (mem[1] > GAIN_PIT_THRES))
- clip = 1;
+ Word16 clip = 0;
+ if ((mem[0] < DIST_ISF_THRES) && (mem[1] > GAIN_PIT_THRES))
+ clip = 1;
- return (clip);
+ return (clip);
}
void Gp_clip_test_isf(
- Word16 isf[], /* (i) : isf values (in frequency domain) */
- Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
- )
+ Word16 isf[], /* (i) : isf values (in frequency domain) */
+ Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
+ )
{
- Word16 dist, dist_min;
- Word32 i;
+ Word16 dist, dist_min;
+ Word32 i;
- dist_min = vo_sub(isf[1], isf[0]);
+ dist_min = vo_sub(isf[1], isf[0]);
- for (i = 2; i < M - 1; i++)
- {
- dist = vo_sub(isf[i], isf[i - 1]);
- if(dist < dist_min)
- {
- dist_min = dist;
- }
- }
+ for (i = 2; i < M - 1; i++)
+ {
+ dist = vo_sub(isf[i], isf[i - 1]);
+ if(dist < dist_min)
+ {
+ dist_min = dist;
+ }
+ }
- dist = extract_h(L_mac(vo_L_mult(26214, mem[0]), 6554, dist_min));
+ dist = extract_h(L_mac(vo_L_mult(26214, mem[0]), 6554, dist_min));
- if (dist > DIST_ISF_MAX)
- {
- dist = DIST_ISF_MAX;
- }
- mem[0] = dist;
+ if (dist > DIST_ISF_MAX)
+ {
+ dist = DIST_ISF_MAX;
+ }
+ mem[0] = dist;
- return;
+ return;
}
void Gp_clip_test_gain_pit(
- Word16 gain_pit, /* (i) Q14 : gain of quantized pitch */
- Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
- )
+ Word16 gain_pit, /* (i) Q14 : gain of quantized pitch */
+ Word16 mem[] /* (i/o) : memory of gain of pitch clipping algorithm */
+ )
{
- Word16 gain;
- Word32 L_tmp;
- L_tmp = (29491 * mem[1])<<1;
- L_tmp += (3277 * gain_pit)<<1;
-
- gain = extract_h(L_tmp);
-
- if(gain < GAIN_PIT_MIN)
- {
- gain = GAIN_PIT_MIN;
- }
- mem[1] = gain;
- return;
+ Word16 gain;
+ Word32 L_tmp;
+ L_tmp = (29491 * mem[1])<<1;
+ L_tmp += (3277 * gain_pit)<<1;
+
+ gain = extract_h(L_tmp);
+
+ if(gain < GAIN_PIT_MIN)
+ {
+ gain = GAIN_PIT_MIN;
+ }
+ mem[1] = gain;
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/homing.c b/media/libstagefright/codecs/amrwbenc/src/homing.c
index 565040f..a96e7db 100644
--- a/media/libstagefright/codecs/amrwbenc/src/homing.c
+++ b/media/libstagefright/codecs/amrwbenc/src/homing.c
@@ -29,18 +29,18 @@
Word16 encoder_homing_frame_test(Word16 input_frame[])
{
- Word32 i;
- Word16 j = 0;
+ Word32 i;
+ Word16 j = 0;
- /* check 320 input samples for matching EHF_MASK: defined in e_homing.h */
- for (i = 0; i < L_FRAME16k; i++)
- {
- j = (Word16) (input_frame[i] ^ EHF_MASK);
+ /* check 320 input samples for matching EHF_MASK: defined in e_homing.h */
+ for (i = 0; i < L_FRAME16k; i++)
+ {
+ j = (Word16) (input_frame[i] ^ EHF_MASK);
- if (j)
- break;
- }
+ if (j)
+ break;
+ }
- return (Word16) (!j);
+ return (Word16) (!j);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp400.c b/media/libstagefright/codecs/amrwbenc/src/hp400.c
index a6f9701..c658a92 100644
--- a/media/libstagefright/codecs/amrwbenc/src/hp400.c
+++ b/media/libstagefright/codecs/amrwbenc/src/hp400.c
@@ -50,56 +50,56 @@ static Word16 a[3] = {16384, 29280, -14160}; /* Q12 (x4) */
void Init_HP400_12k8(Word16 mem[])
{
- Set_zero(mem, 6);
+ Set_zero(mem, 6);
}
void HP400_12k8(
- Word16 signal[], /* input signal / output is divided by 16 */
- Word16 lg, /* lenght of signal */
- Word16 mem[] /* filter memory [6] */
- )
+ Word16 signal[], /* input signal / output is divided by 16 */
+ Word16 lg, /* lenght of signal */
+ Word16 mem[] /* filter memory [6] */
+ )
{
- Word16 x2;
- Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
- Word32 L_tmp;
- Word32 num;
- y2_hi = *mem++;
- y2_lo = *mem++;
- y1_hi = *mem++;
- y1_lo = *mem++;
- x0 = *mem++;
- x1 = *mem;
- num = (Word32)lg;
- do
- {
- x2 = x1;
- x1 = x0;
- x0 = *signal;
- /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */
- /* + a[1]*y[i-1] + a[2] * y[i-2]; */
- L_tmp = 8192L; /* rounding to maximise precision */
- L_tmp += y1_lo * a[1];
- L_tmp += y2_lo * a[2];
- L_tmp = L_tmp >> 14;
- L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2)* b[0] + x1 * b[1]) << 1;
- L_tmp <<= 1; /* coeff Q12 --> Q13 */
- y2_hi = y1_hi;
- y2_lo = y1_lo;
- y1_hi = (Word16)(L_tmp>>16);
- y1_lo = (Word16)((L_tmp & 0xffff)>>1);
+ Word16 x2;
+ Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
+ Word32 L_tmp;
+ Word32 num;
+ y2_hi = *mem++;
+ y2_lo = *mem++;
+ y1_hi = *mem++;
+ y1_lo = *mem++;
+ x0 = *mem++;
+ x1 = *mem;
+ num = (Word32)lg;
+ do
+ {
+ x2 = x1;
+ x1 = x0;
+ x0 = *signal;
+ /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */
+ /* + a[1]*y[i-1] + a[2] * y[i-2]; */
+ L_tmp = 8192L; /* rounding to maximise precision */
+ L_tmp += y1_lo * a[1];
+ L_tmp += y2_lo * a[2];
+ L_tmp = L_tmp >> 14;
+ L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2)* b[0] + x1 * b[1]) << 1;
+ L_tmp <<= 1; /* coeff Q12 --> Q13 */
+ y2_hi = y1_hi;
+ y2_lo = y1_lo;
+ y1_hi = (Word16)(L_tmp>>16);
+ y1_lo = (Word16)((L_tmp & 0xffff)>>1);
- /* signal is divided by 16 to avoid overflow in energy computation */
- *signal++ = (L_tmp + 0x8000) >> 16;
- }while(--num !=0);
+ /* signal is divided by 16 to avoid overflow in energy computation */
+ *signal++ = (L_tmp + 0x8000) >> 16;
+ }while(--num !=0);
- *mem-- = x1;
- *mem-- = x0;
- *mem-- = y1_lo;
- *mem-- = y1_hi;
- *mem-- = y2_lo;
- *mem = y2_hi;
- return;
+ *mem-- = x1;
+ *mem-- = x0;
+ *mem-- = y1_lo;
+ *mem-- = y1_hi;
+ *mem-- = y2_lo;
+ *mem = y2_hi;
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp50.c b/media/libstagefright/codecs/amrwbenc/src/hp50.c
index c1c7b83..807d672 100644
--- a/media/libstagefright/codecs/amrwbenc/src/hp50.c
+++ b/media/libstagefright/codecs/amrwbenc/src/hp50.c
@@ -17,7 +17,7 @@
/***********************************************************************
* File: hp50.c *
* *
-* Description: *
+* Description: *
* 2nd order high pass filter with cut off frequency at 31 Hz. *
* Designed with cheby2 function in MATLAB. *
* Optimized for fixed-point to get the following frequency response: *
@@ -51,56 +51,56 @@ static Word16 a[3] = {8192, 16211, -8021}; /* Q12 (x2) */
void Init_HP50_12k8(Word16 mem[])
{
- Set_zero(mem, 6);
+ Set_zero(mem, 6);
}
void HP50_12k8(
- Word16 signal[], /* input/output signal */
- Word16 lg, /* lenght of signal */
- Word16 mem[] /* filter memory [6] */
- )
+ Word16 signal[], /* input/output signal */
+ Word16 lg, /* lenght of signal */
+ Word16 mem[] /* filter memory [6] */
+ )
{
- Word16 x2;
- Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
- Word32 L_tmp;
- Word32 num;
+ Word16 x2;
+ Word16 y2_hi, y2_lo, y1_hi, y1_lo, x0, x1;
+ Word32 L_tmp;
+ Word32 num;
- y2_hi = *mem++;
- y2_lo = *mem++;
- y1_hi = *mem++;
- y1_lo = *mem++;
- x0 = *mem++;
- x1 = *mem;
- num = (Word32)lg;
- do
- {
- x2 = x1;
- x1 = x0;
- x0 = *signal;
- /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */
- /* + a[1]*y[i-1] + a[2] * y[i-2]; */
- L_tmp = 8192 ; /* rounding to maximise precision */
- L_tmp += y1_lo * a[1];
- L_tmp += y2_lo * a[2];
- L_tmp = L_tmp >> 14;
- L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2) * b[0] + x1 * b[1]) << 1;
- L_tmp <<= 2; /* coeff Q12 --> Q13 */
- y2_hi = y1_hi;
- y2_lo = y1_lo;
- y1_hi = (Word16)(L_tmp>>16);
- y1_lo = (Word16)((L_tmp & 0xffff)>>1);
- *signal++ = extract_h((L_add((L_tmp<<1), 0x8000)));
- }while(--num !=0);
+ y2_hi = *mem++;
+ y2_lo = *mem++;
+ y1_hi = *mem++;
+ y1_lo = *mem++;
+ x0 = *mem++;
+ x1 = *mem;
+ num = (Word32)lg;
+ do
+ {
+ x2 = x1;
+ x1 = x0;
+ x0 = *signal;
+ /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] */
+ /* + a[1]*y[i-1] + a[2] * y[i-2]; */
+ L_tmp = 8192 ; /* rounding to maximise precision */
+ L_tmp += y1_lo * a[1];
+ L_tmp += y2_lo * a[2];
+ L_tmp = L_tmp >> 14;
+ L_tmp += (y1_hi * a[1] + y2_hi * a[2] + (x0 + x2) * b[0] + x1 * b[1]) << 1;
+ L_tmp <<= 2; /* coeff Q12 --> Q13 */
+ y2_hi = y1_hi;
+ y2_lo = y1_lo;
+ y1_hi = (Word16)(L_tmp>>16);
+ y1_lo = (Word16)((L_tmp & 0xffff)>>1);
+ *signal++ = extract_h((L_add((L_tmp<<1), 0x8000)));
+ }while(--num !=0);
- *mem-- = x1;
- *mem-- = x0;
- *mem-- = y1_lo;
- *mem-- = y1_hi;
- *mem-- = y2_lo;
- *mem-- = y2_hi;
+ *mem-- = x1;
+ *mem-- = x0;
+ *mem-- = y1_lo;
+ *mem-- = y1_hi;
+ *mem-- = y2_lo;
+ *mem-- = y2_hi;
- return;
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp6k.c b/media/libstagefright/codecs/amrwbenc/src/hp6k.c
index 8e66eb0..0baf612 100644
--- a/media/libstagefright/codecs/amrwbenc/src/hp6k.c
+++ b/media/libstagefright/codecs/amrwbenc/src/hp6k.c
@@ -17,10 +17,10 @@
/***********************************************************************
* File: hp6k.c *
* *
-* Description:15th order band pass 6kHz to 7kHz FIR filter *
+* Description:15th order band pass 6kHz to 7kHz FIR filter *
* frequency: 4kHz 5kHz 5.5kHz 6kHz 6.5kHz 7kHz 7.5kHz 8kHz *
-* dB loss: -60dB -45dB -13dB -3dB 0dB -3dB -13dB -45dB *
-* *
+* dB loss: -60dB -45dB -13dB -3dB 0dB -3dB -13dB -45dB *
+* *
************************************************************************/
#include "typedef.h"
@@ -34,58 +34,58 @@
Word16 fir_6k_7k[L_FIR] =
{
- -32, 47, 32, -27, -369,
- 1122, -1421, 0, 3798, -8880,
- 12349, -10984, 3548, 7766, -18001,
- 22118, -18001, 7766, 3548, -10984,
- 12349, -8880, 3798, 0, -1421,
- 1122, -369, -27, 32, 47,
- -32
+ -32, 47, 32, -27, -369,
+ 1122, -1421, 0, 3798, -8880,
+ 12349, -10984, 3548, 7766, -18001,
+ 22118, -18001, 7766, 3548, -10984,
+ 12349, -8880, 3798, 0, -1421,
+ 1122, -369, -27, 32, 47,
+ -32
};
void Init_Filt_6k_7k(Word16 mem[]) /* mem[30] */
{
- Set_zero(mem, L_FIR - 1);
- return;
+ Set_zero(mem, L_FIR - 1);
+ return;
}
void Filt_6k_7k(
- Word16 signal[], /* input: signal */
- Word16 lg, /* input: length of input */
- Word16 mem[] /* in/out: memory (size=30) */
- )
+ Word16 signal[], /* input: signal */
+ Word16 lg, /* input: length of input */
+ Word16 mem[] /* in/out: memory (size=30) */
+ )
{
- Word16 x[L_SUBFR16k + (L_FIR - 1)];
- Word32 i, L_tmp;
+ Word16 x[L_SUBFR16k + (L_FIR - 1)];
+ Word32 i, L_tmp;
- Copy(mem, x, L_FIR - 1);
- for (i = lg - 1; i >= 0; i--)
- {
- x[i + L_FIR - 1] = signal[i] >> 2; /* gain of filter = 4 */
- }
- for (i = 0; i < lg; i++)
- {
- L_tmp = (x[i] + x[i+ 30]) * fir_6k_7k[0];
- L_tmp += (x[i+1] + x[i + 29]) * fir_6k_7k[1];
- L_tmp += (x[i+2] + x[i + 28]) * fir_6k_7k[2];
- L_tmp += (x[i+3] + x[i + 27]) * fir_6k_7k[3];
- L_tmp += (x[i+4] + x[i + 26]) * fir_6k_7k[4];
- L_tmp += (x[i+5] + x[i + 25]) * fir_6k_7k[5];
- L_tmp += (x[i+6] + x[i + 24]) * fir_6k_7k[6];
- L_tmp += (x[i+7] + x[i + 23]) * fir_6k_7k[7];
- L_tmp += (x[i+8] + x[i + 22]) * fir_6k_7k[8];
- L_tmp += (x[i+9] + x[i + 21]) * fir_6k_7k[9];
- L_tmp += (x[i+10] + x[i + 20]) * fir_6k_7k[10];
- L_tmp += (x[i+11] + x[i + 19]) * fir_6k_7k[11];
- L_tmp += (x[i+12] + x[i + 18]) * fir_6k_7k[12];
- L_tmp += (x[i+13] + x[i + 17]) * fir_6k_7k[13];
- L_tmp += (x[i+14] + x[i + 16]) * fir_6k_7k[14];
- L_tmp += (x[i+15]) * fir_6k_7k[15];
- signal[i] = (L_tmp + 0x4000) >> 15;
- }
+ Copy(mem, x, L_FIR - 1);
+ for (i = lg - 1; i >= 0; i--)
+ {
+ x[i + L_FIR - 1] = signal[i] >> 2; /* gain of filter = 4 */
+ }
+ for (i = 0; i < lg; i++)
+ {
+ L_tmp = (x[i] + x[i+ 30]) * fir_6k_7k[0];
+ L_tmp += (x[i+1] + x[i + 29]) * fir_6k_7k[1];
+ L_tmp += (x[i+2] + x[i + 28]) * fir_6k_7k[2];
+ L_tmp += (x[i+3] + x[i + 27]) * fir_6k_7k[3];
+ L_tmp += (x[i+4] + x[i + 26]) * fir_6k_7k[4];
+ L_tmp += (x[i+5] + x[i + 25]) * fir_6k_7k[5];
+ L_tmp += (x[i+6] + x[i + 24]) * fir_6k_7k[6];
+ L_tmp += (x[i+7] + x[i + 23]) * fir_6k_7k[7];
+ L_tmp += (x[i+8] + x[i + 22]) * fir_6k_7k[8];
+ L_tmp += (x[i+9] + x[i + 21]) * fir_6k_7k[9];
+ L_tmp += (x[i+10] + x[i + 20]) * fir_6k_7k[10];
+ L_tmp += (x[i+11] + x[i + 19]) * fir_6k_7k[11];
+ L_tmp += (x[i+12] + x[i + 18]) * fir_6k_7k[12];
+ L_tmp += (x[i+13] + x[i + 17]) * fir_6k_7k[13];
+ L_tmp += (x[i+14] + x[i + 16]) * fir_6k_7k[14];
+ L_tmp += (x[i+15]) * fir_6k_7k[15];
+ signal[i] = (L_tmp + 0x4000) >> 15;
+ }
- Copy(x + lg, mem, L_FIR - 1);
+ Copy(x + lg, mem, L_FIR - 1);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c
index bc1ec49..f0347cb 100644
--- a/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c
+++ b/media/libstagefright/codecs/amrwbenc/src/hp_wsp.c
@@ -48,101 +48,101 @@ static Word16 b[4] = {-3432, +10280, -10280, +3432};
/* Initialization of static values */
void Init_Hp_wsp(Word16 mem[])
{
- Set_zero(mem, 9);
+ Set_zero(mem, 9);
- return;
+ return;
}
void scale_mem_Hp_wsp(Word16 mem[], Word16 exp)
{
- Word32 i;
- Word32 L_tmp;
-
- for (i = 0; i < 6; i += 2)
- {
- L_tmp = ((mem[i] << 16) + (mem[i + 1]<<1));
- L_tmp = L_shl(L_tmp, exp);
- mem[i] = L_tmp >> 16;
- mem[i + 1] = (L_tmp & 0xffff)>>1;
- }
-
- for (i = 6; i < 9; i++)
- {
- L_tmp = L_deposit_h(mem[i]); /* x[i] */
- L_tmp = L_shl(L_tmp, exp);
- mem[i] = vo_round(L_tmp);
- }
-
- return;
+ Word32 i;
+ Word32 L_tmp;
+
+ for (i = 0; i < 6; i += 2)
+ {
+ L_tmp = ((mem[i] << 16) + (mem[i + 1]<<1));
+ L_tmp = L_shl(L_tmp, exp);
+ mem[i] = L_tmp >> 16;
+ mem[i + 1] = (L_tmp & 0xffff)>>1;
+ }
+
+ for (i = 6; i < 9; i++)
+ {
+ L_tmp = L_deposit_h(mem[i]); /* x[i] */
+ L_tmp = L_shl(L_tmp, exp);
+ mem[i] = vo_round(L_tmp);
+ }
+
+ return;
}
void Hp_wsp(
- Word16 wsp[], /* i : wsp[] signal */
- Word16 hp_wsp[], /* o : hypass wsp[] */
- Word16 lg, /* i : lenght of signal */
- Word16 mem[] /* i/o : filter memory [9] */
- )
+ Word16 wsp[], /* i : wsp[] signal */
+ Word16 hp_wsp[], /* o : hypass wsp[] */
+ Word16 lg, /* i : lenght of signal */
+ Word16 mem[] /* i/o : filter memory [9] */
+ )
{
- Word16 x0, x1, x2, x3;
- Word16 y3_hi, y3_lo, y2_hi, y2_lo, y1_hi, y1_lo;
- Word32 i, L_tmp;
-
- y3_hi = mem[0];
- y3_lo = mem[1];
- y2_hi = mem[2];
- y2_lo = mem[3];
- y1_hi = mem[4];
- y1_lo = mem[5];
- x0 = mem[6];
- x1 = mem[7];
- x2 = mem[8];
-
- for (i = 0; i < lg; i++)
- {
- x3 = x2;
- x2 = x1;
- x1 = x0;
- x0 = wsp[i];
- /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] + b[3]*x[i-3] */
- /* + a[1]*y[i-1] + a[2] * y[i-2] + a[3]*y[i-3] */
-
- L_tmp = 16384L; /* rounding to maximise precision */
- L_tmp += (y1_lo * a[1])<<1;
- L_tmp += (y2_lo * a[2])<<1;
- L_tmp += (y3_lo * a[3])<<1;
- L_tmp = L_tmp >> 15;
- L_tmp += (y1_hi * a[1])<<1;
- L_tmp += (y2_hi * a[2])<<1;
- L_tmp += (y3_hi * a[3])<<1;
- L_tmp += (x0 * b[0])<<1;
- L_tmp += (x1 * b[1])<<1;
- L_tmp += (x2 * b[2])<<1;
- L_tmp += (x3 * b[3])<<1;
-
- L_tmp = L_tmp << 2;
-
- y3_hi = y2_hi;
- y3_lo = y2_lo;
- y2_hi = y1_hi;
- y2_lo = y1_lo;
- y1_hi = L_tmp >> 16;
- y1_lo = (L_tmp & 0xffff) >>1;
-
- hp_wsp[i] = (L_tmp + 0x4000)>>15;
- }
-
- mem[0] = y3_hi;
- mem[1] = y3_lo;
- mem[2] = y2_hi;
- mem[3] = y2_lo;
- mem[4] = y1_hi;
- mem[5] = y1_lo;
- mem[6] = x0;
- mem[7] = x1;
- mem[8] = x2;
-
- return;
+ Word16 x0, x1, x2, x3;
+ Word16 y3_hi, y3_lo, y2_hi, y2_lo, y1_hi, y1_lo;
+ Word32 i, L_tmp;
+
+ y3_hi = mem[0];
+ y3_lo = mem[1];
+ y2_hi = mem[2];
+ y2_lo = mem[3];
+ y1_hi = mem[4];
+ y1_lo = mem[5];
+ x0 = mem[6];
+ x1 = mem[7];
+ x2 = mem[8];
+
+ for (i = 0; i < lg; i++)
+ {
+ x3 = x2;
+ x2 = x1;
+ x1 = x0;
+ x0 = wsp[i];
+ /* y[i] = b[0]*x[i] + b[1]*x[i-1] + b140[2]*x[i-2] + b[3]*x[i-3] */
+ /* + a[1]*y[i-1] + a[2] * y[i-2] + a[3]*y[i-3] */
+
+ L_tmp = 16384L; /* rounding to maximise precision */
+ L_tmp += (y1_lo * a[1])<<1;
+ L_tmp += (y2_lo * a[2])<<1;
+ L_tmp += (y3_lo * a[3])<<1;
+ L_tmp = L_tmp >> 15;
+ L_tmp += (y1_hi * a[1])<<1;
+ L_tmp += (y2_hi * a[2])<<1;
+ L_tmp += (y3_hi * a[3])<<1;
+ L_tmp += (x0 * b[0])<<1;
+ L_tmp += (x1 * b[1])<<1;
+ L_tmp += (x2 * b[2])<<1;
+ L_tmp += (x3 * b[3])<<1;
+
+ L_tmp = L_tmp << 2;
+
+ y3_hi = y2_hi;
+ y3_lo = y2_lo;
+ y2_hi = y1_hi;
+ y2_lo = y1_lo;
+ y1_hi = L_tmp >> 16;
+ y1_lo = (L_tmp & 0xffff) >>1;
+
+ hp_wsp[i] = (L_tmp + 0x4000)>>15;
+ }
+
+ mem[0] = y3_hi;
+ mem[1] = y3_lo;
+ mem[2] = y2_hi;
+ mem[3] = y2_lo;
+ mem[4] = y1_hi;
+ mem[5] = y1_lo;
+ mem[6] = x0;
+ mem[7] = x1;
+ mem[8] = x2;
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/int_lpc.c b/media/libstagefright/codecs/amrwbenc/src/int_lpc.c
index 1119bc7..3d8b8cb 100644
--- a/media/libstagefright/codecs/amrwbenc/src/int_lpc.c
+++ b/media/libstagefright/codecs/amrwbenc/src/int_lpc.c
@@ -30,36 +30,36 @@
void Int_isp(
- Word16 isp_old[], /* input : isps from past frame */
- Word16 isp_new[], /* input : isps from present frame */
- Word16 frac[], /* input : fraction for 3 first subfr (Q15) */
- Word16 Az[] /* output: LP coefficients in 4 subframes */
- )
+ Word16 isp_old[], /* input : isps from past frame */
+ Word16 isp_new[], /* input : isps from present frame */
+ Word16 frac[], /* input : fraction for 3 first subfr (Q15) */
+ Word16 Az[] /* output: LP coefficients in 4 subframes */
+ )
{
- Word32 i, k;
- Word16 fac_old, fac_new;
- Word16 isp[M];
- Word32 L_tmp;
+ Word32 i, k;
+ Word16 fac_old, fac_new;
+ Word16 isp[M];
+ Word32 L_tmp;
- for (k = 0; k < 3; k++)
- {
- fac_new = frac[k];
- fac_old = (32767 - fac_new) + 1; /* 1.0 - fac_new */
+ for (k = 0; k < 3; k++)
+ {
+ fac_new = frac[k];
+ fac_old = (32767 - fac_new) + 1; /* 1.0 - fac_new */
- for (i = 0; i < M; i++)
- {
- L_tmp = (isp_old[i] * fac_old)<<1;
- L_tmp += (isp_new[i] * fac_new)<<1;
- isp[i] = (L_tmp + 0x8000)>>16;
- }
- Isp_Az(isp, Az, M, 0);
- Az += MP1;
- }
+ for (i = 0; i < M; i++)
+ {
+ L_tmp = (isp_old[i] * fac_old)<<1;
+ L_tmp += (isp_new[i] * fac_new)<<1;
+ isp[i] = (L_tmp + 0x8000)>>16;
+ }
+ Isp_Az(isp, Az, M, 0);
+ Az += MP1;
+ }
- /* 4th subframe: isp_new (frac=1.0) */
- Isp_Az(isp_new, Az, M, 0);
+ /* 4th subframe: isp_new (frac=1.0) */
+ Isp_Az(isp_new, Az, M, 0);
- return;
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_az.c b/media/libstagefright/codecs/amrwbenc/src/isp_az.c
index 30a8bbd..62e29e7 100644
--- a/media/libstagefright/codecs/amrwbenc/src/isp_az.c
+++ b/media/libstagefright/codecs/amrwbenc/src/isp_az.c
@@ -35,132 +35,132 @@ static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n);
static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n);
void Isp_Az(
- Word16 isp[], /* (i) Q15 : Immittance spectral pairs */
- Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */
- Word16 m,
- Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */
- /* 1 : adaptive scaling enabled */
- )
+ Word16 isp[], /* (i) Q15 : Immittance spectral pairs */
+ Word16 a[], /* (o) Q12 : predictor coefficients (order = M) */
+ Word16 m,
+ Word16 adaptive_scaling /* (i) 0 : adaptive scaling disabled */
+ /* 1 : adaptive scaling enabled */
+ )
{
- Word32 i, j;
- Word16 hi, lo;
- Word32 f1[NC16k + 1], f2[NC16k];
- Word16 nc;
- Word32 t0;
- Word16 q, q_sug;
- Word32 tmax;
-
- nc = (m >> 1);
- if(nc > 8)
- {
- Get_isp_pol_16kHz(&isp[0], f1, nc);
- for (i = 0; i <= nc; i++)
- {
- f1[i] = f1[i] << 2;
- }
- } else
- Get_isp_pol(&isp[0], f1, nc);
-
- if (nc > 8)
- {
- Get_isp_pol_16kHz(&isp[1], f2, (nc - 1));
- for (i = 0; i <= nc - 1; i++)
- {
- f2[i] = f2[i] << 2;
- }
- } else
- Get_isp_pol(&isp[1], f2, (nc - 1));
-
- /*-----------------------------------------------------*
- * Multiply F2(z) by (1 - z^-2) *
- *-----------------------------------------------------*/
-
- for (i = (nc - 1); i > 1; i--)
- {
- f2[i] = vo_L_sub(f2[i], f2[i - 2]); /* f2[i] -= f2[i-2]; */
- }
-
- /*----------------------------------------------------------*
- * Scale F1(z) by (1+isp[m-1]) and F2(z) by (1-isp[m-1]) *
- *----------------------------------------------------------*/
-
- for (i = 0; i < nc; i++)
- {
- /* f1[i] *= (1.0 + isp[M-1]); */
-
- hi = f1[i] >> 16;
- lo = (f1[i] & 0xffff)>>1;
-
- t0 = Mpy_32_16(hi, lo, isp[m - 1]);
- f1[i] = vo_L_add(f1[i], t0);
-
- /* f2[i] *= (1.0 - isp[M-1]); */
-
- hi = f2[i] >> 16;
- lo = (f2[i] & 0xffff)>>1;
- t0 = Mpy_32_16(hi, lo, isp[m - 1]);
- f2[i] = vo_L_sub(f2[i], t0);
- }
-
- /*-----------------------------------------------------*
- * A(z) = (F1(z)+F2(z))/2 *
- * F1(z) is symmetric and F2(z) is antisymmetric *
- *-----------------------------------------------------*/
-
- /* a[0] = 1.0; */
- a[0] = 4096;
- tmax = 1;
- for (i = 1, j = m - 1; i < nc; i++, j--)
- {
- /* a[i] = 0.5*(f1[i] + f2[i]); */
-
- t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */
- tmax |= L_abs(t0);
- a[i] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */
-
- /* a[j] = 0.5*(f1[i] - f2[i]); */
-
- t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */
- tmax |= L_abs(t0);
- a[j] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */
- }
-
- /* rescale data if overflow has occured and reprocess the loop */
- if(adaptive_scaling == 1)
- q = 4 - norm_l(tmax); /* adaptive scaling enabled */
- else
- q = 0; /* adaptive scaling disabled */
-
- if (q > 0)
- {
- q_sug = (12 + q);
- for (i = 1, j = m - 1; i < nc; i++, j--)
- {
- /* a[i] = 0.5*(f1[i] + f2[i]); */
- t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */
- a[i] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
-
- /* a[j] = 0.5*(f1[i] - f2[i]); */
- t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */
- a[j] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
- }
- a[0] = shr(a[0], q);
- }
- else
- {
- q_sug = 12;
- q = 0;
- }
- /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */
- hi = f1[nc] >> 16;
- lo = (f1[nc] & 0xffff)>>1;
- t0 = Mpy_32_16(hi, lo, isp[m - 1]);
- t0 = vo_L_add(f1[nc], t0);
- a[nc] = (Word16)(L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
- /* a[m] = isp[m-1]; */
-
- a[m] = vo_shr_r(isp[m - 1], (3 + q)); /* from Q15 to Q12 */
- return;
+ Word32 i, j;
+ Word16 hi, lo;
+ Word32 f1[NC16k + 1], f2[NC16k];
+ Word16 nc;
+ Word32 t0;
+ Word16 q, q_sug;
+ Word32 tmax;
+
+ nc = (m >> 1);
+ if(nc > 8)
+ {
+ Get_isp_pol_16kHz(&isp[0], f1, nc);
+ for (i = 0; i <= nc; i++)
+ {
+ f1[i] = f1[i] << 2;
+ }
+ } else
+ Get_isp_pol(&isp[0], f1, nc);
+
+ if (nc > 8)
+ {
+ Get_isp_pol_16kHz(&isp[1], f2, (nc - 1));
+ for (i = 0; i <= nc - 1; i++)
+ {
+ f2[i] = f2[i] << 2;
+ }
+ } else
+ Get_isp_pol(&isp[1], f2, (nc - 1));
+
+ /*-----------------------------------------------------*
+ * Multiply F2(z) by (1 - z^-2) *
+ *-----------------------------------------------------*/
+
+ for (i = (nc - 1); i > 1; i--)
+ {
+ f2[i] = vo_L_sub(f2[i], f2[i - 2]); /* f2[i] -= f2[i-2]; */
+ }
+
+ /*----------------------------------------------------------*
+ * Scale F1(z) by (1+isp[m-1]) and F2(z) by (1-isp[m-1]) *
+ *----------------------------------------------------------*/
+
+ for (i = 0; i < nc; i++)
+ {
+ /* f1[i] *= (1.0 + isp[M-1]); */
+
+ hi = f1[i] >> 16;
+ lo = (f1[i] & 0xffff)>>1;
+
+ t0 = Mpy_32_16(hi, lo, isp[m - 1]);
+ f1[i] = vo_L_add(f1[i], t0);
+
+ /* f2[i] *= (1.0 - isp[M-1]); */
+
+ hi = f2[i] >> 16;
+ lo = (f2[i] & 0xffff)>>1;
+ t0 = Mpy_32_16(hi, lo, isp[m - 1]);
+ f2[i] = vo_L_sub(f2[i], t0);
+ }
+
+ /*-----------------------------------------------------*
+ * A(z) = (F1(z)+F2(z))/2 *
+ * F1(z) is symmetric and F2(z) is antisymmetric *
+ *-----------------------------------------------------*/
+
+ /* a[0] = 1.0; */
+ a[0] = 4096;
+ tmax = 1;
+ for (i = 1, j = m - 1; i < nc; i++, j--)
+ {
+ /* a[i] = 0.5*(f1[i] + f2[i]); */
+
+ t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */
+ tmax |= L_abs(t0);
+ a[i] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */
+
+ /* a[j] = 0.5*(f1[i] - f2[i]); */
+
+ t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */
+ tmax |= L_abs(t0);
+ a[j] = (Word16)(vo_L_shr_r(t0, 12)); /* from Q23 to Q12 and * 0.5 */
+ }
+
+ /* rescale data if overflow has occured and reprocess the loop */
+ if(adaptive_scaling == 1)
+ q = 4 - norm_l(tmax); /* adaptive scaling enabled */
+ else
+ q = 0; /* adaptive scaling disabled */
+
+ if (q > 0)
+ {
+ q_sug = (12 + q);
+ for (i = 1, j = m - 1; i < nc; i++, j--)
+ {
+ /* a[i] = 0.5*(f1[i] + f2[i]); */
+ t0 = vo_L_add(f1[i], f2[i]); /* f1[i] + f2[i] */
+ a[i] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
+
+ /* a[j] = 0.5*(f1[i] - f2[i]); */
+ t0 = vo_L_sub(f1[i], f2[i]); /* f1[i] - f2[i] */
+ a[j] = (Word16)(vo_L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
+ }
+ a[0] = shr(a[0], q);
+ }
+ else
+ {
+ q_sug = 12;
+ q = 0;
+ }
+ /* a[NC] = 0.5*f1[NC]*(1.0 + isp[M-1]); */
+ hi = f1[nc] >> 16;
+ lo = (f1[nc] & 0xffff)>>1;
+ t0 = Mpy_32_16(hi, lo, isp[m - 1]);
+ t0 = vo_L_add(f1[nc], t0);
+ a[nc] = (Word16)(L_shr_r(t0, q_sug)); /* from Q23 to Q12 and * 0.5 */
+ /* a[m] = isp[m-1]; */
+
+ a[m] = vo_shr_r(isp[m - 1], (3 + q)); /* from Q15 to Q12 */
+ return;
}
/*-----------------------------------------------------------*
@@ -185,63 +185,63 @@ void Isp_Az(
static void Get_isp_pol(Word16 * isp, Word32 * f, Word16 n)
{
- Word16 hi, lo;
- Word32 i, j, t0;
- /* All computation in Q23 */
-
- f[0] = vo_L_mult(4096, 1024); /* f[0] = 1.0; in Q23 */
- f[1] = vo_L_mult(isp[0], -256); /* f[1] = -2.0*isp[0] in Q23 */
-
- f += 2; /* Advance f pointer */
- isp += 2; /* Advance isp pointer */
- for (i = 2; i <= n; i++)
- {
- *f = f[-2];
- for (j = 1; j < i; j++, f--)
- {
- hi = f[-1]>>16;
- lo = (f[-1] & 0xffff)>>1;
-
- t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */
- t0 = t0 << 1;
- *f = vo_L_sub(*f, t0); /* *f -= t0 */
- *f = vo_L_add(*f, f[-2]); /* *f += f[-2] */
- }
- *f -= (*isp << 9); /* *f -= isp<<8 */
- f += i; /* Advance f pointer */
- isp += 2; /* Advance isp pointer */
- }
- return;
+ Word16 hi, lo;
+ Word32 i, j, t0;
+ /* All computation in Q23 */
+
+ f[0] = vo_L_mult(4096, 1024); /* f[0] = 1.0; in Q23 */
+ f[1] = vo_L_mult(isp[0], -256); /* f[1] = -2.0*isp[0] in Q23 */
+
+ f += 2; /* Advance f pointer */
+ isp += 2; /* Advance isp pointer */
+ for (i = 2; i <= n; i++)
+ {
+ *f = f[-2];
+ for (j = 1; j < i; j++, f--)
+ {
+ hi = f[-1]>>16;
+ lo = (f[-1] & 0xffff)>>1;
+
+ t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */
+ t0 = t0 << 1;
+ *f = vo_L_sub(*f, t0); /* *f -= t0 */
+ *f = vo_L_add(*f, f[-2]); /* *f += f[-2] */
+ }
+ *f -= (*isp << 9); /* *f -= isp<<8 */
+ f += i; /* Advance f pointer */
+ isp += 2; /* Advance isp pointer */
+ }
+ return;
}
static void Get_isp_pol_16kHz(Word16 * isp, Word32 * f, Word16 n)
{
- Word16 hi, lo;
- Word32 i, j, t0;
-
- /* All computation in Q23 */
- f[0] = L_mult(4096, 256); /* f[0] = 1.0; in Q23 */
- f[1] = L_mult(isp[0], -64); /* f[1] = -2.0*isp[0] in Q23 */
-
- f += 2; /* Advance f pointer */
- isp += 2; /* Advance isp pointer */
-
- for (i = 2; i <= n; i++)
- {
- *f = f[-2];
- for (j = 1; j < i; j++, f--)
- {
- VO_L_Extract(f[-1], &hi, &lo);
- t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */
- t0 = L_shl2(t0, 1);
- *f = L_sub(*f, t0); /* *f -= t0 */
- *f = L_add(*f, f[-2]); /* *f += f[-2] */
- }
- *f = L_msu(*f, *isp, 64); /* *f -= isp<<8 */
- f += i; /* Advance f pointer */
- isp += 2; /* Advance isp pointer */
- }
- return;
+ Word16 hi, lo;
+ Word32 i, j, t0;
+
+ /* All computation in Q23 */
+ f[0] = L_mult(4096, 256); /* f[0] = 1.0; in Q23 */
+ f[1] = L_mult(isp[0], -64); /* f[1] = -2.0*isp[0] in Q23 */
+
+ f += 2; /* Advance f pointer */
+ isp += 2; /* Advance isp pointer */
+
+ for (i = 2; i <= n; i++)
+ {
+ *f = f[-2];
+ for (j = 1; j < i; j++, f--)
+ {
+ VO_L_Extract(f[-1], &hi, &lo);
+ t0 = Mpy_32_16(hi, lo, *isp); /* t0 = f[-1] * isp */
+ t0 = L_shl2(t0, 1);
+ *f = L_sub(*f, t0); /* *f -= t0 */
+ *f = L_add(*f, f[-2]); /* *f += f[-2] */
+ }
+ *f = L_msu(*f, *isp, 64); /* *f -= isp<<8 */
+ f += i; /* Advance f pointer */
+ isp += 2; /* Advance isp pointer */
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/isp_isf.c b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c
index b4ba408..56798e0 100644
--- a/media/libstagefright/codecs/amrwbenc/src/isp_isf.c
+++ b/media/libstagefright/codecs/amrwbenc/src/isp_isf.c
@@ -18,11 +18,11 @@
* File: isp_isf.c *
* *
* Description: *
-* Isp_isf Transformation isp to isf *
-* Isf_isp Transformation isf to isp *
+* Isp_isf Transformation isp to isf *
+* Isf_isp Transformation isf to isp *
* *
-* The transformation from isp[i] to isf[i] and isf[i] to isp[i] *
-* are approximated by a look-up table and interpolation *
+* The transformation from isp[i] to isf[i] and isf[i] to isp[i] *
+* are approximated by a look-up table and interpolation *
* *
************************************************************************/
@@ -31,59 +31,59 @@
#include "isp_isf.tab" /* Look-up table for transformations */
void Isp_isf(
- Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */
- Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
- Word16 m /* (i) : LPC order */
- )
+ Word16 isp[], /* (i) Q15 : isp[m] (range: -1<=val<1) */
+ Word16 isf[], /* (o) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+ Word16 m /* (i) : LPC order */
+ )
{
- Word32 i, ind;
- Word32 L_tmp;
- ind = 127; /* beging at end of table -1 */
- for (i = (m - 1); i >= 0; i--)
- {
- if (i >= (m - 2))
- { /* m-2 is a constant */
- ind = 127; /* beging at end of table -1 */
- }
- /* find value in table that is just greater than isp[i] */
- while (table[ind] < isp[i])
- ind--;
- /* acos(isp[i])= ind*128 + ( ( isp[i]-table[ind] ) * slope[ind] )/2048 */
- L_tmp = vo_L_mult(vo_sub(isp[i], table[ind]), slope[ind]);
- isf[i] = vo_round((L_tmp << 4)); /* (isp[i]-table[ind])*slope[ind])>>11 */
- isf[i] = add1(isf[i], (ind << 7));
- }
- isf[m - 1] = (isf[m - 1] >> 1);
- return;
+ Word32 i, ind;
+ Word32 L_tmp;
+ ind = 127; /* beging at end of table -1 */
+ for (i = (m - 1); i >= 0; i--)
+ {
+ if (i >= (m - 2))
+ { /* m-2 is a constant */
+ ind = 127; /* beging at end of table -1 */
+ }
+ /* find value in table that is just greater than isp[i] */
+ while (table[ind] < isp[i])
+ ind--;
+ /* acos(isp[i])= ind*128 + ( ( isp[i]-table[ind] ) * slope[ind] )/2048 */
+ L_tmp = vo_L_mult(vo_sub(isp[i], table[ind]), slope[ind]);
+ isf[i] = vo_round((L_tmp << 4)); /* (isp[i]-table[ind])*slope[ind])>>11 */
+ isf[i] = add1(isf[i], (ind << 7));
+ }
+ isf[m - 1] = (isf[m - 1] >> 1);
+ return;
}
void Isf_isp(
- Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
- Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */
- Word16 m /* (i) : LPC order */
- )
+ Word16 isf[], /* (i) Q15 : isf[m] normalized (range: 0.0<=val<=0.5) */
+ Word16 isp[], /* (o) Q15 : isp[m] (range: -1<=val<1) */
+ Word16 m /* (i) : LPC order */
+ )
{
- Word16 offset;
- Word32 i, ind, L_tmp;
+ Word16 offset;
+ Word32 i, ind, L_tmp;
- for (i = 0; i < m - 1; i++)
- {
- isp[i] = isf[i];
- }
- isp[m - 1] = (isf[m - 1] << 1);
+ for (i = 0; i < m - 1; i++)
+ {
+ isp[i] = isf[i];
+ }
+ isp[m - 1] = (isf[m - 1] << 1);
- for (i = 0; i < m; i++)
- {
- ind = (isp[i] >> 7); /* ind = b7-b15 of isf[i] */
- offset = (Word16) (isp[i] & 0x007f); /* offset = b0-b6 of isf[i] */
+ for (i = 0; i < m; i++)
+ {
+ ind = (isp[i] >> 7); /* ind = b7-b15 of isf[i] */
+ offset = (Word16) (isp[i] & 0x007f); /* offset = b0-b6 of isf[i] */
- /* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */
- L_tmp = vo_L_mult(vo_sub(table[ind + 1], table[ind]), offset);
- isp[i] = add1(table[ind], (Word16)((L_tmp >> 8)));
- }
+ /* isp[i] = table[ind]+ ((table[ind+1]-table[ind])*offset) / 128 */
+ L_tmp = vo_L_mult(vo_sub(table[ind + 1], table[ind]), offset);
+ isp[i] = add1(table[ind], (Word16)((L_tmp >> 8)));
+ }
- return;
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/lag_wind.c b/media/libstagefright/codecs/amrwbenc/src/lag_wind.c
index 49c622c..527430b 100644
--- a/media/libstagefright/codecs/amrwbenc/src/lag_wind.c
+++ b/media/libstagefright/codecs/amrwbenc/src/lag_wind.c
@@ -17,8 +17,8 @@
/***********************************************************************
* File: lag_wind.c *
* *
-* Description: Lag_windows on autocorrelations *
-* r[i] *= lag_wind[i] *
+* Description: Lag_windows on autocorrelations *
+* r[i] *= lag_wind[i] *
* *
************************************************************************/
@@ -29,20 +29,20 @@
void Lag_window(
- Word16 r_h[], /* (i/o) : Autocorrelations (msb) */
- Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */
- )
+ Word16 r_h[], /* (i/o) : Autocorrelations (msb) */
+ Word16 r_l[] /* (i/o) : Autocorrelations (lsb) */
+ )
{
- Word32 i;
- Word32 x;
-
- for (i = 1; i <= M; i++)
- {
- x = Mpy_32(r_h[i], r_l[i], volag_h[i - 1], volag_l[i - 1]);
- r_h[i] = x >> 16;
- r_l[i] = (x & 0xffff)>>1;
- }
- return;
+ Word32 i;
+ Word32 x;
+
+ for (i = 1; i <= M; i++)
+ {
+ x = Mpy_32(r_h[i], r_l[i], volag_h[i - 1], volag_l[i - 1]);
+ r_h[i] = x >> 16;
+ r_l[i] = (x & 0xffff)>>1;
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/levinson.c b/media/libstagefright/codecs/amrwbenc/src/levinson.c
index 4b2f8ed..9d5a3bd 100644
--- a/media/libstagefright/codecs/amrwbenc/src/levinson.c
+++ b/media/libstagefright/codecs/amrwbenc/src/levinson.c
@@ -21,7 +21,7 @@
* *
************************************************************************/
/*---------------------------------------------------------------------------*
- * LEVINSON.C *
+ * LEVINSON.C *
*---------------------------------------------------------------------------*
* *
* LEVINSON-DURBIN algorithm in double precision *
@@ -96,154 +96,154 @@
#define NC (M/2)
void Init_Levinson(
- Word16 * mem /* output :static memory (18 words) */
- )
+ Word16 * mem /* output :static memory (18 words) */
+ )
{
- Set_zero(mem, 18); /* old_A[0..M-1] = 0, old_rc[0..1] = 0 */
- return;
+ Set_zero(mem, 18); /* old_A[0..M-1] = 0, old_rc[0..1] = 0 */
+ return;
}
void Levinson(
- Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */
- Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */
- Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */
- Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */
- Word16 * mem /* (i/o) :static memory (18 words) */
- )
+ Word16 Rh[], /* (i) : Rh[M+1] Vector of autocorrelations (msb) */
+ Word16 Rl[], /* (i) : Rl[M+1] Vector of autocorrelations (lsb) */
+ Word16 A[], /* (o) Q12 : A[M] LPC coefficients (m = 16) */
+ Word16 rc[], /* (o) Q15 : rc[M] Reflection coefficients. */
+ Word16 * mem /* (i/o) :static memory (18 words) */
+ )
{
- Word32 i, j;
- Word16 hi, lo;
- Word16 Kh, Kl; /* reflection coefficient; hi and lo */
- Word16 alp_h, alp_l, alp_exp; /* Prediction gain; hi lo and exponent */
- Word16 Ah[M + 1], Al[M + 1]; /* LPC coef. in double prec. */
- Word16 Anh[M + 1], Anl[M + 1]; /* LPC coef.for next iteration in double prec. */
- Word32 t0, t1, t2; /* temporary variable */
- Word16 *old_A, *old_rc;
-
- /* Last A(z) for case of unstable filter */
- old_A = mem;
- old_rc = mem + M;
-
- /* K = A[1] = -R[1] / R[0] */
-
- t1 = ((Rh[1] << 16) + (Rl[1] << 1)); /* R[1] in Q31 */
- t2 = L_abs(t1); /* abs R[1] */
- t0 = Div_32(t2, Rh[0], Rl[0]); /* R[1]/R[0] in Q31 */
- if (t1 > 0)
- t0 = -t0; /* -R[1]/R[0] */
-
- Kh = t0 >> 16;
- Kl = (t0 & 0xffff)>>1;
- rc[0] = Kh;
- t0 = (t0 >> 4); /* A[1] in Q27 */
-
- Ah[1] = t0 >> 16;
- Al[1] = (t0 & 0xffff)>>1;
-
- /* Alpha = R[0] * (1-K**2) */
- t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */
- t0 = L_abs(t0); /* Some case <0 !! */
- t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */
-
- hi = t0 >> 16;
- lo = (t0 & 0xffff)>>1;
-
- t0 = Mpy_32(Rh[0], Rl[0], hi, lo); /* Alpha in Q31 */
-
- /* Normalize Alpha */
- alp_exp = norm_l(t0);
- t0 = (t0 << alp_exp);
-
- alp_h = t0 >> 16;
- alp_l = (t0 & 0xffff)>>1;
- /*--------------------------------------*
- * ITERATIONS I=2 to M *
- *--------------------------------------*/
- for (i = 2; i <= M; i++)
- {
- /* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) + R[i] */
- t0 = 0;
- for (j = 1; j < i; j++)
- t0 = vo_L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i - j], Al[i - j]));
-
- t0 = t0 << 4; /* result in Q27 -> convert to Q31 */
- /* No overflow possible */
- t1 = ((Rh[i] << 16) + (Rl[i] << 1));
- t0 = vo_L_add(t0, t1); /* add R[i] in Q31 */
-
- /* K = -t0 / Alpha */
- t1 = L_abs(t0);
- t2 = Div_32(t1, alp_h, alp_l); /* abs(t0)/Alpha */
- if (t0 > 0)
- t2 = -t2; /* K =-t0/Alpha */
- t2 = (t2 << alp_exp); /* denormalize; compare to Alpha */
-
- Kh = t2 >> 16;
- Kl = (t2 & 0xffff)>>1;
-
- rc[i - 1] = Kh;
- /* Test for unstable filter. If unstable keep old A(z) */
- if (abs_s(Kh) > 32750)
- {
- A[0] = 4096; /* Ai[0] not stored (always 1.0) */
- for (j = 0; j < M; j++)
- {
- A[j + 1] = old_A[j];
- }
- rc[0] = old_rc[0]; /* only two rc coefficients are needed */
- rc[1] = old_rc[1];
- return;
- }
- /*------------------------------------------*
- * Compute new LPC coeff. -> An[i] *
- * An[j]= A[j] + K*A[i-j] , j=1 to i-1 *
- * An[i]= K *
- *------------------------------------------*/
- for (j = 1; j < i; j++)
- {
- t0 = Mpy_32(Kh, Kl, Ah[i - j], Al[i - j]);
- t0 = vo_L_add(t0, ((Ah[j] << 16) + (Al[j] << 1)));
- Anh[j] = t0 >> 16;
- Anl[j] = (t0 & 0xffff)>>1;
- }
- t2 = (t2 >> 4); /* t2 = K in Q31 ->convert to Q27 */
-
- VO_L_Extract(t2, &Anh[i], &Anl[i]); /* An[i] in Q27 */
-
- /* Alpha = Alpha * (1-K**2) */
- t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */
- t0 = L_abs(t0); /* Some case <0 !! */
- t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */
- hi = t0 >> 16;
- lo = (t0 & 0xffff)>>1;
- t0 = Mpy_32(alp_h, alp_l, hi, lo); /* Alpha in Q31 */
-
- /* Normalize Alpha */
- j = norm_l(t0);
- t0 = (t0 << j);
- alp_h = t0 >> 16;
- alp_l = (t0 & 0xffff)>>1;
- alp_exp += j; /* Add normalization to alp_exp */
-
- /* A[j] = An[j] */
- for (j = 1; j <= i; j++)
- {
- Ah[j] = Anh[j];
- Al[j] = Anl[j];
- }
- }
- /* Truncate A[i] in Q27 to Q12 with rounding */
- A[0] = 4096;
- for (i = 1; i <= M; i++)
- {
- t0 = (Ah[i] << 16) + (Al[i] << 1);
- old_A[i - 1] = A[i] = vo_round((t0 << 1));
- }
- old_rc[0] = rc[0];
- old_rc[1] = rc[1];
-
- return;
+ Word32 i, j;
+ Word16 hi, lo;
+ Word16 Kh, Kl; /* reflection coefficient; hi and lo */
+ Word16 alp_h, alp_l, alp_exp; /* Prediction gain; hi lo and exponent */
+ Word16 Ah[M + 1], Al[M + 1]; /* LPC coef. in double prec. */
+ Word16 Anh[M + 1], Anl[M + 1]; /* LPC coef.for next iteration in double prec. */
+ Word32 t0, t1, t2; /* temporary variable */
+ Word16 *old_A, *old_rc;
+
+ /* Last A(z) for case of unstable filter */
+ old_A = mem;
+ old_rc = mem + M;
+
+ /* K = A[1] = -R[1] / R[0] */
+
+ t1 = ((Rh[1] << 16) + (Rl[1] << 1)); /* R[1] in Q31 */
+ t2 = L_abs(t1); /* abs R[1] */
+ t0 = Div_32(t2, Rh[0], Rl[0]); /* R[1]/R[0] in Q31 */
+ if (t1 > 0)
+ t0 = -t0; /* -R[1]/R[0] */
+
+ Kh = t0 >> 16;
+ Kl = (t0 & 0xffff)>>1;
+ rc[0] = Kh;
+ t0 = (t0 >> 4); /* A[1] in Q27 */
+
+ Ah[1] = t0 >> 16;
+ Al[1] = (t0 & 0xffff)>>1;
+
+ /* Alpha = R[0] * (1-K**2) */
+ t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */
+ t0 = L_abs(t0); /* Some case <0 !! */
+ t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */
+
+ hi = t0 >> 16;
+ lo = (t0 & 0xffff)>>1;
+
+ t0 = Mpy_32(Rh[0], Rl[0], hi, lo); /* Alpha in Q31 */
+
+ /* Normalize Alpha */
+ alp_exp = norm_l(t0);
+ t0 = (t0 << alp_exp);
+
+ alp_h = t0 >> 16;
+ alp_l = (t0 & 0xffff)>>1;
+ /*--------------------------------------*
+ * ITERATIONS I=2 to M *
+ *--------------------------------------*/
+ for (i = 2; i <= M; i++)
+ {
+ /* t0 = SUM ( R[j]*A[i-j] ,j=1,i-1 ) + R[i] */
+ t0 = 0;
+ for (j = 1; j < i; j++)
+ t0 = vo_L_add(t0, Mpy_32(Rh[j], Rl[j], Ah[i - j], Al[i - j]));
+
+ t0 = t0 << 4; /* result in Q27 -> convert to Q31 */
+ /* No overflow possible */
+ t1 = ((Rh[i] << 16) + (Rl[i] << 1));
+ t0 = vo_L_add(t0, t1); /* add R[i] in Q31 */
+
+ /* K = -t0 / Alpha */
+ t1 = L_abs(t0);
+ t2 = Div_32(t1, alp_h, alp_l); /* abs(t0)/Alpha */
+ if (t0 > 0)
+ t2 = -t2; /* K =-t0/Alpha */
+ t2 = (t2 << alp_exp); /* denormalize; compare to Alpha */
+
+ Kh = t2 >> 16;
+ Kl = (t2 & 0xffff)>>1;
+
+ rc[i - 1] = Kh;
+ /* Test for unstable filter. If unstable keep old A(z) */
+ if (abs_s(Kh) > 32750)
+ {
+ A[0] = 4096; /* Ai[0] not stored (always 1.0) */
+ for (j = 0; j < M; j++)
+ {
+ A[j + 1] = old_A[j];
+ }
+ rc[0] = old_rc[0]; /* only two rc coefficients are needed */
+ rc[1] = old_rc[1];
+ return;
+ }
+ /*------------------------------------------*
+ * Compute new LPC coeff. -> An[i] *
+ * An[j]= A[j] + K*A[i-j] , j=1 to i-1 *
+ * An[i]= K *
+ *------------------------------------------*/
+ for (j = 1; j < i; j++)
+ {
+ t0 = Mpy_32(Kh, Kl, Ah[i - j], Al[i - j]);
+ t0 = vo_L_add(t0, ((Ah[j] << 16) + (Al[j] << 1)));
+ Anh[j] = t0 >> 16;
+ Anl[j] = (t0 & 0xffff)>>1;
+ }
+ t2 = (t2 >> 4); /* t2 = K in Q31 ->convert to Q27 */
+
+ VO_L_Extract(t2, &Anh[i], &Anl[i]); /* An[i] in Q27 */
+
+ /* Alpha = Alpha * (1-K**2) */
+ t0 = Mpy_32(Kh, Kl, Kh, Kl); /* K*K in Q31 */
+ t0 = L_abs(t0); /* Some case <0 !! */
+ t0 = vo_L_sub((Word32) 0x7fffffffL, t0); /* 1 - K*K in Q31 */
+ hi = t0 >> 16;
+ lo = (t0 & 0xffff)>>1;
+ t0 = Mpy_32(alp_h, alp_l, hi, lo); /* Alpha in Q31 */
+
+ /* Normalize Alpha */
+ j = norm_l(t0);
+ t0 = (t0 << j);
+ alp_h = t0 >> 16;
+ alp_l = (t0 & 0xffff)>>1;
+ alp_exp += j; /* Add normalization to alp_exp */
+
+ /* A[j] = An[j] */
+ for (j = 1; j <= i; j++)
+ {
+ Ah[j] = Anh[j];
+ Al[j] = Anl[j];
+ }
+ }
+ /* Truncate A[i] in Q27 to Q12 with rounding */
+ A[0] = 4096;
+ for (i = 1; i <= M; i++)
+ {
+ t0 = (Ah[i] << 16) + (Al[i] << 1);
+ old_A[i - 1] = A[i] = vo_round((t0 << 1));
+ }
+ old_rc[0] = rc[0];
+ old_rc[1] = rc[1];
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/log2.c b/media/libstagefright/codecs/amrwbenc/src/log2.c
index 0f65541..f14058e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/log2.c
+++ b/media/libstagefright/codecs/amrwbenc/src/log2.c
@@ -54,33 +54,33 @@
*************************************************************************/
void Log2_norm (
- Word32 L_x, /* (i) : input value (normalized) */
- Word16 exp, /* (i) : norm_l (L_x) */
- Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
- Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
- )
+ Word32 L_x, /* (i) : input value (normalized) */
+ Word16 exp, /* (i) : norm_l (L_x) */
+ Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
+ Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+ )
{
- Word16 i, a, tmp;
- Word32 L_y;
- if (L_x <= (Word32) 0)
- {
- *exponent = 0;
- *fraction = 0;
- return;
- }
- *exponent = (30 - exp);
- L_x = (L_x >> 9);
- i = extract_h (L_x); /* Extract b25-b31 */
- L_x = (L_x >> 1);
- a = (Word16)(L_x); /* Extract b10-b24 of fraction */
- a = (Word16)(a & (Word16)0x7fff);
- i -= 32;
- L_y = L_deposit_h (table[i]); /* table[i] << 16 */
- tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */
- L_y = vo_L_msu (L_y, tmp, a); /* L_y -= tmp*a*2 */
- *fraction = extract_h (L_y);
+ Word16 i, a, tmp;
+ Word32 L_y;
+ if (L_x <= (Word32) 0)
+ {
+ *exponent = 0;
+ *fraction = 0;
+ return;
+ }
+ *exponent = (30 - exp);
+ L_x = (L_x >> 9);
+ i = extract_h (L_x); /* Extract b25-b31 */
+ L_x = (L_x >> 1);
+ a = (Word16)(L_x); /* Extract b10-b24 of fraction */
+ a = (Word16)(a & (Word16)0x7fff);
+ i -= 32;
+ L_y = L_deposit_h (table[i]); /* table[i] << 16 */
+ tmp = vo_sub(table[i], table[i + 1]); /* table[i] - table[i+1] */
+ L_y = vo_L_msu (L_y, tmp, a); /* L_y -= tmp*a*2 */
+ *fraction = extract_h (L_y);
- return;
+ return;
}
/*************************************************************************
@@ -96,15 +96,15 @@ void Log2_norm (
*************************************************************************/
void Log2 (
- Word32 L_x, /* (i) : input value */
- Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
- Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
- )
+ Word32 L_x, /* (i) : input value */
+ Word16 *exponent, /* (o) : Integer part of Log2. (range: 0<=val<=30) */
+ Word16 *fraction /* (o) : Fractional part of Log2. (range: 0<=val<1) */
+ )
{
- Word16 exp;
+ Word16 exp;
- exp = norm_l(L_x);
- Log2_norm ((L_x << exp), exp, exponent, fraction);
+ exp = norm_l(L_x);
+ Log2_norm ((L_x << exp), exp, exponent, fraction);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c
index 1d5d076..9a9dd34 100644
--- a/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c
+++ b/media/libstagefright/codecs/amrwbenc/src/lp_dec2.c
@@ -17,7 +17,7 @@
/***********************************************************************
* File: lp_dec2.c *
* *
-* Description:Decimate a vector by 2 with 2nd order fir filter *
+* Description:Decimate a vector by 2 with 2nd order fir filter *
* *
************************************************************************/
@@ -33,36 +33,36 @@
static Word16 h_fir[L_FIR] = {4260, 7536, 9175, 7536, 4260};
void LP_Decim2(
- Word16 x[], /* in/out: signal to process */
- Word16 l, /* input : size of filtering */
- Word16 mem[] /* in/out: memory (size=3) */
- )
+ Word16 x[], /* in/out: signal to process */
+ Word16 l, /* input : size of filtering */
+ Word16 mem[] /* in/out: memory (size=3) */
+ )
{
- Word16 *p_x, x_buf[L_FRAME + L_MEM];
- Word32 i, j;
- Word32 L_tmp;
- /* copy initial filter states into buffer */
- p_x = x_buf;
- for (i = 0; i < L_MEM; i++)
- {
- *p_x++ = mem[i];
- mem[i] = x[l - L_MEM + i];
- }
- for (i = 0; i < l; i++)
- {
- *p_x++ = x[i];
- }
- for (i = 0, j = 0; i < l; i += 2, j++)
- {
- p_x = &x_buf[i];
- L_tmp = ((*p_x++) * h_fir[0]);
- L_tmp += ((*p_x++) * h_fir[1]);
- L_tmp += ((*p_x++) * h_fir[2]);
- L_tmp += ((*p_x++) * h_fir[3]);
- L_tmp += ((*p_x++) * h_fir[4]);
- x[j] = (L_tmp + 0x4000)>>15;
- }
- return;
+ Word16 *p_x, x_buf[L_FRAME + L_MEM];
+ Word32 i, j;
+ Word32 L_tmp;
+ /* copy initial filter states into buffer */
+ p_x = x_buf;
+ for (i = 0; i < L_MEM; i++)
+ {
+ *p_x++ = mem[i];
+ mem[i] = x[l - L_MEM + i];
+ }
+ for (i = 0; i < l; i++)
+ {
+ *p_x++ = x[i];
+ }
+ for (i = 0, j = 0; i < l; i += 2, j++)
+ {
+ p_x = &x_buf[i];
+ L_tmp = ((*p_x++) * h_fir[0]);
+ L_tmp += ((*p_x++) * h_fir[1]);
+ L_tmp += ((*p_x++) * h_fir[2]);
+ L_tmp += ((*p_x++) * h_fir[3]);
+ L_tmp += ((*p_x++) * h_fir[4]);
+ x[j] = (L_tmp + 0x4000)>>15;
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/math_op.c b/media/libstagefright/codecs/amrwbenc/src/math_op.c
index 7affbb2..9d7c74e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/math_op.c
+++ b/media/libstagefright/codecs/amrwbenc/src/math_op.c
@@ -55,17 +55,17 @@
|___________________________________________________________________________|
*/
Word32 Isqrt( /* (o) Q31 : output value (range: 0<=val<1) */
- Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */
- )
+ Word32 L_x /* (i) Q0 : input value (range: 0<=val<=7fffffff) */
+ )
{
- Word16 exp;
- Word32 L_y;
- exp = norm_l(L_x);
- L_x = (L_x << exp); /* L_x is normalized */
- exp = (31 - exp);
- Isqrt_n(&L_x, &exp);
- L_y = (L_x << exp); /* denormalization */
- return (L_y);
+ Word16 exp;
+ Word32 L_y;
+ exp = norm_l(L_x);
+ L_x = (L_x << exp); /* L_x is normalized */
+ exp = (31 - exp);
+ Isqrt_n(&L_x, &exp);
+ L_y = (L_x << exp); /* denormalization */
+ return (L_y);
}
/*___________________________________________________________________________
@@ -90,43 +90,43 @@ Word32 Isqrt( /* (o) Q31 : output value (range: 0<=
*/
static Word16 table_isqrt[49] =
{
- 32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214,
- 25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155,
- 21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539,
- 19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674,
- 17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384
+ 32767, 31790, 30894, 30070, 29309, 28602, 27945, 27330, 26755, 26214,
+ 25705, 25225, 24770, 24339, 23930, 23541, 23170, 22817, 22479, 22155,
+ 21845, 21548, 21263, 20988, 20724, 20470, 20225, 19988, 19760, 19539,
+ 19326, 19119, 18919, 18725, 18536, 18354, 18176, 18004, 17837, 17674,
+ 17515, 17361, 17211, 17064, 16921, 16782, 16646, 16514, 16384
};
void Isqrt_n(
- Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
- Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */
- )
+ Word32 * frac, /* (i/o) Q31: normalized value (1.0 < frac <= 0.5) */
+ Word16 * exp /* (i/o) : exponent (value = frac x 2^exponent) */
+ )
{
- Word16 i, a, tmp;
-
- if (*frac <= (Word32) 0)
- {
- *exp = 0;
- *frac = 0x7fffffffL;
- return;
- }
-
- if((*exp & 1) == 1) /*If exponant odd -> shift right */
- *frac = (*frac) >> 1;
-
- *exp = negate((*exp - 1) >> 1);
-
- *frac = (*frac >> 9);
- i = extract_h(*frac); /* Extract b25-b31 */
- *frac = (*frac >> 1);
- a = (Word16)(*frac); /* Extract b10-b24 */
- a = (Word16) (a & (Word16) 0x7fff);
- i -= 16;
- *frac = L_deposit_h(table_isqrt[i]); /* table[i] << 16 */
- tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]); /* table[i] - table[i+1]) */
- *frac = vo_L_msu(*frac, tmp, a); /* frac -= tmp*a*2 */
-
- return;
+ Word16 i, a, tmp;
+
+ if (*frac <= (Word32) 0)
+ {
+ *exp = 0;
+ *frac = 0x7fffffffL;
+ return;
+ }
+
+ if((*exp & 1) == 1) /*If exponant odd -> shift right */
+ *frac = (*frac) >> 1;
+
+ *exp = negate((*exp - 1) >> 1);
+
+ *frac = (*frac >> 9);
+ i = extract_h(*frac); /* Extract b25-b31 */
+ *frac = (*frac >> 1);
+ a = (Word16)(*frac); /* Extract b10-b24 */
+ a = (Word16) (a & (Word16) 0x7fff);
+ i -= 16;
+ *frac = L_deposit_h(table_isqrt[i]); /* table[i] << 16 */
+ tmp = vo_sub(table_isqrt[i], table_isqrt[i + 1]); /* table[i] - table[i+1]) */
+ *frac = vo_L_msu(*frac, tmp, a); /* frac -= tmp*a*2 */
+
+ return;
}
/*___________________________________________________________________________
@@ -149,34 +149,34 @@ void Isqrt_n(
*/
static Word16 table_pow2[33] =
{
- 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911,
- 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726,
- 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706,
- 31379, 32066, 32767
+ 16384, 16743, 17109, 17484, 17867, 18258, 18658, 19066, 19484, 19911,
+ 20347, 20792, 21247, 21713, 22188, 22674, 23170, 23678, 24196, 24726,
+ 25268, 25821, 26386, 26964, 27554, 28158, 28774, 29405, 30048, 30706,
+ 31379, 32066, 32767
};
Word32 Pow2( /* (o) Q0 : result (range: 0<=val<=0x7fffffff) */
- Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */
- Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */
- )
+ Word16 exponant, /* (i) Q0 : Integer part. (range: 0<=val<=30) */
+ Word16 fraction /* (i) Q15 : Fractionnal part. (range: 0.0<=val<1.0) */
+ )
{
- Word16 exp, i, a, tmp;
- Word32 L_x;
+ Word16 exp, i, a, tmp;
+ Word32 L_x;
- L_x = vo_L_mult(fraction, 32); /* L_x = fraction<<6 */
- i = extract_h(L_x); /* Extract b10-b16 of fraction */
- L_x =L_x >> 1;
- a = (Word16)(L_x); /* Extract b0-b9 of fraction */
- a = (Word16) (a & (Word16) 0x7fff);
+ L_x = vo_L_mult(fraction, 32); /* L_x = fraction<<6 */
+ i = extract_h(L_x); /* Extract b10-b16 of fraction */
+ L_x =L_x >> 1;
+ a = (Word16)(L_x); /* Extract b0-b9 of fraction */
+ a = (Word16) (a & (Word16) 0x7fff);
- L_x = L_deposit_h(table_pow2[i]); /* table[i] << 16 */
- tmp = vo_sub(table_pow2[i], table_pow2[i + 1]); /* table[i] - table[i+1] */
- L_x -= (tmp * a)<<1; /* L_x -= tmp*a*2 */
+ L_x = L_deposit_h(table_pow2[i]); /* table[i] << 16 */
+ tmp = vo_sub(table_pow2[i], table_pow2[i + 1]); /* table[i] - table[i+1] */
+ L_x -= (tmp * a)<<1; /* L_x -= tmp*a*2 */
- exp = vo_sub(30, exponant);
- L_x = vo_L_shr_r(L_x, exp);
+ exp = vo_sub(30, exponant);
+ L_x = vo_L_shr_r(L_x, exp);
- return (L_x);
+ return (L_x);
}
/*___________________________________________________________________________
@@ -194,25 +194,30 @@ Word32 Pow2( /* (o) Q0 : result (range: 0<=
*/
Word32 Dot_product12( /* (o) Q31: normalized result (1 < val <= -1) */
- Word16 x[], /* (i) 12bits: x vector */
- Word16 y[], /* (i) 12bits: y vector */
- Word16 lg, /* (i) : vector length */
- Word16 * exp /* (o) : exponent of result (0..+30) */
- )
+ Word16 x[], /* (i) 12bits: x vector */
+ Word16 y[], /* (i) 12bits: y vector */
+ Word16 lg, /* (i) : vector length */
+ Word16 * exp /* (o) : exponent of result (0..+30) */
+ )
{
- Word16 sft;
- Word32 i, L_sum;
- L_sum = 0;
- for (i = 0; i < lg; i++)
- {
- L_sum += x[i] * y[i];
- }
- L_sum = (L_sum << 1) + 1;
- /* Normalize acc in Q31 */
- sft = norm_l(L_sum);
- L_sum = L_sum << sft;
- *exp = 30 - sft; /* exponent = 0..30 */
- return (L_sum);
+ Word16 sft;
+ Word32 i, L_sum;
+ L_sum = 0;
+ for (i = 0; i < lg; i++)
+ {
+ Word32 tmp = (Word32) x[i] * (Word32) y[i];
+ if (tmp == (Word32) 0x40000000L) {
+ tmp = MAX_32;
+ }
+ L_sum = L_add(L_sum, tmp);
+ }
+ L_sum = L_shl2(L_sum, 1);
+ L_sum = L_add(L_sum, 1);
+ /* Normalize acc in Q31 */
+ sft = norm_l(L_sum);
+ L_sum = L_sum << sft;
+ *exp = 30 - sft; /* exponent = 0..30 */
+ return (L_sum);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/mem_align.c b/media/libstagefright/codecs/amrwbenc/src/mem_align.c
index 3b7853f..04e5976 100644
--- a/media/libstagefright/codecs/amrwbenc/src/mem_align.c
+++ b/media/libstagefright/codecs/amrwbenc/src/mem_align.c
@@ -15,18 +15,18 @@
*/
/*******************************************************************************
- File: mem_align.c
+ File: mem_align.c
- Content: Memory alloc alignments functions
+ Content: Memory alloc alignments functions
*******************************************************************************/
-#include "mem_align.h"
+#include "mem_align.h"
#ifdef _MSC_VER
-#include <stddef.h>
+#include <stddef.h>
#else
-#include <stdint.h>
+#include <stdint.h>
#endif
/*****************************************************************************
@@ -39,50 +39,50 @@
void *
mem_malloc(VO_MEM_OPERATOR *pMemop, unsigned int size, unsigned char alignment, unsigned int CodecID)
{
- int ret;
- unsigned char *mem_ptr;
- VO_MEM_INFO MemInfo;
+ int ret;
+ unsigned char *mem_ptr;
+ VO_MEM_INFO MemInfo;
- if (!alignment) {
+ if (!alignment) {
- MemInfo.Flag = 0;
- MemInfo.Size = size + 1;
- ret = pMemop->Alloc(CodecID, &MemInfo);
- if(ret != 0)
- return 0;
- mem_ptr = (unsigned char *)MemInfo.VBuffer;
+ MemInfo.Flag = 0;
+ MemInfo.Size = size + 1;
+ ret = pMemop->Alloc(CodecID, &MemInfo);
+ if(ret != 0)
+ return 0;
+ mem_ptr = (unsigned char *)MemInfo.VBuffer;
- pMemop->Set(CodecID, mem_ptr, 0, size + 1);
+ pMemop->Set(CodecID, mem_ptr, 0, size + 1);
- *mem_ptr = (unsigned char)1;
+ *mem_ptr = (unsigned char)1;
- return ((void *)(mem_ptr+1));
- } else {
- unsigned char *tmp;
+ return ((void *)(mem_ptr+1));
+ } else {
+ unsigned char *tmp;
- MemInfo.Flag = 0;
- MemInfo.Size = size + alignment;
- ret = pMemop->Alloc(CodecID, &MemInfo);
- if(ret != 0)
- return 0;
+ MemInfo.Flag = 0;
+ MemInfo.Size = size + alignment;
+ ret = pMemop->Alloc(CodecID, &MemInfo);
+ if(ret != 0)
+ return 0;
- tmp = (unsigned char *)MemInfo.VBuffer;
+ tmp = (unsigned char *)MemInfo.VBuffer;
- pMemop->Set(CodecID, tmp, 0, size + alignment);
+ pMemop->Set(CodecID, tmp, 0, size + alignment);
- mem_ptr =
- (unsigned char *) ((intptr_t) (tmp + alignment - 1) &
- (~((intptr_t) (alignment - 1))));
+ mem_ptr =
+ (unsigned char *) ((intptr_t) (tmp + alignment - 1) &
+ (~((intptr_t) (alignment - 1))));
- if (mem_ptr == tmp)
- mem_ptr += alignment;
+ if (mem_ptr == tmp)
+ mem_ptr += alignment;
- *(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp);
+ *(mem_ptr - 1) = (unsigned char) (mem_ptr - tmp);
- return ((void *)mem_ptr);
- }
+ return ((void *)mem_ptr);
+ }
- return(0);
+ return(0);
}
@@ -96,16 +96,16 @@ void
mem_free(VO_MEM_OPERATOR *pMemop, void *mem_ptr, unsigned int CodecID)
{
- unsigned char *ptr;
+ unsigned char *ptr;
- if (mem_ptr == 0)
- return;
+ if (mem_ptr == 0)
+ return;
- ptr = mem_ptr;
+ ptr = mem_ptr;
- ptr -= *(ptr - 1);
+ ptr -= *(ptr - 1);
- pMemop->Free(CodecID, ptr);
+ pMemop->Free(CodecID, ptr);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/oper_32b.c b/media/libstagefright/codecs/amrwbenc/src/oper_32b.c
index 27cad76..e6f80d0 100644
--- a/media/libstagefright/codecs/amrwbenc/src/oper_32b.c
+++ b/media/libstagefright/codecs/amrwbenc/src/oper_32b.c
@@ -56,9 +56,9 @@
__inline void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo)
{
- *hi = (Word16)(L_32 >> 16);
- *lo = (Word16)((L_32 & 0xffff) >> 1);
- return;
+ *hi = (Word16)(L_32 >> 16);
+ *lo = (Word16)((L_32 & 0xffff) >> 1);
+ return;
}
/*****************************************************************************
@@ -84,11 +84,11 @@ __inline void VO_L_Extract (Word32 L_32, Word16 *hi, Word16 *lo)
Word32 L_Comp (Word16 hi, Word16 lo)
{
- Word32 L_32;
+ Word32 L_32;
- L_32 = L_deposit_h (hi);
+ L_32 = L_deposit_h (hi);
- return (L_mac (L_32, lo, 1)); /* = hi<<16 + lo<<1 */
+ return (L_mac (L_32, lo, 1)); /* = hi<<16 + lo<<1 */
}
/*****************************************************************************
@@ -113,13 +113,13 @@ Word32 L_Comp (Word16 hi, Word16 lo)
__inline Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2)
{
- Word32 L_32;
- L_32 = (hi1 * hi2);
- L_32 += (hi1 * lo2) >> 15;
- L_32 += (lo1 * hi2) >> 15;
- L_32 <<= 1;
+ Word32 L_32;
+ L_32 = (hi1 * hi2);
+ L_32 += (hi1 * lo2) >> 15;
+ L_32 += (lo1 * hi2) >> 15;
+ L_32 <<= 1;
- return (L_32);
+ return (L_32);
}
/*****************************************************************************
@@ -142,12 +142,12 @@ __inline Word32 Mpy_32 (Word16 hi1, Word16 lo1, Word16 hi2, Word16 lo2)
__inline Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n)
{
- Word32 L_32;
+ Word32 L_32;
- L_32 = (hi * n)<<1;
- L_32 += (((lo * n)>>15)<<1);
+ L_32 = (hi * n)<<1;
+ L_32 += (((lo * n)>>15)<<1);
- return (L_32);
+ return (L_32);
}
/*****************************************************************************
@@ -194,30 +194,30 @@ __inline Word32 Mpy_32_16 (Word16 hi, Word16 lo, Word16 n)
Word32 Div_32 (Word32 L_num, Word16 denom_hi, Word16 denom_lo)
{
- Word16 approx, hi, lo, n_hi, n_lo;
- Word32 L_32;
+ Word16 approx, hi, lo, n_hi, n_lo;
+ Word32 L_32;
- /* First approximation: 1 / L_denom = 1/denom_hi */
+ /* First approximation: 1 / L_denom = 1/denom_hi */
- approx = div_s ((Word16) 0x3fff, denom_hi);
+ approx = div_s ((Word16) 0x3fff, denom_hi);
- /* 1/L_denom = approx * (2.0 - L_denom * approx) */
+ /* 1/L_denom = approx * (2.0 - L_denom * approx) */
- L_32 = Mpy_32_16 (denom_hi, denom_lo, approx);
+ L_32 = Mpy_32_16 (denom_hi, denom_lo, approx);
- L_32 = L_sub ((Word32) 0x7fffffffL, L_32);
- hi = L_32 >> 16;
- lo = (L_32 & 0xffff) >> 1;
+ L_32 = L_sub ((Word32) 0x7fffffffL, L_32);
+ hi = L_32 >> 16;
+ lo = (L_32 & 0xffff) >> 1;
- L_32 = Mpy_32_16 (hi, lo, approx);
+ L_32 = Mpy_32_16 (hi, lo, approx);
- /* L_num * (1/L_denom) */
- hi = L_32 >> 16;
- lo = (L_32 & 0xffff) >> 1;
- VO_L_Extract (L_num, &n_hi, &n_lo);
- L_32 = Mpy_32 (n_hi, n_lo, hi, lo);
- L_32 = L_shl2(L_32, 2);
+ /* L_num * (1/L_denom) */
+ hi = L_32 >> 16;
+ lo = (L_32 & 0xffff) >> 1;
+ VO_L_Extract (L_num, &n_hi, &n_lo);
+ L_32 = Mpy_32 (n_hi, n_lo, hi, lo);
+ L_32 = L_shl2(L_32, 2);
- return (L_32);
+ return (L_32);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
index b8174b9..5d2b4bd 100644
--- a/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
+++ b/media/libstagefright/codecs/amrwbenc/src/p_med_ol.c
@@ -18,7 +18,7 @@
* File: p_med_ol.c *
* *
* Description: Compute the open loop pitch lag *
-* output: open loop pitch lag *
+* output: open loop pitch lag *
************************************************************************/
#include "typedef.h"
@@ -29,131 +29,131 @@
#include "p_med_ol.tab"
Word16 Pitch_med_ol(
- Word16 wsp[], /* i: signal used to compute the open loop pitch*/
+ Word16 wsp[], /* i: signal used to compute the open loop pitch*/
/* wsp[-pit_max] to wsp[-1] should be known */
- Coder_State *st, /* i/o: codec global structure */
- Word16 L_frame /* i: length of frame to compute pitch */
- )
+ Coder_State *st, /* i/o: codec global structure */
+ Word16 L_frame /* i: length of frame to compute pitch */
+ )
{
- Word16 Tm;
- Word16 hi, lo;
- Word16 *ww, *we, *hp_wsp;
- Word16 exp_R0, exp_R1, exp_R2;
- Word32 i, j, max, R0, R1, R2;
- Word16 *p1, *p2;
- Word16 L_min = 17; /* minimum pitch lag: PIT_MIN / OPL_DECIM */
- Word16 L_max = 115; /* maximum pitch lag: PIT_MAX / OPL_DECIM */
- Word16 L_0 = st->old_T0_med; /* old open-loop pitch */
- Word16 *gain = &(st->ol_gain); /* normalize correlation of hp_wsp for the lag */
- Word16 *hp_wsp_mem = st->hp_wsp_mem; /* memory of the hypass filter for hp_wsp[] (lg = 9)*/
- Word16 *old_hp_wsp = st->old_hp_wsp; /* hypass wsp[] */
- Word16 wght_flg = st->ol_wght_flg; /* is weighting function used */
-
- ww = &corrweight[198];
- we = &corrweight[98 + L_max - L_0];
-
- max = MIN_32;
- Tm = 0;
- for (i = L_max; i > L_min; i--)
- {
- /* Compute the correlation */
- R0 = 0;
- p1 = wsp;
- p2 = &wsp[-i];
- for (j = 0; j < L_frame; j+=4)
- {
- R0 += vo_L_mult((*p1++), (*p2++));
- R0 += vo_L_mult((*p1++), (*p2++));
- R0 += vo_L_mult((*p1++), (*p2++));
- R0 += vo_L_mult((*p1++), (*p2++));
- }
- /* Weighting of the correlation function. */
- hi = R0>>16;
- lo = (R0 & 0xffff)>>1;
-
- R0 = Mpy_32_16(hi, lo, *ww);
- ww--;
-
- if ((L_0 > 0) && (wght_flg > 0))
- {
- /* Weight the neighbourhood of the old lag. */
- hi = R0>>16;
- lo = (R0 & 0xffff)>>1;
- R0 = Mpy_32_16(hi, lo, *we);
- we--;
- }
- if(R0 >= max)
- {
- max = R0;
- Tm = i;
- }
- }
-
- /* Hypass the wsp[] vector */
- hp_wsp = old_hp_wsp + L_max;
- Hp_wsp(wsp, hp_wsp, L_frame, hp_wsp_mem);
-
- /* Compute normalize correlation at delay Tm */
- R0 = 0;
- R1 = 0;
- R2 = 0;
- p1 = hp_wsp;
- p2 = hp_wsp - Tm;
- for (j = 0; j < L_frame; j+=4)
- {
- R2 += vo_mult32(*p1, *p1);
- R1 += vo_mult32(*p2, *p2);
- R0 += vo_mult32(*p1++, *p2++);
- R2 += vo_mult32(*p1, *p1);
- R1 += vo_mult32(*p2, *p2);
- R0 += vo_mult32(*p1++, *p2++);
- R2 += vo_mult32(*p1, *p1);
- R1 += vo_mult32(*p2, *p2);
- R0 += vo_mult32(*p1++, *p2++);
- R2 += vo_mult32(*p1, *p1);
- R1 += vo_mult32(*p2, *p2);
- R0 += vo_mult32(*p1++, *p2++);
- }
- R0 = R0 <<1;
- R1 = (R1 <<1) + 1L;
- R2 = (R2 <<1) + 1L;
- /* gain = R0/ sqrt(R1*R2) */
-
- exp_R0 = norm_l(R0);
- R0 = (R0 << exp_R0);
-
- exp_R1 = norm_l(R1);
- R1 = (R1 << exp_R1);
-
- exp_R2 = norm_l(R2);
- R2 = (R2 << exp_R2);
-
-
- R1 = vo_L_mult(vo_round(R1), vo_round(R2));
-
- i = norm_l(R1);
- R1 = (R1 << i);
-
- exp_R1 += exp_R2;
- exp_R1 += i;
- exp_R1 = 62 - exp_R1;
-
- Isqrt_n(&R1, &exp_R1);
-
- R0 = vo_L_mult(voround(R0), voround(R1));
- exp_R0 = 31 - exp_R0;
- exp_R0 += exp_R1;
-
- *gain = vo_round(L_shl(R0, exp_R0));
-
- /* Shitf hp_wsp[] for next frame */
-
- for (i = 0; i < L_max; i++)
- {
- old_hp_wsp[i] = old_hp_wsp[i + L_frame];
- }
-
- return (Tm);
+ Word16 Tm;
+ Word16 hi, lo;
+ Word16 *ww, *we, *hp_wsp;
+ Word16 exp_R0, exp_R1, exp_R2;
+ Word32 i, j, max, R0, R1, R2;
+ Word16 *p1, *p2;
+ Word16 L_min = 17; /* minimum pitch lag: PIT_MIN / OPL_DECIM */
+ Word16 L_max = 115; /* maximum pitch lag: PIT_MAX / OPL_DECIM */
+ Word16 L_0 = st->old_T0_med; /* old open-loop pitch */
+ Word16 *gain = &(st->ol_gain); /* normalize correlation of hp_wsp for the lag */
+ Word16 *hp_wsp_mem = st->hp_wsp_mem; /* memory of the hypass filter for hp_wsp[] (lg = 9)*/
+ Word16 *old_hp_wsp = st->old_hp_wsp; /* hypass wsp[] */
+ Word16 wght_flg = st->ol_wght_flg; /* is weighting function used */
+
+ ww = &corrweight[198];
+ we = &corrweight[98 + L_max - L_0];
+
+ max = MIN_32;
+ Tm = 0;
+ for (i = L_max; i > L_min; i--)
+ {
+ /* Compute the correlation */
+ R0 = 0;
+ p1 = wsp;
+ p2 = &wsp[-i];
+ for (j = 0; j < L_frame; j+=4)
+ {
+ R0 += vo_L_mult((*p1++), (*p2++));
+ R0 += vo_L_mult((*p1++), (*p2++));
+ R0 += vo_L_mult((*p1++), (*p2++));
+ R0 += vo_L_mult((*p1++), (*p2++));
+ }
+ /* Weighting of the correlation function. */
+ hi = R0>>16;
+ lo = (R0 & 0xffff)>>1;
+
+ R0 = Mpy_32_16(hi, lo, *ww);
+ ww--;
+
+ if ((L_0 > 0) && (wght_flg > 0))
+ {
+ /* Weight the neighbourhood of the old lag. */
+ hi = R0>>16;
+ lo = (R0 & 0xffff)>>1;
+ R0 = Mpy_32_16(hi, lo, *we);
+ we--;
+ }
+ if(R0 >= max)
+ {
+ max = R0;
+ Tm = i;
+ }
+ }
+
+ /* Hypass the wsp[] vector */
+ hp_wsp = old_hp_wsp + L_max;
+ Hp_wsp(wsp, hp_wsp, L_frame, hp_wsp_mem);
+
+ /* Compute normalize correlation at delay Tm */
+ R0 = 0;
+ R1 = 0;
+ R2 = 0;
+ p1 = hp_wsp;
+ p2 = hp_wsp - Tm;
+ for (j = 0; j < L_frame; j+=4)
+ {
+ R2 += vo_mult32(*p1, *p1);
+ R1 += vo_mult32(*p2, *p2);
+ R0 += vo_mult32(*p1++, *p2++);
+ R2 += vo_mult32(*p1, *p1);
+ R1 += vo_mult32(*p2, *p2);
+ R0 += vo_mult32(*p1++, *p2++);
+ R2 += vo_mult32(*p1, *p1);
+ R1 += vo_mult32(*p2, *p2);
+ R0 += vo_mult32(*p1++, *p2++);
+ R2 += vo_mult32(*p1, *p1);
+ R1 += vo_mult32(*p2, *p2);
+ R0 += vo_mult32(*p1++, *p2++);
+ }
+ R0 = R0 <<1;
+ R1 = (R1 <<1) + 1L;
+ R2 = (R2 <<1) + 1L;
+ /* gain = R0/ sqrt(R1*R2) */
+
+ exp_R0 = norm_l(R0);
+ R0 = (R0 << exp_R0);
+
+ exp_R1 = norm_l(R1);
+ R1 = (R1 << exp_R1);
+
+ exp_R2 = norm_l(R2);
+ R2 = (R2 << exp_R2);
+
+
+ R1 = vo_L_mult(voround(R1), voround(R2));
+
+ i = norm_l(R1);
+ R1 = (R1 << i);
+
+ exp_R1 += exp_R2;
+ exp_R1 += i;
+ exp_R1 = 62 - exp_R1;
+
+ Isqrt_n(&R1, &exp_R1);
+
+ R0 = vo_L_mult(voround(R0), voround(R1));
+ exp_R0 = 31 - exp_R0;
+ exp_R0 += exp_R1;
+
+ *gain = vo_round(L_shl(R0, exp_R0));
+
+ /* Shitf hp_wsp[] for next frame */
+
+ for (i = 0; i < L_max; i++)
+ {
+ old_hp_wsp[i] = old_hp_wsp[i + L_frame];
+ }
+
+ return (Tm);
}
/************************************************************************
@@ -171,84 +171,84 @@ Word16 Pitch_med_ol(
Word16 median5(Word16 x[])
{
- Word16 x1, x2, x3, x4, x5;
- Word16 tmp;
-
- x1 = x[-2];
- x2 = x[-1];
- x3 = x[0];
- x4 = x[1];
- x5 = x[2];
-
- if (x2 < x1)
- {
- tmp = x1;
- x1 = x2;
- x2 = tmp;
- }
- if (x3 < x1)
- {
- tmp = x1;
- x1 = x3;
- x3 = tmp;
- }
- if (x4 < x1)
- {
- tmp = x1;
- x1 = x4;
- x4 = tmp;
- }
- if (x5 < x1)
- {
- x5 = x1;
- }
- if (x3 < x2)
- {
- tmp = x2;
- x2 = x3;
- x3 = tmp;
- }
- if (x4 < x2)
- {
- tmp = x2;
- x2 = x4;
- x4 = tmp;
- }
- if (x5 < x2)
- {
- x5 = x2;
- }
- if (x4 < x3)
- {
- x3 = x4;
- }
- if (x5 < x3)
- {
- x3 = x5;
- }
- return (x3);
+ Word16 x1, x2, x3, x4, x5;
+ Word16 tmp;
+
+ x1 = x[-2];
+ x2 = x[-1];
+ x3 = x[0];
+ x4 = x[1];
+ x5 = x[2];
+
+ if (x2 < x1)
+ {
+ tmp = x1;
+ x1 = x2;
+ x2 = tmp;
+ }
+ if (x3 < x1)
+ {
+ tmp = x1;
+ x1 = x3;
+ x3 = tmp;
+ }
+ if (x4 < x1)
+ {
+ tmp = x1;
+ x1 = x4;
+ x4 = tmp;
+ }
+ if (x5 < x1)
+ {
+ x5 = x1;
+ }
+ if (x3 < x2)
+ {
+ tmp = x2;
+ x2 = x3;
+ x3 = tmp;
+ }
+ if (x4 < x2)
+ {
+ tmp = x2;
+ x2 = x4;
+ x4 = tmp;
+ }
+ if (x5 < x2)
+ {
+ x5 = x2;
+ }
+ if (x4 < x3)
+ {
+ x3 = x4;
+ }
+ if (x5 < x3)
+ {
+ x3 = x5;
+ }
+ return (x3);
}
Word16 Med_olag( /* output : median of 5 previous open-loop lags */
- Word16 prev_ol_lag, /* input : previous open-loop lag */
- Word16 old_ol_lag[5]
- )
+ Word16 prev_ol_lag, /* input : previous open-loop lag */
+ Word16 old_ol_lag[5]
+ )
{
- Word32 i;
+ Word32 i;
- /* Use median of 5 previous open-loop lags as old lag */
+ /* Use median of 5 previous open-loop lags as old lag */
- for (i = 4; i > 0; i--)
- {
- old_ol_lag[i] = old_ol_lag[i - 1];
- }
+ for (i = 4; i > 0; i--)
+ {
+ old_ol_lag[i] = old_ol_lag[i - 1];
+ }
- old_ol_lag[0] = prev_ol_lag;
+ old_ol_lag[0] = prev_ol_lag;
- i = median5(&old_ol_lag[2]);
+ i = median5(&old_ol_lag[2]);
- return i;
+ return i;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c b/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c
index 6f55b8f..f100253 100644
--- a/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c
+++ b/media/libstagefright/codecs/amrwbenc/src/pit_shrp.c
@@ -25,24 +25,24 @@
#include "basic_op.h"
void Pit_shrp(
- Word16 * x, /* in/out: impulse response (or algebraic code) */
- Word16 pit_lag, /* input : pitch lag */
- Word16 sharp, /* input : pitch sharpening factor (Q15) */
- Word16 L_subfr /* input : subframe size */
- )
+ Word16 * x, /* in/out: impulse response (or algebraic code) */
+ Word16 pit_lag, /* input : pitch lag */
+ Word16 sharp, /* input : pitch sharpening factor (Q15) */
+ Word16 L_subfr /* input : subframe size */
+ )
{
- Word32 i;
- Word32 L_tmp;
- Word16 *x_ptr = x + pit_lag;
-
- for (i = pit_lag; i < L_subfr; i++)
- {
- L_tmp = (*x_ptr << 15);
- L_tmp += *x++ * sharp;
- *x_ptr++ = ((L_tmp + 0x4000)>>15);
- }
-
- return;
+ Word32 i;
+ Word32 L_tmp;
+ Word16 *x_ptr = x + pit_lag;
+
+ for (i = pit_lag; i < L_subfr; i++)
+ {
+ L_tmp = (*x_ptr << 15);
+ L_tmp += *x++ * sharp;
+ *x_ptr++ = ((L_tmp + 0x4000)>>15);
+ }
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c
index b66b55e..de2a221 100644
--- a/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c
+++ b/media/libstagefright/codecs/amrwbenc/src/pitch_f4.c
@@ -18,7 +18,7 @@
* File: pitch_f4.c *
* *
* Description: Find the closed loop pitch period with *
-* 1/4 subsample resolution. *
+* 1/4 subsample resolution. *
* *
************************************************************************/
@@ -37,117 +37,117 @@
#ifdef ASM_OPT
void Norm_corr_asm(
- Word16 exc[], /* (i) : excitation buffer */
- Word16 xn[], /* (i) : target vector */
- Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
- Word16 L_subfr,
- Word16 t_min, /* (i) : minimum value of pitch lag. */
- Word16 t_max, /* (i) : maximum value of pitch lag. */
- Word16 corr_norm[] /* (o) Q15 : normalized correlation */
- );
+ Word16 exc[], /* (i) : excitation buffer */
+ Word16 xn[], /* (i) : target vector */
+ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+ Word16 L_subfr,
+ Word16 t_min, /* (i) : minimum value of pitch lag. */
+ Word16 t_max, /* (i) : maximum value of pitch lag. */
+ Word16 corr_norm[] /* (o) Q15 : normalized correlation */
+ );
#else
static void Norm_Corr(
- Word16 exc[], /* (i) : excitation buffer */
- Word16 xn[], /* (i) : target vector */
- Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
- Word16 L_subfr,
- Word16 t_min, /* (i) : minimum value of pitch lag. */
- Word16 t_max, /* (i) : maximum value of pitch lag. */
- Word16 corr_norm[] /* (o) Q15 : normalized correlation */
- );
+ Word16 exc[], /* (i) : excitation buffer */
+ Word16 xn[], /* (i) : target vector */
+ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+ Word16 L_subfr,
+ Word16 t_min, /* (i) : minimum value of pitch lag. */
+ Word16 t_max, /* (i) : maximum value of pitch lag. */
+ Word16 corr_norm[] /* (o) Q15 : normalized correlation */
+ );
#endif
static Word16 Interpol_4( /* (o) : interpolated value */
- Word16 * x, /* (i) : input vector */
- Word32 frac /* (i) : fraction (-4..+3) */
- );
+ Word16 * x, /* (i) : input vector */
+ Word32 frac /* (i) : fraction (-4..+3) */
+ );
Word16 Pitch_fr4( /* (o) : pitch period. */
- Word16 exc[], /* (i) : excitation buffer */
- Word16 xn[], /* (i) : target vector */
- Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
- Word16 t0_min, /* (i) : minimum value in the searched range. */
- Word16 t0_max, /* (i) : maximum value in the searched range. */
- Word16 * pit_frac, /* (o) : chosen fraction (0, 1, 2 or 3). */
- Word16 i_subfr, /* (i) : indicator for first subframe. */
- Word16 t0_fr2, /* (i) : minimum value for resolution 1/2 */
- Word16 t0_fr1, /* (i) : minimum value for resolution 1 */
- Word16 L_subfr /* (i) : Length of subframe */
- )
+ Word16 exc[], /* (i) : excitation buffer */
+ Word16 xn[], /* (i) : target vector */
+ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+ Word16 t0_min, /* (i) : minimum value in the searched range. */
+ Word16 t0_max, /* (i) : maximum value in the searched range. */
+ Word16 * pit_frac, /* (o) : chosen fraction (0, 1, 2 or 3). */
+ Word16 i_subfr, /* (i) : indicator for first subframe. */
+ Word16 t0_fr2, /* (i) : minimum value for resolution 1/2 */
+ Word16 t0_fr1, /* (i) : minimum value for resolution 1 */
+ Word16 L_subfr /* (i) : Length of subframe */
+ )
{
- Word32 fraction, i;
- Word16 t_min, t_max;
- Word16 max, t0, step, temp;
- Word16 *corr;
- Word16 corr_v[40]; /* Total length = t0_max-t0_min+1+2*L_inter */
-
- /* Find interval to compute normalized correlation */
-
- t_min = t0_min - L_INTERPOL1;
- t_max = t0_max + L_INTERPOL1;
- corr = &corr_v[-t_min];
- /* Compute normalized correlation between target and filtered excitation */
+ Word32 fraction, i;
+ Word16 t_min, t_max;
+ Word16 max, t0, step, temp;
+ Word16 *corr;
+ Word16 corr_v[40]; /* Total length = t0_max-t0_min+1+2*L_inter */
+
+ /* Find interval to compute normalized correlation */
+
+ t_min = t0_min - L_INTERPOL1;
+ t_max = t0_max + L_INTERPOL1;
+ corr = &corr_v[-t_min];
+ /* Compute normalized correlation between target and filtered excitation */
#ifdef ASM_OPT /* asm optimization branch */
Norm_corr_asm(exc, xn, h, L_subfr, t_min, t_max, corr);
#else
- Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr);
+ Norm_Corr(exc, xn, h, L_subfr, t_min, t_max, corr);
#endif
- /* Find integer pitch */
-
- max = corr[t0_min];
- t0 = t0_min;
- for (i = t0_min + 1; i <= t0_max; i++)
- {
- if (corr[i] >= max)
- {
- max = corr[i];
- t0 = i;
- }
- }
- /* If first subframe and t0 >= t0_fr1, do not search fractionnal pitch */
- if ((i_subfr == 0) && (t0 >= t0_fr1))
- {
- *pit_frac = 0;
- return (t0);
- }
- /*------------------------------------------------------------------*
- * Search fractionnal pitch with 1/4 subsample resolution. *
- * Test the fractions around t0 and choose the one which maximizes *
- * the interpolated normalized correlation. *
- *------------------------------------------------------------------*/
-
- step = 1; /* 1/4 subsample resolution */
- fraction = -3;
- if ((t0_fr2 == PIT_MIN)||((i_subfr == 0) && (t0 >= t0_fr2)))
- {
- step = 2; /* 1/2 subsample resolution */
- fraction = -2;
- }
- if(t0 == t0_min)
- {
- fraction = 0;
- }
- max = Interpol_4(&corr[t0], fraction);
-
- for (i = fraction + step; i <= 3; i += step)
- {
- temp = Interpol_4(&corr[t0], i);
- if(temp > max)
- {
- max = temp;
- fraction = i;
- }
- }
- /* limit the fraction value in the interval [0,1,2,3] */
- if (fraction < 0)
- {
- fraction += UP_SAMP;
- t0 -= 1;
- }
- *pit_frac = fraction;
- return (t0);
+ /* Find integer pitch */
+
+ max = corr[t0_min];
+ t0 = t0_min;
+ for (i = t0_min + 1; i <= t0_max; i++)
+ {
+ if (corr[i] >= max)
+ {
+ max = corr[i];
+ t0 = i;
+ }
+ }
+ /* If first subframe and t0 >= t0_fr1, do not search fractionnal pitch */
+ if ((i_subfr == 0) && (t0 >= t0_fr1))
+ {
+ *pit_frac = 0;
+ return (t0);
+ }
+ /*------------------------------------------------------------------*
+ * Search fractionnal pitch with 1/4 subsample resolution. *
+ * Test the fractions around t0 and choose the one which maximizes *
+ * the interpolated normalized correlation. *
+ *------------------------------------------------------------------*/
+
+ step = 1; /* 1/4 subsample resolution */
+ fraction = -3;
+ if ((t0_fr2 == PIT_MIN)||((i_subfr == 0) && (t0 >= t0_fr2)))
+ {
+ step = 2; /* 1/2 subsample resolution */
+ fraction = -2;
+ }
+ if(t0 == t0_min)
+ {
+ fraction = 0;
+ }
+ max = Interpol_4(&corr[t0], fraction);
+
+ for (i = fraction + step; i <= 3; i += step)
+ {
+ temp = Interpol_4(&corr[t0], i);
+ if(temp > max)
+ {
+ max = temp;
+ fraction = i;
+ }
+ }
+ /* limit the fraction value in the interval [0,1,2,3] */
+ if (fraction < 0)
+ {
+ fraction += UP_SAMP;
+ t0 -= 1;
+ }
+ *pit_frac = fraction;
+ return (t0);
}
@@ -161,109 +161,109 @@ Word16 Pitch_fr4( /* (o) : pitch period.
************************************************************************************/
#ifndef ASM_OPT
static void Norm_Corr(
- Word16 exc[], /* (i) : excitation buffer */
- Word16 xn[], /* (i) : target vector */
- Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
- Word16 L_subfr,
- Word16 t_min, /* (i) : minimum value of pitch lag. */
- Word16 t_max, /* (i) : maximum value of pitch lag. */
- Word16 corr_norm[]) /* (o) Q15 : normalized correlation */
+ Word16 exc[], /* (i) : excitation buffer */
+ Word16 xn[], /* (i) : target vector */
+ Word16 h[], /* (i) Q15 : impulse response of synth/wgt filters */
+ Word16 L_subfr,
+ Word16 t_min, /* (i) : minimum value of pitch lag. */
+ Word16 t_max, /* (i) : maximum value of pitch lag. */
+ Word16 corr_norm[]) /* (o) Q15 : normalized correlation */
{
- Word32 i, k, t;
- Word32 corr, exp_corr, norm, exp, scale;
- Word16 exp_norm, excf[L_SUBFR], tmp;
- Word32 L_tmp, L_tmp1, L_tmp2;
+ Word32 i, k, t;
+ Word32 corr, exp_corr, norm, exp, scale;
+ Word16 exp_norm, excf[L_SUBFR], tmp;
+ Word32 L_tmp, L_tmp1, L_tmp2;
UNUSED(L_subfr);
- /* compute the filtered excitation for the first delay t_min */
- k = -t_min;
+ /* compute the filtered excitation for the first delay t_min */
+ k = -t_min;
#ifdef ASM_OPT /* asm optimization branch */
- Convolve_asm(&exc[k], h, excf, 64);
+ Convolve_asm(&exc[k], h, excf, 64);
#else
- Convolve(&exc[k], h, excf, 64);
+ Convolve(&exc[k], h, excf, 64);
#endif
- /* Compute rounded down 1/sqrt(energy of xn[]) */
- L_tmp = 0;
- for (i = 0; i < 64; i+=4)
- {
- L_tmp += (xn[i] * xn[i]);
- L_tmp += (xn[i+1] * xn[i+1]);
- L_tmp += (xn[i+2] * xn[i+2]);
- L_tmp += (xn[i+3] * xn[i+3]);
- }
-
- L_tmp = (L_tmp << 1) + 1;
- exp = norm_l(L_tmp);
- exp = (32 - exp);
- //exp = exp + 2; /* energy of xn[] x 2 + rounded up */
- scale = -(exp >> 1); /* (1<<scale) < 1/sqrt(energy rounded) */
-
- /* loop for every possible period */
-
- for (t = t_min; t <= t_max; t++)
- {
- /* Compute correlation between xn[] and excf[] */
- L_tmp = 0;
- L_tmp1 = 0;
- for (i = 0; i < 64; i+=4)
- {
- L_tmp += (xn[i] * excf[i]);
- L_tmp1 += (excf[i] * excf[i]);
- L_tmp += (xn[i+1] * excf[i+1]);
- L_tmp1 += (excf[i+1] * excf[i+1]);
- L_tmp += (xn[i+2] * excf[i+2]);
- L_tmp1 += (excf[i+2] * excf[i+2]);
- L_tmp += (xn[i+3] * excf[i+3]);
- L_tmp1 += (excf[i+3] * excf[i+3]);
- }
-
- L_tmp = (L_tmp << 1) + 1;
- L_tmp1 = (L_tmp1 << 1) + 1;
-
- exp = norm_l(L_tmp);
- L_tmp = (L_tmp << exp);
- exp_corr = (30 - exp);
- corr = extract_h(L_tmp);
-
- exp = norm_l(L_tmp1);
- L_tmp = (L_tmp1 << exp);
- exp_norm = (30 - exp);
-
- Isqrt_n(&L_tmp, &exp_norm);
- norm = extract_h(L_tmp);
-
- /* Normalize correlation = correlation * (1/sqrt(energy)) */
-
- L_tmp = vo_L_mult(corr, norm);
-
- L_tmp2 = exp_corr + exp_norm + scale;
- if(L_tmp2 < 0)
- {
- L_tmp2 = -L_tmp2;
- L_tmp = L_tmp >> L_tmp2;
- }
- else
- {
- L_tmp = L_tmp << L_tmp2;
- }
-
- corr_norm[t] = vo_round(L_tmp);
- /* modify the filtered excitation excf[] for the next iteration */
-
- if(t != t_max)
- {
- k = -(t + 1);
- tmp = exc[k];
- for (i = 63; i > 0; i--)
- {
- excf[i] = add1(vo_mult(tmp, h[i]), excf[i - 1]);
- }
- excf[0] = vo_mult(tmp, h[0]);
- }
- }
- return;
+ /* Compute rounded down 1/sqrt(energy of xn[]) */
+ L_tmp = 0;
+ for (i = 0; i < 64; i+=4)
+ {
+ L_tmp += (xn[i] * xn[i]);
+ L_tmp += (xn[i+1] * xn[i+1]);
+ L_tmp += (xn[i+2] * xn[i+2]);
+ L_tmp += (xn[i+3] * xn[i+3]);
+ }
+
+ L_tmp = (L_tmp << 1) + 1;
+ exp = norm_l(L_tmp);
+ exp = (32 - exp);
+ //exp = exp + 2; /* energy of xn[] x 2 + rounded up */
+ scale = -(exp >> 1); /* (1<<scale) < 1/sqrt(energy rounded) */
+
+ /* loop for every possible period */
+
+ for (t = t_min; t <= t_max; t++)
+ {
+ /* Compute correlation between xn[] and excf[] */
+ L_tmp = 0;
+ L_tmp1 = 0;
+ for (i = 0; i < 64; i+=4)
+ {
+ L_tmp += (xn[i] * excf[i]);
+ L_tmp1 += (excf[i] * excf[i]);
+ L_tmp += (xn[i+1] * excf[i+1]);
+ L_tmp1 += (excf[i+1] * excf[i+1]);
+ L_tmp += (xn[i+2] * excf[i+2]);
+ L_tmp1 += (excf[i+2] * excf[i+2]);
+ L_tmp += (xn[i+3] * excf[i+3]);
+ L_tmp1 += (excf[i+3] * excf[i+3]);
+ }
+
+ L_tmp = (L_tmp << 1) + 1;
+ L_tmp1 = (L_tmp1 << 1) + 1;
+
+ exp = norm_l(L_tmp);
+ L_tmp = (L_tmp << exp);
+ exp_corr = (30 - exp);
+ corr = extract_h(L_tmp);
+
+ exp = norm_l(L_tmp1);
+ L_tmp = (L_tmp1 << exp);
+ exp_norm = (30 - exp);
+
+ Isqrt_n(&L_tmp, &exp_norm);
+ norm = extract_h(L_tmp);
+
+ /* Normalize correlation = correlation * (1/sqrt(energy)) */
+
+ L_tmp = vo_L_mult(corr, norm);
+
+ L_tmp2 = exp_corr + exp_norm + scale;
+ if(L_tmp2 < 0)
+ {
+ L_tmp2 = -L_tmp2;
+ L_tmp = L_tmp >> L_tmp2;
+ }
+ else
+ {
+ L_tmp = L_tmp << L_tmp2;
+ }
+
+ corr_norm[t] = vo_round(L_tmp);
+ /* modify the filtered excitation excf[] for the next iteration */
+
+ if(t != t_max)
+ {
+ k = -(t + 1);
+ tmp = exc[k];
+ for (i = 63; i > 0; i--)
+ {
+ excf[i] = add1(vo_mult(tmp, h[i]), excf[i - 1]);
+ }
+ excf[0] = vo_mult(tmp, h[0]);
+ }
+ }
+ return;
}
#endif
@@ -276,10 +276,10 @@ static void Norm_Corr(
/* 1/4 resolution interpolation filter (-3 dB at 0.791*fs/2) in Q14 */
static Word16 inter4_1[4][8] =
{
- {-12, 420, -1732, 5429, 13418, -1242, 73, 32},
- {-26, 455, -2142, 9910, 9910, -2142, 455, -26},
- {32, 73, -1242, 13418, 5429, -1732, 420, -12},
- {206, -766, 1376, 14746, 1376, -766, 206, 0}
+ {-12, 420, -1732, 5429, 13418, -1242, 73, 32},
+ {-26, 455, -2142, 9910, 9910, -2142, 455, -26},
+ {32, 73, -1242, 13418, 5429, -1732, 420, -12},
+ {206, -766, 1376, 14746, 1376, -766, 206, 0}
};
/*** Coefficients in floating point
@@ -292,34 +292,34 @@ static float inter4_1[UP_SAMP*L_INTERPOL1+1] = {
***/
static Word16 Interpol_4( /* (o) : interpolated value */
- Word16 * x, /* (i) : input vector */
- Word32 frac /* (i) : fraction (-4..+3) */
- )
+ Word16 * x, /* (i) : input vector */
+ Word32 frac /* (i) : fraction (-4..+3) */
+ )
{
- Word16 sum;
- Word32 k, L_sum;
- Word16 *ptr;
-
- if (frac < 0)
- {
- frac += UP_SAMP;
- x--;
- }
- x = x - L_INTERPOL1 + 1;
- k = UP_SAMP - 1 - frac;
- ptr = &(inter4_1[k][0]);
-
- L_sum = vo_mult32(x[0], (*ptr++));
- L_sum += vo_mult32(x[1], (*ptr++));
- L_sum += vo_mult32(x[2], (*ptr++));
- L_sum += vo_mult32(x[3], (*ptr++));
- L_sum += vo_mult32(x[4], (*ptr++));
- L_sum += vo_mult32(x[5], (*ptr++));
- L_sum += vo_mult32(x[6], (*ptr++));
- L_sum += vo_mult32(x[7], (*ptr++));
-
- sum = extract_h(L_add(L_shl2(L_sum, 2), 0x8000));
- return (sum);
+ Word16 sum;
+ Word32 k, L_sum;
+ Word16 *ptr;
+
+ if (frac < 0)
+ {
+ frac += UP_SAMP;
+ x--;
+ }
+ x = x - L_INTERPOL1 + 1;
+ k = UP_SAMP - 1 - frac;
+ ptr = &(inter4_1[k][0]);
+
+ L_sum = vo_mult32(x[0], (*ptr++));
+ L_sum += vo_mult32(x[1], (*ptr++));
+ L_sum += vo_mult32(x[2], (*ptr++));
+ L_sum += vo_mult32(x[3], (*ptr++));
+ L_sum += vo_mult32(x[4], (*ptr++));
+ L_sum += vo_mult32(x[5], (*ptr++));
+ L_sum += vo_mult32(x[6], (*ptr++));
+ L_sum += vo_mult32(x[7], (*ptr++));
+
+ sum = extract_h(L_add(L_shl2(L_sum, 2), 0x8000));
+ return (sum);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c b/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c
index 8404cf9..386cab3 100644
--- a/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c
+++ b/media/libstagefright/codecs/amrwbenc/src/pred_lt4.c
@@ -34,86 +34,86 @@
Word16 inter4_2[4][32] =
{
- {0,-2,4,-2,-10,38,-88,165,-275,424,-619,871,-1207,1699,-2598,5531,14031,-2147,780,-249,
- -16,153,-213,226,-209,175,-133,91,-55,28,-10,2},
+ {0,-2,4,-2,-10,38,-88,165,-275,424,-619,871,-1207,1699,-2598,5531,14031,-2147,780,-249,
+ -16,153,-213,226,-209,175,-133,91,-55,28,-10,2},
- {1,-7,19,-33,47,-52,43,-9,-60,175,-355,626,-1044,1749,-3267,10359,10359,-3267,1749,-1044,
- 626,-355,175,-60,-9,43,-52,47,-33,19, -7, 1},
+ {1,-7,19,-33,47,-52,43,-9,-60,175,-355,626,-1044,1749,-3267,10359,10359,-3267,1749,-1044,
+ 626,-355,175,-60,-9,43,-52,47,-33,19, -7, 1},
- {2,-10,28,-55,91,-133,175,-209,226,-213,153,-16,-249,780,-2147,14031,5531,-2598,1699,-1207,
- 871,-619,424,-275,165,-88,38,-10,-2,4,-2,0},
+ {2,-10,28,-55,91,-133,175,-209,226,-213,153,-16,-249,780,-2147,14031,5531,-2598,1699,-1207,
+ 871,-619,424,-275,165,-88,38,-10,-2,4,-2,0},
- {1,-7,22,-49,92,-153,231,-325,431,-544,656,-762,853,-923,968,15401,968,-923,853,-762,
- 656,-544,431,-325,231,-153,92,-49,22,-7, 1, 0}
+ {1,-7,22,-49,92,-153,231,-325,431,-544,656,-762,853,-923,968,15401,968,-923,853,-762,
+ 656,-544,431,-325,231,-153,92,-49,22,-7, 1, 0}
};
void Pred_lt4(
- Word16 exc[], /* in/out: excitation buffer */
- Word16 T0, /* input : integer pitch lag */
- Word16 frac, /* input : fraction of lag */
- Word16 L_subfr /* input : subframe size */
- )
+ Word16 exc[], /* in/out: excitation buffer */
+ Word16 T0, /* input : integer pitch lag */
+ Word16 frac, /* input : fraction of lag */
+ Word16 L_subfr /* input : subframe size */
+ )
{
- Word16 j, k, *x;
- Word32 L_sum;
- Word16 *ptr, *ptr1;
- Word16 *ptr2;
-
- x = exc - T0;
- frac = -frac;
- if (frac < 0)
- {
- frac += UP_SAMP;
- x--;
- }
- x -= 15; /* x = L_INTERPOL2 - 1 */
- k = 3 - frac; /* k = UP_SAMP - 1 - frac */
-
- ptr2 = &(inter4_2[k][0]);
- for (j = 0; j < L_subfr; j++)
- {
- ptr = ptr2;
- ptr1 = x;
- L_sum = vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
- L_sum += vo_mult32((*ptr1++), (*ptr++));
-
- L_sum = L_shl2(L_sum, 2);
- exc[j] = extract_h(L_add(L_sum, 0x8000));
- x++;
- }
-
- return;
+ Word16 j, k, *x;
+ Word32 L_sum;
+ Word16 *ptr, *ptr1;
+ Word16 *ptr2;
+
+ x = exc - T0;
+ frac = -frac;
+ if (frac < 0)
+ {
+ frac += UP_SAMP;
+ x--;
+ }
+ x -= 15; /* x = L_INTERPOL2 - 1 */
+ k = 3 - frac; /* k = UP_SAMP - 1 - frac */
+
+ ptr2 = &(inter4_2[k][0]);
+ for (j = 0; j < L_subfr; j++)
+ {
+ ptr = ptr2;
+ ptr1 = x;
+ L_sum = vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+ L_sum += vo_mult32((*ptr1++), (*ptr++));
+
+ L_sum = L_shl2(L_sum, 2);
+ exc[j] = extract_h(L_add(L_sum, 0x8000));
+ x++;
+ }
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/preemph.c b/media/libstagefright/codecs/amrwbenc/src/preemph.c
index 6c26da5..70c8650 100644
--- a/media/libstagefright/codecs/amrwbenc/src/preemph.c
+++ b/media/libstagefright/codecs/amrwbenc/src/preemph.c
@@ -18,7 +18,7 @@
* File: preemph.c *
* *
* Description: Preemphasis: filtering through 1 - g z^-1 *
-* Preemph2 --> signal is multiplied by 2 *
+* Preemph2 --> signal is multiplied by 2 *
* *
************************************************************************/
@@ -26,71 +26,74 @@
#include "basic_op.h"
void Preemph(
- Word16 x[], /* (i/o) : input signal overwritten by the output */
- Word16 mu, /* (i) Q15 : preemphasis coefficient */
- Word16 lg, /* (i) : lenght of filtering */
- Word16 * mem /* (i/o) : memory (x[-1]) */
- )
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : preemphasis coefficient */
+ Word16 lg, /* (i) : lenght of filtering */
+ Word16 * mem /* (i/o) : memory (x[-1]) */
+ )
{
- Word16 temp;
- Word32 i, L_tmp;
+ Word16 temp;
+ Word32 i, L_tmp;
- temp = x[lg - 1];
+ temp = x[lg - 1];
- for (i = lg - 1; i > 0; i--)
- {
- L_tmp = L_deposit_h(x[i]);
- L_tmp -= (x[i - 1] * mu)<<1;
- x[i] = (L_tmp + 0x8000)>>16;
- }
+ for (i = lg - 1; i > 0; i--)
+ {
+ L_tmp = L_deposit_h(x[i]);
+ L_tmp -= (x[i - 1] * mu)<<1;
+ x[i] = (L_tmp + 0x8000)>>16;
+ }
- L_tmp = L_deposit_h(x[0]);
- L_tmp -= ((*mem) * mu)<<1;
- x[0] = (L_tmp + 0x8000)>>16;
+ L_tmp = L_deposit_h(x[0]);
+ L_tmp -= ((*mem) * mu)<<1;
+ x[0] = (L_tmp + 0x8000)>>16;
- *mem = temp;
+ *mem = temp;
- return;
+ return;
}
void Preemph2(
- Word16 x[], /* (i/o) : input signal overwritten by the output */
- Word16 mu, /* (i) Q15 : preemphasis coefficient */
- Word16 lg, /* (i) : lenght of filtering */
- Word16 * mem /* (i/o) : memory (x[-1]) */
- )
+ Word16 x[], /* (i/o) : input signal overwritten by the output */
+ Word16 mu, /* (i) Q15 : preemphasis coefficient */
+ Word16 lg, /* (i) : lenght of filtering */
+ Word16 * mem /* (i/o) : memory (x[-1]) */
+ )
{
- Word16 temp;
- Word32 i, L_tmp;
-
- temp = x[lg - 1];
-
- for (i = (Word16) (lg - 1); i > 0; i--)
- {
- L_tmp = L_deposit_h(x[i]);
- L_tmp -= (x[i - 1] * mu)<<1; // only called with mu == 22282, so this won't overflow
- if (L_tmp > INT32_MAX / 2) {
- L_tmp = INT32_MAX / 2;
- }
- L_tmp = (L_tmp << 1);
- x[i] = (L_tmp + 0x8000)>>16;
- }
-
- L_tmp = L_deposit_h(x[0]);
- L_tmp -= ((*mem) * mu)<<1;
- if (L_tmp > INT32_MAX / 2) {
- L_tmp = INT32_MAX / 2;
- }
- L_tmp = (L_tmp << 1);
- if (L_tmp > INT32_MAX - 0x8000) {
- L_tmp = INT32_MAX - 0x8000;
- }
- x[0] = (L_tmp + 0x8000)>>16;
-
- *mem = temp;
-
- return;
+ Word16 temp;
+ Word32 i, L_tmp;
+
+ temp = x[lg - 1];
+
+ for (i = (Word16) (lg - 1); i > 0; i--)
+ {
+ L_tmp = L_deposit_h(x[i]);
+ L_tmp -= (x[i - 1] * mu)<<1; // only called with mu == 22282, so this won't overflow
+ if (L_tmp > INT32_MAX / 2) {
+ L_tmp = INT32_MAX / 2;
+ }
+ L_tmp = (L_tmp << 1);
+ if (L_tmp > INT32_MAX - 0x8000) {
+ L_tmp = INT32_MAX - 0x8000;
+ }
+ x[i] = (L_tmp + 0x8000)>>16;
+ }
+
+ L_tmp = L_deposit_h(x[0]);
+ L_tmp -= ((*mem) * mu)<<1;
+ if (L_tmp > INT32_MAX / 2) {
+ L_tmp = INT32_MAX / 2;
+ }
+ L_tmp = (L_tmp << 1);
+ if (L_tmp > INT32_MAX - 0x8000) {
+ L_tmp = INT32_MAX - 0x8000;
+ }
+ x[0] = (L_tmp + 0x8000)>>16;
+
+ *mem = temp;
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/q_gain2.c b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c
index e8ca043..bb797d8 100644
--- a/media/libstagefright/codecs/amrwbenc/src/q_gain2.c
+++ b/media/libstagefright/codecs/amrwbenc/src/q_gain2.c
@@ -45,300 +45,300 @@ static Word16 pred[PRED_ORDER] = {4096, 3277, 2458, 1638};
void Init_Q_gain2(
- Word16 * mem /* output :static memory (2 words) */
- )
+ Word16 * mem /* output :static memory (2 words) */
+ )
{
- Word32 i;
+ Word32 i;
- /* 4nd order quantizer energy predictor (init to -14.0 in Q10) */
- for (i = 0; i < PRED_ORDER; i++)
- {
- mem[i] = -14336; /* past_qua_en[i] */
- }
+ /* 4nd order quantizer energy predictor (init to -14.0 in Q10) */
+ for (i = 0; i < PRED_ORDER; i++)
+ {
+ mem[i] = -14336; /* past_qua_en[i] */
+ }
- return;
+ return;
}
Word16 Q_gain2( /* Return index of quantization. */
- Word16 xn[], /* (i) Q_xn: Target vector. */
- Word16 y1[], /* (i) Q_xn: Adaptive codebook. */
- Word16 Q_xn, /* (i) : xn and y1 format */
- Word16 y2[], /* (i) Q9 : Filtered innovative vector. */
- Word16 code[], /* (i) Q9 : Innovative vector. */
- Word16 g_coeff[], /* (i) : Correlations <xn y1> <y1 y1> */
- /* Compute in G_pitch(). */
- Word16 L_subfr, /* (i) : Subframe lenght. */
- Word16 nbits, /* (i) : number of bits (6 or 7) */
- Word16 * gain_pit, /* (i/o)Q14: Pitch gain. */
- Word32 * gain_cod, /* (o) Q16 : Code gain. */
- Word16 gp_clip, /* (i) : Gp Clipping flag */
- Word16 * mem /* (i/o) : static memory (2 words) */
- )
+ Word16 xn[], /* (i) Q_xn: Target vector. */
+ Word16 y1[], /* (i) Q_xn: Adaptive codebook. */
+ Word16 Q_xn, /* (i) : xn and y1 format */
+ Word16 y2[], /* (i) Q9 : Filtered innovative vector. */
+ Word16 code[], /* (i) Q9 : Innovative vector. */
+ Word16 g_coeff[], /* (i) : Correlations <xn y1> <y1 y1> */
+ /* Compute in G_pitch(). */
+ Word16 L_subfr, /* (i) : Subframe lenght. */
+ Word16 nbits, /* (i) : number of bits (6 or 7) */
+ Word16 * gain_pit, /* (i/o)Q14: Pitch gain. */
+ Word32 * gain_cod, /* (o) Q16 : Code gain. */
+ Word16 gp_clip, /* (i) : Gp Clipping flag */
+ Word16 * mem /* (i/o) : static memory (2 words) */
+ )
{
- Word16 index, *p, min_ind, size;
- Word16 exp, frac, gcode0, exp_gcode0, e_max, exp_code, qua_ener;
- Word16 g_pitch, g2_pitch, g_code, g_pit_cod, g2_code, g2_code_lo;
- Word16 coeff[5], coeff_lo[5], exp_coeff[5];
- Word16 exp_max[5];
- Word32 i, j, L_tmp, dist_min;
- Word16 *past_qua_en, *t_qua_gain;
-
- past_qua_en = mem;
-
- /*-----------------------------------------------------------------*
- * - Find the initial quantization pitch index *
- * - Set gains search range *
- *-----------------------------------------------------------------*/
- if (nbits == 6)
- {
- t_qua_gain = t_qua_gain6b;
- min_ind = 0;
- size = RANGE;
-
- if(gp_clip == 1)
- {
- size = size - 16; /* limit gain pitch to 1.0 */
- }
- } else
- {
- t_qua_gain = t_qua_gain7b;
-
- p = t_qua_gain7b + RANGE; /* pt at 1/4th of table */
-
- j = nb_qua_gain7b - RANGE;
-
- if (gp_clip == 1)
- {
- j = j - 27; /* limit gain pitch to 1.0 */
- }
- min_ind = 0;
- g_pitch = *gain_pit;
-
- for (i = 0; i < j; i++, p += 2)
- {
- if (g_pitch > *p)
- {
- min_ind = min_ind + 1;
- }
- }
- size = RANGE;
- }
-
- /*------------------------------------------------------------------*
- * Compute coefficient need for the quantization. *
- * *
- * coeff[0] = y1 y1 *
- * coeff[1] = -2 xn y1 *
- * coeff[2] = y2 y2 *
- * coeff[3] = -2 xn y2 *
- * coeff[4] = 2 y1 y2 *
- * *
- * Product <y1 y1> and <xn y1> have been compute in G_pitch() and *
- * are in vector g_coeff[]. *
- *------------------------------------------------------------------*/
-
- coeff[0] = g_coeff[0];
- exp_coeff[0] = g_coeff[1];
- coeff[1] = negate(g_coeff[2]); /* coeff[1] = -2 xn y1 */
- exp_coeff[1] = g_coeff[3] + 1;
-
- /* Compute scalar product <y2[],y2[]> */
+ Word16 index, *p, min_ind, size;
+ Word16 exp, frac, gcode0, exp_gcode0, e_max, exp_code, qua_ener;
+ Word16 g_pitch, g2_pitch, g_code, g_pit_cod, g2_code, g2_code_lo;
+ Word16 coeff[5], coeff_lo[5], exp_coeff[5];
+ Word16 exp_max[5];
+ Word32 i, j, L_tmp, dist_min;
+ Word16 *past_qua_en, *t_qua_gain;
+
+ past_qua_en = mem;
+
+ /*-----------------------------------------------------------------*
+ * - Find the initial quantization pitch index *
+ * - Set gains search range *
+ *-----------------------------------------------------------------*/
+ if (nbits == 6)
+ {
+ t_qua_gain = t_qua_gain6b;
+ min_ind = 0;
+ size = RANGE;
+
+ if(gp_clip == 1)
+ {
+ size = size - 16; /* limit gain pitch to 1.0 */
+ }
+ } else
+ {
+ t_qua_gain = t_qua_gain7b;
+
+ p = t_qua_gain7b + RANGE; /* pt at 1/4th of table */
+
+ j = nb_qua_gain7b - RANGE;
+
+ if (gp_clip == 1)
+ {
+ j = j - 27; /* limit gain pitch to 1.0 */
+ }
+ min_ind = 0;
+ g_pitch = *gain_pit;
+
+ for (i = 0; i < j; i++, p += 2)
+ {
+ if (g_pitch > *p)
+ {
+ min_ind = min_ind + 1;
+ }
+ }
+ size = RANGE;
+ }
+
+ /*------------------------------------------------------------------*
+ * Compute coefficient need for the quantization. *
+ * *
+ * coeff[0] = y1 y1 *
+ * coeff[1] = -2 xn y1 *
+ * coeff[2] = y2 y2 *
+ * coeff[3] = -2 xn y2 *
+ * coeff[4] = 2 y1 y2 *
+ * *
+ * Product <y1 y1> and <xn y1> have been compute in G_pitch() and *
+ * are in vector g_coeff[]. *
+ *------------------------------------------------------------------*/
+
+ coeff[0] = g_coeff[0];
+ exp_coeff[0] = g_coeff[1];
+ coeff[1] = negate(g_coeff[2]); /* coeff[1] = -2 xn y1 */
+ exp_coeff[1] = g_coeff[3] + 1;
+
+ /* Compute scalar product <y2[],y2[]> */
#ifdef ASM_OPT /* asm optimization branch */
- coeff[2] = extract_h(Dot_product12_asm(y2, y2, L_subfr, &exp));
+ coeff[2] = extract_h(Dot_product12_asm(y2, y2, L_subfr, &exp));
#else
- coeff[2] = extract_h(Dot_product12(y2, y2, L_subfr, &exp));
+ coeff[2] = extract_h(Dot_product12(y2, y2, L_subfr, &exp));
#endif
- exp_coeff[2] = (exp - 18) + (Q_xn << 1); /* -18 (y2 Q9) */
+ exp_coeff[2] = (exp - 18) + (Q_xn << 1); /* -18 (y2 Q9) */
- /* Compute scalar product -2*<xn[],y2[]> */
+ /* Compute scalar product -2*<xn[],y2[]> */
#ifdef ASM_OPT /* asm optimization branch */
- coeff[3] = extract_h(L_negate(Dot_product12_asm(xn, y2, L_subfr, &exp)));
+ coeff[3] = extract_h(L_negate(Dot_product12_asm(xn, y2, L_subfr, &exp)));
#else
- coeff[3] = extract_h(L_negate(Dot_product12(xn, y2, L_subfr, &exp)));
+ coeff[3] = extract_h(L_negate(Dot_product12(xn, y2, L_subfr, &exp)));
#endif
- exp_coeff[3] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 xn y2) */
+ exp_coeff[3] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 xn y2) */
- /* Compute scalar product 2*<y1[],y2[]> */
+ /* Compute scalar product 2*<y1[],y2[]> */
#ifdef ASM_OPT /* asm optimization branch */
- coeff[4] = extract_h(Dot_product12_asm(y1, y2, L_subfr, &exp));
+ coeff[4] = extract_h(Dot_product12_asm(y1, y2, L_subfr, &exp));
#else
- coeff[4] = extract_h(Dot_product12(y1, y2, L_subfr, &exp));
+ coeff[4] = extract_h(Dot_product12(y1, y2, L_subfr, &exp));
#endif
- exp_coeff[4] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 y1 y2) */
-
- /*-----------------------------------------------------------------*
- * Find energy of code and compute: *
- * *
- * L_tmp = MEAN_ENER - 10log10(energy of code/ L_subfr) *
- * = MEAN_ENER - 3.0103*log2(energy of code/ L_subfr) *
- *-----------------------------------------------------------------*/
+ exp_coeff[4] = (exp - 8) + Q_xn; /* -9 (y2 Q9), +1 (2 y1 y2) */
+
+ /*-----------------------------------------------------------------*
+ * Find energy of code and compute: *
+ * *
+ * L_tmp = MEAN_ENER - 10log10(energy of code/ L_subfr) *
+ * = MEAN_ENER - 3.0103*log2(energy of code/ L_subfr) *
+ *-----------------------------------------------------------------*/
#ifdef ASM_OPT /* asm optimization branch */
- L_tmp = Dot_product12_asm(code, code, L_subfr, &exp_code);
+ L_tmp = Dot_product12_asm(code, code, L_subfr, &exp_code);
#else
- L_tmp = Dot_product12(code, code, L_subfr, &exp_code);
+ L_tmp = Dot_product12(code, code, L_subfr, &exp_code);
#endif
- /* exp_code: -18 (code in Q9), -6 (/L_subfr), -31 (L_tmp Q31->Q0) */
- exp_code = (exp_code - (18 + 6 + 31));
-
- Log2(L_tmp, &exp, &frac);
- exp += exp_code;
- L_tmp = Mpy_32_16(exp, frac, -24660); /* x -3.0103(Q13) -> Q14 */
-
- L_tmp += (MEAN_ENER * 8192)<<1; /* + MEAN_ENER in Q14 */
-
- /*-----------------------------------------------------------------*
- * Compute gcode0. *
- * = Sum(i=0,1) pred[i]*past_qua_en[i] + mean_ener - ener_code *
- *-----------------------------------------------------------------*/
- L_tmp = (L_tmp << 10); /* From Q14 to Q24 */
- L_tmp += (pred[0] * past_qua_en[0])<<1; /* Q13*Q10 -> Q24 */
- L_tmp += (pred[1] * past_qua_en[1])<<1; /* Q13*Q10 -> Q24 */
- L_tmp += (pred[2] * past_qua_en[2])<<1; /* Q13*Q10 -> Q24 */
- L_tmp += (pred[3] * past_qua_en[3])<<1; /* Q13*Q10 -> Q24 */
-
- gcode0 = extract_h(L_tmp); /* From Q24 to Q8 */
-
- /*-----------------------------------------------------------------*
- * gcode0 = pow(10.0, gcode0/20) *
- * = pow(2, 3.321928*gcode0/20) *
- * = pow(2, 0.166096*gcode0) *
- *-----------------------------------------------------------------*/
-
- L_tmp = vo_L_mult(gcode0, 5443); /* *0.166096 in Q15 -> Q24 */
- L_tmp = L_tmp >> 8; /* From Q24 to Q16 */
- VO_L_Extract(L_tmp, &exp_gcode0, &frac); /* Extract exponent of gcode0 */
-
- gcode0 = (Word16)(Pow2(14, frac)); /* Put 14 as exponent so that */
- /* output of Pow2() will be: */
- /* 16384 < Pow2() <= 32767 */
- exp_gcode0 -= 14;
-
- /*-------------------------------------------------------------------------*
- * Find the best quantizer *
- * ~~~~~~~~~~~~~~~~~~~~~~~ *
- * Before doing the computation we need to aling exponents of coeff[] *
- * to be sure to have the maximum precision. *
- * *
- * In the table the pitch gains are in Q14, the code gains are in Q11 and *
- * are multiply by gcode0 which have been multiply by 2^exp_gcode0. *
- * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code *
- * we divide by 2^15. *
- * Considering all the scaling above we have: *
- * *
- * exp_code = exp_gcode0-11+15 = exp_gcode0+4 *
- * *
- * g_pitch*g_pitch = -14-14+15 *
- * g_pitch = -14 *
- * g_code*g_code = (2*exp_code)+15 *
- * g_code = exp_code *
- * g_pitch*g_code = -14 + exp_code +15 *
- * *
- * g_pitch*g_pitch * coeff[0] ;exp_max0 = exp_coeff[0] - 13 *
- * g_pitch * coeff[1] ;exp_max1 = exp_coeff[1] - 14 *
- * g_code*g_code * coeff[2] ;exp_max2 = exp_coeff[2] +15+(2*exp_code) *
- * g_code * coeff[3] ;exp_max3 = exp_coeff[3] + exp_code *
- * g_pitch*g_code * coeff[4] ;exp_max4 = exp_coeff[4] + 1 + exp_code *
- *-------------------------------------------------------------------------*/
-
- exp_code = (exp_gcode0 + 4);
- exp_max[0] = (exp_coeff[0] - 13);
- exp_max[1] = (exp_coeff[1] - 14);
- exp_max[2] = (exp_coeff[2] + (15 + (exp_code << 1)));
- exp_max[3] = (exp_coeff[3] + exp_code);
- exp_max[4] = (exp_coeff[4] + (1 + exp_code));
-
- /* Find maximum exponant */
-
- e_max = exp_max[0];
- for (i = 1; i < 5; i++)
- {
- if(exp_max[i] > e_max)
- {
- e_max = exp_max[i];
- }
- }
-
- /* align coeff[] and save in special 32 bit double precision */
-
- for (i = 0; i < 5; i++)
- {
- j = add1(vo_sub(e_max, exp_max[i]), 2);/* /4 to avoid overflow */
- L_tmp = L_deposit_h(coeff[i]);
- L_tmp = L_shr(L_tmp, j);
- VO_L_Extract(L_tmp, &coeff[i], &coeff_lo[i]);
- coeff_lo[i] = (coeff_lo[i] >> 3); /* lo >> 3 */
- }
-
- /* Codebook search */
- dist_min = MAX_32;
- p = &t_qua_gain[min_ind << 1];
-
- index = 0;
- for (i = 0; i < size; i++)
- {
- g_pitch = *p++;
- g_code = *p++;
-
- g_code = ((g_code * gcode0) + 0x4000)>>15;
- g2_pitch = ((g_pitch * g_pitch) + 0x4000)>>15;
- g_pit_cod = ((g_code * g_pitch) + 0x4000)>>15;
- L_tmp = (g_code * g_code)<<1;
- VO_L_Extract(L_tmp, &g2_code, &g2_code_lo);
-
- L_tmp = (coeff[2] * g2_code_lo)<<1;
- L_tmp = (L_tmp >> 3);
- L_tmp += (coeff_lo[0] * g2_pitch)<<1;
- L_tmp += (coeff_lo[1] * g_pitch)<<1;
- L_tmp += (coeff_lo[2] * g2_code)<<1;
- L_tmp += (coeff_lo[3] * g_code)<<1;
- L_tmp += (coeff_lo[4] * g_pit_cod)<<1;
- L_tmp = (L_tmp >> 12);
- L_tmp += (coeff[0] * g2_pitch)<<1;
- L_tmp += (coeff[1] * g_pitch)<<1;
- L_tmp += (coeff[2] * g2_code)<<1;
- L_tmp += (coeff[3] * g_code)<<1;
- L_tmp += (coeff[4] * g_pit_cod)<<1;
-
- if(L_tmp < dist_min)
- {
- dist_min = L_tmp;
- index = i;
- }
- }
-
- /* Read the quantized gains */
- index = index + min_ind;
- p = &t_qua_gain[(index + index)];
- *gain_pit = *p++; /* selected pitch gain in Q14 */
- g_code = *p++; /* selected code gain in Q11 */
-
- L_tmp = vo_L_mult(g_code, gcode0); /* Q11*Q0 -> Q12 */
- L_tmp = L_shl(L_tmp, (exp_gcode0 + 4)); /* Q12 -> Q16 */
-
- *gain_cod = L_tmp; /* gain of code in Q16 */
-
- /*---------------------------------------------------*
- * qua_ener = 20*log10(g_code) *
- * = 6.0206*log2(g_code) *
- * = 6.0206*(log2(g_codeQ11) - 11) *
- *---------------------------------------------------*/
-
- L_tmp = L_deposit_l(g_code);
- Log2(L_tmp, &exp, &frac);
- exp -= 11;
- L_tmp = Mpy_32_16(exp, frac, 24660); /* x 6.0206 in Q12 */
-
- qua_ener = (Word16)(L_tmp >> 3); /* result in Q10 */
-
- /* update table of past quantized energies */
-
- past_qua_en[3] = past_qua_en[2];
- past_qua_en[2] = past_qua_en[1];
- past_qua_en[1] = past_qua_en[0];
- past_qua_en[0] = qua_ener;
-
- return (index);
+ /* exp_code: -18 (code in Q9), -6 (/L_subfr), -31 (L_tmp Q31->Q0) */
+ exp_code = (exp_code - (18 + 6 + 31));
+
+ Log2(L_tmp, &exp, &frac);
+ exp += exp_code;
+ L_tmp = Mpy_32_16(exp, frac, -24660); /* x -3.0103(Q13) -> Q14 */
+
+ L_tmp += (MEAN_ENER * 8192)<<1; /* + MEAN_ENER in Q14 */
+
+ /*-----------------------------------------------------------------*
+ * Compute gcode0. *
+ * = Sum(i=0,1) pred[i]*past_qua_en[i] + mean_ener - ener_code *
+ *-----------------------------------------------------------------*/
+ L_tmp = (L_tmp << 10); /* From Q14 to Q24 */
+ L_tmp += (pred[0] * past_qua_en[0])<<1; /* Q13*Q10 -> Q24 */
+ L_tmp += (pred[1] * past_qua_en[1])<<1; /* Q13*Q10 -> Q24 */
+ L_tmp += (pred[2] * past_qua_en[2])<<1; /* Q13*Q10 -> Q24 */
+ L_tmp += (pred[3] * past_qua_en[3])<<1; /* Q13*Q10 -> Q24 */
+
+ gcode0 = extract_h(L_tmp); /* From Q24 to Q8 */
+
+ /*-----------------------------------------------------------------*
+ * gcode0 = pow(10.0, gcode0/20) *
+ * = pow(2, 3.321928*gcode0/20) *
+ * = pow(2, 0.166096*gcode0) *
+ *-----------------------------------------------------------------*/
+
+ L_tmp = vo_L_mult(gcode0, 5443); /* *0.166096 in Q15 -> Q24 */
+ L_tmp = L_tmp >> 8; /* From Q24 to Q16 */
+ VO_L_Extract(L_tmp, &exp_gcode0, &frac); /* Extract exponent of gcode0 */
+
+ gcode0 = (Word16)(Pow2(14, frac)); /* Put 14 as exponent so that */
+ /* output of Pow2() will be: */
+ /* 16384 < Pow2() <= 32767 */
+ exp_gcode0 -= 14;
+
+ /*-------------------------------------------------------------------------*
+ * Find the best quantizer *
+ * ~~~~~~~~~~~~~~~~~~~~~~~ *
+ * Before doing the computation we need to aling exponents of coeff[] *
+ * to be sure to have the maximum precision. *
+ * *
+ * In the table the pitch gains are in Q14, the code gains are in Q11 and *
+ * are multiply by gcode0 which have been multiply by 2^exp_gcode0. *
+ * Also when we compute g_pitch*g_pitch, g_code*g_code and g_pitch*g_code *
+ * we divide by 2^15. *
+ * Considering all the scaling above we have: *
+ * *
+ * exp_code = exp_gcode0-11+15 = exp_gcode0+4 *
+ * *
+ * g_pitch*g_pitch = -14-14+15 *
+ * g_pitch = -14 *
+ * g_code*g_code = (2*exp_code)+15 *
+ * g_code = exp_code *
+ * g_pitch*g_code = -14 + exp_code +15 *
+ * *
+ * g_pitch*g_pitch * coeff[0] ;exp_max0 = exp_coeff[0] - 13 *
+ * g_pitch * coeff[1] ;exp_max1 = exp_coeff[1] - 14 *
+ * g_code*g_code * coeff[2] ;exp_max2 = exp_coeff[2] +15+(2*exp_code) *
+ * g_code * coeff[3] ;exp_max3 = exp_coeff[3] + exp_code *
+ * g_pitch*g_code * coeff[4] ;exp_max4 = exp_coeff[4] + 1 + exp_code *
+ *-------------------------------------------------------------------------*/
+
+ exp_code = (exp_gcode0 + 4);
+ exp_max[0] = (exp_coeff[0] - 13);
+ exp_max[1] = (exp_coeff[1] - 14);
+ exp_max[2] = (exp_coeff[2] + (15 + (exp_code << 1)));
+ exp_max[3] = (exp_coeff[3] + exp_code);
+ exp_max[4] = (exp_coeff[4] + (1 + exp_code));
+
+ /* Find maximum exponant */
+
+ e_max = exp_max[0];
+ for (i = 1; i < 5; i++)
+ {
+ if(exp_max[i] > e_max)
+ {
+ e_max = exp_max[i];
+ }
+ }
+
+ /* align coeff[] and save in special 32 bit double precision */
+
+ for (i = 0; i < 5; i++)
+ {
+ j = add1(vo_sub(e_max, exp_max[i]), 2);/* /4 to avoid overflow */
+ L_tmp = L_deposit_h(coeff[i]);
+ L_tmp = L_shr(L_tmp, j);
+ VO_L_Extract(L_tmp, &coeff[i], &coeff_lo[i]);
+ coeff_lo[i] = (coeff_lo[i] >> 3); /* lo >> 3 */
+ }
+
+ /* Codebook search */
+ dist_min = MAX_32;
+ p = &t_qua_gain[min_ind << 1];
+
+ index = 0;
+ for (i = 0; i < size; i++)
+ {
+ g_pitch = *p++;
+ g_code = *p++;
+
+ g_code = ((g_code * gcode0) + 0x4000)>>15;
+ g2_pitch = ((g_pitch * g_pitch) + 0x4000)>>15;
+ g_pit_cod = ((g_code * g_pitch) + 0x4000)>>15;
+ L_tmp = (g_code * g_code)<<1;
+ VO_L_Extract(L_tmp, &g2_code, &g2_code_lo);
+
+ L_tmp = (coeff[2] * g2_code_lo)<<1;
+ L_tmp = (L_tmp >> 3);
+ L_tmp += (coeff_lo[0] * g2_pitch)<<1;
+ L_tmp += (coeff_lo[1] * g_pitch)<<1;
+ L_tmp += (coeff_lo[2] * g2_code)<<1;
+ L_tmp += (coeff_lo[3] * g_code)<<1;
+ L_tmp += (coeff_lo[4] * g_pit_cod)<<1;
+ L_tmp = (L_tmp >> 12);
+ L_tmp += (coeff[0] * g2_pitch)<<1;
+ L_tmp += (coeff[1] * g_pitch)<<1;
+ L_tmp += (coeff[2] * g2_code)<<1;
+ L_tmp += (coeff[3] * g_code)<<1;
+ L_tmp += (coeff[4] * g_pit_cod)<<1;
+
+ if(L_tmp < dist_min)
+ {
+ dist_min = L_tmp;
+ index = i;
+ }
+ }
+
+ /* Read the quantized gains */
+ index = index + min_ind;
+ p = &t_qua_gain[(index + index)];
+ *gain_pit = *p++; /* selected pitch gain in Q14 */
+ g_code = *p++; /* selected code gain in Q11 */
+
+ L_tmp = vo_L_mult(g_code, gcode0); /* Q11*Q0 -> Q12 */
+ L_tmp = L_shl(L_tmp, (exp_gcode0 + 4)); /* Q12 -> Q16 */
+
+ *gain_cod = L_tmp; /* gain of code in Q16 */
+
+ /*---------------------------------------------------*
+ * qua_ener = 20*log10(g_code) *
+ * = 6.0206*log2(g_code) *
+ * = 6.0206*(log2(g_codeQ11) - 11) *
+ *---------------------------------------------------*/
+
+ L_tmp = L_deposit_l(g_code);
+ Log2(L_tmp, &exp, &frac);
+ exp -= 11;
+ L_tmp = Mpy_32_16(exp, frac, 24660); /* x 6.0206 in Q12 */
+
+ qua_ener = (Word16)(L_tmp >> 3); /* result in Q10 */
+
+ /* update table of past quantized energies */
+
+ past_qua_en[3] = past_qua_en[2];
+ past_qua_en[2] = past_qua_en[1];
+ past_qua_en[1] = past_qua_en[0];
+ past_qua_en[0] = qua_ener;
+
+ return (index);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c
index d658602..fe0bdda 100644
--- a/media/libstagefright/codecs/amrwbenc/src/q_pulse.c
+++ b/media/libstagefright/codecs/amrwbenc/src/q_pulse.c
@@ -29,372 +29,372 @@
#define NB_POS 16 /* pos in track, mask for sign bit */
Word32 quant_1p_N1( /* (o) return N+1 bits */
- Word16 pos, /* (i) position of the pulse */
- Word16 N) /* (i) number of bits for position */
+ Word16 pos, /* (i) position of the pulse */
+ Word16 N) /* (i) number of bits for position */
{
- Word16 mask;
- Word32 index;
-
- mask = (1 << N) - 1; /* mask = ((1<<N)-1); */
- /*-------------------------------------------------------*
- * Quantization of 1 pulse with N+1 bits: *
- *-------------------------------------------------------*/
- index = L_deposit_l((Word16) (pos & mask));
- if ((pos & NB_POS) != 0)
- {
- index = vo_L_add(index, L_deposit_l(1 << N)); /* index += 1 << N; */
- }
- return (index);
+ Word16 mask;
+ Word32 index;
+
+ mask = (1 << N) - 1; /* mask = ((1<<N)-1); */
+ /*-------------------------------------------------------*
+ * Quantization of 1 pulse with N+1 bits: *
+ *-------------------------------------------------------*/
+ index = L_deposit_l((Word16) (pos & mask));
+ if ((pos & NB_POS) != 0)
+ {
+ index = vo_L_add(index, L_deposit_l(1 << N)); /* index += 1 << N; */
+ }
+ return (index);
}
Word32 quant_2p_2N1( /* (o) return (2*N)+1 bits */
- Word16 pos1, /* (i) position of the pulse 1 */
- Word16 pos2, /* (i) position of the pulse 2 */
- Word16 N) /* (i) number of bits for position */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 N) /* (i) number of bits for position */
{
- Word16 mask, tmp;
- Word32 index;
- mask = (1 << N) - 1; /* mask = ((1<<N)-1); */
- /*-------------------------------------------------------*
- * Quantization of 2 pulses with 2*N+1 bits: *
- *-------------------------------------------------------*/
- if (((pos2 ^ pos1) & NB_POS) == 0)
- {
- /* sign of 1st pulse == sign of 2th pulse */
- if(pos1 <= pos2) /* ((pos1 - pos2) <= 0) */
- {
- /* index = ((pos1 & mask) << N) + (pos2 & mask); */
- index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
- } else
- {
- /* ((pos2 & mask) << N) + (pos1 & mask); */
- index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
- }
- if ((pos1 & NB_POS) != 0)
- {
- tmp = (N << 1);
- index = vo_L_add(index, (1L << tmp)); /* index += 1 << (2*N); */
- }
- } else
- {
- /* sign of 1st pulse != sign of 2th pulse */
- if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0)
- {
- /* index = ((pos2 & mask) << N) + (pos1 & mask); */
- index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
- if ((pos2 & NB_POS) != 0)
- {
- tmp = (N << 1); /* index += 1 << (2*N); */
- index = vo_L_add(index, (1L << tmp));
- }
- } else
- {
- /* index = ((pos1 & mask) << N) + (pos2 & mask); */
- index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
- if ((pos1 & NB_POS) != 0)
- {
- tmp = (N << 1);
- index = vo_L_add(index, (1 << tmp)); /* index += 1 << (2*N); */
- }
- }
- }
- return (index);
+ Word16 mask, tmp;
+ Word32 index;
+ mask = (1 << N) - 1; /* mask = ((1<<N)-1); */
+ /*-------------------------------------------------------*
+ * Quantization of 2 pulses with 2*N+1 bits: *
+ *-------------------------------------------------------*/
+ if (((pos2 ^ pos1) & NB_POS) == 0)
+ {
+ /* sign of 1st pulse == sign of 2th pulse */
+ if(pos1 <= pos2) /* ((pos1 - pos2) <= 0) */
+ {
+ /* index = ((pos1 & mask) << N) + (pos2 & mask); */
+ index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
+ } else
+ {
+ /* ((pos2 & mask) << N) + (pos1 & mask); */
+ index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
+ }
+ if ((pos1 & NB_POS) != 0)
+ {
+ tmp = (N << 1);
+ index = vo_L_add(index, (1L << tmp)); /* index += 1 << (2*N); */
+ }
+ } else
+ {
+ /* sign of 1st pulse != sign of 2th pulse */
+ if (vo_sub((Word16) (pos1 & mask), (Word16) (pos2 & mask)) <= 0)
+ {
+ /* index = ((pos2 & mask) << N) + (pos1 & mask); */
+ index = L_deposit_l(add1((((Word16) (pos2 & mask)) << N), ((Word16) (pos1 & mask))));
+ if ((pos2 & NB_POS) != 0)
+ {
+ tmp = (N << 1); /* index += 1 << (2*N); */
+ index = vo_L_add(index, (1L << tmp));
+ }
+ } else
+ {
+ /* index = ((pos1 & mask) << N) + (pos2 & mask); */
+ index = L_deposit_l(add1((((Word16) (pos1 & mask)) << N), ((Word16) (pos2 & mask))));
+ if ((pos1 & NB_POS) != 0)
+ {
+ tmp = (N << 1);
+ index = vo_L_add(index, (1 << tmp)); /* index += 1 << (2*N); */
+ }
+ }
+ }
+ return (index);
}
Word32 quant_3p_3N1( /* (o) return (3*N)+1 bits */
- Word16 pos1, /* (i) position of the pulse 1 */
- Word16 pos2, /* (i) position of the pulse 2 */
- Word16 pos3, /* (i) position of the pulse 3 */
- Word16 N) /* (i) number of bits for position */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 pos3, /* (i) position of the pulse 3 */
+ Word16 N) /* (i) number of bits for position */
{
- Word16 nb_pos;
- Word32 index;
-
- nb_pos =(1 <<(N - 1)); /* nb_pos = (1<<(N-1)); */
- /*-------------------------------------------------------*
- * Quantization of 3 pulses with 3*N+1 bits: *
- *-------------------------------------------------------*/
- if (((pos1 ^ pos2) & nb_pos) == 0)
- {
- index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
- /* index += (pos1 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
- /* index += quant_1p_N1(pos3, N) << (2*N); */
- index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1)));
-
- } else if (((pos1 ^ pos3) & nb_pos) == 0)
- {
- index = quant_2p_2N1(pos1, pos3, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos3, (N-1)); */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
- /* index += (pos1 & nb_pos) << N; */
- index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1)));
- /* index += quant_1p_N1(pos2, N) <<
- * (2*N); */
- } else
- {
- index = quant_2p_2N1(pos2, pos3, (N - 1)); /* index = quant_2p_2N1(pos2, pos3, (N-1)); */
- /* index += (pos2 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
- /* index += quant_1p_N1(pos1, N) << (2*N); */
- index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1)));
- }
- return (index);
+ Word16 nb_pos;
+ Word32 index;
+
+ nb_pos =(1 <<(N - 1)); /* nb_pos = (1<<(N-1)); */
+ /*-------------------------------------------------------*
+ * Quantization of 3 pulses with 3*N+1 bits: *
+ *-------------------------------------------------------*/
+ if (((pos1 ^ pos2) & nb_pos) == 0)
+ {
+ index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
+ /* index += (pos1 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
+ /* index += quant_1p_N1(pos3, N) << (2*N); */
+ index = vo_L_add(index, (quant_1p_N1(pos3, N)<<(N << 1)));
+
+ } else if (((pos1 ^ pos3) & nb_pos) == 0)
+ {
+ index = quant_2p_2N1(pos1, pos3, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos3, (N-1)); */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
+ /* index += (pos1 & nb_pos) << N; */
+ index = vo_L_add(index, (quant_1p_N1(pos2, N) << (N << 1)));
+ /* index += quant_1p_N1(pos2, N) <<
+ * (2*N); */
+ } else
+ {
+ index = quant_2p_2N1(pos2, pos3, (N - 1)); /* index = quant_2p_2N1(pos2, pos3, (N-1)); */
+ /* index += (pos2 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
+ /* index += quant_1p_N1(pos1, N) << (2*N); */
+ index = vo_L_add(index, (quant_1p_N1(pos1, N) << (N << 1)));
+ }
+ return (index);
}
Word32 quant_4p_4N1( /* (o) return (4*N)+1 bits */
- Word16 pos1, /* (i) position of the pulse 1 */
- Word16 pos2, /* (i) position of the pulse 2 */
- Word16 pos3, /* (i) position of the pulse 3 */
- Word16 pos4, /* (i) position of the pulse 4 */
- Word16 N) /* (i) number of bits for position */
+ Word16 pos1, /* (i) position of the pulse 1 */
+ Word16 pos2, /* (i) position of the pulse 2 */
+ Word16 pos3, /* (i) position of the pulse 3 */
+ Word16 pos4, /* (i) position of the pulse 4 */
+ Word16 N) /* (i) number of bits for position */
{
- Word16 nb_pos;
- Word32 index;
-
- nb_pos = 1 << (N - 1); /* nb_pos = (1<<(N-1)); */
- /*-------------------------------------------------------*
- * Quantization of 4 pulses with 4*N+1 bits: *
- *-------------------------------------------------------*/
- if (((pos1 ^ pos2) & nb_pos) == 0)
- {
- index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
- /* index += (pos1 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
- /* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */
- index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1)));
- } else if (((pos1 ^ pos3) & nb_pos) == 0)
- {
- index = quant_2p_2N1(pos1, pos3, (N - 1));
- /* index += (pos1 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
- /* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */
- index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1)));
- } else
- {
- index = quant_2p_2N1(pos2, pos3, (N - 1));
- /* index += (pos2 & nb_pos) << N; */
- index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
- /* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */
- index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1)));
- }
- return (index);
+ Word16 nb_pos;
+ Word32 index;
+
+ nb_pos = 1 << (N - 1); /* nb_pos = (1<<(N-1)); */
+ /*-------------------------------------------------------*
+ * Quantization of 4 pulses with 4*N+1 bits: *
+ *-------------------------------------------------------*/
+ if (((pos1 ^ pos2) & nb_pos) == 0)
+ {
+ index = quant_2p_2N1(pos1, pos2, sub(N, 1)); /* index = quant_2p_2N1(pos1, pos2, (N-1)); */
+ /* index += (pos1 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
+ /* index += quant_2p_2N1(pos3, pos4, N) << (2*N); */
+ index = vo_L_add(index, (quant_2p_2N1(pos3, pos4, N) << (N << 1)));
+ } else if (((pos1 ^ pos3) & nb_pos) == 0)
+ {
+ index = quant_2p_2N1(pos1, pos3, (N - 1));
+ /* index += (pos1 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos1 & nb_pos)) << N));
+ /* index += quant_2p_2N1(pos2, pos4, N) << (2*N); */
+ index = vo_L_add(index, (quant_2p_2N1(pos2, pos4, N) << (N << 1)));
+ } else
+ {
+ index = quant_2p_2N1(pos2, pos3, (N - 1));
+ /* index += (pos2 & nb_pos) << N; */
+ index = vo_L_add(index, (L_deposit_l((Word16) (pos2 & nb_pos)) << N));
+ /* index += quant_2p_2N1(pos1, pos4, N) << (2*N); */
+ index = vo_L_add(index, (quant_2p_2N1(pos1, pos4, N) << (N << 1)));
+ }
+ return (index);
}
Word32 quant_4p_4N( /* (o) return 4*N bits */
- Word16 pos[], /* (i) position of the pulse 1..4 */
- Word16 N) /* (i) number of bits for position */
+ Word16 pos[], /* (i) position of the pulse 1..4 */
+ Word16 N) /* (i) number of bits for position */
{
- Word16 nb_pos, mask __unused, n_1, tmp;
- Word16 posA[4], posB[4];
- Word32 i, j, k, index;
-
- n_1 = (Word16) (N - 1);
- nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
- mask = vo_sub((1 << N), 1); /* mask = ((1<<N)-1); */
-
- i = 0;
- j = 0;
- for (k = 0; k < 4; k++)
- {
- if ((pos[k] & nb_pos) == 0)
- {
- posA[i++] = pos[k];
- } else
- {
- posB[j++] = pos[k];
- }
- }
-
- switch (i)
- {
- case 0:
- tmp = vo_sub((N << 2), 3); /* index = 1 << ((4*N)-3); */
- index = (1L << tmp);
- /* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */
- index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));
- break;
- case 1:
- /* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */
- tmp = add1((Word16)((vo_L_mult(3, n_1) >> 1)), 1);
- index = L_shl(quant_1p_N1(posA[0], n_1), tmp);
- /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
- index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
- break;
- case 2:
- tmp = ((n_1 << 1) + 1); /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */
- index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp);
- /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
- index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));
- break;
- case 3:
- /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */
- index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N);
- index = vo_L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */
- break;
- case 4:
- index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);
- break;
- default:
- index = 0;
- fprintf(stderr, "Error in function quant_4p_4N\n");
- }
- tmp = ((N << 2) - 2); /* index += (i & 3) << ((4*N)-2); */
- index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp));
-
- return (index);
+ Word16 nb_pos, mask __unused, n_1, tmp;
+ Word16 posA[4], posB[4];
+ Word32 i, j, k, index;
+
+ n_1 = (Word16) (N - 1);
+ nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
+ mask = vo_sub((1 << N), 1); /* mask = ((1<<N)-1); */
+
+ i = 0;
+ j = 0;
+ for (k = 0; k < 4; k++)
+ {
+ if ((pos[k] & nb_pos) == 0)
+ {
+ posA[i++] = pos[k];
+ } else
+ {
+ posB[j++] = pos[k];
+ }
+ }
+
+ switch (i)
+ {
+ case 0:
+ tmp = vo_sub((N << 2), 3); /* index = 1 << ((4*N)-3); */
+ index = (1L << tmp);
+ /* index += quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1); */
+ index = vo_L_add(index, quant_4p_4N1(posB[0], posB[1], posB[2], posB[3], n_1));
+ break;
+ case 1:
+ /* index = quant_1p_N1(posA[0], n_1) << ((3*n_1)+1); */
+ tmp = add1((Word16)((vo_L_mult(3, n_1) >> 1)), 1);
+ index = L_shl(quant_1p_N1(posA[0], n_1), tmp);
+ /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
+ index = vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
+ break;
+ case 2:
+ tmp = ((n_1 << 1) + 1); /* index = quant_2p_2N1(posA[0], posA[1], n_1) << ((2*n_1)+1); */
+ index = L_shl(quant_2p_2N1(posA[0], posA[1], n_1), tmp);
+ /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
+ index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1));
+ break;
+ case 3:
+ /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << N; */
+ index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), N);
+ index = vo_L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */
+ break;
+ case 4:
+ index = quant_4p_4N1(posA[0], posA[1], posA[2], posA[3], n_1);
+ break;
+ default:
+ index = 0;
+ fprintf(stderr, "Error in function quant_4p_4N\n");
+ }
+ tmp = ((N << 2) - 2); /* index += (i & 3) << ((4*N)-2); */
+ index = vo_L_add(index, L_shl((L_deposit_l(i) & (3L)), tmp));
+
+ return (index);
}
Word32 quant_5p_5N( /* (o) return 5*N bits */
- Word16 pos[], /* (i) position of the pulse 1..5 */
- Word16 N) /* (i) number of bits for position */
+ Word16 pos[], /* (i) position of the pulse 1..5 */
+ Word16 N) /* (i) number of bits for position */
{
- Word16 nb_pos, n_1, tmp;
- Word16 posA[5], posB[5];
- Word32 i, j, k, index, tmp2;
-
- n_1 = (Word16) (N - 1);
- nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
-
- i = 0;
- j = 0;
- for (k = 0; k < 5; k++)
- {
- if ((pos[k] & nb_pos) == 0)
- {
- posA[i++] = pos[k];
- } else
- {
- posB[j++] = pos[k];
- }
- }
-
- switch (i)
- {
- case 0:
- tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* ((5*N)-1)) */
- index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */
- tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/
- tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
- index = vo_L_add(index, tmp2);
- index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N)); /* index += quant_2p_2N1(posB[3], posB[4], N); */
- break;
- case 1:
- tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* index = 1 << ((5*N)-1); */
- index = L_shl(1L, tmp);
- tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1); */
- tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
- index = vo_L_add(index, tmp2);
- index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N)); /* index += quant_2p_2N1(posB[3], posA[0], N); */
- break;
- case 2:
- tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* ((5*N)-1)) */
- index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */
- tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1); */
- tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
- index = vo_L_add(index, tmp2);
- index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N)); /* index += quant_2p_2N1(posA[0], posA[1], N); */
- break;
- case 3:
- tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
- index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
- index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N)); /* index += quant_2p_2N1(posB[0], posB[1], N); */
- break;
- case 4:
- tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
- index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
- index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N)); /* index += quant_2p_2N1(posA[3], posB[0], N); */
- break;
- case 5:
- tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
- index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
- index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N)); /* index += quant_2p_2N1(posA[3], posA[4], N); */
- break;
- default:
- index = 0;
- fprintf(stderr, "Error in function quant_5p_5N\n");
- }
-
- return (index);
+ Word16 nb_pos, n_1, tmp;
+ Word16 posA[5], posB[5];
+ Word32 i, j, k, index, tmp2;
+
+ n_1 = (Word16) (N - 1);
+ nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
+
+ i = 0;
+ j = 0;
+ for (k = 0; k < 5; k++)
+ {
+ if ((pos[k] & nb_pos) == 0)
+ {
+ posA[i++] = pos[k];
+ } else
+ {
+ posB[j++] = pos[k];
+ }
+ }
+
+ switch (i)
+ {
+ case 0:
+ tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* ((5*N)-1)) */
+ index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */
+ tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1);*/
+ tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
+ index = vo_L_add(index, tmp2);
+ index = vo_L_add(index, quant_2p_2N1(posB[3], posB[4], N)); /* index += quant_2p_2N1(posB[3], posB[4], N); */
+ break;
+ case 1:
+ tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* index = 1 << ((5*N)-1); */
+ index = L_shl(1L, tmp);
+ tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) <<((2*N)+1); */
+ tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
+ index = vo_L_add(index, tmp2);
+ index = vo_L_add(index, quant_2p_2N1(posB[3], posA[0], N)); /* index += quant_2p_2N1(posB[3], posA[0], N); */
+ break;
+ case 2:
+ tmp = vo_sub((Word16)((vo_L_mult(5, N) >> 1)), 1); /* ((5*N)-1)) */
+ index = L_shl(1L, tmp); /* index = 1 << ((5*N)-1); */
+ tmp = add1((N << 1), 1); /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1) << ((2*N)+1); */
+ tmp2 = L_shl(quant_3p_3N1(posB[0], posB[1], posB[2], n_1), tmp);
+ index = vo_L_add(index, tmp2);
+ index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], N)); /* index += quant_2p_2N1(posA[0], posA[1], N); */
+ break;
+ case 3:
+ tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
+ index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
+ index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], N)); /* index += quant_2p_2N1(posB[0], posB[1], N); */
+ break;
+ case 4:
+ tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
+ index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
+ index = vo_L_add(index, quant_2p_2N1(posA[3], posB[0], N)); /* index += quant_2p_2N1(posA[3], posB[0], N); */
+ break;
+ case 5:
+ tmp = add1((N << 1), 1); /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((2*N)+1); */
+ index = L_shl(quant_3p_3N1(posA[0], posA[1], posA[2], n_1), tmp);
+ index = vo_L_add(index, quant_2p_2N1(posA[3], posA[4], N)); /* index += quant_2p_2N1(posA[3], posA[4], N); */
+ break;
+ default:
+ index = 0;
+ fprintf(stderr, "Error in function quant_5p_5N\n");
+ }
+
+ return (index);
}
Word32 quant_6p_6N_2( /* (o) return (6*N)-2 bits */
- Word16 pos[], /* (i) position of the pulse 1..6 */
- Word16 N) /* (i) number of bits for position */
+ Word16 pos[], /* (i) position of the pulse 1..6 */
+ Word16 N) /* (i) number of bits for position */
{
- Word16 nb_pos, n_1;
- Word16 posA[6], posB[6];
- Word32 i, j, k, index;
-
- /* !! N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
- n_1 = (Word16) (N - 1);
- nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
-
- i = 0;
- j = 0;
- for (k = 0; k < 6; k++)
- {
- if ((pos[k] & nb_pos) == 0)
- {
- posA[i++] = pos[k];
- } else
- {
- posB[j++] = pos[k];
- }
- }
-
- switch (i)
- {
- case 0:
- index = (1 << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
- index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
- index = vo_L_add(index, quant_1p_N1(posB[5], n_1)); /* index += quant_1p_N1(posB[5], n_1); */
- break;
- case 1:
- index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
- index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
- index = vo_L_add(index, quant_1p_N1(posA[0], n_1)); /* index += quant_1p_N1(posA[0], n_1); */
- break;
- case 2:
- index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
- /* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */
- index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1)));
- index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1)); /* index += quant_2p_2N1(posA[0], posA[1], n_1); */
- break;
- case 3:
- index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1));
- /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
- index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
- /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
- break;
- case 4:
- i = 2;
- index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1)); /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */
- index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1)); /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
- break;
- case 5:
- i = 1;
- index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, n_1) << N; */
- index = vo_L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */
- break;
- case 6:
- i = 0;
- index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, n_1) << N; */
- index = vo_L_add(index, quant_1p_N1(posA[5], n_1)); /* index += quant_1p_N1(posA[5], n_1); */
- break;
- default:
- index = 0;
- fprintf(stderr, "Error in function quant_6p_6N_2\n");
- }
- index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4))); /* index += (i & 3) << ((6*N)-4); */
-
- return (index);
+ Word16 nb_pos, n_1;
+ Word16 posA[6], posB[6];
+ Word32 i, j, k, index;
+
+ /* !! N and n_1 are constants -> it doesn't need to be operated by Basic Operators */
+ n_1 = (Word16) (N - 1);
+ nb_pos = (1 << n_1); /* nb_pos = (1<<n_1); */
+
+ i = 0;
+ j = 0;
+ for (k = 0; k < 6; k++)
+ {
+ if ((pos[k] & nb_pos) == 0)
+ {
+ posA[i++] = pos[k];
+ } else
+ {
+ posB[j++] = pos[k];
+ }
+ }
+
+ switch (i)
+ {
+ case 0:
+ index = (1 << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
+ index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
+ index = vo_L_add(index, quant_1p_N1(posB[5], n_1)); /* index += quant_1p_N1(posB[5], n_1); */
+ break;
+ case 1:
+ index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
+ index = vo_L_add(index, (quant_5p_5N(posB, n_1) << N)); /* index += quant_5p_5N(posB, n_1) << N; */
+ index = vo_L_add(index, quant_1p_N1(posA[0], n_1)); /* index += quant_1p_N1(posA[0], n_1); */
+ break;
+ case 2:
+ index = (1L << (Word16) (6 * N - 5)); /* index = 1 << ((6*N)-5); */
+ /* index += quant_4p_4N(posB, n_1) << ((2*n_1)+1); */
+ index = vo_L_add(index, (quant_4p_4N(posB, n_1) << (Word16) (2 * n_1 + 1)));
+ index = vo_L_add(index, quant_2p_2N1(posA[0], posA[1], n_1)); /* index += quant_2p_2N1(posA[0], posA[1], n_1); */
+ break;
+ case 3:
+ index = (quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << (Word16) (3 * n_1 + 1));
+ /* index = quant_3p_3N1(posA[0], posA[1], posA[2], n_1) << ((3*n_1)+1); */
+ index =vo_L_add(index, quant_3p_3N1(posB[0], posB[1], posB[2], n_1));
+ /* index += quant_3p_3N1(posB[0], posB[1], posB[2], n_1); */
+ break;
+ case 4:
+ i = 2;
+ index = (quant_4p_4N(posA, n_1) << (Word16) (2 * n_1 + 1)); /* index = quant_4p_4N(posA, n_1) << ((2*n_1)+1); */
+ index = vo_L_add(index, quant_2p_2N1(posB[0], posB[1], n_1)); /* index += quant_2p_2N1(posB[0], posB[1], n_1); */
+ break;
+ case 5:
+ i = 1;
+ index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, n_1) << N; */
+ index = vo_L_add(index, quant_1p_N1(posB[0], n_1)); /* index += quant_1p_N1(posB[0], n_1); */
+ break;
+ case 6:
+ i = 0;
+ index = (quant_5p_5N(posA, n_1) << N); /* index = quant_5p_5N(posA, n_1) << N; */
+ index = vo_L_add(index, quant_1p_N1(posA[5], n_1)); /* index += quant_1p_N1(posA[5], n_1); */
+ break;
+ default:
+ index = 0;
+ fprintf(stderr, "Error in function quant_6p_6N_2\n");
+ }
+ index = vo_L_add(index, ((L_deposit_l(i) & 3L) << (Word16) (6 * N - 4))); /* index += (i & 3) << ((6*N)-4); */
+
+ return (index);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c
index fc2f00d..eac98e2 100644
--- a/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c
+++ b/media/libstagefright/codecs/amrwbenc/src/qisf_ns.c
@@ -33,30 +33,30 @@
*------------------------------------------------------------------*/
void Qisf_ns(
- Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */
- Word16 * isf_q, /* output: quantized ISF */
- Word16 * indice /* output: quantization indices */
- )
+ Word16 * isf1, /* input : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* output: quantized ISF */
+ Word16 * indice /* output: quantization indices */
+ )
{
- Word16 i;
- Word32 tmp;
+ Word16 i;
+ Word32 tmp;
- for (i = 0; i < ORDER; i++)
- {
- isf_q[i] = sub(isf1[i], mean_isf_noise[i]);
- }
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = sub(isf1[i], mean_isf_noise[i]);
+ }
- indice[0] = Sub_VQ(&isf_q[0], dico1_isf_noise, 2, SIZE_BK_NOISE1, &tmp);
- indice[1] = Sub_VQ(&isf_q[2], dico2_isf_noise, 3, SIZE_BK_NOISE2, &tmp);
- indice[2] = Sub_VQ(&isf_q[5], dico3_isf_noise, 3, SIZE_BK_NOISE3, &tmp);
- indice[3] = Sub_VQ(&isf_q[8], dico4_isf_noise, 4, SIZE_BK_NOISE4, &tmp);
- indice[4] = Sub_VQ(&isf_q[12], dico5_isf_noise, 4, SIZE_BK_NOISE5, &tmp);
+ indice[0] = Sub_VQ(&isf_q[0], dico1_isf_noise, 2, SIZE_BK_NOISE1, &tmp);
+ indice[1] = Sub_VQ(&isf_q[2], dico2_isf_noise, 3, SIZE_BK_NOISE2, &tmp);
+ indice[2] = Sub_VQ(&isf_q[5], dico3_isf_noise, 3, SIZE_BK_NOISE3, &tmp);
+ indice[3] = Sub_VQ(&isf_q[8], dico4_isf_noise, 4, SIZE_BK_NOISE4, &tmp);
+ indice[4] = Sub_VQ(&isf_q[12], dico5_isf_noise, 4, SIZE_BK_NOISE5, &tmp);
- /* decoding the ISFs */
+ /* decoding the ISFs */
- Disf_ns(indice, isf_q);
+ Disf_ns(indice, isf_q);
- return;
+ return;
}
/********************************************************************
@@ -70,41 +70,41 @@ void Qisf_ns(
*********************************************************************/
void Disf_ns(
- Word16 * indice, /* input: quantization indices */
- Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */
- )
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q /* input : ISF in the frequency domain (0..0.5) */
+ )
{
- Word16 i;
-
- for (i = 0; i < 2; i++)
- {
- isf_q[i] = dico1_isf_noise[indice[0] * 2 + i];
- }
- for (i = 0; i < 3; i++)
- {
- isf_q[i + 2] = dico2_isf_noise[indice[1] * 3 + i];
- }
- for (i = 0; i < 3; i++)
- {
- isf_q[i + 5] = dico3_isf_noise[indice[2] * 3 + i];
- }
- for (i = 0; i < 4; i++)
- {
- isf_q[i + 8] = dico4_isf_noise[indice[3] * 4 + i];
- }
- for (i = 0; i < 4; i++)
- {
- isf_q[i + 12] = dico5_isf_noise[indice[4] * 4 + i];
- }
-
- for (i = 0; i < ORDER; i++)
- {
- isf_q[i] = add(isf_q[i], mean_isf_noise[i]);
- }
-
- Reorder_isf(isf_q, ISF_GAP, ORDER);
-
- return;
+ Word16 i;
+
+ for (i = 0; i < 2; i++)
+ {
+ isf_q[i] = dico1_isf_noise[indice[0] * 2 + i];
+ }
+ for (i = 0; i < 3; i++)
+ {
+ isf_q[i + 2] = dico2_isf_noise[indice[1] * 3 + i];
+ }
+ for (i = 0; i < 3; i++)
+ {
+ isf_q[i + 5] = dico3_isf_noise[indice[2] * 3 + i];
+ }
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 8] = dico4_isf_noise[indice[3] * 4 + i];
+ }
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 12] = dico5_isf_noise[indice[4] * 4 + i];
+ }
+
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = add(isf_q[i], mean_isf_noise[i]);
+ }
+
+ Reorder_isf(isf_q, ISF_GAP, ORDER);
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
index c711cd0..bec334e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
+++ b/media/libstagefright/codecs/amrwbenc/src/qpisf_2s.c
@@ -36,13 +36,13 @@
/* private functions */
static void VQ_stage1(
- Word16 * x, /* input : ISF residual vector */
- Word16 * dico, /* input : quantization codebook */
- Word16 dim, /* input : dimention of vector */
- Word16 dico_size, /* input : size of quantization codebook */
- Word16 * index, /* output: indices of survivors */
- Word16 surv /* input : number of survivor */
- );
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word16 * index, /* output: indices of survivors */
+ Word16 surv /* input : number of survivor */
+ );
/**************************************************************************
* Function: Qpisf_2s_46B() *
@@ -54,84 +54,84 @@ static void VQ_stage1(
***************************************************************************/
void Qpisf_2s_46b(
- Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
- Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
- Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
- Word16 * indice, /* (o) : quantization indices */
- Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
- )
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ )
{
- Word16 tmp_ind[5];
- Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
- Word32 i, k, temp, min_err, distance;
- Word16 isf[ORDER];
- Word16 isf_stage2[ORDER];
-
- for (i = 0; i < ORDER; i++)
- {
- isf[i] = vo_sub(isf1[i], mean_isf[i]);
- isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
- }
-
- VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
-
- distance = MAX_32;
-
- for (k = 0; k < nb_surv; k++)
- {
- for (i = 0; i < 9; i++)
- {
- isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
- }
- tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err);
- temp = min_err;
- tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err);
- temp = vo_L_add(temp, min_err);
- tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);
- temp = vo_L_add(temp, min_err);
-
- if(temp < distance)
- {
- distance = temp;
- indice[0] = surv1[k];
- for (i = 0; i < 3; i++)
- {
- indice[i + 2] = tmp_ind[i];
- }
- }
- }
-
-
- VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
-
- distance = MAX_32;
-
- for (k = 0; k < nb_surv; k++)
- {
- for (i = 0; i < 7; i++)
- {
- isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
- }
-
- tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
- temp = min_err;
- tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
- temp = vo_L_add(temp, min_err);
-
- if(temp < distance)
- {
- distance = temp;
- indice[1] = surv1[k];
- for (i = 0; i < 2; i++)
- {
- indice[i + 5] = tmp_ind[i];
- }
- }
- }
-
- Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
-
- return;
+ Word16 tmp_ind[5];
+ Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
+ Word32 i, k, temp, min_err, distance;
+ Word16 isf[ORDER];
+ Word16 isf_stage2[ORDER];
+
+ for (i = 0; i < ORDER; i++)
+ {
+ isf[i] = vo_sub(isf1[i], mean_isf[i]);
+ isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
+ }
+
+ VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
+
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
+ }
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf, 3, SIZE_BK21, &min_err);
+ temp = min_err;
+ tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico22_isf, 3, SIZE_BK22, &min_err);
+ temp = vo_L_add(temp, min_err);
+ tmp_ind[2] = Sub_VQ(&isf_stage2[6], dico23_isf, 3, SIZE_BK23, &min_err);
+ temp = vo_L_add(temp, min_err);
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[0] = surv1[k];
+ for (i = 0; i < 3; i++)
+ {
+ indice[i + 2] = tmp_ind[i];
+ }
+ }
+ }
+
+
+ VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
+
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 7; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
+ }
+
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico24_isf, 3, SIZE_BK24, &min_err);
+ temp = min_err;
+ tmp_ind[1] = Sub_VQ(&isf_stage2[3], dico25_isf, 4, SIZE_BK25, &min_err);
+ temp = vo_L_add(temp, min_err);
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[1] = surv1[k];
+ for (i = 0; i < 2; i++)
+ {
+ indice[i + 5] = tmp_ind[i];
+ }
+ }
+ }
+
+ Dpisf_2s_46b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
+
+ return;
}
/*****************************************************************************
@@ -144,76 +144,76 @@ void Qpisf_2s_46b(
******************************************************************************/
void Qpisf_2s_36b(
- Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
- Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
- Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
- Word16 * indice, /* (o) : quantization indices */
- Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
- )
+ Word16 * isf1, /* (i) Q15 : ISF in the frequency domain (0..0.5) */
+ Word16 * isf_q, /* (o) Q15 : quantized ISF (0..0.5) */
+ Word16 * past_isfq, /* (io)Q15 : past ISF quantizer */
+ Word16 * indice, /* (o) : quantization indices */
+ Word16 nb_surv /* (i) : number of survivor (1, 2, 3 or 4) */
+ )
{
- Word16 i, k, tmp_ind[5];
- Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
- Word32 temp, min_err, distance;
- Word16 isf[ORDER];
- Word16 isf_stage2[ORDER];
-
- for (i = 0; i < ORDER; i++)
- {
- isf[i] = vo_sub(isf1[i], mean_isf[i]);
- isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
- }
-
- VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
-
- distance = MAX_32;
-
- for (k = 0; k < nb_surv; k++)
- {
- for (i = 0; i < 9; i++)
- {
- isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
- }
-
- tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);
- temp = min_err;
- tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);
- temp = vo_L_add(temp, min_err);
-
- if(temp < distance)
- {
- distance = temp;
- indice[0] = surv1[k];
- for (i = 0; i < 2; i++)
- {
- indice[i + 2] = tmp_ind[i];
- }
- }
- }
-
- VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
- distance = MAX_32;
-
- for (k = 0; k < nb_surv; k++)
- {
- for (i = 0; i < 7; i++)
- {
- isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
- }
-
- tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);
- temp = min_err;
-
- if(temp < distance)
- {
- distance = temp;
- indice[1] = surv1[k];
- indice[4] = tmp_ind[0];
- }
- }
-
- Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
-
- return;
+ Word16 i, k, tmp_ind[5];
+ Word16 surv1[N_SURV_MAX]; /* indices of survivors from 1st stage */
+ Word32 temp, min_err, distance;
+ Word16 isf[ORDER];
+ Word16 isf_stage2[ORDER];
+
+ for (i = 0; i < ORDER; i++)
+ {
+ isf[i] = vo_sub(isf1[i], mean_isf[i]);
+ isf[i] = vo_sub(isf[i], vo_mult(MU, past_isfq[i]));
+ }
+
+ VQ_stage1(&isf[0], dico1_isf, 9, SIZE_BK1, surv1, nb_surv);
+
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[i], dico1_isf[i + surv1[k] * 9]);
+ }
+
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico21_isf_36b, 5, SIZE_BK21_36b, &min_err);
+ temp = min_err;
+ tmp_ind[1] = Sub_VQ(&isf_stage2[5], dico22_isf_36b, 4, SIZE_BK22_36b, &min_err);
+ temp = vo_L_add(temp, min_err);
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[0] = surv1[k];
+ for (i = 0; i < 2; i++)
+ {
+ indice[i + 2] = tmp_ind[i];
+ }
+ }
+ }
+
+ VQ_stage1(&isf[9], dico2_isf, 7, SIZE_BK2, surv1, nb_surv);
+ distance = MAX_32;
+
+ for (k = 0; k < nb_surv; k++)
+ {
+ for (i = 0; i < 7; i++)
+ {
+ isf_stage2[i] = vo_sub(isf[9 + i], dico2_isf[i + surv1[k] * 7]);
+ }
+
+ tmp_ind[0] = Sub_VQ(&isf_stage2[0], dico23_isf_36b, 7, SIZE_BK23_36b, &min_err);
+ temp = min_err;
+
+ if(temp < distance)
+ {
+ distance = temp;
+ indice[1] = surv1[k];
+ indice[4] = tmp_ind[0];
+ }
+ }
+
+ Dpisf_2s_36b(indice, isf_q, past_isfq, isf_q, isf_q, 0, 0);
+
+ return;
}
/*********************************************************************
@@ -223,90 +223,90 @@ void Qpisf_2s_36b(
**********************************************************************/
void Dpisf_2s_46b(
- Word16 * indice, /* input: quantization indices */
- Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
- Word16 * past_isfq, /* i/0 : past ISF quantizer */
- Word16 * isfold, /* input : past quantized ISF */
- Word16 * isf_buf, /* input : isf buffer */
- Word16 bfi, /* input : Bad frame indicator */
- Word16 enc_dec
- )
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ )
{
- Word16 ref_isf[M], tmp;
- Word32 i, j, L_tmp;
-
- if (bfi == 0) /* Good frame */
- {
- for (i = 0; i < 9; i++)
- {
- isf_q[i] = dico1_isf[indice[0] * 9 + i];
- }
- for (i = 0; i < 7; i++)
- {
- isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
- }
-
- for (i = 0; i < 3; i++)
- {
- isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);
- isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);
- isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]);
- isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]);
- }
-
- for (i = 0; i < 4; i++)
- {
- isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);
- }
-
- for (i = 0; i < ORDER; i++)
- {
- tmp = isf_q[i];
- isf_q[i] = add1(tmp, mean_isf[i]);
- isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
- past_isfq[i] = tmp;
- }
-
- if (enc_dec)
- {
- for (i = 0; i < M; i++)
- {
- for (j = (L_MEANBUF - 1); j > 0; j--)
- {
- isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
- }
- isf_buf[i] = isf_q[i];
- }
- }
- } else
- { /* bad frame */
- for (i = 0; i < M; i++)
- {
- L_tmp = mean_isf[i] << 14;
- for (j = 0; j < L_MEANBUF; j++)
- {
- L_tmp += (isf_buf[j * M + i] << 14);
- }
- ref_isf[i] = vo_round(L_tmp);
- }
-
- /* use the past ISFs slightly shifted towards their mean */
- for (i = 0; i < ORDER; i++)
- {
- isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
- }
-
- /* estimate past quantized residual to be used in next frame */
- for (i = 0; i < ORDER; i++)
- {
- tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
- past_isfq[i] = vo_sub(isf_q[i], tmp);
- past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */
- }
- }
-
- Reorder_isf(isf_q, ISF_GAP, ORDER);
- return;
+ Word16 ref_isf[M], tmp;
+ Word32 i, j, L_tmp;
+
+ if (bfi == 0) /* Good frame */
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_q[i] = dico1_isf[indice[0] * 9 + i];
+ }
+ for (i = 0; i < 7; i++)
+ {
+ isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
+ }
+
+ for (i = 0; i < 3; i++)
+ {
+ isf_q[i] = add1(isf_q[i], dico21_isf[indice[2] * 3 + i]);
+ isf_q[i + 3] = add1(isf_q[i + 3], dico22_isf[indice[3] * 3 + i]);
+ isf_q[i + 6] = add1(isf_q[i + 6], dico23_isf[indice[4] * 3 + i]);
+ isf_q[i + 9] = add1(isf_q[i + 9], dico24_isf[indice[5] * 3 + i]);
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 12] = add1(isf_q[i + 12], dico25_isf[indice[6] * 4 + i]);
+ }
+
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = isf_q[i];
+ isf_q[i] = add1(tmp, mean_isf[i]);
+ isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
+ past_isfq[i] = tmp;
+ }
+
+ if (enc_dec)
+ {
+ for (i = 0; i < M; i++)
+ {
+ for (j = (L_MEANBUF - 1); j > 0; j--)
+ {
+ isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
+ }
+ isf_buf[i] = isf_q[i];
+ }
+ }
+ } else
+ { /* bad frame */
+ for (i = 0; i < M; i++)
+ {
+ L_tmp = mean_isf[i] << 14;
+ for (j = 0; j < L_MEANBUF; j++)
+ {
+ L_tmp += (isf_buf[j * M + i] << 14);
+ }
+ ref_isf[i] = vo_round(L_tmp);
+ }
+
+ /* use the past ISFs slightly shifted towards their mean */
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
+ }
+
+ /* estimate past quantized residual to be used in next frame */
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
+ past_isfq[i] = vo_sub(isf_q[i], tmp);
+ past_isfq[i] = (past_isfq[i] >> 1); /* past_isfq[i] *= 0.5 */
+ }
+ }
+
+ Reorder_isf(isf_q, ISF_GAP, ORDER);
+ return;
}
/*********************************************************************
@@ -316,92 +316,92 @@ void Dpisf_2s_46b(
*********************************************************************/
void Dpisf_2s_36b(
- Word16 * indice, /* input: quantization indices */
- Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
- Word16 * past_isfq, /* i/0 : past ISF quantizer */
- Word16 * isfold, /* input : past quantized ISF */
- Word16 * isf_buf, /* input : isf buffer */
- Word16 bfi, /* input : Bad frame indicator */
- Word16 enc_dec
- )
+ Word16 * indice, /* input: quantization indices */
+ Word16 * isf_q, /* output: quantized ISF in frequency domain (0..0.5) */
+ Word16 * past_isfq, /* i/0 : past ISF quantizer */
+ Word16 * isfold, /* input : past quantized ISF */
+ Word16 * isf_buf, /* input : isf buffer */
+ Word16 bfi, /* input : Bad frame indicator */
+ Word16 enc_dec
+ )
{
- Word16 ref_isf[M], tmp;
- Word32 i, j, L_tmp;
-
- if (bfi == 0) /* Good frame */
- {
- for (i = 0; i < 9; i++)
- {
- isf_q[i] = dico1_isf[indice[0] * 9 + i];
- }
- for (i = 0; i < 7; i++)
- {
- isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
- }
-
- for (i = 0; i < 5; i++)
- {
- isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
- }
- for (i = 0; i < 4; i++)
- {
- isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);
- }
- for (i = 0; i < 7; i++)
- {
- isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);
- }
-
- for (i = 0; i < ORDER; i++)
- {
- tmp = isf_q[i];
- isf_q[i] = add1(tmp, mean_isf[i]);
- isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
- past_isfq[i] = tmp;
- }
-
-
- if (enc_dec)
- {
- for (i = 0; i < M; i++)
- {
- for (j = (L_MEANBUF - 1); j > 0; j--)
- {
- isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
- }
- isf_buf[i] = isf_q[i];
- }
- }
- } else
- { /* bad frame */
- for (i = 0; i < M; i++)
- {
- L_tmp = (mean_isf[i] << 14);
- for (j = 0; j < L_MEANBUF; j++)
- {
- L_tmp += (isf_buf[j * M + i] << 14);
- }
- ref_isf[i] = vo_round(L_tmp);
- }
-
- /* use the past ISFs slightly shifted towards their mean */
- for (i = 0; i < ORDER; i++)
- {
- isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
- }
-
- /* estimate past quantized residual to be used in next frame */
- for (i = 0; i < ORDER; i++)
- {
- tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
- past_isfq[i] = vo_sub(isf_q[i], tmp);
- past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */
- }
- }
-
- Reorder_isf(isf_q, ISF_GAP, ORDER);
-
- return;
+ Word16 ref_isf[M], tmp;
+ Word32 i, j, L_tmp;
+
+ if (bfi == 0) /* Good frame */
+ {
+ for (i = 0; i < 9; i++)
+ {
+ isf_q[i] = dico1_isf[indice[0] * 9 + i];
+ }
+ for (i = 0; i < 7; i++)
+ {
+ isf_q[i + 9] = dico2_isf[indice[1] * 7 + i];
+ }
+
+ for (i = 0; i < 5; i++)
+ {
+ isf_q[i] = add1(isf_q[i], dico21_isf_36b[indice[2] * 5 + i]);
+ }
+ for (i = 0; i < 4; i++)
+ {
+ isf_q[i + 5] = add1(isf_q[i + 5], dico22_isf_36b[indice[3] * 4 + i]);
+ }
+ for (i = 0; i < 7; i++)
+ {
+ isf_q[i + 9] = add1(isf_q[i + 9], dico23_isf_36b[indice[4] * 7 + i]);
+ }
+
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = isf_q[i];
+ isf_q[i] = add1(tmp, mean_isf[i]);
+ isf_q[i] = add1(isf_q[i], vo_mult(MU, past_isfq[i]));
+ past_isfq[i] = tmp;
+ }
+
+
+ if (enc_dec)
+ {
+ for (i = 0; i < M; i++)
+ {
+ for (j = (L_MEANBUF - 1); j > 0; j--)
+ {
+ isf_buf[j * M + i] = isf_buf[(j - 1) * M + i];
+ }
+ isf_buf[i] = isf_q[i];
+ }
+ }
+ } else
+ { /* bad frame */
+ for (i = 0; i < M; i++)
+ {
+ L_tmp = (mean_isf[i] << 14);
+ for (j = 0; j < L_MEANBUF; j++)
+ {
+ L_tmp += (isf_buf[j * M + i] << 14);
+ }
+ ref_isf[i] = vo_round(L_tmp);
+ }
+
+ /* use the past ISFs slightly shifted towards their mean */
+ for (i = 0; i < ORDER; i++)
+ {
+ isf_q[i] = add1(vo_mult(ALPHA, isfold[i]), vo_mult(ONE_ALPHA, ref_isf[i]));
+ }
+
+ /* estimate past quantized residual to be used in next frame */
+ for (i = 0; i < ORDER; i++)
+ {
+ tmp = add1(ref_isf[i], vo_mult(past_isfq[i], MU)); /* predicted ISF */
+ past_isfq[i] = vo_sub(isf_q[i], tmp);
+ past_isfq[i] = past_isfq[i] >> 1; /* past_isfq[i] *= 0.5 */
+ }
+ }
+
+ Reorder_isf(isf_q, ISF_GAP, ORDER);
+
+ return;
}
@@ -419,122 +419,122 @@ void Dpisf_2s_36b(
****************************************************************************/
void Reorder_isf(
- Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
- Word16 min_dist, /* (i) Q15 : minimum distance to keep */
- Word16 n /* (i) : number of ISF */
- )
+ Word16 * isf, /* (i/o) Q15: ISF in the frequency domain (0..0.5) */
+ Word16 min_dist, /* (i) Q15 : minimum distance to keep */
+ Word16 n /* (i) : number of ISF */
+ )
{
- Word32 i;
- Word16 isf_min;
-
- isf_min = min_dist;
- for (i = 0; i < n - 1; i++)
- {
- if(isf[i] < isf_min)
- {
- isf[i] = isf_min;
- }
- isf_min = (isf[i] + min_dist);
- }
- return;
+ Word32 i;
+ Word16 isf_min;
+
+ isf_min = min_dist;
+ for (i = 0; i < n - 1; i++)
+ {
+ if(isf[i] < isf_min)
+ {
+ isf[i] = isf_min;
+ }
+ isf_min = (isf[i] + min_dist);
+ }
+ return;
}
Word16 Sub_VQ( /* output: return quantization index */
- Word16 * x, /* input : ISF residual vector */
- Word16 * dico, /* input : quantization codebook */
- Word16 dim, /* input : dimention of vector */
- Word16 dico_size, /* input : size of quantization codebook */
- Word32 * distance /* output: error of quantization */
- )
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word32 * distance /* output: error of quantization */
+ )
{
- Word16 temp, *p_dico;
- Word32 i, j, index;
- Word32 dist_min, dist;
-
- dist_min = MAX_32;
- p_dico = dico;
-
- index = 0;
- for (i = 0; i < dico_size; i++)
- {
- dist = 0;
-
- for (j = 0; j < dim; j++)
- {
- temp = x[j] - (*p_dico++);
- dist += (temp * temp)<<1;
- }
-
- if(dist < dist_min)
- {
- dist_min = dist;
- index = i;
- }
- }
-
- *distance = dist_min;
-
- /* Reading the selected vector */
- p_dico = &dico[index * dim];
- for (j = 0; j < dim; j++)
- {
- x[j] = *p_dico++;
- }
-
- return index;
+ Word16 temp, *p_dico;
+ Word32 i, j, index;
+ Word32 dist_min, dist;
+
+ dist_min = MAX_32;
+ p_dico = dico;
+
+ index = 0;
+ for (i = 0; i < dico_size; i++)
+ {
+ dist = 0;
+
+ for (j = 0; j < dim; j++)
+ {
+ temp = x[j] - (*p_dico++);
+ dist += (temp * temp)<<1;
+ }
+
+ if(dist < dist_min)
+ {
+ dist_min = dist;
+ index = i;
+ }
+ }
+
+ *distance = dist_min;
+
+ /* Reading the selected vector */
+ p_dico = &dico[index * dim];
+ for (j = 0; j < dim; j++)
+ {
+ x[j] = *p_dico++;
+ }
+
+ return index;
}
static void VQ_stage1(
- Word16 * x, /* input : ISF residual vector */
- Word16 * dico, /* input : quantization codebook */
- Word16 dim, /* input : dimention of vector */
- Word16 dico_size, /* input : size of quantization codebook */
- Word16 * index, /* output: indices of survivors */
- Word16 surv /* input : number of survivor */
- )
+ Word16 * x, /* input : ISF residual vector */
+ Word16 * dico, /* input : quantization codebook */
+ Word16 dim, /* input : dimention of vector */
+ Word16 dico_size, /* input : size of quantization codebook */
+ Word16 * index, /* output: indices of survivors */
+ Word16 surv /* input : number of survivor */
+ )
{
- Word16 temp, *p_dico;
- Word32 i, j, k, l;
- Word32 dist_min[N_SURV_MAX], dist;
-
- dist_min[0] = MAX_32;
- dist_min[1] = MAX_32;
- dist_min[2] = MAX_32;
- dist_min[3] = MAX_32;
- index[0] = 0;
- index[1] = 1;
- index[2] = 2;
- index[3] = 3;
-
- p_dico = dico;
-
- for (i = 0; i < dico_size; i++)
- {
- dist = 0;
- for (j = 0; j < dim; j++)
- {
- temp = x[j] - (*p_dico++);
- dist += (temp * temp)<<1;
- }
-
- for (k = 0; k < surv; k++)
- {
- if(dist < dist_min[k])
- {
- for (l = surv - 1; l > k; l--)
- {
- dist_min[l] = dist_min[l - 1];
- index[l] = index[l - 1];
- }
- dist_min[k] = dist;
- index[k] = i;
- break;
- }
- }
- }
- return;
+ Word16 temp, *p_dico;
+ Word32 i, j, k, l;
+ Word32 dist_min[N_SURV_MAX], dist;
+
+ dist_min[0] = MAX_32;
+ dist_min[1] = MAX_32;
+ dist_min[2] = MAX_32;
+ dist_min[3] = MAX_32;
+ index[0] = 0;
+ index[1] = 1;
+ index[2] = 2;
+ index[3] = 3;
+
+ p_dico = dico;
+
+ for (i = 0; i < dico_size; i++)
+ {
+ dist = 0;
+ for (j = 0; j < dim; j++)
+ {
+ temp = x[j] - (*p_dico++);
+ dist += (temp * temp)<<1;
+ }
+
+ for (k = 0; k < surv; k++)
+ {
+ if(dist < dist_min[k])
+ {
+ for (l = surv - 1; l > k; l--)
+ {
+ dist_min[l] = dist_min[l - 1];
+ index[l] = index[l - 1];
+ }
+ dist_min[k] = dist;
+ index[k] = i;
+ break;
+ }
+ }
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/random.c b/media/libstagefright/codecs/amrwbenc/src/random.c
index b896863..758343c 100644
--- a/media/libstagefright/codecs/amrwbenc/src/random.c
+++ b/media/libstagefright/codecs/amrwbenc/src/random.c
@@ -26,8 +26,8 @@
Word16 Random(Word16 * seed)
{
- /* static Word16 seed = 21845; */
- *seed = (Word16)(L_add((L_mult(*seed, 31821) >> 1), 13849L));
- return (*seed);
+ /* static Word16 seed = 21845; */
+ *seed = (Word16)(L_add((L_mult(*seed, 31821) >> 1), 13849L));
+ return (*seed);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/residu.c b/media/libstagefright/codecs/amrwbenc/src/residu.c
index b0c04b5..76d0e41 100644
--- a/media/libstagefright/codecs/amrwbenc/src/residu.c
+++ b/media/libstagefright/codecs/amrwbenc/src/residu.c
@@ -26,41 +26,41 @@
#include "basic_op.h"
void Residu(
- Word16 a[], /* (i) Q12 : prediction coefficients */
- Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
- Word16 y[], /* (o) x2 : residual signal */
- Word16 lg /* (i) : size of filtering */
- )
+ Word16 a[], /* (i) Q12 : prediction coefficients */
+ Word16 x[], /* (i) : speech (values x[-m..-1] are needed */
+ Word16 y[], /* (o) x2 : residual signal */
+ Word16 lg /* (i) : size of filtering */
+ )
{
- Word16 i,*p1, *p2;
- Word32 s;
- for (i = 0; i < lg; i++)
- {
- p1 = a;
- p2 = &x[i];
- s = vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1++), (*p2--));
- s += vo_mult32((*p1), (*p2));
+ Word16 i,*p1, *p2;
+ Word32 s;
+ for (i = 0; i < lg; i++)
+ {
+ p1 = a;
+ p2 = &x[i];
+ s = vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1++), (*p2--));
+ s += vo_mult32((*p1), (*p2));
- s = L_shl2(s, 5);
- y[i] = extract_h(L_add(s, 0x8000));
- }
+ s = L_shl2(s, 5);
+ y[i] = extract_h(L_add(s, 0x8000));
+ }
- return;
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/scale.c b/media/libstagefright/codecs/amrwbenc/src/scale.c
index 418cc06..21458c8 100644
--- a/media/libstagefright/codecs/amrwbenc/src/scale.c
+++ b/media/libstagefright/codecs/amrwbenc/src/scale.c
@@ -25,32 +25,32 @@
#include "basic_op.h"
void Scale_sig(
- Word16 x[], /* (i/o) : signal to scale */
- Word16 lg, /* (i) : size of x[] */
- Word16 exp /* (i) : exponent: x = round(x << exp) */
- )
+ Word16 x[], /* (i/o) : signal to scale */
+ Word16 lg, /* (i) : size of x[] */
+ Word16 exp /* (i) : exponent: x = round(x << exp) */
+ )
{
- Word32 i;
- Word32 L_tmp;
- if(exp > 0)
- {
- for (i = lg - 1 ; i >= 0; i--)
- {
- L_tmp = L_shl2(x[i], 16 + exp);
- x[i] = extract_h(L_add(L_tmp, 0x8000));
- }
- }
- else
- {
- exp = -exp;
- for (i = lg - 1; i >= 0; i--)
- {
- L_tmp = x[i] << 16;
- L_tmp >>= exp;
- x[i] = (L_tmp + 0x8000)>>16;
- }
- }
- return;
+ Word32 i;
+ Word32 L_tmp;
+ if(exp > 0)
+ {
+ for (i = lg - 1 ; i >= 0; i--)
+ {
+ L_tmp = L_shl2(x[i], 16 + exp);
+ x[i] = extract_h(L_add(L_tmp, 0x8000));
+ }
+ }
+ else
+ {
+ exp = -exp;
+ for (i = lg - 1; i >= 0; i--)
+ {
+ L_tmp = x[i] << 16;
+ L_tmp >>= exp;
+ x[i] = (L_tmp + 0x8000)>>16;
+ }
+ }
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/stream.c b/media/libstagefright/codecs/amrwbenc/src/stream.c
index 780f009..a39149e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/stream.c
+++ b/media/libstagefright/codecs/amrwbenc/src/stream.c
@@ -25,34 +25,34 @@
void voAWB_InitFrameBuffer(FrameStream *stream)
{
- stream->set_ptr = NULL;
- stream->frame_ptr_bk = stream->frame_ptr;
- stream->set_len = 0;
- stream->framebuffer_len = 0;
- stream->frame_storelen = 0;
+ stream->set_ptr = NULL;
+ stream->frame_ptr_bk = stream->frame_ptr;
+ stream->set_len = 0;
+ stream->framebuffer_len = 0;
+ stream->frame_storelen = 0;
}
void voAWB_UpdateFrameBuffer(
- FrameStream *stream,
- VO_MEM_OPERATOR *pMemOP
- )
+ FrameStream *stream,
+ VO_MEM_OPERATOR *pMemOP
+ )
{
- int len;
- len = MIN(Frame_Maxsize - stream->frame_storelen, stream->set_len);
- pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk + stream->frame_storelen , stream->set_ptr, len);
- stream->set_len -= len;
- stream->set_ptr += len;
- stream->framebuffer_len = stream->frame_storelen + len;
- stream->frame_ptr = stream->frame_ptr_bk;
- stream->used_len += len;
+ int len;
+ len = MIN(Frame_Maxsize - stream->frame_storelen, stream->set_len);
+ pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk + stream->frame_storelen , stream->set_ptr, len);
+ stream->set_len -= len;
+ stream->set_ptr += len;
+ stream->framebuffer_len = stream->frame_storelen + len;
+ stream->frame_ptr = stream->frame_ptr_bk;
+ stream->used_len += len;
}
void voAWB_FlushFrameBuffer(FrameStream *stream)
{
- stream->set_ptr = NULL;
- stream->frame_ptr_bk = stream->frame_ptr;
- stream->set_len = 0;
- stream->framebuffer_len = 0;
- stream->frame_storelen = 0;
+ stream->set_ptr = NULL;
+ stream->frame_ptr_bk = stream->frame_ptr;
+ stream->set_len = 0;
+ stream->framebuffer_len = 0;
+ stream->frame_storelen = 0;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/syn_filt.c b/media/libstagefright/codecs/amrwbenc/src/syn_filt.c
index 961aadc..7eba12f 100644
--- a/media/libstagefright/codecs/amrwbenc/src/syn_filt.c
+++ b/media/libstagefright/codecs/amrwbenc/src/syn_filt.c
@@ -29,134 +29,134 @@
#define UNUSED(x) (void)(x)
void Syn_filt(
- Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
- Word16 x[], /* (i) : input signal */
- Word16 y[], /* (o) : output signal */
- Word16 lg, /* (i) : size of filtering */
- Word16 mem[], /* (i/o) : memory associated with this filtering. */
- Word16 update /* (i) : 0=no update, 1=update of memory. */
- )
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 x[], /* (i) : input signal */
+ Word16 y[], /* (o) : output signal */
+ Word16 lg, /* (i) : size of filtering */
+ Word16 mem[], /* (i/o) : memory associated with this filtering. */
+ Word16 update /* (i) : 0=no update, 1=update of memory. */
+ )
{
- Word32 i, a0;
- Word16 y_buf[L_SUBFR16k + M16k];
- Word32 L_tmp;
- Word16 *yy, *p1, *p2;
- yy = &y_buf[0];
- /* copy initial filter states into synthesis buffer */
- for (i = 0; i < 16; i++)
- {
- *yy++ = mem[i];
- }
- a0 = (a[0] >> 1); /* input / 2 */
- /* Do the filtering. */
- for (i = 0; i < lg; i++)
- {
- p1 = &a[1];
- p2 = &yy[i-1];
- L_tmp = vo_mult32(a0, x[i]);
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1++), (*p2--));
- L_tmp -= vo_mult32((*p1), (*p2));
-
- L_tmp = L_shl2(L_tmp, 4);
- y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000));
- }
- /* Update memory if required */
- if (update)
- for (i = 0; i < 16; i++)
- {
- mem[i] = yy[lg - 16 + i];
- }
- return;
+ Word32 i, a0;
+ Word16 y_buf[L_SUBFR16k + M16k];
+ Word32 L_tmp;
+ Word16 *yy, *p1, *p2;
+ yy = &y_buf[0];
+ /* copy initial filter states into synthesis buffer */
+ for (i = 0; i < 16; i++)
+ {
+ *yy++ = mem[i];
+ }
+ a0 = (a[0] >> 1); /* input / 2 */
+ /* Do the filtering. */
+ for (i = 0; i < lg; i++)
+ {
+ p1 = &a[1];
+ p2 = &yy[i-1];
+ L_tmp = vo_mult32(a0, x[i]);
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1++), (*p2--));
+ L_tmp -= vo_mult32((*p1), (*p2));
+
+ L_tmp = L_shl2(L_tmp, 4);
+ y[i] = yy[i] = extract_h(L_add(L_tmp, 0x8000));
+ }
+ /* Update memory if required */
+ if (update)
+ for (i = 0; i < 16; i++)
+ {
+ mem[i] = yy[lg - 16 + i];
+ }
+ return;
}
void Syn_filt_32(
- Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
- Word16 m, /* (i) : order of LP filter */
- Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
- Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
- Word16 sig_hi[], /* (o) /16 : synthesis high */
- Word16 sig_lo[], /* (o) /16 : synthesis low */
- Word16 lg /* (i) : size of filtering */
- )
+ Word16 a[], /* (i) Q12 : a[m+1] prediction coefficients */
+ Word16 m, /* (i) : order of LP filter */
+ Word16 exc[], /* (i) Qnew: excitation (exc[i] >> Qnew) */
+ Word16 Qnew, /* (i) : exc scaling = 0(min) to 8(max) */
+ Word16 sig_hi[], /* (o) /16 : synthesis high */
+ Word16 sig_lo[], /* (o) /16 : synthesis low */
+ Word16 lg /* (i) : size of filtering */
+ )
{
- Word32 i,a0;
- Word32 L_tmp, L_tmp1;
- Word16 *p1, *p2, *p3;
+ Word32 i,a0;
+ Word32 L_tmp, L_tmp1;
+ Word16 *p1, *p2, *p3;
UNUSED(m);
- a0 = a[0] >> (4 + Qnew); /* input / 16 and >>Qnew */
- /* Do the filtering. */
- for (i = 0; i < lg; i++)
- {
- L_tmp = 0;
- L_tmp1 = 0;
- p1 = a;
- p2 = &sig_lo[i - 1];
- p3 = &sig_hi[i - 1];
-
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
- L_tmp -= vo_mult32((*p2--), (*p1));
- L_tmp1 -= vo_mult32((*p3--), (*p1++));
-
- L_tmp = L_tmp >> 11;
- L_tmp += vo_L_mult(exc[i], a0);
-
- /* sig_hi = bit16 to bit31 of synthesis */
- L_tmp = L_tmp - (L_tmp1<<1);
-
- L_tmp = L_tmp >> 3; /* ai in Q12 */
- sig_hi[i] = extract_h(L_tmp);
-
- /* sig_lo = bit4 to bit15 of synthesis */
- L_tmp >>= 4; /* 4 : sig_lo[i] >> 4 */
- sig_lo[i] = (Word16)((L_tmp - (sig_hi[i] << 13)));
- }
-
- return;
+ a0 = a[0] >> (4 + Qnew); /* input / 16 and >>Qnew */
+ /* Do the filtering. */
+ for (i = 0; i < lg; i++)
+ {
+ L_tmp = 0;
+ L_tmp1 = 0;
+ p1 = a;
+ p2 = &sig_lo[i - 1];
+ p3 = &sig_hi[i - 1];
+
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+ L_tmp -= vo_mult32((*p2--), (*p1));
+ L_tmp1 -= vo_mult32((*p3--), (*p1++));
+
+ L_tmp = L_tmp >> 11;
+ L_tmp += vo_L_mult(exc[i], a0);
+
+ /* sig_hi = bit16 to bit31 of synthesis */
+ L_tmp = L_tmp - (L_tmp1<<1);
+
+ L_tmp = L_tmp >> 3; /* ai in Q12 */
+ sig_hi[i] = extract_h(L_tmp);
+
+ /* sig_lo = bit4 to bit15 of synthesis */
+ L_tmp >>= 4; /* 4 : sig_lo[i] >> 4 */
+ sig_lo[i] = (Word16)((L_tmp - (sig_hi[i] << 13)));
+ }
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/updt_tar.c b/media/libstagefright/codecs/amrwbenc/src/updt_tar.c
index 96779fd..ba7c2ff 100644
--- a/media/libstagefright/codecs/amrwbenc/src/updt_tar.c
+++ b/media/libstagefright/codecs/amrwbenc/src/updt_tar.c
@@ -25,24 +25,25 @@
#include "basic_op.h"
void Updt_tar(
- Word16 * x, /* (i) Q0 : old target (for pitch search) */
- Word16 * x2, /* (o) Q0 : new target (for codebook search) */
- Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */
- Word16 gain, /* (i) Q14 : adaptive codebook gain */
- Word16 L /* (i) : subframe size */
- )
+ Word16 * x, /* (i) Q0 : old target (for pitch search) */
+ Word16 * x2, /* (o) Q0 : new target (for codebook search) */
+ Word16 * y, /* (i) Q0 : filtered adaptive codebook vector */
+ Word16 gain, /* (i) Q14 : adaptive codebook gain */
+ Word16 L /* (i) : subframe size */
+ )
{
- Word32 i;
- Word32 L_tmp;
-
- for (i = 0; i < L; i++)
- {
- L_tmp = x[i] << 15;
- L_tmp -= (y[i] * gain)<<1;
- x2[i] = extract_h(L_shl2(L_tmp, 1));
- }
-
- return;
+ Word32 i;
+ Word32 L_tmp, L_tmp2;
+
+ for (i = 0; i < L; i++)
+ {
+ L_tmp = x[i] << 15;
+ L_tmp2 = L_mult(y[i], gain);
+ L_tmp = L_sub(L_tmp, L_tmp2);
+ x2[i] = extract_h(L_shl2(L_tmp, 1));
+ }
+
+ return;
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/util.c b/media/libstagefright/codecs/amrwbenc/src/util.c
index 333140d..374245f 100644
--- a/media/libstagefright/codecs/amrwbenc/src/util.c
+++ b/media/libstagefright/codecs/amrwbenc/src/util.c
@@ -30,15 +30,15 @@
************************************************************************/
void Set_zero(
- Word16 x[], /* (o) : vector to clear */
- Word16 L /* (i) : length of vector */
- )
+ Word16 x[], /* (o) : vector to clear */
+ Word16 L /* (i) : length of vector */
+ )
{
- Word32 num = (Word32)L;
- while (num > 0) {
- *x++ = 0;
+ Word32 num = (Word32)L;
+ while (num > 0) {
+ *x++ = 0;
--num;
- }
+ }
}
@@ -49,28 +49,28 @@ void Set_zero(
*********************************************************************/
void Copy(
- Word16 x[], /* (i) : input vector */
- Word16 y[], /* (o) : output vector */
- Word16 L /* (i) : vector length */
- )
+ Word16 x[], /* (i) : input vector */
+ Word16 y[], /* (o) : output vector */
+ Word16 L /* (i) : vector length */
+ )
{
- Word32 temp1,temp2,num;
+ Word32 temp1,temp2,num;
if (L <= 0) {
return;
}
- if(L&1)
- {
- temp1 = *x++;
- *y++ = temp1;
- }
- num = (Word32)(L>>1);
- while (num > 0) {
- temp1 = *x++;
- temp2 = *x++;
- *y++ = temp1;
- *y++ = temp2;
+ if(L&1)
+ {
+ temp1 = *x++;
+ *y++ = temp1;
+ }
+ num = (Word32)(L>>1);
+ while (num > 0) {
+ temp1 = *x++;
+ temp2 = *x++;
+ *y++ = temp1;
+ *y++ = temp2;
--num;
- }
+ }
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
index df7b9b3..4cafb01 100644
--- a/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
+++ b/media/libstagefright/codecs/amrwbenc/src/voAMRWBEnc.c
@@ -19,8 +19,8 @@
* *
* Description: Performs the main encoder routine *
* Fixed-point C simulation of AMR WB ACELP coding *
-* algorithm with 20 msspeech frames for *
-* wideband speech signals. *
+* algorithm with 20 msspeech frames for *
+* wideband speech signals. *
* *
************************************************************************/
@@ -51,95 +51,95 @@ static Word16 interpol_frac[NB_SUBFR] = {14746, 26214, 31457, 32767};
/* isp tables for initialization */
static Word16 isp_init[M] =
{
- 32138, 30274, 27246, 23170, 18205, 12540, 6393, 0,
- -6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475
+ 32138, 30274, 27246, 23170, 18205, 12540, 6393, 0,
+ -6393, -12540, -18205, -23170, -27246, -30274, -32138, 1475
};
static Word16 isf_init[M] =
{
- 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192,
- 9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840
+ 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192,
+ 9216, 10240, 11264, 12288, 13312, 14336, 15360, 3840
};
/* High Band encoding */
static const Word16 HP_gain[16] =
{
- 3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264,
- 11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728
+ 3624, 4673, 5597, 6479, 7425, 8378, 9324, 10264,
+ 11210, 12206, 13391, 14844, 16770, 19655, 24289, 32728
};
/* Private function declaration */
static Word16 synthesis(
- Word16 Aq[], /* A(z) : quantized Az */
- Word16 exc[], /* (i) : excitation at 12kHz */
- Word16 Q_new, /* (i) : scaling performed on exc */
- Word16 synth16k[], /* (o) : 16kHz synthesis signal */
- Coder_State * st /* (i/o) : State structure */
- );
+ Word16 Aq[], /* A(z) : quantized Az */
+ Word16 exc[], /* (i) : excitation at 12kHz */
+ Word16 Q_new, /* (i) : scaling performed on exc */
+ Word16 synth16k[], /* (o) : 16kHz synthesis signal */
+ Coder_State * st /* (i/o) : State structure */
+ );
/* Codec some parameters initialization */
void Reset_encoder(void *st, Word16 reset_all)
{
- Word16 i;
- Coder_State *cod_state;
- cod_state = (Coder_State *) st;
- Set_zero(cod_state->old_exc, PIT_MAX + L_INTERPOL);
- Set_zero(cod_state->mem_syn, M);
- Set_zero(cod_state->past_isfq, M);
- cod_state->mem_w0 = 0;
- cod_state->tilt_code = 0;
- cod_state->first_frame = 1;
- Init_gp_clip(cod_state->gp_clip);
- cod_state->L_gc_thres = 0;
- if (reset_all != 0)
- {
- /* Static vectors to zero */
- Set_zero(cod_state->old_speech, L_TOTAL - L_FRAME);
- Set_zero(cod_state->old_wsp, (PIT_MAX / OPL_DECIM));
- Set_zero(cod_state->mem_decim2, 3);
- /* routines initialization */
- Init_Decim_12k8(cod_state->mem_decim);
- Init_HP50_12k8(cod_state->mem_sig_in);
- Init_Levinson(cod_state->mem_levinson);
- Init_Q_gain2(cod_state->qua_gain);
- Init_Hp_wsp(cod_state->hp_wsp_mem);
- /* isp initialization */
- Copy(isp_init, cod_state->ispold, M);
- Copy(isp_init, cod_state->ispold_q, M);
- /* variable initialization */
- cod_state->mem_preemph = 0;
- cod_state->mem_wsp = 0;
- cod_state->Q_old = 15;
- cod_state->Q_max[0] = 15;
- cod_state->Q_max[1] = 15;
- cod_state->old_wsp_max = 0;
- cod_state->old_wsp_shift = 0;
- /* pitch ol initialization */
- cod_state->old_T0_med = 40;
- cod_state->ol_gain = 0;
- cod_state->ada_w = 0;
- cod_state->ol_wght_flg = 0;
- for (i = 0; i < 5; i++)
- {
- cod_state->old_ol_lag[i] = 40;
- }
- Set_zero(cod_state->old_hp_wsp, (L_FRAME / 2) / OPL_DECIM + (PIT_MAX / OPL_DECIM));
- Set_zero(cod_state->mem_syn_hf, M);
- Set_zero(cod_state->mem_syn_hi, M);
- Set_zero(cod_state->mem_syn_lo, M);
- Init_HP50_12k8(cod_state->mem_sig_out);
- Init_Filt_6k_7k(cod_state->mem_hf);
- Init_HP400_12k8(cod_state->mem_hp400);
- Copy(isf_init, cod_state->isfold, M);
- cod_state->mem_deemph = 0;
- cod_state->seed2 = 21845;
- Init_Filt_6k_7k(cod_state->mem_hf2);
- cod_state->gain_alpha = 32767;
- cod_state->vad_hist = 0;
- wb_vad_reset(cod_state->vadSt);
- dtx_enc_reset(cod_state->dtx_encSt, isf_init);
- }
- return;
+ Word16 i;
+ Coder_State *cod_state;
+ cod_state = (Coder_State *) st;
+ Set_zero(cod_state->old_exc, PIT_MAX + L_INTERPOL);
+ Set_zero(cod_state->mem_syn, M);
+ Set_zero(cod_state->past_isfq, M);
+ cod_state->mem_w0 = 0;
+ cod_state->tilt_code = 0;
+ cod_state->first_frame = 1;
+ Init_gp_clip(cod_state->gp_clip);
+ cod_state->L_gc_thres = 0;
+ if (reset_all != 0)
+ {
+ /* Static vectors to zero */
+ Set_zero(cod_state->old_speech, L_TOTAL - L_FRAME);
+ Set_zero(cod_state->old_wsp, (PIT_MAX / OPL_DECIM));
+ Set_zero(cod_state->mem_decim2, 3);
+ /* routines initialization */
+ Init_Decim_12k8(cod_state->mem_decim);
+ Init_HP50_12k8(cod_state->mem_sig_in);
+ Init_Levinson(cod_state->mem_levinson);
+ Init_Q_gain2(cod_state->qua_gain);
+ Init_Hp_wsp(cod_state->hp_wsp_mem);
+ /* isp initialization */
+ Copy(isp_init, cod_state->ispold, M);
+ Copy(isp_init, cod_state->ispold_q, M);
+ /* variable initialization */
+ cod_state->mem_preemph = 0;
+ cod_state->mem_wsp = 0;
+ cod_state->Q_old = 15;
+ cod_state->Q_max[0] = 15;
+ cod_state->Q_max[1] = 15;
+ cod_state->old_wsp_max = 0;
+ cod_state->old_wsp_shift = 0;
+ /* pitch ol initialization */
+ cod_state->old_T0_med = 40;
+ cod_state->ol_gain = 0;
+ cod_state->ada_w = 0;
+ cod_state->ol_wght_flg = 0;
+ for (i = 0; i < 5; i++)
+ {
+ cod_state->old_ol_lag[i] = 40;
+ }
+ Set_zero(cod_state->old_hp_wsp, (L_FRAME / 2) / OPL_DECIM + (PIT_MAX / OPL_DECIM));
+ Set_zero(cod_state->mem_syn_hf, M);
+ Set_zero(cod_state->mem_syn_hi, M);
+ Set_zero(cod_state->mem_syn_lo, M);
+ Init_HP50_12k8(cod_state->mem_sig_out);
+ Init_Filt_6k_7k(cod_state->mem_hf);
+ Init_HP400_12k8(cod_state->mem_hp400);
+ Copy(isf_init, cod_state->isfold, M);
+ cod_state->mem_deemph = 0;
+ cod_state->seed2 = 21845;
+ Init_Filt_6k_7k(cod_state->mem_hf2);
+ cod_state->gain_alpha = 32767;
+ cod_state->vad_hist = 0;
+ wb_vad_reset(cod_state->vadSt);
+ dtx_enc_reset(cod_state->dtx_encSt, isf_init);
+ }
+ return;
}
/*-----------------------------------------------------------------*
@@ -149,1176 +149,1180 @@ void Reset_encoder(void *st, Word16 reset_all)
* *
*-----------------------------------------------------------------*/
void coder(
- Word16 * mode, /* input : used mode */
- Word16 speech16k[], /* input : 320 new speech samples (at 16 kHz) */
- Word16 prms[], /* output: output parameters */
- Word16 * ser_size, /* output: bit rate of the used mode */
- void *spe_state, /* i/o : State structure */
- Word16 allow_dtx /* input : DTX ON/OFF */
- )
+ Word16 * mode, /* input : used mode */
+ Word16 speech16k[], /* input : 320 new speech samples (at 16 kHz) */
+ Word16 prms[], /* output: output parameters */
+ Word16 * ser_size, /* output: bit rate of the used mode */
+ void *spe_state, /* i/o : State structure */
+ Word16 allow_dtx /* input : DTX ON/OFF */
+ )
{
- /* Coder states */
- Coder_State *st;
- /* Speech vector */
- Word16 old_speech[L_TOTAL];
- Word16 *new_speech, *speech, *p_window;
-
- /* Weighted speech vector */
- Word16 old_wsp[L_FRAME + (PIT_MAX / OPL_DECIM)];
- Word16 *wsp;
-
- /* Excitation vector */
- Word16 old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL];
- Word16 *exc;
-
- /* LPC coefficients */
- Word16 r_h[M + 1], r_l[M + 1]; /* Autocorrelations of windowed speech */
- Word16 rc[M]; /* Reflection coefficients. */
- Word16 Ap[M + 1]; /* A(z) with spectral expansion */
- Word16 ispnew[M]; /* immittance spectral pairs at 4nd sfr */
- Word16 ispnew_q[M]; /* quantized ISPs at 4nd subframe */
- Word16 isf[M]; /* ISF (frequency domain) at 4nd sfr */
- Word16 *p_A, *p_Aq; /* ptr to A(z) for the 4 subframes */
- Word16 A[NB_SUBFR * (M + 1)]; /* A(z) unquantized for the 4 subframes */
- Word16 Aq[NB_SUBFR * (M + 1)]; /* A(z) quantized for the 4 subframes */
-
- /* Other vectors */
- Word16 xn[L_SUBFR]; /* Target vector for pitch search */
- Word16 xn2[L_SUBFR]; /* Target vector for codebook search */
- Word16 dn[L_SUBFR]; /* Correlation between xn2 and h1 */
- Word16 cn[L_SUBFR]; /* Target vector in residual domain */
- Word16 h1[L_SUBFR]; /* Impulse response vector */
- Word16 h2[L_SUBFR]; /* Impulse response vector */
- Word16 code[L_SUBFR]; /* Fixed codebook excitation */
- Word16 y1[L_SUBFR]; /* Filtered adaptive excitation */
- Word16 y2[L_SUBFR]; /* Filtered adaptive excitation */
- Word16 error[M + L_SUBFR]; /* error of quantization */
- Word16 synth[L_SUBFR]; /* 12.8kHz synthesis vector */
- Word16 exc2[L_FRAME]; /* excitation vector */
- Word16 buf[L_FRAME]; /* VAD buffer */
-
- /* Scalars */
- Word32 i, j, i_subfr, select, pit_flag, clip_gain, vad_flag;
- Word16 codec_mode;
- Word16 T_op, T_op2, T0, T0_min, T0_max, T0_frac, index;
- Word16 gain_pit, gain_code, g_coeff[4], g_coeff2[4];
- Word16 tmp, gain1, gain2, exp, Q_new, mu, shift, max;
- Word16 voice_fac;
- Word16 indice[8];
- Word32 L_tmp, L_gain_code, L_max, L_tmp1;
- Word16 code2[L_SUBFR]; /* Fixed codebook excitation */
- Word16 stab_fac, fac, gain_code_lo;
-
- Word16 corr_gain;
- Word16 *vo_p0, *vo_p1, *vo_p2, *vo_p3;
-
- st = (Coder_State *) spe_state;
-
- *ser_size = nb_of_bits[*mode];
- codec_mode = *mode;
-
- /*--------------------------------------------------------------------------*
- * Initialize pointers to speech vector. *
- * *
- * *
- * |-------|-------|-------|-------|-------|-------| *
- * past sp sf1 sf2 sf3 sf4 L_NEXT *
- * <------- Total speech buffer (L_TOTAL) ------> *
- * old_speech *
- * <------- LPC analysis window (L_WINDOW) ------> *
- * | <-- present frame (L_FRAME) ----> *
- * p_window | <----- new speech (L_FRAME) ----> *
- * | | *
- * speech | *
- * new_speech *
- *--------------------------------------------------------------------------*/
-
- new_speech = old_speech + L_TOTAL - L_FRAME - L_FILT; /* New speech */
- speech = old_speech + L_TOTAL - L_FRAME - L_NEXT; /* Present frame */
- p_window = old_speech + L_TOTAL - L_WINDOW;
-
- exc = old_exc + PIT_MAX + L_INTERPOL;
- wsp = old_wsp + (PIT_MAX / OPL_DECIM);
-
- /* copy coder memory state into working space */
- Copy(st->old_speech, old_speech, L_TOTAL - L_FRAME);
- Copy(st->old_wsp, old_wsp, PIT_MAX / OPL_DECIM);
- Copy(st->old_exc, old_exc, PIT_MAX + L_INTERPOL);
-
- /*---------------------------------------------------------------*
- * Down sampling signal from 16kHz to 12.8kHz *
- * -> The signal is extended by L_FILT samples (padded to zero) *
- * to avoid additional delay (L_FILT samples) in the coder. *
- * The last L_FILT samples are approximated after decimation and *
- * are used (and windowed) only in autocorrelations. *
- *---------------------------------------------------------------*/
-
- Decim_12k8(speech16k, L_FRAME16k, new_speech, st->mem_decim);
-
- /* last L_FILT samples for autocorrelation window */
- Copy(st->mem_decim, code, 2 * L_FILT16k);
- Set_zero(error, L_FILT16k); /* set next sample to zero */
- Decim_12k8(error, L_FILT16k, new_speech + L_FRAME, code);
-
- /*---------------------------------------------------------------*
- * Perform 50Hz HP filtering of input signal. *
- *---------------------------------------------------------------*/
-
- HP50_12k8(new_speech, L_FRAME, st->mem_sig_in);
-
- /* last L_FILT samples for autocorrelation window */
- Copy(st->mem_sig_in, code, 6);
- HP50_12k8(new_speech + L_FRAME, L_FILT, code);
-
- /*---------------------------------------------------------------*
- * Perform fixed preemphasis through 1 - g z^-1 *
- * Scale signal to get maximum of precision in filtering *
- *---------------------------------------------------------------*/
-
- mu = PREEMPH_FAC >> 1; /* Q15 --> Q14 */
-
- /* get max of new preemphased samples (L_FRAME+L_FILT) */
- L_tmp = new_speech[0] << 15;
- L_tmp -= (st->mem_preemph * mu)<<1;
- L_max = L_abs(L_tmp);
-
- for (i = 1; i < L_FRAME + L_FILT; i++)
- {
- L_tmp = new_speech[i] << 15;
- L_tmp -= (new_speech[i - 1] * mu)<<1;
- L_tmp = L_abs(L_tmp);
- if(L_tmp > L_max)
- {
- L_max = L_tmp;
- }
- }
-
- /* get scaling factor for new and previous samples */
- /* limit scaling to Q_MAX to keep dynamic for ringing in low signal */
- /* limit scaling to Q_MAX also to avoid a[0]<1 in syn_filt_32 */
- tmp = extract_h(L_max);
- if (tmp == 0)
- {
- shift = Q_MAX;
- } else
- {
- shift = norm_s(tmp) - 1;
- if (shift < 0)
- {
- shift = 0;
- }
- if (shift > Q_MAX)
- {
- shift = Q_MAX;
- }
- }
- Q_new = shift;
- if (Q_new > st->Q_max[0])
- {
- Q_new = st->Q_max[0];
- }
- if (Q_new > st->Q_max[1])
- {
- Q_new = st->Q_max[1];
- }
- exp = (Q_new - st->Q_old);
- st->Q_old = Q_new;
- st->Q_max[1] = st->Q_max[0];
- st->Q_max[0] = shift;
-
- /* preemphasis with scaling (L_FRAME+L_FILT) */
- tmp = new_speech[L_FRAME - 1];
-
- for (i = L_FRAME + L_FILT - 1; i > 0; i--)
- {
- L_tmp = new_speech[i] << 15;
- L_tmp -= (new_speech[i - 1] * mu)<<1;
- L_tmp = (L_tmp << Q_new);
- new_speech[i] = vo_round(L_tmp);
- }
-
- L_tmp = new_speech[0] << 15;
- L_tmp -= (st->mem_preemph * mu)<<1;
- L_tmp = (L_tmp << Q_new);
- new_speech[0] = vo_round(L_tmp);
-
- st->mem_preemph = tmp;
-
- /* scale previous samples and memory */
-
- Scale_sig(old_speech, L_TOTAL - L_FRAME - L_FILT, exp);
- Scale_sig(old_exc, PIT_MAX + L_INTERPOL, exp);
- Scale_sig(st->mem_syn, M, exp);
- Scale_sig(st->mem_decim2, 3, exp);
- Scale_sig(&(st->mem_wsp), 1, exp);
- Scale_sig(&(st->mem_w0), 1, exp);
-
- /*------------------------------------------------------------------------*
- * Call VAD *
- * Preemphesis scale down signal in low frequency and keep dynamic in HF.*
- * Vad work slightly in futur (new_speech = speech + L_NEXT - L_FILT). *
- *------------------------------------------------------------------------*/
- Copy(new_speech, buf, L_FRAME);
+ /* Coder states */
+ Coder_State *st;
+ /* Speech vector */
+ Word16 old_speech[L_TOTAL];
+ Word16 *new_speech, *speech, *p_window;
+
+ /* Weighted speech vector */
+ Word16 old_wsp[L_FRAME + (PIT_MAX / OPL_DECIM)];
+ Word16 *wsp;
+
+ /* Excitation vector */
+ Word16 old_exc[(L_FRAME + 1) + PIT_MAX + L_INTERPOL];
+ Word16 *exc;
+
+ /* LPC coefficients */
+ Word16 r_h[M + 1], r_l[M + 1]; /* Autocorrelations of windowed speech */
+ Word16 rc[M]; /* Reflection coefficients. */
+ Word16 Ap[M + 1]; /* A(z) with spectral expansion */
+ Word16 ispnew[M]; /* immittance spectral pairs at 4nd sfr */
+ Word16 ispnew_q[M]; /* quantized ISPs at 4nd subframe */
+ Word16 isf[M]; /* ISF (frequency domain) at 4nd sfr */
+ Word16 *p_A, *p_Aq; /* ptr to A(z) for the 4 subframes */
+ Word16 A[NB_SUBFR * (M + 1)]; /* A(z) unquantized for the 4 subframes */
+ Word16 Aq[NB_SUBFR * (M + 1)]; /* A(z) quantized for the 4 subframes */
+
+ /* Other vectors */
+ Word16 xn[L_SUBFR]; /* Target vector for pitch search */
+ Word16 xn2[L_SUBFR]; /* Target vector for codebook search */
+ Word16 dn[L_SUBFR]; /* Correlation between xn2 and h1 */
+ Word16 cn[L_SUBFR]; /* Target vector in residual domain */
+ Word16 h1[L_SUBFR]; /* Impulse response vector */
+ Word16 h2[L_SUBFR]; /* Impulse response vector */
+ Word16 code[L_SUBFR]; /* Fixed codebook excitation */
+ Word16 y1[L_SUBFR]; /* Filtered adaptive excitation */
+ Word16 y2[L_SUBFR]; /* Filtered adaptive excitation */
+ Word16 error[M + L_SUBFR]; /* error of quantization */
+ Word16 synth[L_SUBFR]; /* 12.8kHz synthesis vector */
+ Word16 exc2[L_FRAME]; /* excitation vector */
+ Word16 buf[L_FRAME]; /* VAD buffer */
+
+ /* Scalars */
+ Word32 i, j, i_subfr, select, pit_flag, clip_gain, vad_flag;
+ Word16 codec_mode;
+ Word16 T_op, T_op2, T0, T0_min, T0_max, T0_frac, index;
+ Word16 gain_pit, gain_code, g_coeff[4], g_coeff2[4];
+ Word16 tmp, gain1, gain2, exp, Q_new, mu, shift, max;
+ Word16 voice_fac;
+ Word16 indice[8];
+ Word32 L_tmp, L_gain_code, L_max, L_tmp1;
+ Word16 code2[L_SUBFR]; /* Fixed codebook excitation */
+ Word16 stab_fac, fac, gain_code_lo;
+
+ Word16 corr_gain;
+ Word16 *vo_p0, *vo_p1, *vo_p2, *vo_p3;
+
+ st = (Coder_State *) spe_state;
+
+ *ser_size = nb_of_bits[*mode];
+ codec_mode = *mode;
+
+ /*--------------------------------------------------------------------------*
+ * Initialize pointers to speech vector. *
+ * *
+ * *
+ * |-------|-------|-------|-------|-------|-------| *
+ * past sp sf1 sf2 sf3 sf4 L_NEXT *
+ * <------- Total speech buffer (L_TOTAL) ------> *
+ * old_speech *
+ * <------- LPC analysis window (L_WINDOW) ------> *
+ * | <-- present frame (L_FRAME) ----> *
+ * p_window | <----- new speech (L_FRAME) ----> *
+ * | | *
+ * speech | *
+ * new_speech *
+ *--------------------------------------------------------------------------*/
+
+ new_speech = old_speech + L_TOTAL - L_FRAME - L_FILT; /* New speech */
+ speech = old_speech + L_TOTAL - L_FRAME - L_NEXT; /* Present frame */
+ p_window = old_speech + L_TOTAL - L_WINDOW;
+
+ exc = old_exc + PIT_MAX + L_INTERPOL;
+ wsp = old_wsp + (PIT_MAX / OPL_DECIM);
+
+ /* copy coder memory state into working space */
+ Copy(st->old_speech, old_speech, L_TOTAL - L_FRAME);
+ Copy(st->old_wsp, old_wsp, PIT_MAX / OPL_DECIM);
+ Copy(st->old_exc, old_exc, PIT_MAX + L_INTERPOL);
+
+ /*---------------------------------------------------------------*
+ * Down sampling signal from 16kHz to 12.8kHz *
+ * -> The signal is extended by L_FILT samples (padded to zero) *
+ * to avoid additional delay (L_FILT samples) in the coder. *
+ * The last L_FILT samples are approximated after decimation and *
+ * are used (and windowed) only in autocorrelations. *
+ *---------------------------------------------------------------*/
+
+ Decim_12k8(speech16k, L_FRAME16k, new_speech, st->mem_decim);
+
+ /* last L_FILT samples for autocorrelation window */
+ Copy(st->mem_decim, code, 2 * L_FILT16k);
+ Set_zero(error, L_FILT16k); /* set next sample to zero */
+ Decim_12k8(error, L_FILT16k, new_speech + L_FRAME, code);
+
+ /*---------------------------------------------------------------*
+ * Perform 50Hz HP filtering of input signal. *
+ *---------------------------------------------------------------*/
+
+ HP50_12k8(new_speech, L_FRAME, st->mem_sig_in);
+
+ /* last L_FILT samples for autocorrelation window */
+ Copy(st->mem_sig_in, code, 6);
+ HP50_12k8(new_speech + L_FRAME, L_FILT, code);
+
+ /*---------------------------------------------------------------*
+ * Perform fixed preemphasis through 1 - g z^-1 *
+ * Scale signal to get maximum of precision in filtering *
+ *---------------------------------------------------------------*/
+
+ mu = PREEMPH_FAC >> 1; /* Q15 --> Q14 */
+
+ /* get max of new preemphased samples (L_FRAME+L_FILT) */
+ L_tmp = new_speech[0] << 15;
+ L_tmp -= (st->mem_preemph * mu)<<1;
+ L_max = L_abs(L_tmp);
+
+ for (i = 1; i < L_FRAME + L_FILT; i++)
+ {
+ L_tmp = new_speech[i] << 15;
+ L_tmp -= (new_speech[i - 1] * mu)<<1;
+ L_tmp = L_abs(L_tmp);
+ if(L_tmp > L_max)
+ {
+ L_max = L_tmp;
+ }
+ }
+
+ /* get scaling factor for new and previous samples */
+ /* limit scaling to Q_MAX to keep dynamic for ringing in low signal */
+ /* limit scaling to Q_MAX also to avoid a[0]<1 in syn_filt_32 */
+ tmp = extract_h(L_max);
+ if (tmp == 0)
+ {
+ shift = Q_MAX;
+ } else
+ {
+ shift = norm_s(tmp) - 1;
+ if (shift < 0)
+ {
+ shift = 0;
+ }
+ if (shift > Q_MAX)
+ {
+ shift = Q_MAX;
+ }
+ }
+ Q_new = shift;
+ if (Q_new > st->Q_max[0])
+ {
+ Q_new = st->Q_max[0];
+ }
+ if (Q_new > st->Q_max[1])
+ {
+ Q_new = st->Q_max[1];
+ }
+ exp = (Q_new - st->Q_old);
+ st->Q_old = Q_new;
+ st->Q_max[1] = st->Q_max[0];
+ st->Q_max[0] = shift;
+
+ /* preemphasis with scaling (L_FRAME+L_FILT) */
+ tmp = new_speech[L_FRAME - 1];
+
+ for (i = L_FRAME + L_FILT - 1; i > 0; i--)
+ {
+ L_tmp = new_speech[i] << 15;
+ L_tmp -= (new_speech[i - 1] * mu)<<1;
+ L_tmp = (L_tmp << Q_new);
+ new_speech[i] = vo_round(L_tmp);
+ }
+
+ L_tmp = new_speech[0] << 15;
+ L_tmp -= (st->mem_preemph * mu)<<1;
+ L_tmp = (L_tmp << Q_new);
+ new_speech[0] = vo_round(L_tmp);
+
+ st->mem_preemph = tmp;
+
+ /* scale previous samples and memory */
+
+ Scale_sig(old_speech, L_TOTAL - L_FRAME - L_FILT, exp);
+ Scale_sig(old_exc, PIT_MAX + L_INTERPOL, exp);
+ Scale_sig(st->mem_syn, M, exp);
+ Scale_sig(st->mem_decim2, 3, exp);
+ Scale_sig(&(st->mem_wsp), 1, exp);
+ Scale_sig(&(st->mem_w0), 1, exp);
+
+ /*------------------------------------------------------------------------*
+ * Call VAD *
+ * Preemphesis scale down signal in low frequency and keep dynamic in HF.*
+ * Vad work slightly in futur (new_speech = speech + L_NEXT - L_FILT). *
+ *------------------------------------------------------------------------*/
+ Copy(new_speech, buf, L_FRAME);
#ifdef ASM_OPT /* asm optimization branch */
- Scale_sig_opt(buf, L_FRAME, 1 - Q_new);
+ Scale_sig_opt(buf, L_FRAME, 1 - Q_new);
#else
- Scale_sig(buf, L_FRAME, 1 - Q_new);
+ Scale_sig(buf, L_FRAME, 1 - Q_new);
#endif
- vad_flag = wb_vad(st->vadSt, buf); /* Voice Activity Detection */
- if (vad_flag == 0)
- {
- st->vad_hist = (st->vad_hist + 1);
- } else
- {
- st->vad_hist = 0;
- }
-
- /* DTX processing */
- if (allow_dtx != 0)
- {
- /* Note that mode may change here */
- tx_dtx_handler(st->dtx_encSt, vad_flag, mode);
- *ser_size = nb_of_bits[*mode];
- }
-
- if(*mode != MRDTX)
- {
- Parm_serial(vad_flag, 1, &prms);
- }
- /*------------------------------------------------------------------------*
- * Perform LPC analysis *
- * ~~~~~~~~~~~~~~~~~~~~ *
- * - autocorrelation + lag windowing *
- * - Levinson-durbin algorithm to find a[] *
- * - convert a[] to isp[] *
- * - convert isp[] to isf[] for quantization *
- * - quantize and code the isf[] *
- * - convert isf[] to isp[] for interpolation *
- * - find the interpolated ISPs and convert to a[] for the 4 subframes *
- *------------------------------------------------------------------------*/
-
- /* LP analysis centered at 4nd subframe */
- Autocorr(p_window, M, r_h, r_l); /* Autocorrelations */
- Lag_window(r_h, r_l); /* Lag windowing */
- Levinson(r_h, r_l, A, rc, st->mem_levinson); /* Levinson Durbin */
- Az_isp(A, ispnew, st->ispold); /* From A(z) to ISP */
-
- /* Find the interpolated ISPs and convert to a[] for all subframes */
- Int_isp(st->ispold, ispnew, interpol_frac, A);
-
- /* update ispold[] for the next frame */
- Copy(ispnew, st->ispold, M);
-
- /* Convert ISPs to frequency domain 0..6400 */
- Isp_isf(ispnew, isf, M);
-
- /* check resonance for pitch clipping algorithm */
- Gp_clip_test_isf(isf, st->gp_clip);
-
- /*----------------------------------------------------------------------*
- * Perform PITCH_OL analysis *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~ *
- * - Find the residual res[] for the whole speech frame *
- * - Find the weighted input speech wsp[] for the whole speech frame *
- * - scale wsp[] to avoid overflow in pitch estimation *
- * - Find open loop pitch lag for whole speech frame *
- *----------------------------------------------------------------------*/
- p_A = A;
- for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
- {
- /* Weighting of LPC coefficients */
- Weight_a(p_A, Ap, GAMMA1, M);
+ vad_flag = wb_vad(st->vadSt, buf); /* Voice Activity Detection */
+ if (vad_flag == 0)
+ {
+ st->vad_hist = (st->vad_hist + 1);
+ } else
+ {
+ st->vad_hist = 0;
+ }
+
+ /* DTX processing */
+ if (allow_dtx != 0)
+ {
+ /* Note that mode may change here */
+ tx_dtx_handler(st->dtx_encSt, vad_flag, mode);
+ *ser_size = nb_of_bits[*mode];
+ }
+
+ if(*mode != MRDTX)
+ {
+ Parm_serial(vad_flag, 1, &prms);
+ }
+ /*------------------------------------------------------------------------*
+ * Perform LPC analysis *
+ * ~~~~~~~~~~~~~~~~~~~~ *
+ * - autocorrelation + lag windowing *
+ * - Levinson-durbin algorithm to find a[] *
+ * - convert a[] to isp[] *
+ * - convert isp[] to isf[] for quantization *
+ * - quantize and code the isf[] *
+ * - convert isf[] to isp[] for interpolation *
+ * - find the interpolated ISPs and convert to a[] for the 4 subframes *
+ *------------------------------------------------------------------------*/
+
+ /* LP analysis centered at 4nd subframe */
+ Autocorr(p_window, M, r_h, r_l); /* Autocorrelations */
+ Lag_window(r_h, r_l); /* Lag windowing */
+ Levinson(r_h, r_l, A, rc, st->mem_levinson); /* Levinson Durbin */
+ Az_isp(A, ispnew, st->ispold); /* From A(z) to ISP */
+
+ /* Find the interpolated ISPs and convert to a[] for all subframes */
+ Int_isp(st->ispold, ispnew, interpol_frac, A);
+
+ /* update ispold[] for the next frame */
+ Copy(ispnew, st->ispold, M);
+
+ /* Convert ISPs to frequency domain 0..6400 */
+ Isp_isf(ispnew, isf, M);
+
+ /* check resonance for pitch clipping algorithm */
+ Gp_clip_test_isf(isf, st->gp_clip);
+
+ /*----------------------------------------------------------------------*
+ * Perform PITCH_OL analysis *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~ *
+ * - Find the residual res[] for the whole speech frame *
+ * - Find the weighted input speech wsp[] for the whole speech frame *
+ * - scale wsp[] to avoid overflow in pitch estimation *
+ * - Find open loop pitch lag for whole speech frame *
+ *----------------------------------------------------------------------*/
+ p_A = A;
+ for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+ {
+ /* Weighting of LPC coefficients */
+ Weight_a(p_A, Ap, GAMMA1, M);
#ifdef ASM_OPT /* asm optimization branch */
- Residu_opt(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
+ Residu_opt(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
#else
- Residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
+ Residu(Ap, &speech[i_subfr], &wsp[i_subfr], L_SUBFR);
#endif
- p_A += (M + 1);
- }
-
- Deemph2(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp));
-
- /* find maximum value on wsp[] for 12 bits scaling */
- max = 0;
- for (i = 0; i < L_FRAME; i++)
- {
- tmp = abs_s(wsp[i]);
- if(tmp > max)
- {
- max = tmp;
- }
- }
- tmp = st->old_wsp_max;
- if(max > tmp)
- {
- tmp = max; /* tmp = max(wsp_max, old_wsp_max) */
- }
- st->old_wsp_max = max;
-
- shift = norm_s(tmp) - 3;
- if (shift > 0)
- {
- shift = 0; /* shift = 0..-3 */
- }
- /* decimation of wsp[] to search pitch in LF and to reduce complexity */
- LP_Decim2(wsp, L_FRAME, st->mem_decim2);
-
- /* scale wsp[] in 12 bits to avoid overflow */
+ p_A += (M + 1);
+ }
+
+ Deemph2(wsp, TILT_FAC, L_FRAME, &(st->mem_wsp));
+
+ /* find maximum value on wsp[] for 12 bits scaling */
+ max = 0;
+ for (i = 0; i < L_FRAME; i++)
+ {
+ tmp = abs_s(wsp[i]);
+ if(tmp > max)
+ {
+ max = tmp;
+ }
+ }
+ tmp = st->old_wsp_max;
+ if(max > tmp)
+ {
+ tmp = max; /* tmp = max(wsp_max, old_wsp_max) */
+ }
+ st->old_wsp_max = max;
+
+ shift = norm_s(tmp) - 3;
+ if (shift > 0)
+ {
+ shift = 0; /* shift = 0..-3 */
+ }
+ /* decimation of wsp[] to search pitch in LF and to reduce complexity */
+ LP_Decim2(wsp, L_FRAME, st->mem_decim2);
+
+ /* scale wsp[] in 12 bits to avoid overflow */
#ifdef ASM_OPT /* asm optimization branch */
- Scale_sig_opt(wsp, L_FRAME / OPL_DECIM, shift);
+ Scale_sig_opt(wsp, L_FRAME / OPL_DECIM, shift);
#else
- Scale_sig(wsp, L_FRAME / OPL_DECIM, shift);
+ Scale_sig(wsp, L_FRAME / OPL_DECIM, shift);
#endif
- /* scale old_wsp (warning: exp must be Q_new-Q_old) */
- exp = exp + (shift - st->old_wsp_shift);
- st->old_wsp_shift = shift;
-
- Scale_sig(old_wsp, PIT_MAX / OPL_DECIM, exp);
- Scale_sig(st->old_hp_wsp, PIT_MAX / OPL_DECIM, exp);
-
- scale_mem_Hp_wsp(st->hp_wsp_mem, exp);
-
- /* Find open loop pitch lag for whole speech frame */
-
- if(*ser_size == NBBITS_7k)
- {
- /* Find open loop pitch lag for whole speech frame */
- T_op = Pitch_med_ol(wsp, st, L_FRAME / OPL_DECIM);
- } else
- {
- /* Find open loop pitch lag for first 1/2 frame */
- T_op = Pitch_med_ol(wsp, st, (L_FRAME/2) / OPL_DECIM);
- }
-
- if(st->ol_gain > 19661) /* 0.6 in Q15 */
- {
- st->old_T0_med = Med_olag(T_op, st->old_ol_lag);
- st->ada_w = 32767;
- } else
- {
- st->ada_w = vo_mult(st->ada_w, 29491);
- }
-
- if(st->ada_w < 26214)
- st->ol_wght_flg = 0;
- else
- st->ol_wght_flg = 1;
-
- wb_vad_tone_detection(st->vadSt, st->ol_gain);
- T_op *= OPL_DECIM;
-
- if(*ser_size != NBBITS_7k)
- {
- /* Find open loop pitch lag for second 1/2 frame */
- T_op2 = Pitch_med_ol(wsp + ((L_FRAME / 2) / OPL_DECIM), st, (L_FRAME/2) / OPL_DECIM);
-
- if(st->ol_gain > 19661) /* 0.6 in Q15 */
- {
- st->old_T0_med = Med_olag(T_op2, st->old_ol_lag);
- st->ada_w = 32767;
- } else
- {
- st->ada_w = mult(st->ada_w, 29491);
- }
-
- if(st->ada_w < 26214)
- st->ol_wght_flg = 0;
- else
- st->ol_wght_flg = 1;
-
- wb_vad_tone_detection(st->vadSt, st->ol_gain);
-
- T_op2 *= OPL_DECIM;
-
- } else
- {
- T_op2 = T_op;
- }
- /*----------------------------------------------------------------------*
- * DTX-CNG *
- *----------------------------------------------------------------------*/
- if(*mode == MRDTX) /* CNG mode */
- {
- /* Buffer isf's and energy */
+ /* scale old_wsp (warning: exp must be Q_new-Q_old) */
+ exp = exp + (shift - st->old_wsp_shift);
+ st->old_wsp_shift = shift;
+
+ Scale_sig(old_wsp, PIT_MAX / OPL_DECIM, exp);
+ Scale_sig(st->old_hp_wsp, PIT_MAX / OPL_DECIM, exp);
+
+ scale_mem_Hp_wsp(st->hp_wsp_mem, exp);
+
+ /* Find open loop pitch lag for whole speech frame */
+
+ if(*ser_size == NBBITS_7k)
+ {
+ /* Find open loop pitch lag for whole speech frame */
+ T_op = Pitch_med_ol(wsp, st, L_FRAME / OPL_DECIM);
+ } else
+ {
+ /* Find open loop pitch lag for first 1/2 frame */
+ T_op = Pitch_med_ol(wsp, st, (L_FRAME/2) / OPL_DECIM);
+ }
+
+ if(st->ol_gain > 19661) /* 0.6 in Q15 */
+ {
+ st->old_T0_med = Med_olag(T_op, st->old_ol_lag);
+ st->ada_w = 32767;
+ } else
+ {
+ st->ada_w = vo_mult(st->ada_w, 29491);
+ }
+
+ if(st->ada_w < 26214)
+ st->ol_wght_flg = 0;
+ else
+ st->ol_wght_flg = 1;
+
+ wb_vad_tone_detection(st->vadSt, st->ol_gain);
+ T_op *= OPL_DECIM;
+
+ if(*ser_size != NBBITS_7k)
+ {
+ /* Find open loop pitch lag for second 1/2 frame */
+ T_op2 = Pitch_med_ol(wsp + ((L_FRAME / 2) / OPL_DECIM), st, (L_FRAME/2) / OPL_DECIM);
+
+ if(st->ol_gain > 19661) /* 0.6 in Q15 */
+ {
+ st->old_T0_med = Med_olag(T_op2, st->old_ol_lag);
+ st->ada_w = 32767;
+ } else
+ {
+ st->ada_w = mult(st->ada_w, 29491);
+ }
+
+ if(st->ada_w < 26214)
+ st->ol_wght_flg = 0;
+ else
+ st->ol_wght_flg = 1;
+
+ wb_vad_tone_detection(st->vadSt, st->ol_gain);
+
+ T_op2 *= OPL_DECIM;
+
+ } else
+ {
+ T_op2 = T_op;
+ }
+ /*----------------------------------------------------------------------*
+ * DTX-CNG *
+ *----------------------------------------------------------------------*/
+ if(*mode == MRDTX) /* CNG mode */
+ {
+ /* Buffer isf's and energy */
#ifdef ASM_OPT /* asm optimization branch */
- Residu_opt(&A[3 * (M + 1)], speech, exc, L_FRAME);
+ Residu_opt(&A[3 * (M + 1)], speech, exc, L_FRAME);
#else
- Residu(&A[3 * (M + 1)], speech, exc, L_FRAME);
+ Residu(&A[3 * (M + 1)], speech, exc, L_FRAME);
#endif
- for (i = 0; i < L_FRAME; i++)
- {
- exc2[i] = shr(exc[i], Q_new);
- }
+ for (i = 0; i < L_FRAME; i++)
+ {
+ exc2[i] = shr(exc[i], Q_new);
+ }
- L_tmp = 0;
- for (i = 0; i < L_FRAME; i++)
- L_tmp += (exc2[i] * exc2[i])<<1;
-
- L_tmp >>= 1;
-
- dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
-
- /* Quantize and code the ISFs */
- dtx_enc(st->dtx_encSt, isf, exc2, &prms);
-
- /* Convert ISFs to the cosine domain */
- Isf_isp(isf, ispnew_q, M);
- Isp_Az(ispnew_q, Aq, M, 0);
-
- for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
- {
- corr_gain = synthesis(Aq, &exc2[i_subfr], 0, &speech16k[i_subfr * 5 / 4], st);
- }
- Copy(isf, st->isfold, M);
-
- /* reset speech coder memories */
- Reset_encoder(st, 0);
-
- /*--------------------------------------------------*
- * Update signal for next frame. *
- * -> save past of speech[] and wsp[]. *
- *--------------------------------------------------*/
-
- Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
- Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
-
- return;
- }
- /*----------------------------------------------------------------------*
- * ACELP *
- *----------------------------------------------------------------------*/
-
- /* Quantize and code the ISFs */
-
- if (*ser_size <= NBBITS_7k)
- {
- Qpisf_2s_36b(isf, isf, st->past_isfq, indice, 4);
-
- Parm_serial(indice[0], 8, &prms);
- Parm_serial(indice[1], 8, &prms);
- Parm_serial(indice[2], 7, &prms);
- Parm_serial(indice[3], 7, &prms);
- Parm_serial(indice[4], 6, &prms);
- } else
- {
- Qpisf_2s_46b(isf, isf, st->past_isfq, indice, 4);
-
- Parm_serial(indice[0], 8, &prms);
- Parm_serial(indice[1], 8, &prms);
- Parm_serial(indice[2], 6, &prms);
- Parm_serial(indice[3], 7, &prms);
- Parm_serial(indice[4], 7, &prms);
- Parm_serial(indice[5], 5, &prms);
- Parm_serial(indice[6], 5, &prms);
- }
-
- /* Check stability on isf : distance between old isf and current isf */
-
- L_tmp = 0;
- for (i = 0; i < M - 1; i++)
- {
- tmp = vo_sub(isf[i], st->isfold[i]);
- L_tmp += (tmp * tmp)<<1;
- }
-
- tmp = extract_h(L_shl2(L_tmp, 8));
-
- tmp = vo_mult(tmp, 26214); /* tmp = L_tmp*0.8/256 */
- tmp = vo_sub(20480, tmp); /* 1.25 - tmp (in Q14) */
-
- stab_fac = shl(tmp, 1);
-
- if (stab_fac < 0)
- {
- stab_fac = 0;
- }
- Copy(isf, st->isfold, M);
-
- /* Convert ISFs to the cosine domain */
- Isf_isp(isf, ispnew_q, M);
-
- if (st->first_frame != 0)
- {
- st->first_frame = 0;
- Copy(ispnew_q, st->ispold_q, M);
- }
- /* Find the interpolated ISPs and convert to a[] for all subframes */
-
- Int_isp(st->ispold_q, ispnew_q, interpol_frac, Aq);
-
- /* update ispold[] for the next frame */
- Copy(ispnew_q, st->ispold_q, M);
-
- p_Aq = Aq;
- for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
- {
+ L_tmp = 0;
+ for (i = 0; i < L_FRAME; i++)
+ L_tmp += (exc2[i] * exc2[i])<<1;
+
+ L_tmp >>= 1;
+
+ dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
+
+ /* Quantize and code the ISFs */
+ dtx_enc(st->dtx_encSt, isf, exc2, &prms);
+
+ /* Convert ISFs to the cosine domain */
+ Isf_isp(isf, ispnew_q, M);
+ Isp_Az(ispnew_q, Aq, M, 0);
+
+ for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+ {
+ corr_gain = synthesis(Aq, &exc2[i_subfr], 0, &speech16k[i_subfr * 5 / 4], st);
+ }
+ Copy(isf, st->isfold, M);
+
+ /* reset speech coder memories */
+ Reset_encoder(st, 0);
+
+ /*--------------------------------------------------*
+ * Update signal for next frame. *
+ * -> save past of speech[] and wsp[]. *
+ *--------------------------------------------------*/
+
+ Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
+ Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
+
+ return;
+ }
+ /*----------------------------------------------------------------------*
+ * ACELP *
+ *----------------------------------------------------------------------*/
+
+ /* Quantize and code the ISFs */
+
+ if (*ser_size <= NBBITS_7k)
+ {
+ Qpisf_2s_36b(isf, isf, st->past_isfq, indice, 4);
+
+ Parm_serial(indice[0], 8, &prms);
+ Parm_serial(indice[1], 8, &prms);
+ Parm_serial(indice[2], 7, &prms);
+ Parm_serial(indice[3], 7, &prms);
+ Parm_serial(indice[4], 6, &prms);
+ } else
+ {
+ Qpisf_2s_46b(isf, isf, st->past_isfq, indice, 4);
+
+ Parm_serial(indice[0], 8, &prms);
+ Parm_serial(indice[1], 8, &prms);
+ Parm_serial(indice[2], 6, &prms);
+ Parm_serial(indice[3], 7, &prms);
+ Parm_serial(indice[4], 7, &prms);
+ Parm_serial(indice[5], 5, &prms);
+ Parm_serial(indice[6], 5, &prms);
+ }
+
+ /* Check stability on isf : distance between old isf and current isf */
+
+ L_tmp = 0;
+ for (i = 0; i < M - 1; i++)
+ {
+ tmp = vo_sub(isf[i], st->isfold[i]);
+ L_tmp += (tmp * tmp)<<1;
+ }
+
+ tmp = extract_h(L_shl2(L_tmp, 8));
+
+ tmp = vo_mult(tmp, 26214); /* tmp = L_tmp*0.8/256 */
+ tmp = vo_sub(20480, tmp); /* 1.25 - tmp (in Q14) */
+
+ stab_fac = shl(tmp, 1);
+
+ if (stab_fac < 0)
+ {
+ stab_fac = 0;
+ }
+ Copy(isf, st->isfold, M);
+
+ /* Convert ISFs to the cosine domain */
+ Isf_isp(isf, ispnew_q, M);
+
+ if (st->first_frame != 0)
+ {
+ st->first_frame = 0;
+ Copy(ispnew_q, st->ispold_q, M);
+ }
+ /* Find the interpolated ISPs and convert to a[] for all subframes */
+
+ Int_isp(st->ispold_q, ispnew_q, interpol_frac, Aq);
+
+ /* update ispold[] for the next frame */
+ Copy(ispnew_q, st->ispold_q, M);
+
+ p_Aq = Aq;
+ for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+ {
#ifdef ASM_OPT /* asm optimization branch */
- Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+ Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
#else
- Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+ Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
#endif
- p_Aq += (M + 1);
- }
-
- /* Buffer isf's and energy for dtx on non-speech frame */
- if (vad_flag == 0)
- {
- for (i = 0; i < L_FRAME; i++)
- {
- exc2[i] = exc[i] >> Q_new;
- }
- L_tmp = 0;
- for (i = 0; i < L_FRAME; i++)
- L_tmp += (exc2[i] * exc2[i])<<1;
- L_tmp >>= 1;
-
- dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
- }
- /* range for closed loop pitch search in 1st subframe */
-
- T0_min = T_op - 8;
- if (T0_min < PIT_MIN)
- {
- T0_min = PIT_MIN;
- }
- T0_max = (T0_min + 15);
-
- if(T0_max > PIT_MAX)
- {
- T0_max = PIT_MAX;
- T0_min = T0_max - 15;
- }
- /*------------------------------------------------------------------------*
- * Loop for every subframe in the analysis frame *
- *------------------------------------------------------------------------*
- * To find the pitch and innovation parameters. The subframe size is *
- * L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times. *
- * - compute the target signal for pitch search *
- * - compute impulse response of weighted synthesis filter (h1[]) *
- * - find the closed-loop pitch parameters *
- * - encode the pitch dealy *
- * - find 2 lt prediction (with / without LP filter for lt pred) *
- * - find 2 pitch gains and choose the best lt prediction. *
- * - find target vector for codebook search *
- * - update the impulse response h1[] for codebook search *
- * - correlation between target vector and impulse response *
- * - codebook search and encoding *
- * - VQ of pitch and codebook gains *
- * - find voicing factor and tilt of code for next subframe. *
- * - update states of weighting filter *
- * - find excitation and synthesis speech *
- *------------------------------------------------------------------------*/
- p_A = A;
- p_Aq = Aq;
- for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
- {
- pit_flag = i_subfr;
- if ((i_subfr == 2 * L_SUBFR) && (*ser_size > NBBITS_7k))
- {
- pit_flag = 0;
- /* range for closed loop pitch search in 3rd subframe */
- T0_min = (T_op2 - 8);
-
- if (T0_min < PIT_MIN)
- {
- T0_min = PIT_MIN;
- }
- T0_max = (T0_min + 15);
- if (T0_max > PIT_MAX)
- {
- T0_max = PIT_MAX;
- T0_min = (T0_max - 15);
- }
- }
- /*-----------------------------------------------------------------------*
- * *
- * Find the target vector for pitch search: *
- * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
- * *
- * |------| res[n] *
- * speech[n]---| A(z) |-------- *
- * |------| | |--------| error[n] |------| *
- * zero -- (-)--| 1/A(z) |-----------| W(z) |-- target *
- * exc |--------| |------| *
- * *
- * Instead of subtracting the zero-input response of filters from *
- * the weighted input speech, the above configuration is used to *
- * compute the target vector. *
- * *
- *-----------------------------------------------------------------------*/
-
- for (i = 0; i < M; i++)
- {
- error[i] = vo_sub(speech[i + i_subfr - M], st->mem_syn[i]);
- }
+ p_Aq += (M + 1);
+ }
+
+ /* Buffer isf's and energy for dtx on non-speech frame */
+ if (vad_flag == 0)
+ {
+ for (i = 0; i < L_FRAME; i++)
+ {
+ exc2[i] = exc[i] >> Q_new;
+ }
+ L_tmp = 0;
+ for (i = 0; i < L_FRAME; i++) {
+ Word32 tmp = L_mult(exc2[i], exc2[i]); // (exc2[i] * exc2[i])<<1;
+ L_tmp = L_add(L_tmp, tmp);
+ }
+ L_tmp >>= 1;
+
+ dtx_buffer(st->dtx_encSt, isf, L_tmp, codec_mode);
+ }
+ /* range for closed loop pitch search in 1st subframe */
+
+ T0_min = T_op - 8;
+ if (T0_min < PIT_MIN)
+ {
+ T0_min = PIT_MIN;
+ }
+ T0_max = (T0_min + 15);
+
+ if(T0_max > PIT_MAX)
+ {
+ T0_max = PIT_MAX;
+ T0_min = T0_max - 15;
+ }
+ /*------------------------------------------------------------------------*
+ * Loop for every subframe in the analysis frame *
+ *------------------------------------------------------------------------*
+ * To find the pitch and innovation parameters. The subframe size is *
+ * L_SUBFR and the loop is repeated L_FRAME/L_SUBFR times. *
+ * - compute the target signal for pitch search *
+ * - compute impulse response of weighted synthesis filter (h1[]) *
+ * - find the closed-loop pitch parameters *
+ * - encode the pitch dealy *
+ * - find 2 lt prediction (with / without LP filter for lt pred) *
+ * - find 2 pitch gains and choose the best lt prediction. *
+ * - find target vector for codebook search *
+ * - update the impulse response h1[] for codebook search *
+ * - correlation between target vector and impulse response *
+ * - codebook search and encoding *
+ * - VQ of pitch and codebook gains *
+ * - find voicing factor and tilt of code for next subframe. *
+ * - update states of weighting filter *
+ * - find excitation and synthesis speech *
+ *------------------------------------------------------------------------*/
+ p_A = A;
+ p_Aq = Aq;
+ for (i_subfr = 0; i_subfr < L_FRAME; i_subfr += L_SUBFR)
+ {
+ pit_flag = i_subfr;
+ if ((i_subfr == 2 * L_SUBFR) && (*ser_size > NBBITS_7k))
+ {
+ pit_flag = 0;
+ /* range for closed loop pitch search in 3rd subframe */
+ T0_min = (T_op2 - 8);
+
+ if (T0_min < PIT_MIN)
+ {
+ T0_min = PIT_MIN;
+ }
+ T0_max = (T0_min + 15);
+ if (T0_max > PIT_MAX)
+ {
+ T0_max = PIT_MAX;
+ T0_min = (T0_max - 15);
+ }
+ }
+ /*-----------------------------------------------------------------------*
+ * *
+ * Find the target vector for pitch search: *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *
+ * *
+ * |------| res[n] *
+ * speech[n]---| A(z) |-------- *
+ * |------| | |--------| error[n] |------| *
+ * zero -- (-)--| 1/A(z) |-----------| W(z) |-- target *
+ * exc |--------| |------| *
+ * *
+ * Instead of subtracting the zero-input response of filters from *
+ * the weighted input speech, the above configuration is used to *
+ * compute the target vector. *
+ * *
+ *-----------------------------------------------------------------------*/
+
+ for (i = 0; i < M; i++)
+ {
+ error[i] = vo_sub(speech[i + i_subfr - M], st->mem_syn[i]);
+ }
#ifdef ASM_OPT /* asm optimization branch */
- Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+ Residu_opt(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
#else
- Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
+ Residu(p_Aq, &speech[i_subfr], &exc[i_subfr], L_SUBFR);
#endif
- Syn_filt(p_Aq, &exc[i_subfr], error + M, L_SUBFR, error, 0);
- Weight_a(p_A, Ap, GAMMA1, M);
+ Syn_filt(p_Aq, &exc[i_subfr], error + M, L_SUBFR, error, 0);
+ Weight_a(p_A, Ap, GAMMA1, M);
#ifdef ASM_OPT /* asm optimization branch */
- Residu_opt(Ap, error + M, xn, L_SUBFR);
+ Residu_opt(Ap, error + M, xn, L_SUBFR);
#else
- Residu(Ap, error + M, xn, L_SUBFR);
+ Residu(Ap, error + M, xn, L_SUBFR);
#endif
- Deemph2(xn, TILT_FAC, L_SUBFR, &(st->mem_w0));
-
- /*----------------------------------------------------------------------*
- * Find approx. target in residual domain "cn[]" for inovation search. *
- *----------------------------------------------------------------------*/
- /* first half: xn[] --> cn[] */
- Set_zero(code, M);
- Copy(xn, code + M, L_SUBFR / 2);
- tmp = 0;
- Preemph2(code + M, TILT_FAC, L_SUBFR / 2, &tmp);
- Weight_a(p_A, Ap, GAMMA1, M);
- Syn_filt(Ap,code + M, code + M, L_SUBFR / 2, code, 0);
+ Deemph2(xn, TILT_FAC, L_SUBFR, &(st->mem_w0));
+
+ /*----------------------------------------------------------------------*
+ * Find approx. target in residual domain "cn[]" for inovation search. *
+ *----------------------------------------------------------------------*/
+ /* first half: xn[] --> cn[] */
+ Set_zero(code, M);
+ Copy(xn, code + M, L_SUBFR / 2);
+ tmp = 0;
+ Preemph2(code + M, TILT_FAC, L_SUBFR / 2, &tmp);
+ Weight_a(p_A, Ap, GAMMA1, M);
+ Syn_filt(Ap,code + M, code + M, L_SUBFR / 2, code, 0);
#ifdef ASM_OPT /* asm optimization branch */
- Residu_opt(p_Aq,code + M, cn, L_SUBFR / 2);
+ Residu_opt(p_Aq,code + M, cn, L_SUBFR / 2);
#else
- Residu(p_Aq,code + M, cn, L_SUBFR / 2);
+ Residu(p_Aq,code + M, cn, L_SUBFR / 2);
#endif
- /* second half: res[] --> cn[] (approximated and faster) */
- Copy(&exc[i_subfr + (L_SUBFR / 2)], cn + (L_SUBFR / 2), L_SUBFR / 2);
-
- /*---------------------------------------------------------------*
- * Compute impulse response, h1[], of weighted synthesis filter *
- *---------------------------------------------------------------*/
-
- Set_zero(error, M + L_SUBFR);
- Weight_a(p_A, error + M, GAMMA1, M);
-
- vo_p0 = error+M;
- vo_p3 = h1;
- for (i = 0; i < L_SUBFR; i++)
- {
- L_tmp = *vo_p0 << 14; /* x4 (Q12 to Q14) */
- vo_p1 = p_Aq + 1;
- vo_p2 = vo_p0-1;
- for (j = 1; j <= M/4; j++)
- {
- L_tmp -= *vo_p1++ * *vo_p2--;
- L_tmp -= *vo_p1++ * *vo_p2--;
- L_tmp -= *vo_p1++ * *vo_p2--;
- L_tmp -= *vo_p1++ * *vo_p2--;
- }
- *vo_p3++ = *vo_p0++ = vo_round((L_tmp <<4));
- }
- /* deemph without division by 2 -> Q14 to Q15 */
- tmp = 0;
- Deemph2(h1, TILT_FAC, L_SUBFR, &tmp); /* h1 in Q14 */
-
- /* h2 in Q12 for codebook search */
- Copy(h1, h2, L_SUBFR);
-
- /*---------------------------------------------------------------*
- * scale xn[] and h1[] to avoid overflow in dot_product12() *
- *---------------------------------------------------------------*/
+ /* second half: res[] --> cn[] (approximated and faster) */
+ Copy(&exc[i_subfr + (L_SUBFR / 2)], cn + (L_SUBFR / 2), L_SUBFR / 2);
+
+ /*---------------------------------------------------------------*
+ * Compute impulse response, h1[], of weighted synthesis filter *
+ *---------------------------------------------------------------*/
+
+ Set_zero(error, M + L_SUBFR);
+ Weight_a(p_A, error + M, GAMMA1, M);
+
+ vo_p0 = error+M;
+ vo_p3 = h1;
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ L_tmp = *vo_p0 << 14; /* x4 (Q12 to Q14) */
+ vo_p1 = p_Aq + 1;
+ vo_p2 = vo_p0-1;
+ for (j = 1; j <= M/4; j++)
+ {
+ L_tmp -= *vo_p1++ * *vo_p2--;
+ L_tmp -= *vo_p1++ * *vo_p2--;
+ L_tmp -= *vo_p1++ * *vo_p2--;
+ L_tmp -= *vo_p1++ * *vo_p2--;
+ }
+ *vo_p3++ = *vo_p0++ = vo_round((L_tmp <<4));
+ }
+ /* deemph without division by 2 -> Q14 to Q15 */
+ tmp = 0;
+ Deemph2(h1, TILT_FAC, L_SUBFR, &tmp); /* h1 in Q14 */
+
+ /* h2 in Q12 for codebook search */
+ Copy(h1, h2, L_SUBFR);
+
+ /*---------------------------------------------------------------*
+ * scale xn[] and h1[] to avoid overflow in dot_product12() *
+ *---------------------------------------------------------------*/
#ifdef ASM_OPT /* asm optimization branch */
- Scale_sig_opt(h2, L_SUBFR, -2);
- Scale_sig_opt(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */
- Scale_sig_opt(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */
+ Scale_sig_opt(h2, L_SUBFR, -2);
+ Scale_sig_opt(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */
+ Scale_sig_opt(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */
#else
- Scale_sig(h2, L_SUBFR, -2);
- Scale_sig(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */
- Scale_sig(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */
+ Scale_sig(h2, L_SUBFR, -2);
+ Scale_sig(xn, L_SUBFR, shift); /* scaling of xn[] to limit dynamic at 12 bits */
+ Scale_sig(h1, L_SUBFR, 1 + shift); /* set h1[] in Q15 with scaling for convolution */
#endif
- /*----------------------------------------------------------------------*
- * Closed-loop fractional pitch search *
- *----------------------------------------------------------------------*/
- /* find closed loop fractional pitch lag */
- if(*ser_size <= NBBITS_9k)
- {
- T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
- pit_flag, PIT_MIN, PIT_FR1_8b, L_SUBFR);
-
- /* encode pitch lag */
- if (pit_flag == 0) /* if 1st/3rd subframe */
- {
- /*--------------------------------------------------------------*
- * The pitch range for the 1st/3rd subframe is encoded with *
- * 8 bits and is divided as follows: *
- * PIT_MIN to PIT_FR1-1 resolution 1/2 (frac = 0 or 2) *
- * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) *
- *--------------------------------------------------------------*/
- if (T0 < PIT_FR1_8b)
- {
- index = ((T0 << 1) + (T0_frac >> 1) - (PIT_MIN<<1));
- } else
- {
- index = ((T0 - PIT_FR1_8b) + ((PIT_FR1_8b - PIT_MIN)*2));
- }
-
- Parm_serial(index, 8, &prms);
-
- /* find T0_min and T0_max for subframe 2 and 4 */
- T0_min = (T0 - 8);
- if (T0_min < PIT_MIN)
- {
- T0_min = PIT_MIN;
- }
- T0_max = T0_min + 15;
- if (T0_max > PIT_MAX)
- {
- T0_max = PIT_MAX;
- T0_min = (T0_max - 15);
- }
- } else
- { /* if subframe 2 or 4 */
- /*--------------------------------------------------------------*
- * The pitch range for subframe 2 or 4 is encoded with 5 bits: *
- * T0_min to T0_max resolution 1/2 (frac = 0 or 2) *
- *--------------------------------------------------------------*/
- i = (T0 - T0_min);
- index = (i << 1) + (T0_frac >> 1);
-
- Parm_serial(index, 5, &prms);
- }
- } else
- {
- T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
- pit_flag, PIT_FR2, PIT_FR1_9b, L_SUBFR);
-
- /* encode pitch lag */
- if (pit_flag == 0) /* if 1st/3rd subframe */
- {
- /*--------------------------------------------------------------*
- * The pitch range for the 1st/3rd subframe is encoded with *
- * 9 bits and is divided as follows: *
- * PIT_MIN to PIT_FR2-1 resolution 1/4 (frac = 0,1,2 or 3) *
- * PIT_FR2 to PIT_FR1-1 resolution 1/2 (frac = 0 or 1) *
- * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) *
- *--------------------------------------------------------------*/
-
- if (T0 < PIT_FR2)
- {
- index = ((T0 << 2) + T0_frac) - (PIT_MIN << 2);
- } else if(T0 < PIT_FR1_9b)
- {
- index = ((((T0 << 1) + (T0_frac >> 1)) - (PIT_FR2<<1)) + ((PIT_FR2 - PIT_MIN)<<2));
- } else
- {
- index = (((T0 - PIT_FR1_9b) + ((PIT_FR2 - PIT_MIN)<<2)) + ((PIT_FR1_9b - PIT_FR2)<<1));
- }
-
- Parm_serial(index, 9, &prms);
-
- /* find T0_min and T0_max for subframe 2 and 4 */
-
- T0_min = (T0 - 8);
- if (T0_min < PIT_MIN)
- {
- T0_min = PIT_MIN;
- }
- T0_max = T0_min + 15;
-
- if (T0_max > PIT_MAX)
- {
- T0_max = PIT_MAX;
- T0_min = (T0_max - 15);
- }
- } else
- { /* if subframe 2 or 4 */
- /*--------------------------------------------------------------*
- * The pitch range for subframe 2 or 4 is encoded with 6 bits: *
- * T0_min to T0_max resolution 1/4 (frac = 0,1,2 or 3) *
- *--------------------------------------------------------------*/
- i = (T0 - T0_min);
- index = (i << 2) + T0_frac;
- Parm_serial(index, 6, &prms);
- }
- }
-
- /*-----------------------------------------------------------------*
- * Gain clipping test to avoid unstable synthesis on frame erasure *
- *-----------------------------------------------------------------*/
-
- clip_gain = 0;
- if((st->gp_clip[0] < 154) && (st->gp_clip[1] > 14746))
- clip_gain = 1;
-
- /*-----------------------------------------------------------------*
- * - find unity gain pitch excitation (adaptive codebook entry) *
- * with fractional interpolation. *
- * - find filtered pitch exc. y1[]=exc[] convolved with h1[]) *
- * - compute pitch gain1 *
- *-----------------------------------------------------------------*/
- /* find pitch exitation */
+ /*----------------------------------------------------------------------*
+ * Closed-loop fractional pitch search *
+ *----------------------------------------------------------------------*/
+ /* find closed loop fractional pitch lag */
+ if(*ser_size <= NBBITS_9k)
+ {
+ T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
+ pit_flag, PIT_MIN, PIT_FR1_8b, L_SUBFR);
+
+ /* encode pitch lag */
+ if (pit_flag == 0) /* if 1st/3rd subframe */
+ {
+ /*--------------------------------------------------------------*
+ * The pitch range for the 1st/3rd subframe is encoded with *
+ * 8 bits and is divided as follows: *
+ * PIT_MIN to PIT_FR1-1 resolution 1/2 (frac = 0 or 2) *
+ * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) *
+ *--------------------------------------------------------------*/
+ if (T0 < PIT_FR1_8b)
+ {
+ index = ((T0 << 1) + (T0_frac >> 1) - (PIT_MIN<<1));
+ } else
+ {
+ index = ((T0 - PIT_FR1_8b) + ((PIT_FR1_8b - PIT_MIN)*2));
+ }
+
+ Parm_serial(index, 8, &prms);
+
+ /* find T0_min and T0_max for subframe 2 and 4 */
+ T0_min = (T0 - 8);
+ if (T0_min < PIT_MIN)
+ {
+ T0_min = PIT_MIN;
+ }
+ T0_max = T0_min + 15;
+ if (T0_max > PIT_MAX)
+ {
+ T0_max = PIT_MAX;
+ T0_min = (T0_max - 15);
+ }
+ } else
+ { /* if subframe 2 or 4 */
+ /*--------------------------------------------------------------*
+ * The pitch range for subframe 2 or 4 is encoded with 5 bits: *
+ * T0_min to T0_max resolution 1/2 (frac = 0 or 2) *
+ *--------------------------------------------------------------*/
+ i = (T0 - T0_min);
+ index = (i << 1) + (T0_frac >> 1);
+
+ Parm_serial(index, 5, &prms);
+ }
+ } else
+ {
+ T0 = Pitch_fr4(&exc[i_subfr], xn, h1, T0_min, T0_max, &T0_frac,
+ pit_flag, PIT_FR2, PIT_FR1_9b, L_SUBFR);
+
+ /* encode pitch lag */
+ if (pit_flag == 0) /* if 1st/3rd subframe */
+ {
+ /*--------------------------------------------------------------*
+ * The pitch range for the 1st/3rd subframe is encoded with *
+ * 9 bits and is divided as follows: *
+ * PIT_MIN to PIT_FR2-1 resolution 1/4 (frac = 0,1,2 or 3) *
+ * PIT_FR2 to PIT_FR1-1 resolution 1/2 (frac = 0 or 1) *
+ * PIT_FR1 to PIT_MAX resolution 1 (frac = 0) *
+ *--------------------------------------------------------------*/
+
+ if (T0 < PIT_FR2)
+ {
+ index = ((T0 << 2) + T0_frac) - (PIT_MIN << 2);
+ } else if(T0 < PIT_FR1_9b)
+ {
+ index = ((((T0 << 1) + (T0_frac >> 1)) - (PIT_FR2<<1)) + ((PIT_FR2 - PIT_MIN)<<2));
+ } else
+ {
+ index = (((T0 - PIT_FR1_9b) + ((PIT_FR2 - PIT_MIN)<<2)) + ((PIT_FR1_9b - PIT_FR2)<<1));
+ }
+
+ Parm_serial(index, 9, &prms);
+
+ /* find T0_min and T0_max for subframe 2 and 4 */
+
+ T0_min = (T0 - 8);
+ if (T0_min < PIT_MIN)
+ {
+ T0_min = PIT_MIN;
+ }
+ T0_max = T0_min + 15;
+
+ if (T0_max > PIT_MAX)
+ {
+ T0_max = PIT_MAX;
+ T0_min = (T0_max - 15);
+ }
+ } else
+ { /* if subframe 2 or 4 */
+ /*--------------------------------------------------------------*
+ * The pitch range for subframe 2 or 4 is encoded with 6 bits: *
+ * T0_min to T0_max resolution 1/4 (frac = 0,1,2 or 3) *
+ *--------------------------------------------------------------*/
+ i = (T0 - T0_min);
+ index = (i << 2) + T0_frac;
+ Parm_serial(index, 6, &prms);
+ }
+ }
+
+ /*-----------------------------------------------------------------*
+ * Gain clipping test to avoid unstable synthesis on frame erasure *
+ *-----------------------------------------------------------------*/
+
+ clip_gain = 0;
+ if((st->gp_clip[0] < 154) && (st->gp_clip[1] > 14746))
+ clip_gain = 1;
+
+ /*-----------------------------------------------------------------*
+ * - find unity gain pitch excitation (adaptive codebook entry) *
+ * with fractional interpolation. *
+ * - find filtered pitch exc. y1[]=exc[] convolved with h1[]) *
+ * - compute pitch gain1 *
+ *-----------------------------------------------------------------*/
+ /* find pitch exitation */
#ifdef ASM_OPT /* asm optimization branch */
- pred_lt4_asm(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
+ pred_lt4_asm(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
#else
- Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
+ Pred_lt4(&exc[i_subfr], T0, T0_frac, L_SUBFR + 1);
#endif
- if (*ser_size > NBBITS_9k)
- {
+ if (*ser_size > NBBITS_9k)
+ {
#ifdef ASM_OPT /* asm optimization branch */
- Convolve_asm(&exc[i_subfr], h1, y1, L_SUBFR);
+ Convolve_asm(&exc[i_subfr], h1, y1, L_SUBFR);
#else
- Convolve(&exc[i_subfr], h1, y1, L_SUBFR);
+ Convolve(&exc[i_subfr], h1, y1, L_SUBFR);
#endif
- gain1 = G_pitch(xn, y1, g_coeff, L_SUBFR);
- /* clip gain if necessary to avoid problem at decoder */
- if ((clip_gain != 0) && (gain1 > GP_CLIP))
- {
- gain1 = GP_CLIP;
- }
- /* find energy of new target xn2[] */
- Updt_tar(xn, dn, y1, gain1, L_SUBFR); /* dn used temporary */
- } else
- {
- gain1 = 0;
- }
- /*-----------------------------------------------------------------*
- * - find pitch excitation filtered by 1st order LP filter. *
- * - find filtered pitch exc. y2[]=exc[] convolved with h1[]) *
- * - compute pitch gain2 *
- *-----------------------------------------------------------------*/
- /* find pitch excitation with lp filter */
- vo_p0 = exc + i_subfr-1;
- vo_p1 = code;
- /* find pitch excitation with lp filter */
- for (i = 0; i < L_SUBFR/2; i++)
- {
- L_tmp = 5898 * *vo_p0++;
- L_tmp1 = 5898 * *vo_p0;
- L_tmp += 20972 * *vo_p0++;
- L_tmp1 += 20972 * *vo_p0++;
- L_tmp1 += 5898 * *vo_p0--;
- L_tmp += 5898 * *vo_p0;
- *vo_p1++ = (L_tmp + 0x4000)>>15;
- *vo_p1++ = (L_tmp1 + 0x4000)>>15;
- }
+ gain1 = G_pitch(xn, y1, g_coeff, L_SUBFR);
+ /* clip gain if necessary to avoid problem at decoder */
+ if ((clip_gain != 0) && (gain1 > GP_CLIP))
+ {
+ gain1 = GP_CLIP;
+ }
+ /* find energy of new target xn2[] */
+ Updt_tar(xn, dn, y1, gain1, L_SUBFR); /* dn used temporary */
+ } else
+ {
+ gain1 = 0;
+ }
+ /*-----------------------------------------------------------------*
+ * - find pitch excitation filtered by 1st order LP filter. *
+ * - find filtered pitch exc. y2[]=exc[] convolved with h1[]) *
+ * - compute pitch gain2 *
+ *-----------------------------------------------------------------*/
+ /* find pitch excitation with lp filter */
+ vo_p0 = exc + i_subfr-1;
+ vo_p1 = code;
+ /* find pitch excitation with lp filter */
+ for (i = 0; i < L_SUBFR/2; i++)
+ {
+ L_tmp = 5898 * *vo_p0++;
+ L_tmp1 = 5898 * *vo_p0;
+ L_tmp += 20972 * *vo_p0++;
+ L_tmp1 += 20972 * *vo_p0++;
+ L_tmp1 += 5898 * *vo_p0--;
+ L_tmp += 5898 * *vo_p0;
+ *vo_p1++ = (L_tmp + 0x4000)>>15;
+ *vo_p1++ = (L_tmp1 + 0x4000)>>15;
+ }
#ifdef ASM_OPT /* asm optimization branch */
- Convolve_asm(code, h1, y2, L_SUBFR);
+ Convolve_asm(code, h1, y2, L_SUBFR);
#else
- Convolve(code, h1, y2, L_SUBFR);
+ Convolve(code, h1, y2, L_SUBFR);
#endif
- gain2 = G_pitch(xn, y2, g_coeff2, L_SUBFR);
-
- /* clip gain if necessary to avoid problem at decoder */
- if ((clip_gain != 0) && (gain2 > GP_CLIP))
- {
- gain2 = GP_CLIP;
- }
- /* find energy of new target xn2[] */
- Updt_tar(xn, xn2, y2, gain2, L_SUBFR);
- /*-----------------------------------------------------------------*
- * use the best prediction (minimise quadratic error). *
- *-----------------------------------------------------------------*/
- select = 0;
- if(*ser_size > NBBITS_9k)
- {
- L_tmp = 0L;
- vo_p0 = dn;
- vo_p1 = xn2;
- for (i = 0; i < L_SUBFR/2; i++)
- {
- L_tmp += *vo_p0 * *vo_p0;
- vo_p0++;
- L_tmp -= *vo_p1 * *vo_p1;
- vo_p1++;
- L_tmp += *vo_p0 * *vo_p0;
- vo_p0++;
- L_tmp -= *vo_p1 * *vo_p1;
- vo_p1++;
- }
-
- if (L_tmp <= 0)
- {
- select = 1;
- }
- Parm_serial(select, 1, &prms);
- }
- if (select == 0)
- {
- /* use the lp filter for pitch excitation prediction */
- gain_pit = gain2;
- Copy(code, &exc[i_subfr], L_SUBFR);
- Copy(y2, y1, L_SUBFR);
- Copy(g_coeff2, g_coeff, 4);
- } else
- {
- /* no filter used for pitch excitation prediction */
- gain_pit = gain1;
- Copy(dn, xn2, L_SUBFR); /* target vector for codebook search */
- }
- /*-----------------------------------------------------------------*
- * - update cn[] for codebook search *
- *-----------------------------------------------------------------*/
- Updt_tar(cn, cn, &exc[i_subfr], gain_pit, L_SUBFR);
+ gain2 = G_pitch(xn, y2, g_coeff2, L_SUBFR);
+
+ /* clip gain if necessary to avoid problem at decoder */
+ if ((clip_gain != 0) && (gain2 > GP_CLIP))
+ {
+ gain2 = GP_CLIP;
+ }
+ /* find energy of new target xn2[] */
+ Updt_tar(xn, xn2, y2, gain2, L_SUBFR);
+ /*-----------------------------------------------------------------*
+ * use the best prediction (minimise quadratic error). *
+ *-----------------------------------------------------------------*/
+ select = 0;
+ if(*ser_size > NBBITS_9k)
+ {
+ L_tmp = 0L;
+ vo_p0 = dn;
+ vo_p1 = xn2;
+ for (i = 0; i < L_SUBFR/2; i++)
+ {
+ L_tmp += *vo_p0 * *vo_p0;
+ vo_p0++;
+ L_tmp -= *vo_p1 * *vo_p1;
+ vo_p1++;
+ L_tmp += *vo_p0 * *vo_p0;
+ vo_p0++;
+ L_tmp -= *vo_p1 * *vo_p1;
+ vo_p1++;
+ }
+
+ if (L_tmp <= 0)
+ {
+ select = 1;
+ }
+ Parm_serial(select, 1, &prms);
+ }
+ if (select == 0)
+ {
+ /* use the lp filter for pitch excitation prediction */
+ gain_pit = gain2;
+ Copy(code, &exc[i_subfr], L_SUBFR);
+ Copy(y2, y1, L_SUBFR);
+ Copy(g_coeff2, g_coeff, 4);
+ } else
+ {
+ /* no filter used for pitch excitation prediction */
+ gain_pit = gain1;
+ Copy(dn, xn2, L_SUBFR); /* target vector for codebook search */
+ }
+ /*-----------------------------------------------------------------*
+ * - update cn[] for codebook search *
+ *-----------------------------------------------------------------*/
+ Updt_tar(cn, cn, &exc[i_subfr], gain_pit, L_SUBFR);
#ifdef ASM_OPT /* asm optimization branch */
- Scale_sig_opt(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */
+ Scale_sig_opt(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */
#else
- Scale_sig(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */
+ Scale_sig(cn, L_SUBFR, shift); /* scaling of cn[] to limit dynamic at 12 bits */
#endif
- /*-----------------------------------------------------------------*
- * - include fixed-gain pitch contribution into impulse resp. h1[] *
- *-----------------------------------------------------------------*/
- tmp = 0;
- Preemph(h2, st->tilt_code, L_SUBFR, &tmp);
-
- if (T0_frac > 2)
- T0 = (T0 + 1);
- Pit_shrp(h2, T0, PIT_SHARP, L_SUBFR);
- /*-----------------------------------------------------------------*
- * - Correlation between target xn2[] and impulse response h1[] *
- * - Innovative codebook search *
- *-----------------------------------------------------------------*/
- cor_h_x(h2, xn2, dn);
- if (*ser_size <= NBBITS_7k)
- {
- ACELP_2t64_fx(dn, cn, h2, code, y2, indice);
-
- Parm_serial(indice[0], 12, &prms);
- } else if(*ser_size <= NBBITS_9k)
- {
- ACELP_4t64_fx(dn, cn, h2, code, y2, 20, *ser_size, indice);
-
- Parm_serial(indice[0], 5, &prms);
- Parm_serial(indice[1], 5, &prms);
- Parm_serial(indice[2], 5, &prms);
- Parm_serial(indice[3], 5, &prms);
- } else if(*ser_size <= NBBITS_12k)
- {
- ACELP_4t64_fx(dn, cn, h2, code, y2, 36, *ser_size, indice);
-
- Parm_serial(indice[0], 9, &prms);
- Parm_serial(indice[1], 9, &prms);
- Parm_serial(indice[2], 9, &prms);
- Parm_serial(indice[3], 9, &prms);
- } else if(*ser_size <= NBBITS_14k)
- {
- ACELP_4t64_fx(dn, cn, h2, code, y2, 44, *ser_size, indice);
-
- Parm_serial(indice[0], 13, &prms);
- Parm_serial(indice[1], 13, &prms);
- Parm_serial(indice[2], 9, &prms);
- Parm_serial(indice[3], 9, &prms);
- } else if(*ser_size <= NBBITS_16k)
- {
- ACELP_4t64_fx(dn, cn, h2, code, y2, 52, *ser_size, indice);
-
- Parm_serial(indice[0], 13, &prms);
- Parm_serial(indice[1], 13, &prms);
- Parm_serial(indice[2], 13, &prms);
- Parm_serial(indice[3], 13, &prms);
- } else if(*ser_size <= NBBITS_18k)
- {
- ACELP_4t64_fx(dn, cn, h2, code, y2, 64, *ser_size, indice);
-
- Parm_serial(indice[0], 2, &prms);
- Parm_serial(indice[1], 2, &prms);
- Parm_serial(indice[2], 2, &prms);
- Parm_serial(indice[3], 2, &prms);
- Parm_serial(indice[4], 14, &prms);
- Parm_serial(indice[5], 14, &prms);
- Parm_serial(indice[6], 14, &prms);
- Parm_serial(indice[7], 14, &prms);
- } else if(*ser_size <= NBBITS_20k)
- {
- ACELP_4t64_fx(dn, cn, h2, code, y2, 72, *ser_size, indice);
-
- Parm_serial(indice[0], 10, &prms);
- Parm_serial(indice[1], 10, &prms);
- Parm_serial(indice[2], 2, &prms);
- Parm_serial(indice[3], 2, &prms);
- Parm_serial(indice[4], 10, &prms);
- Parm_serial(indice[5], 10, &prms);
- Parm_serial(indice[6], 14, &prms);
- Parm_serial(indice[7], 14, &prms);
- } else
- {
- ACELP_4t64_fx(dn, cn, h2, code, y2, 88, *ser_size, indice);
-
- Parm_serial(indice[0], 11, &prms);
- Parm_serial(indice[1], 11, &prms);
- Parm_serial(indice[2], 11, &prms);
- Parm_serial(indice[3], 11, &prms);
- Parm_serial(indice[4], 11, &prms);
- Parm_serial(indice[5], 11, &prms);
- Parm_serial(indice[6], 11, &prms);
- Parm_serial(indice[7], 11, &prms);
- }
- /*-------------------------------------------------------*
- * - Add the fixed-gain pitch contribution to code[]. *
- *-------------------------------------------------------*/
- tmp = 0;
- Preemph(code, st->tilt_code, L_SUBFR, &tmp);
- Pit_shrp(code, T0, PIT_SHARP, L_SUBFR);
- /*----------------------------------------------------------*
- * - Compute the fixed codebook gain *
- * - quantize fixed codebook gain *
- *----------------------------------------------------------*/
- if(*ser_size <= NBBITS_9k)
- {
- index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 6,
- &gain_pit, &L_gain_code, clip_gain, st->qua_gain);
- Parm_serial(index, 6, &prms);
- } else
- {
- index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 7,
- &gain_pit, &L_gain_code, clip_gain, st->qua_gain);
- Parm_serial(index, 7, &prms);
- }
- /* test quantized gain of pitch for pitch clipping algorithm */
- Gp_clip_test_gain_pit(gain_pit, st->gp_clip);
-
- L_tmp = L_shl(L_gain_code, Q_new);
- gain_code = extract_h(L_add(L_tmp, 0x8000));
-
- /*----------------------------------------------------------*
- * Update parameters for the next subframe. *
- * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced) *
- *----------------------------------------------------------*/
- /* find voice factor in Q15 (1=voiced, -1=unvoiced) */
- Copy(&exc[i_subfr], exc2, L_SUBFR);
+ /*-----------------------------------------------------------------*
+ * - include fixed-gain pitch contribution into impulse resp. h1[] *
+ *-----------------------------------------------------------------*/
+ tmp = 0;
+ Preemph(h2, st->tilt_code, L_SUBFR, &tmp);
+
+ if (T0_frac > 2)
+ T0 = (T0 + 1);
+ Pit_shrp(h2, T0, PIT_SHARP, L_SUBFR);
+ /*-----------------------------------------------------------------*
+ * - Correlation between target xn2[] and impulse response h1[] *
+ * - Innovative codebook search *
+ *-----------------------------------------------------------------*/
+ cor_h_x(h2, xn2, dn);
+ if (*ser_size <= NBBITS_7k)
+ {
+ ACELP_2t64_fx(dn, cn, h2, code, y2, indice);
+
+ Parm_serial(indice[0], 12, &prms);
+ } else if(*ser_size <= NBBITS_9k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 20, *ser_size, indice);
+
+ Parm_serial(indice[0], 5, &prms);
+ Parm_serial(indice[1], 5, &prms);
+ Parm_serial(indice[2], 5, &prms);
+ Parm_serial(indice[3], 5, &prms);
+ } else if(*ser_size <= NBBITS_12k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 36, *ser_size, indice);
+
+ Parm_serial(indice[0], 9, &prms);
+ Parm_serial(indice[1], 9, &prms);
+ Parm_serial(indice[2], 9, &prms);
+ Parm_serial(indice[3], 9, &prms);
+ } else if(*ser_size <= NBBITS_14k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 44, *ser_size, indice);
+
+ Parm_serial(indice[0], 13, &prms);
+ Parm_serial(indice[1], 13, &prms);
+ Parm_serial(indice[2], 9, &prms);
+ Parm_serial(indice[3], 9, &prms);
+ } else if(*ser_size <= NBBITS_16k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 52, *ser_size, indice);
+
+ Parm_serial(indice[0], 13, &prms);
+ Parm_serial(indice[1], 13, &prms);
+ Parm_serial(indice[2], 13, &prms);
+ Parm_serial(indice[3], 13, &prms);
+ } else if(*ser_size <= NBBITS_18k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 64, *ser_size, indice);
+
+ Parm_serial(indice[0], 2, &prms);
+ Parm_serial(indice[1], 2, &prms);
+ Parm_serial(indice[2], 2, &prms);
+ Parm_serial(indice[3], 2, &prms);
+ Parm_serial(indice[4], 14, &prms);
+ Parm_serial(indice[5], 14, &prms);
+ Parm_serial(indice[6], 14, &prms);
+ Parm_serial(indice[7], 14, &prms);
+ } else if(*ser_size <= NBBITS_20k)
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 72, *ser_size, indice);
+
+ Parm_serial(indice[0], 10, &prms);
+ Parm_serial(indice[1], 10, &prms);
+ Parm_serial(indice[2], 2, &prms);
+ Parm_serial(indice[3], 2, &prms);
+ Parm_serial(indice[4], 10, &prms);
+ Parm_serial(indice[5], 10, &prms);
+ Parm_serial(indice[6], 14, &prms);
+ Parm_serial(indice[7], 14, &prms);
+ } else
+ {
+ ACELP_4t64_fx(dn, cn, h2, code, y2, 88, *ser_size, indice);
+
+ Parm_serial(indice[0], 11, &prms);
+ Parm_serial(indice[1], 11, &prms);
+ Parm_serial(indice[2], 11, &prms);
+ Parm_serial(indice[3], 11, &prms);
+ Parm_serial(indice[4], 11, &prms);
+ Parm_serial(indice[5], 11, &prms);
+ Parm_serial(indice[6], 11, &prms);
+ Parm_serial(indice[7], 11, &prms);
+ }
+ /*-------------------------------------------------------*
+ * - Add the fixed-gain pitch contribution to code[]. *
+ *-------------------------------------------------------*/
+ tmp = 0;
+ Preemph(code, st->tilt_code, L_SUBFR, &tmp);
+ Pit_shrp(code, T0, PIT_SHARP, L_SUBFR);
+ /*----------------------------------------------------------*
+ * - Compute the fixed codebook gain *
+ * - quantize fixed codebook gain *
+ *----------------------------------------------------------*/
+ if(*ser_size <= NBBITS_9k)
+ {
+ index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 6,
+ &gain_pit, &L_gain_code, clip_gain, st->qua_gain);
+ Parm_serial(index, 6, &prms);
+ } else
+ {
+ index = Q_gain2(xn, y1, Q_new + shift, y2, code, g_coeff, L_SUBFR, 7,
+ &gain_pit, &L_gain_code, clip_gain, st->qua_gain);
+ Parm_serial(index, 7, &prms);
+ }
+ /* test quantized gain of pitch for pitch clipping algorithm */
+ Gp_clip_test_gain_pit(gain_pit, st->gp_clip);
+
+ L_tmp = L_shl(L_gain_code, Q_new);
+ gain_code = extract_h(L_add(L_tmp, 0x8000));
+
+ /*----------------------------------------------------------*
+ * Update parameters for the next subframe. *
+ * - tilt of code: 0.0 (unvoiced) to 0.5 (voiced) *
+ *----------------------------------------------------------*/
+ /* find voice factor in Q15 (1=voiced, -1=unvoiced) */
+ Copy(&exc[i_subfr], exc2, L_SUBFR);
#ifdef ASM_OPT /* asm optimization branch */
- Scale_sig_opt(exc2, L_SUBFR, shift);
+ Scale_sig_opt(exc2, L_SUBFR, shift);
#else
- Scale_sig(exc2, L_SUBFR, shift);
+ Scale_sig(exc2, L_SUBFR, shift);
#endif
- voice_fac = voice_factor(exc2, shift, gain_pit, code, gain_code, L_SUBFR);
- /* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */
- st->tilt_code = ((voice_fac >> 2) + 8192);
- /*------------------------------------------------------*
- * - Update filter's memory "mem_w0" for finding the *
- * target vector in the next subframe. *
- * - Find the total excitation *
- * - Find synthesis speech to update mem_syn[]. *
- *------------------------------------------------------*/
-
- /* y2 in Q9, gain_pit in Q14 */
- L_tmp = (gain_code * y2[L_SUBFR - 1])<<1;
- L_tmp = L_shl(L_tmp, (5 + shift));
- L_tmp = L_negate(L_tmp);
- L_tmp += (xn[L_SUBFR - 1] * 16384)<<1;
- L_tmp -= (y1[L_SUBFR - 1] * gain_pit)<<1;
- L_tmp = L_shl(L_tmp, (1 - shift));
- st->mem_w0 = extract_h(L_add(L_tmp, 0x8000));
-
- if (*ser_size >= NBBITS_24k)
- Copy(&exc[i_subfr], exc2, L_SUBFR);
-
- for (i = 0; i < L_SUBFR; i++)
- {
- /* code in Q9, gain_pit in Q14 */
- L_tmp = (gain_code * code[i])<<1;
- L_tmp = (L_tmp << 5);
- L_tmp += (exc[i + i_subfr] * gain_pit)<<1;
- L_tmp = L_shl2(L_tmp, 1);
- exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000));
- }
-
- Syn_filt(p_Aq,&exc[i_subfr], synth, L_SUBFR, st->mem_syn, 1);
-
- if(*ser_size >= NBBITS_24k)
- {
- /*------------------------------------------------------------*
- * phase dispersion to enhance noise in low bit rate *
- *------------------------------------------------------------*/
- /* L_gain_code in Q16 */
- VO_L_Extract(L_gain_code, &gain_code, &gain_code_lo);
-
- /*------------------------------------------------------------*
- * noise enhancer *
- * ~~~~~~~~~~~~~~ *
- * - Enhance excitation on noise. (modify gain of code) *
- * If signal is noisy and LPC filter is stable, move gain *
- * of code 1.5 dB toward gain of code threshold. *
- * This decrease by 3 dB noise energy variation. *
- *------------------------------------------------------------*/
- tmp = (16384 - (voice_fac >> 1)); /* 1=unvoiced, 0=voiced */
- fac = vo_mult(stab_fac, tmp);
- L_tmp = L_gain_code;
- if(L_tmp < st->L_gc_thres)
- {
- L_tmp = vo_L_add(L_tmp, Mpy_32_16(gain_code, gain_code_lo, 6226));
- if(L_tmp > st->L_gc_thres)
- {
- L_tmp = st->L_gc_thres;
- }
- } else
- {
- L_tmp = Mpy_32_16(gain_code, gain_code_lo, 27536);
- if(L_tmp < st->L_gc_thres)
- {
- L_tmp = st->L_gc_thres;
- }
- }
- st->L_gc_thres = L_tmp;
-
- L_gain_code = Mpy_32_16(gain_code, gain_code_lo, (32767 - fac));
- VO_L_Extract(L_tmp, &gain_code, &gain_code_lo);
- L_gain_code = vo_L_add(L_gain_code, Mpy_32_16(gain_code, gain_code_lo, fac));
-
- /*------------------------------------------------------------*
- * pitch enhancer *
- * ~~~~~~~~~~~~~~ *
- * - Enhance excitation on voice. (HP filtering of code) *
- * On voiced signal, filtering of code by a smooth fir HP *
- * filter to decrease energy of code in low frequency. *
- *------------------------------------------------------------*/
-
- tmp = ((voice_fac >> 3) + 4096); /* 0.25=voiced, 0=unvoiced */
-
- L_tmp = L_deposit_h(code[0]);
- L_tmp -= (code[1] * tmp)<<1;
- code2[0] = vo_round(L_tmp);
-
- for (i = 1; i < L_SUBFR - 1; i++)
- {
- L_tmp = L_deposit_h(code[i]);
- L_tmp -= (code[i + 1] * tmp)<<1;
- L_tmp -= (code[i - 1] * tmp)<<1;
- code2[i] = vo_round(L_tmp);
- }
-
- L_tmp = L_deposit_h(code[L_SUBFR - 1]);
- L_tmp -= (code[L_SUBFR - 2] * tmp)<<1;
- code2[L_SUBFR - 1] = vo_round(L_tmp);
-
- /* build excitation */
- gain_code = vo_round(L_shl(L_gain_code, Q_new));
-
- for (i = 0; i < L_SUBFR; i++)
- {
- L_tmp = (code2[i] * gain_code)<<1;
- L_tmp = (L_tmp << 5);
- L_tmp += (exc2[i] * gain_pit)<<1;
- L_tmp = (L_tmp << 1);
- exc2[i] = vo_round(L_tmp);
- }
-
- corr_gain = synthesis(p_Aq, exc2, Q_new, &speech16k[i_subfr * 5 / 4], st);
- Parm_serial(corr_gain, 4, &prms);
- }
- p_A += (M + 1);
- p_Aq += (M + 1);
- } /* end of subframe loop */
-
- /*--------------------------------------------------*
- * Update signal for next frame. *
- * -> save past of speech[], wsp[] and exc[]. *
- *--------------------------------------------------*/
- Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
- Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
- Copy(&old_exc[L_FRAME], st->old_exc, PIT_MAX + L_INTERPOL);
- return;
+ voice_fac = voice_factor(exc2, shift, gain_pit, code, gain_code, L_SUBFR);
+ /* tilt of code for next subframe: 0.5=voiced, 0=unvoiced */
+ st->tilt_code = ((voice_fac >> 2) + 8192);
+ /*------------------------------------------------------*
+ * - Update filter's memory "mem_w0" for finding the *
+ * target vector in the next subframe. *
+ * - Find the total excitation *
+ * - Find synthesis speech to update mem_syn[]. *
+ *------------------------------------------------------*/
+
+ /* y2 in Q9, gain_pit in Q14 */
+ L_tmp = (gain_code * y2[L_SUBFR - 1])<<1;
+ L_tmp = L_shl(L_tmp, (5 + shift));
+ L_tmp = L_negate(L_tmp);
+ L_tmp += (xn[L_SUBFR - 1] * 16384)<<1;
+ L_tmp -= (y1[L_SUBFR - 1] * gain_pit)<<1;
+ L_tmp = L_shl(L_tmp, (1 - shift));
+ st->mem_w0 = extract_h(L_add(L_tmp, 0x8000));
+
+ if (*ser_size >= NBBITS_24k)
+ Copy(&exc[i_subfr], exc2, L_SUBFR);
+
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ Word32 tmp;
+ /* code in Q9, gain_pit in Q14 */
+ L_tmp = (gain_code * code[i])<<1;
+ L_tmp = (L_tmp << 5);
+ tmp = L_mult(exc[i + i_subfr], gain_pit); // (exc[i + i_subfr] * gain_pit)<<1
+ L_tmp = L_add(L_tmp, tmp);
+ L_tmp = L_shl2(L_tmp, 1);
+ exc[i + i_subfr] = extract_h(L_add(L_tmp, 0x8000));
+ }
+
+ Syn_filt(p_Aq,&exc[i_subfr], synth, L_SUBFR, st->mem_syn, 1);
+
+ if(*ser_size >= NBBITS_24k)
+ {
+ /*------------------------------------------------------------*
+ * phase dispersion to enhance noise in low bit rate *
+ *------------------------------------------------------------*/
+ /* L_gain_code in Q16 */
+ VO_L_Extract(L_gain_code, &gain_code, &gain_code_lo);
+
+ /*------------------------------------------------------------*
+ * noise enhancer *
+ * ~~~~~~~~~~~~~~ *
+ * - Enhance excitation on noise. (modify gain of code) *
+ * If signal is noisy and LPC filter is stable, move gain *
+ * of code 1.5 dB toward gain of code threshold. *
+ * This decrease by 3 dB noise energy variation. *
+ *------------------------------------------------------------*/
+ tmp = (16384 - (voice_fac >> 1)); /* 1=unvoiced, 0=voiced */
+ fac = vo_mult(stab_fac, tmp);
+ L_tmp = L_gain_code;
+ if(L_tmp < st->L_gc_thres)
+ {
+ L_tmp = vo_L_add(L_tmp, Mpy_32_16(gain_code, gain_code_lo, 6226));
+ if(L_tmp > st->L_gc_thres)
+ {
+ L_tmp = st->L_gc_thres;
+ }
+ } else
+ {
+ L_tmp = Mpy_32_16(gain_code, gain_code_lo, 27536);
+ if(L_tmp < st->L_gc_thres)
+ {
+ L_tmp = st->L_gc_thres;
+ }
+ }
+ st->L_gc_thres = L_tmp;
+
+ L_gain_code = Mpy_32_16(gain_code, gain_code_lo, (32767 - fac));
+ VO_L_Extract(L_tmp, &gain_code, &gain_code_lo);
+ L_gain_code = vo_L_add(L_gain_code, Mpy_32_16(gain_code, gain_code_lo, fac));
+
+ /*------------------------------------------------------------*
+ * pitch enhancer *
+ * ~~~~~~~~~~~~~~ *
+ * - Enhance excitation on voice. (HP filtering of code) *
+ * On voiced signal, filtering of code by a smooth fir HP *
+ * filter to decrease energy of code in low frequency. *
+ *------------------------------------------------------------*/
+
+ tmp = ((voice_fac >> 3) + 4096); /* 0.25=voiced, 0=unvoiced */
+
+ L_tmp = L_deposit_h(code[0]);
+ L_tmp -= (code[1] * tmp)<<1;
+ code2[0] = vo_round(L_tmp);
+
+ for (i = 1; i < L_SUBFR - 1; i++)
+ {
+ L_tmp = L_deposit_h(code[i]);
+ L_tmp -= (code[i + 1] * tmp)<<1;
+ L_tmp -= (code[i - 1] * tmp)<<1;
+ code2[i] = vo_round(L_tmp);
+ }
+
+ L_tmp = L_deposit_h(code[L_SUBFR - 1]);
+ L_tmp -= (code[L_SUBFR - 2] * tmp)<<1;
+ code2[L_SUBFR - 1] = vo_round(L_tmp);
+
+ /* build excitation */
+ gain_code = vo_round(L_shl(L_gain_code, Q_new));
+
+ for (i = 0; i < L_SUBFR; i++)
+ {
+ L_tmp = (code2[i] * gain_code)<<1;
+ L_tmp = (L_tmp << 5);
+ L_tmp += (exc2[i] * gain_pit)<<1;
+ L_tmp = (L_tmp << 1);
+ exc2[i] = voround(L_tmp);
+ }
+
+ corr_gain = synthesis(p_Aq, exc2, Q_new, &speech16k[i_subfr * 5 / 4], st);
+ Parm_serial(corr_gain, 4, &prms);
+ }
+ p_A += (M + 1);
+ p_Aq += (M + 1);
+ } /* end of subframe loop */
+
+ /*--------------------------------------------------*
+ * Update signal for next frame. *
+ * -> save past of speech[], wsp[] and exc[]. *
+ *--------------------------------------------------*/
+ Copy(&old_speech[L_FRAME], st->old_speech, L_TOTAL - L_FRAME);
+ Copy(&old_wsp[L_FRAME / OPL_DECIM], st->old_wsp, PIT_MAX / OPL_DECIM);
+ Copy(&old_exc[L_FRAME], st->old_exc, PIT_MAX + L_INTERPOL);
+ return;
}
/*-----------------------------------------------------*
@@ -1329,225 +1333,225 @@ void coder(
*-----------------------------------------------------*/
static Word16 synthesis(
- Word16 Aq[], /* A(z) : quantized Az */
- Word16 exc[], /* (i) : excitation at 12kHz */
- Word16 Q_new, /* (i) : scaling performed on exc */
- Word16 synth16k[], /* (o) : 16kHz synthesis signal */
- Coder_State * st /* (i/o) : State structure */
- )
+ Word16 Aq[], /* A(z) : quantized Az */
+ Word16 exc[], /* (i) : excitation at 12kHz */
+ Word16 Q_new, /* (i) : scaling performed on exc */
+ Word16 synth16k[], /* (o) : 16kHz synthesis signal */
+ Coder_State * st /* (i/o) : State structure */
+ )
{
- Word16 fac, tmp, exp;
- Word16 ener, exp_ener;
- Word32 L_tmp, i;
-
- Word16 synth_hi[M + L_SUBFR], synth_lo[M + L_SUBFR];
- Word16 synth[L_SUBFR];
- Word16 HF[L_SUBFR16k]; /* High Frequency vector */
- Word16 Ap[M + 1];
-
- Word16 HF_SP[L_SUBFR16k]; /* High Frequency vector (from original signal) */
-
- Word16 HP_est_gain, HP_calc_gain, HP_corr_gain;
- Word16 dist_min, dist;
- Word16 HP_gain_ind = 0;
- Word16 gain1, gain2;
- Word16 weight1, weight2;
-
- /*------------------------------------------------------------*
- * speech synthesis *
- * ~~~~~~~~~~~~~~~~ *
- * - Find synthesis speech corresponding to exc2[]. *
- * - Perform fixed deemphasis and hp 50hz filtering. *
- * - Oversampling from 12.8kHz to 16kHz. *
- *------------------------------------------------------------*/
- Copy(st->mem_syn_hi, synth_hi, M);
- Copy(st->mem_syn_lo, synth_lo, M);
+ Word16 fac, tmp, exp;
+ Word16 ener, exp_ener;
+ Word32 L_tmp, i;
+
+ Word16 synth_hi[M + L_SUBFR], synth_lo[M + L_SUBFR];
+ Word16 synth[L_SUBFR];
+ Word16 HF[L_SUBFR16k]; /* High Frequency vector */
+ Word16 Ap[M + 1];
+
+ Word16 HF_SP[L_SUBFR16k]; /* High Frequency vector (from original signal) */
+
+ Word16 HP_est_gain, HP_calc_gain, HP_corr_gain;
+ Word16 dist_min, dist;
+ Word16 HP_gain_ind = 0;
+ Word16 gain1, gain2;
+ Word16 weight1, weight2;
+
+ /*------------------------------------------------------------*
+ * speech synthesis *
+ * ~~~~~~~~~~~~~~~~ *
+ * - Find synthesis speech corresponding to exc2[]. *
+ * - Perform fixed deemphasis and hp 50hz filtering. *
+ * - Oversampling from 12.8kHz to 16kHz. *
+ *------------------------------------------------------------*/
+ Copy(st->mem_syn_hi, synth_hi, M);
+ Copy(st->mem_syn_lo, synth_lo, M);
#ifdef ASM_OPT /* asm optimization branch */
- Syn_filt_32_asm(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
+ Syn_filt_32_asm(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
#else
- Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
+ Syn_filt_32(Aq, M, exc, Q_new, synth_hi + M, synth_lo + M, L_SUBFR);
#endif
- Copy(synth_hi + L_SUBFR, st->mem_syn_hi, M);
- Copy(synth_lo + L_SUBFR, st->mem_syn_lo, M);
+ Copy(synth_hi + L_SUBFR, st->mem_syn_hi, M);
+ Copy(synth_lo + L_SUBFR, st->mem_syn_lo, M);
#ifdef ASM_OPT /* asm optimization branch */
- Deemph_32_asm(synth_hi + M, synth_lo + M, synth, &(st->mem_deemph));
+ Deemph_32_asm(synth_hi + M, synth_lo + M, synth, &(st->mem_deemph));
#else
- Deemph_32(synth_hi + M, synth_lo + M, synth, PREEMPH_FAC, L_SUBFR, &(st->mem_deemph));
+ Deemph_32(synth_hi + M, synth_lo + M, synth, PREEMPH_FAC, L_SUBFR, &(st->mem_deemph));
#endif
- HP50_12k8(synth, L_SUBFR, st->mem_sig_out);
-
- /* Original speech signal as reference for high band gain quantisation */
- for (i = 0; i < L_SUBFR16k; i++)
- {
- HF_SP[i] = synth16k[i];
- }
-
- /*------------------------------------------------------*
- * HF noise synthesis *
- * ~~~~~~~~~~~~~~~~~~ *
- * - Generate HF noise between 5.5 and 7.5 kHz. *
- * - Set energy of noise according to synthesis tilt. *
- * tilt > 0.8 ==> - 14 dB (voiced) *
- * tilt 0.5 ==> - 6 dB (voiced or noise) *
- * tilt < 0.0 ==> 0 dB (noise) *
- *------------------------------------------------------*/
- /* generate white noise vector */
- for (i = 0; i < L_SUBFR16k; i++)
- {
- HF[i] = Random(&(st->seed2))>>3;
- }
- /* energy of excitation */
+ HP50_12k8(synth, L_SUBFR, st->mem_sig_out);
+
+ /* Original speech signal as reference for high band gain quantisation */
+ for (i = 0; i < L_SUBFR16k; i++)
+ {
+ HF_SP[i] = synth16k[i];
+ }
+
+ /*------------------------------------------------------*
+ * HF noise synthesis *
+ * ~~~~~~~~~~~~~~~~~~ *
+ * - Generate HF noise between 5.5 and 7.5 kHz. *
+ * - Set energy of noise according to synthesis tilt. *
+ * tilt > 0.8 ==> - 14 dB (voiced) *
+ * tilt 0.5 ==> - 6 dB (voiced or noise) *
+ * tilt < 0.0 ==> 0 dB (noise) *
+ *------------------------------------------------------*/
+ /* generate white noise vector */
+ for (i = 0; i < L_SUBFR16k; i++)
+ {
+ HF[i] = Random(&(st->seed2))>>3;
+ }
+ /* energy of excitation */
#ifdef ASM_OPT /* asm optimization branch */
- Scale_sig_opt(exc, L_SUBFR, -3);
- Q_new = Q_new - 3;
- ener = extract_h(Dot_product12_asm(exc, exc, L_SUBFR, &exp_ener));
+ Scale_sig_opt(exc, L_SUBFR, -3);
+ Q_new = Q_new - 3;
+ ener = extract_h(Dot_product12_asm(exc, exc, L_SUBFR, &exp_ener));
#else
- Scale_sig(exc, L_SUBFR, -3);
- Q_new = Q_new - 3;
- ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener));
+ Scale_sig(exc, L_SUBFR, -3);
+ Q_new = Q_new - 3;
+ ener = extract_h(Dot_product12(exc, exc, L_SUBFR, &exp_ener));
#endif
- exp_ener = exp_ener - (Q_new + Q_new);
- /* set energy of white noise to energy of excitation */
+ exp_ener = exp_ener - (Q_new + Q_new);
+ /* set energy of white noise to energy of excitation */
#ifdef ASM_OPT /* asm optimization branch */
- tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
+ tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
#else
- tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
+ tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
#endif
- if(tmp > ener)
- {
- tmp = (tmp >> 1); /* Be sure tmp < ener */
- exp = (exp + 1);
- }
- L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
- exp = (exp - exp_ener);
- Isqrt_n(&L_tmp, &exp);
- L_tmp = L_shl(L_tmp, (exp + 1)); /* L_tmp x 2, L_tmp in Q31 */
- tmp = extract_h(L_tmp); /* tmp = 2 x sqrt(ener_exc/ener_hf) */
-
- for (i = 0; i < L_SUBFR16k; i++)
- {
- HF[i] = vo_mult(HF[i], tmp);
- }
-
- /* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */
- HP400_12k8(synth, L_SUBFR, st->mem_hp400);
-
- L_tmp = 1L;
- for (i = 0; i < L_SUBFR; i++)
- L_tmp += (synth[i] * synth[i])<<1;
-
- exp = norm_l(L_tmp);
- ener = extract_h(L_tmp << exp); /* ener = r[0] */
-
- L_tmp = 1L;
- for (i = 1; i < L_SUBFR; i++)
- L_tmp +=(synth[i] * synth[i - 1])<<1;
-
- tmp = extract_h(L_tmp << exp); /* tmp = r[1] */
-
- if (tmp > 0)
- {
- fac = div_s(tmp, ener);
- } else
- {
- fac = 0;
- }
-
- /* modify energy of white noise according to synthesis tilt */
- gain1 = 32767 - fac;
- gain2 = vo_mult(gain1, 20480);
- gain2 = shl(gain2, 1);
-
- if (st->vad_hist > 0)
- {
- weight1 = 0;
- weight2 = 32767;
- } else
- {
- weight1 = 32767;
- weight2 = 0;
- }
- tmp = vo_mult(weight1, gain1);
- tmp = add1(tmp, vo_mult(weight2, gain2));
-
- if (tmp != 0)
- {
- tmp = (tmp + 1);
- }
- HP_est_gain = tmp;
-
- if(HP_est_gain < 3277)
- {
- HP_est_gain = 3277; /* 0.1 in Q15 */
- }
- /* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */
- Weight_a(Aq, Ap, 19661, M); /* fac=0.6 */
+ if(tmp > ener)
+ {
+ tmp = (tmp >> 1); /* Be sure tmp < ener */
+ exp = (exp + 1);
+ }
+ L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
+ exp = (exp - exp_ener);
+ Isqrt_n(&L_tmp, &exp);
+ L_tmp = L_shl(L_tmp, (exp + 1)); /* L_tmp x 2, L_tmp in Q31 */
+ tmp = extract_h(L_tmp); /* tmp = 2 x sqrt(ener_exc/ener_hf) */
+
+ for (i = 0; i < L_SUBFR16k; i++)
+ {
+ HF[i] = vo_mult(HF[i], tmp);
+ }
+
+ /* find tilt of synthesis speech (tilt: 1=voiced, -1=unvoiced) */
+ HP400_12k8(synth, L_SUBFR, st->mem_hp400);
+
+ L_tmp = 1L;
+ for (i = 0; i < L_SUBFR; i++)
+ L_tmp += (synth[i] * synth[i])<<1;
+
+ exp = norm_l(L_tmp);
+ ener = extract_h(L_tmp << exp); /* ener = r[0] */
+
+ L_tmp = 1L;
+ for (i = 1; i < L_SUBFR; i++)
+ L_tmp +=(synth[i] * synth[i - 1])<<1;
+
+ tmp = extract_h(L_tmp << exp); /* tmp = r[1] */
+
+ if (tmp > 0)
+ {
+ fac = div_s(tmp, ener);
+ } else
+ {
+ fac = 0;
+ }
+
+ /* modify energy of white noise according to synthesis tilt */
+ gain1 = 32767 - fac;
+ gain2 = vo_mult(gain1, 20480);
+ gain2 = shl(gain2, 1);
+
+ if (st->vad_hist > 0)
+ {
+ weight1 = 0;
+ weight2 = 32767;
+ } else
+ {
+ weight1 = 32767;
+ weight2 = 0;
+ }
+ tmp = vo_mult(weight1, gain1);
+ tmp = add1(tmp, vo_mult(weight2, gain2));
+
+ if (tmp != 0)
+ {
+ tmp = (tmp + 1);
+ }
+ HP_est_gain = tmp;
+
+ if(HP_est_gain < 3277)
+ {
+ HP_est_gain = 3277; /* 0.1 in Q15 */
+ }
+ /* synthesis of noise: 4.8kHz..5.6kHz --> 6kHz..7kHz */
+ Weight_a(Aq, Ap, 19661, M); /* fac=0.6 */
#ifdef ASM_OPT /* asm optimization branch */
- Syn_filt_asm(Ap, HF, HF, st->mem_syn_hf);
- /* noise High Pass filtering (1ms of delay) */
- Filt_6k_7k_asm(HF, L_SUBFR16k, st->mem_hf);
- /* filtering of the original signal */
- Filt_6k_7k_asm(HF_SP, L_SUBFR16k, st->mem_hf2);
-
- /* check the gain difference */
- Scale_sig_opt(HF_SP, L_SUBFR16k, -1);
- ener = extract_h(Dot_product12_asm(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
- /* set energy of white noise to energy of excitation */
- tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
+ Syn_filt_asm(Ap, HF, HF, st->mem_syn_hf);
+ /* noise High Pass filtering (1ms of delay) */
+ Filt_6k_7k_asm(HF, L_SUBFR16k, st->mem_hf);
+ /* filtering of the original signal */
+ Filt_6k_7k_asm(HF_SP, L_SUBFR16k, st->mem_hf2);
+
+ /* check the gain difference */
+ Scale_sig_opt(HF_SP, L_SUBFR16k, -1);
+ ener = extract_h(Dot_product12_asm(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
+ /* set energy of white noise to energy of excitation */
+ tmp = extract_h(Dot_product12_asm(HF, HF, L_SUBFR16k, &exp));
#else
- Syn_filt(Ap, HF, HF, L_SUBFR16k, st->mem_syn_hf, 1);
- /* noise High Pass filtering (1ms of delay) */
- Filt_6k_7k(HF, L_SUBFR16k, st->mem_hf);
- /* filtering of the original signal */
- Filt_6k_7k(HF_SP, L_SUBFR16k, st->mem_hf2);
- /* check the gain difference */
- Scale_sig(HF_SP, L_SUBFR16k, -1);
- ener = extract_h(Dot_product12(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
- /* set energy of white noise to energy of excitation */
- tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
+ Syn_filt(Ap, HF, HF, L_SUBFR16k, st->mem_syn_hf, 1);
+ /* noise High Pass filtering (1ms of delay) */
+ Filt_6k_7k(HF, L_SUBFR16k, st->mem_hf);
+ /* filtering of the original signal */
+ Filt_6k_7k(HF_SP, L_SUBFR16k, st->mem_hf2);
+ /* check the gain difference */
+ Scale_sig(HF_SP, L_SUBFR16k, -1);
+ ener = extract_h(Dot_product12(HF_SP, HF_SP, L_SUBFR16k, &exp_ener));
+ /* set energy of white noise to energy of excitation */
+ tmp = extract_h(Dot_product12(HF, HF, L_SUBFR16k, &exp));
#endif
- if (tmp > ener)
- {
- tmp = (tmp >> 1); /* Be sure tmp < ener */
- exp = (exp + 1);
- }
- L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
- exp = vo_sub(exp, exp_ener);
- Isqrt_n(&L_tmp, &exp);
- L_tmp = L_shl(L_tmp, exp); /* L_tmp, L_tmp in Q31 */
- HP_calc_gain = extract_h(L_tmp); /* tmp = sqrt(ener_input/ener_hf) */
-
- /* st->gain_alpha *= st->dtx_encSt->dtxHangoverCount/7 */
- L_tmp = (vo_L_mult(st->dtx_encSt->dtxHangoverCount, 4681) << 15);
- st->gain_alpha = vo_mult(st->gain_alpha, extract_h(L_tmp));
-
- if(st->dtx_encSt->dtxHangoverCount > 6)
- st->gain_alpha = 32767;
- HP_est_gain = HP_est_gain >> 1; /* From Q15 to Q14 */
- HP_corr_gain = add1(vo_mult(HP_calc_gain, st->gain_alpha), vo_mult((32767 - st->gain_alpha), HP_est_gain));
-
- /* Quantise the correction gain */
- dist_min = 32767;
- for (i = 0; i < 16; i++)
- {
- dist = vo_mult((HP_corr_gain - HP_gain[i]), (HP_corr_gain - HP_gain[i]));
- if (dist_min > dist)
- {
- dist_min = dist;
- HP_gain_ind = i;
- }
- }
- HP_corr_gain = HP_gain[HP_gain_ind];
- /* return the quantised gain index when using the highest mode, otherwise zero */
- return (HP_gain_ind);
+ if (tmp > ener)
+ {
+ tmp = (tmp >> 1); /* Be sure tmp < ener */
+ exp = (exp + 1);
+ }
+ L_tmp = L_deposit_h(div_s(tmp, ener)); /* result is normalized */
+ exp = vo_sub(exp, exp_ener);
+ Isqrt_n(&L_tmp, &exp);
+ L_tmp = L_shl(L_tmp, exp); /* L_tmp, L_tmp in Q31 */
+ HP_calc_gain = extract_h(L_tmp); /* tmp = sqrt(ener_input/ener_hf) */
+
+ /* st->gain_alpha *= st->dtx_encSt->dtxHangoverCount/7 */
+ L_tmp = (vo_L_mult(st->dtx_encSt->dtxHangoverCount, 4681) << 15);
+ st->gain_alpha = vo_mult(st->gain_alpha, extract_h(L_tmp));
+
+ if(st->dtx_encSt->dtxHangoverCount > 6)
+ st->gain_alpha = 32767;
+ HP_est_gain = HP_est_gain >> 1; /* From Q15 to Q14 */
+ HP_corr_gain = add1(vo_mult(HP_calc_gain, st->gain_alpha), vo_mult((32767 - st->gain_alpha), HP_est_gain));
+
+ /* Quantise the correction gain */
+ dist_min = 32767;
+ for (i = 0; i < 16; i++)
+ {
+ dist = vo_mult((HP_corr_gain - HP_gain[i]), (HP_corr_gain - HP_gain[i]));
+ if (dist_min > dist)
+ {
+ dist_min = dist;
+ HP_gain_ind = i;
+ }
+ }
+ HP_corr_gain = HP_gain[HP_gain_ind];
+ /* return the quantised gain index when using the highest mode, otherwise zero */
+ return (HP_gain_ind);
}
/*************************************************
@@ -1558,33 +1562,33 @@ static Word16 synthesis(
int AMR_Enc_Encode(HAMRENC hCodec)
{
- Word32 i;
- Coder_State *gData = (Coder_State*)hCodec;
- Word16 *signal;
- Word16 packed_size = 0;
- Word16 prms[NB_BITS_MAX];
- Word16 coding_mode = 0, nb_bits, allow_dtx, mode, reset_flag;
- mode = gData->mode;
- coding_mode = gData->mode;
- nb_bits = nb_of_bits[mode];
- signal = (Word16 *)gData->inputStream;
- allow_dtx = gData->allow_dtx;
-
- /* check for homing frame */
- reset_flag = encoder_homing_frame_test(signal);
-
- for (i = 0; i < L_FRAME16k; i++) /* Delete the 2 LSBs (14-bit input) */
- {
- *(signal + i) = (Word16) (*(signal + i) & 0xfffC);
- }
-
- coder(&coding_mode, signal, prms, &nb_bits, gData, allow_dtx);
- packed_size = PackBits(prms, coding_mode, mode, gData);
- if (reset_flag != 0)
- {
- Reset_encoder(gData, 1);
- }
- return packed_size;
+ Word32 i;
+ Coder_State *gData = (Coder_State*)hCodec;
+ Word16 *signal;
+ Word16 packed_size = 0;
+ Word16 prms[NB_BITS_MAX];
+ Word16 coding_mode = 0, nb_bits, allow_dtx, mode, reset_flag;
+ mode = gData->mode;
+ coding_mode = gData->mode;
+ nb_bits = nb_of_bits[mode];
+ signal = (Word16 *)gData->inputStream;
+ allow_dtx = gData->allow_dtx;
+
+ /* check for homing frame */
+ reset_flag = encoder_homing_frame_test(signal);
+
+ for (i = 0; i < L_FRAME16k; i++) /* Delete the 2 LSBs (14-bit input) */
+ {
+ *(signal + i) = (Word16) (*(signal + i) & 0xfffC);
+ }
+
+ coder(&coding_mode, signal, prms, &nb_bits, gData, allow_dtx);
+ packed_size = PackBits(prms, coding_mode, mode, gData);
+ if (reset_flag != 0)
+ {
+ Reset_encoder(gData, 1);
+ }
+ return packed_size;
}
/***************************************************************************
@@ -1594,94 +1598,94 @@ int AMR_Enc_Encode(HAMRENC hCodec)
***************************************************************************/
VO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec, /* o: the audio codec handle */
- VO_AUDIO_CODINGTYPE vType, /* i: Codec Type ID */
- VO_CODEC_INIT_USERDATA * pUserData /* i: init Parameters */
- )
+ VO_AUDIO_CODINGTYPE vType, /* i: Codec Type ID */
+ VO_CODEC_INIT_USERDATA * pUserData /* i: init Parameters */
+ )
{
- Coder_State *st;
- FrameStream *stream;
+ Coder_State *st;
+ FrameStream *stream;
#ifdef USE_DEAULT_MEM
- VO_MEM_OPERATOR voMemoprator;
+ VO_MEM_OPERATOR voMemoprator;
#endif
- VO_MEM_OPERATOR *pMemOP;
+ VO_MEM_OPERATOR *pMemOP;
UNUSED(vType);
- int interMem = 0;
+ int interMem = 0;
- if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
- {
+ if(pUserData == NULL || pUserData->memflag != VO_IMF_USERMEMOPERATOR || pUserData->memData == NULL )
+ {
#ifdef USE_DEAULT_MEM
- voMemoprator.Alloc = cmnMemAlloc;
- voMemoprator.Copy = cmnMemCopy;
- voMemoprator.Free = cmnMemFree;
- voMemoprator.Set = cmnMemSet;
- voMemoprator.Check = cmnMemCheck;
- interMem = 1;
- pMemOP = &voMemoprator;
+ voMemoprator.Alloc = cmnMemAlloc;
+ voMemoprator.Copy = cmnMemCopy;
+ voMemoprator.Free = cmnMemFree;
+ voMemoprator.Set = cmnMemSet;
+ voMemoprator.Check = cmnMemCheck;
+ interMem = 1;
+ pMemOP = &voMemoprator;
#else
- *phCodec = NULL;
- return VO_ERR_INVALID_ARG;
+ *phCodec = NULL;
+ return VO_ERR_INVALID_ARG;
#endif
- }
- else
- {
- pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;
- }
- /*-------------------------------------------------------------------------*
- * Memory allocation for coder state. *
- *-------------------------------------------------------------------------*/
- if ((st = (Coder_State *)mem_malloc(pMemOP, sizeof(Coder_State), 32, VO_INDEX_ENC_AMRWB)) == NULL)
- {
- return VO_ERR_OUTOF_MEMORY;
- }
-
- st->vadSt = NULL;
- st->dtx_encSt = NULL;
- st->sid_update_counter = 3;
- st->sid_handover_debt = 0;
- st->prev_ft = TX_SPEECH;
- st->inputStream = NULL;
- st->inputSize = 0;
-
- /* Default setting */
- st->mode = VOAMRWB_MD2385; /* bit rate 23.85kbps */
- st->frameType = VOAMRWB_RFC3267; /* frame type: RFC3267 */
- st->allow_dtx = 0; /* disable DTX mode */
-
- st->outputStream = NULL;
- st->outputSize = 0;
-
- st->stream = (FrameStream *)mem_malloc(pMemOP, sizeof(FrameStream), 32, VO_INDEX_ENC_AMRWB);
- if(st->stream == NULL)
- return VO_ERR_OUTOF_MEMORY;
-
- st->stream->frame_ptr = (unsigned char *)mem_malloc(pMemOP, Frame_Maxsize, 32, VO_INDEX_ENC_AMRWB);
- if(st->stream->frame_ptr == NULL)
- return VO_ERR_OUTOF_MEMORY;
-
- stream = st->stream;
- voAWB_InitFrameBuffer(stream);
-
- wb_vad_init(&(st->vadSt), pMemOP);
- dtx_enc_init(&(st->dtx_encSt), isf_init, pMemOP);
-
- Reset_encoder((void *) st, 1);
-
- if(interMem)
- {
- st->voMemoprator.Alloc = cmnMemAlloc;
- st->voMemoprator.Copy = cmnMemCopy;
- st->voMemoprator.Free = cmnMemFree;
- st->voMemoprator.Set = cmnMemSet;
- st->voMemoprator.Check = cmnMemCheck;
- pMemOP = &st->voMemoprator;
- }
-
- st->pvoMemop = pMemOP;
-
- *phCodec = (void *) st;
-
- return VO_ERR_NONE;
+ }
+ else
+ {
+ pMemOP = (VO_MEM_OPERATOR *)pUserData->memData;
+ }
+ /*-------------------------------------------------------------------------*
+ * Memory allocation for coder state. *
+ *-------------------------------------------------------------------------*/
+ if ((st = (Coder_State *)mem_malloc(pMemOP, sizeof(Coder_State), 32, VO_INDEX_ENC_AMRWB)) == NULL)
+ {
+ return VO_ERR_OUTOF_MEMORY;
+ }
+
+ st->vadSt = NULL;
+ st->dtx_encSt = NULL;
+ st->sid_update_counter = 3;
+ st->sid_handover_debt = 0;
+ st->prev_ft = TX_SPEECH;
+ st->inputStream = NULL;
+ st->inputSize = 0;
+
+ /* Default setting */
+ st->mode = VOAMRWB_MD2385; /* bit rate 23.85kbps */
+ st->frameType = VOAMRWB_RFC3267; /* frame type: RFC3267 */
+ st->allow_dtx = 0; /* disable DTX mode */
+
+ st->outputStream = NULL;
+ st->outputSize = 0;
+
+ st->stream = (FrameStream *)mem_malloc(pMemOP, sizeof(FrameStream), 32, VO_INDEX_ENC_AMRWB);
+ if(st->stream == NULL)
+ return VO_ERR_OUTOF_MEMORY;
+
+ st->stream->frame_ptr = (unsigned char *)mem_malloc(pMemOP, Frame_Maxsize, 32, VO_INDEX_ENC_AMRWB);
+ if(st->stream->frame_ptr == NULL)
+ return VO_ERR_OUTOF_MEMORY;
+
+ stream = st->stream;
+ voAWB_InitFrameBuffer(stream);
+
+ wb_vad_init(&(st->vadSt), pMemOP);
+ dtx_enc_init(&(st->dtx_encSt), isf_init, pMemOP);
+
+ Reset_encoder((void *) st, 1);
+
+ if(interMem)
+ {
+ st->voMemoprator.Alloc = cmnMemAlloc;
+ st->voMemoprator.Copy = cmnMemCopy;
+ st->voMemoprator.Free = cmnMemFree;
+ st->voMemoprator.Set = cmnMemSet;
+ st->voMemoprator.Check = cmnMemCheck;
+ pMemOP = &st->voMemoprator;
+ }
+
+ st->pvoMemop = pMemOP;
+
+ *phCodec = (void *) st;
+
+ return VO_ERR_NONE;
}
/**********************************************************************************
@@ -1691,32 +1695,32 @@ VO_U32 VO_API voAMRWB_Init(VO_HANDLE * phCodec, /* o: the audi
***********************************************************************************/
VO_U32 VO_API voAMRWB_SetInputData(
- VO_HANDLE hCodec, /* i/o: The codec handle which was created by Init function */
- VO_CODECBUFFER * pInput /* i: The input buffer parameter */
- )
+ VO_HANDLE hCodec, /* i/o: The codec handle which was created by Init function */
+ VO_CODECBUFFER * pInput /* i: The input buffer parameter */
+ )
{
- Coder_State *gData;
- FrameStream *stream;
+ Coder_State *gData;
+ FrameStream *stream;
- if(NULL == hCodec)
- {
- return VO_ERR_INVALID_ARG;
- }
+ if(NULL == hCodec)
+ {
+ return VO_ERR_INVALID_ARG;
+ }
- gData = (Coder_State *)hCodec;
- stream = gData->stream;
+ gData = (Coder_State *)hCodec;
+ stream = gData->stream;
- if(NULL == pInput || NULL == pInput->Buffer)
- {
- return VO_ERR_INVALID_ARG;
- }
+ if(NULL == pInput || NULL == pInput->Buffer)
+ {
+ return VO_ERR_INVALID_ARG;
+ }
- stream->set_ptr = pInput->Buffer;
- stream->set_len = pInput->Length;
- stream->frame_ptr = stream->frame_ptr_bk;
- stream->used_len = 0;
+ stream->set_ptr = pInput->Buffer;
+ stream->set_len = pInput->Length;
+ stream->frame_ptr = stream->frame_ptr_bk;
+ stream->used_len = 0;
- return VO_ERR_NONE;
+ return VO_ERR_NONE;
}
/**************************************************************************************
@@ -1726,52 +1730,52 @@ VO_U32 VO_API voAMRWB_SetInputData(
***************************************************************************************/
VO_U32 VO_API voAMRWB_GetOutputData(
- VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function*/
- VO_CODECBUFFER * pOutput, /* o: The output audio data */
- VO_AUDIO_OUTPUTINFO * pAudioFormat /* o: The encoder module filled audio format and used the input size*/
- )
+ VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function*/
+ VO_CODECBUFFER * pOutput, /* o: The output audio data */
+ VO_AUDIO_OUTPUTINFO * pAudioFormat /* o: The encoder module filled audio format and used the input size*/
+ )
{
- Coder_State* gData = (Coder_State*)hCodec;
- VO_MEM_OPERATOR *pMemOP;
- FrameStream *stream = (FrameStream *)gData->stream;
- pMemOP = (VO_MEM_OPERATOR *)gData->pvoMemop;
-
- if(stream->framebuffer_len < Frame_MaxByte) /* check the work buffer len */
- {
- stream->frame_storelen = stream->framebuffer_len;
- if(stream->frame_storelen)
- {
- pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk , stream->frame_ptr , stream->frame_storelen);
- }
- if(stream->set_len > 0)
- {
- voAWB_UpdateFrameBuffer(stream, pMemOP);
- }
- if(stream->framebuffer_len < Frame_MaxByte)
- {
- if(pAudioFormat)
- pAudioFormat->InputUsed = stream->used_len;
- return VO_ERR_INPUT_BUFFER_SMALL;
- }
- }
-
- gData->inputStream = stream->frame_ptr;
- gData->outputStream = (unsigned short*)pOutput->Buffer;
-
- gData->outputSize = AMR_Enc_Encode(gData); /* encoder main function */
-
- pOutput->Length = gData->outputSize; /* get the output buffer length */
- stream->frame_ptr += 640; /* update the work buffer ptr */
- stream->framebuffer_len -= 640;
-
- if(pAudioFormat) /* return output audio information */
- {
- pAudioFormat->Format.Channels = 1;
- pAudioFormat->Format.SampleRate = 8000;
- pAudioFormat->Format.SampleBits = 16;
- pAudioFormat->InputUsed = stream->used_len;
- }
- return VO_ERR_NONE;
+ Coder_State* gData = (Coder_State*)hCodec;
+ VO_MEM_OPERATOR *pMemOP;
+ FrameStream *stream = (FrameStream *)gData->stream;
+ pMemOP = (VO_MEM_OPERATOR *)gData->pvoMemop;
+
+ if(stream->framebuffer_len < Frame_MaxByte) /* check the work buffer len */
+ {
+ stream->frame_storelen = stream->framebuffer_len;
+ if(stream->frame_storelen)
+ {
+ pMemOP->Copy(VO_INDEX_ENC_AMRWB, stream->frame_ptr_bk , stream->frame_ptr , stream->frame_storelen);
+ }
+ if(stream->set_len > 0)
+ {
+ voAWB_UpdateFrameBuffer(stream, pMemOP);
+ }
+ if(stream->framebuffer_len < Frame_MaxByte)
+ {
+ if(pAudioFormat)
+ pAudioFormat->InputUsed = stream->used_len;
+ return VO_ERR_INPUT_BUFFER_SMALL;
+ }
+ }
+
+ gData->inputStream = stream->frame_ptr;
+ gData->outputStream = (unsigned short*)pOutput->Buffer;
+
+ gData->outputSize = AMR_Enc_Encode(gData); /* encoder main function */
+
+ pOutput->Length = gData->outputSize; /* get the output buffer length */
+ stream->frame_ptr += 640; /* update the work buffer ptr */
+ stream->framebuffer_len -= 640;
+
+ if(pAudioFormat) /* return output audio information */
+ {
+ pAudioFormat->Format.Channels = 1;
+ pAudioFormat->Format.SampleRate = 8000;
+ pAudioFormat->Format.SampleBits = 16;
+ pAudioFormat->InputUsed = stream->used_len;
+ }
+ return VO_ERR_NONE;
}
/*************************************************************************
@@ -1782,50 +1786,50 @@ VO_U32 VO_API voAMRWB_GetOutputData(
VO_U32 VO_API voAMRWB_SetParam(
- VO_HANDLE hCodec, /* i/o: The Codec Handle which was created by Init function */
- VO_S32 uParamID, /* i: The param ID */
- VO_PTR pData /* i: The param value depend on the ID */
- )
+ VO_HANDLE hCodec, /* i/o: The Codec Handle which was created by Init function */
+ VO_S32 uParamID, /* i: The param ID */
+ VO_PTR pData /* i: The param value depend on the ID */
+ )
{
- Coder_State* gData = (Coder_State*)hCodec;
- FrameStream *stream = (FrameStream *)(gData->stream);
- int *lValue = (int*)pData;
-
- switch(uParamID)
- {
- /* setting AMR-WB frame type*/
- case VO_PID_AMRWB_FRAMETYPE:
- if(*lValue < VOAMRWB_DEFAULT || *lValue > VOAMRWB_RFC3267)
- return VO_ERR_WRONG_PARAM_ID;
- gData->frameType = *lValue;
- break;
- /* setting AMR-WB bit rate */
- case VO_PID_AMRWB_MODE:
- {
- if(*lValue < VOAMRWB_MD66 || *lValue > VOAMRWB_MD2385)
- return VO_ERR_WRONG_PARAM_ID;
- gData->mode = *lValue;
- }
- break;
- /* enable or disable DTX mode */
- case VO_PID_AMRWB_DTX:
- gData->allow_dtx = (Word16)(*lValue);
- break;
-
- case VO_PID_COMMON_HEADDATA:
- break;
+ Coder_State* gData = (Coder_State*)hCodec;
+ FrameStream *stream = (FrameStream *)(gData->stream);
+ int *lValue = (int*)pData;
+
+ switch(uParamID)
+ {
+ /* setting AMR-WB frame type*/
+ case VO_PID_AMRWB_FRAMETYPE:
+ if(*lValue < VOAMRWB_DEFAULT || *lValue > VOAMRWB_RFC3267)
+ return VO_ERR_WRONG_PARAM_ID;
+ gData->frameType = *lValue;
+ break;
+ /* setting AMR-WB bit rate */
+ case VO_PID_AMRWB_MODE:
+ {
+ if(*lValue < VOAMRWB_MD66 || *lValue > VOAMRWB_MD2385)
+ return VO_ERR_WRONG_PARAM_ID;
+ gData->mode = *lValue;
+ }
+ break;
+ /* enable or disable DTX mode */
+ case VO_PID_AMRWB_DTX:
+ gData->allow_dtx = (Word16)(*lValue);
+ break;
+
+ case VO_PID_COMMON_HEADDATA:
+ break;
/* flush the work buffer */
- case VO_PID_COMMON_FLUSH:
- stream->set_ptr = NULL;
- stream->frame_storelen = 0;
- stream->framebuffer_len = 0;
- stream->set_len = 0;
- break;
-
- default:
- return VO_ERR_WRONG_PARAM_ID;
- }
- return VO_ERR_NONE;
+ case VO_PID_COMMON_FLUSH:
+ stream->set_ptr = NULL;
+ stream->frame_storelen = 0;
+ stream->framebuffer_len = 0;
+ stream->set_len = 0;
+ break;
+
+ default:
+ return VO_ERR_WRONG_PARAM_ID;
+ }
+ return VO_ERR_NONE;
}
/**************************************************************************
@@ -1835,52 +1839,52 @@ VO_U32 VO_API voAMRWB_SetParam(
***************************************************************************/
VO_U32 VO_API voAMRWB_GetParam(
- VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function */
- VO_S32 uParamID, /* i: The param ID */
- VO_PTR pData /* o: The param value depend on the ID */
- )
+ VO_HANDLE hCodec, /* i: The Codec Handle which was created by Init function */
+ VO_S32 uParamID, /* i: The param ID */
+ VO_PTR pData /* o: The param value depend on the ID */
+ )
{
- int temp;
- Coder_State* gData = (Coder_State*)hCodec;
-
- if (gData==NULL)
- return VO_ERR_INVALID_ARG;
- switch(uParamID)
- {
- /* output audio format */
- case VO_PID_AMRWB_FORMAT:
- {
- VO_AUDIO_FORMAT* fmt = (VO_AUDIO_FORMAT*)pData;
- fmt->Channels = 1;
- fmt->SampleRate = 16000;
- fmt->SampleBits = 16;
- break;
- }
+ int temp;
+ Coder_State* gData = (Coder_State*)hCodec;
+
+ if (gData==NULL)
+ return VO_ERR_INVALID_ARG;
+ switch(uParamID)
+ {
+ /* output audio format */
+ case VO_PID_AMRWB_FORMAT:
+ {
+ VO_AUDIO_FORMAT* fmt = (VO_AUDIO_FORMAT*)pData;
+ fmt->Channels = 1;
+ fmt->SampleRate = 16000;
+ fmt->SampleBits = 16;
+ break;
+ }
/* output audio channel number */
- case VO_PID_AMRWB_CHANNELS:
- temp = 1;
- pData = (void *)(&temp);
- break;
+ case VO_PID_AMRWB_CHANNELS:
+ temp = 1;
+ pData = (void *)(&temp);
+ break;
/* output audio sample rate */
- case VO_PID_AMRWB_SAMPLERATE:
- temp = 16000;
- pData = (void *)(&temp);
- break;
- /* output audio frame type */
- case VO_PID_AMRWB_FRAMETYPE:
- temp = gData->frameType;
- pData = (void *)(&temp);
- break;
- /* output audio bit rate */
- case VO_PID_AMRWB_MODE:
- temp = gData->mode;
- pData = (void *)(&temp);
- break;
- default:
- return VO_ERR_WRONG_PARAM_ID;
- }
-
- return VO_ERR_NONE;
+ case VO_PID_AMRWB_SAMPLERATE:
+ temp = 16000;
+ pData = (void *)(&temp);
+ break;
+ /* output audio frame type */
+ case VO_PID_AMRWB_FRAMETYPE:
+ temp = gData->frameType;
+ pData = (void *)(&temp);
+ break;
+ /* output audio bit rate */
+ case VO_PID_AMRWB_MODE:
+ temp = gData->mode;
+ pData = (void *)(&temp);
+ break;
+ default:
+ return VO_ERR_WRONG_PARAM_ID;
+ }
+
+ return VO_ERR_NONE;
}
/***********************************************************************************
@@ -1890,32 +1894,32 @@ VO_U32 VO_API voAMRWB_GetParam(
*************************************************************************************/
VO_U32 VO_API voAMRWB_Uninit(VO_HANDLE hCodec /* i/o: Codec handle pointer */
- )
+ )
{
- Coder_State* gData = (Coder_State*)hCodec;
- VO_MEM_OPERATOR *pMemOP;
- pMemOP = gData->pvoMemop;
-
- if(hCodec)
- {
- if(gData->stream)
- {
- if(gData->stream->frame_ptr_bk)
- {
- mem_free(pMemOP, gData->stream->frame_ptr_bk, VO_INDEX_ENC_AMRWB);
- gData->stream->frame_ptr_bk = NULL;
- }
- mem_free(pMemOP, gData->stream, VO_INDEX_ENC_AMRWB);
- gData->stream = NULL;
- }
- wb_vad_exit(&(((Coder_State *) gData)->vadSt), pMemOP);
- dtx_enc_exit(&(((Coder_State *) gData)->dtx_encSt), pMemOP);
-
- mem_free(pMemOP, hCodec, VO_INDEX_ENC_AMRWB);
- hCodec = NULL;
- }
-
- return VO_ERR_NONE;
+ Coder_State* gData = (Coder_State*)hCodec;
+ VO_MEM_OPERATOR *pMemOP;
+ pMemOP = gData->pvoMemop;
+
+ if(hCodec)
+ {
+ if(gData->stream)
+ {
+ if(gData->stream->frame_ptr_bk)
+ {
+ mem_free(pMemOP, gData->stream->frame_ptr_bk, VO_INDEX_ENC_AMRWB);
+ gData->stream->frame_ptr_bk = NULL;
+ }
+ mem_free(pMemOP, gData->stream, VO_INDEX_ENC_AMRWB);
+ gData->stream = NULL;
+ }
+ wb_vad_exit(&(((Coder_State *) gData)->vadSt), pMemOP);
+ dtx_enc_exit(&(((Coder_State *) gData)->dtx_encSt), pMemOP);
+
+ mem_free(pMemOP, hCodec, VO_INDEX_ENC_AMRWB);
+ hCodec = NULL;
+ }
+
+ return VO_ERR_NONE;
}
/********************************************************************************
@@ -1925,19 +1929,19 @@ VO_U32 VO_API voAMRWB_Uninit(VO_HANDLE hCodec /* i/o: Codec handle poi
********************************************************************************/
VO_S32 VO_API voGetAMRWBEncAPI(
- VO_AUDIO_CODECAPI * pEncHandle /* i/o: Codec handle pointer */
- )
+ VO_AUDIO_CODECAPI * pEncHandle /* i/o: Codec handle pointer */
+ )
{
- if(NULL == pEncHandle)
- return VO_ERR_INVALID_ARG;
- pEncHandle->Init = voAMRWB_Init;
- pEncHandle->SetInputData = voAMRWB_SetInputData;
- pEncHandle->GetOutputData = voAMRWB_GetOutputData;
- pEncHandle->SetParam = voAMRWB_SetParam;
- pEncHandle->GetParam = voAMRWB_GetParam;
- pEncHandle->Uninit = voAMRWB_Uninit;
-
- return VO_ERR_NONE;
+ if(NULL == pEncHandle)
+ return VO_ERR_INVALID_ARG;
+ pEncHandle->Init = voAMRWB_Init;
+ pEncHandle->SetInputData = voAMRWB_SetInputData;
+ pEncHandle->GetOutputData = voAMRWB_GetOutputData;
+ pEncHandle->SetParam = voAMRWB_SetParam;
+ pEncHandle->GetParam = voAMRWB_GetParam;
+ pEncHandle->Uninit = voAMRWB_Uninit;
+
+ return VO_ERR_NONE;
}
#ifdef __cplusplus
diff --git a/media/libstagefright/codecs/amrwbenc/src/voicefac.c b/media/libstagefright/codecs/amrwbenc/src/voicefac.c
index d890044..c9f48c2 100644
--- a/media/libstagefright/codecs/amrwbenc/src/voicefac.c
+++ b/media/libstagefright/codecs/amrwbenc/src/voicefac.c
@@ -26,65 +26,65 @@
#include "math_op.h"
Word16 voice_factor( /* (o) Q15 : factor (-1=unvoiced to 1=voiced) */
- Word16 exc[], /* (i) Q_exc : pitch excitation */
- Word16 Q_exc, /* (i) : exc format */
- Word16 gain_pit, /* (i) Q14 : gain of pitch */
- Word16 code[], /* (i) Q9 : Fixed codebook excitation */
- Word16 gain_code, /* (i) Q0 : gain of code */
- Word16 L_subfr /* (i) : subframe length */
- )
+ Word16 exc[], /* (i) Q_exc : pitch excitation */
+ Word16 Q_exc, /* (i) : exc format */
+ Word16 gain_pit, /* (i) Q14 : gain of pitch */
+ Word16 code[], /* (i) Q9 : Fixed codebook excitation */
+ Word16 gain_code, /* (i) Q0 : gain of code */
+ Word16 L_subfr /* (i) : subframe length */
+ )
{
- Word16 tmp, exp, ener1, exp1, ener2, exp2;
- Word32 i, L_tmp;
+ Word16 tmp, exp, ener1, exp1, ener2, exp2;
+ Word32 i, L_tmp;
#ifdef ASM_OPT /* asm optimization branch */
- ener1 = extract_h(Dot_product12_asm(exc, exc, L_subfr, &exp1));
+ ener1 = extract_h(Dot_product12_asm(exc, exc, L_subfr, &exp1));
#else
- ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1));
+ ener1 = extract_h(Dot_product12(exc, exc, L_subfr, &exp1));
#endif
- exp1 = exp1 - (Q_exc + Q_exc);
- L_tmp = vo_L_mult(gain_pit, gain_pit);
- exp = norm_l(L_tmp);
- tmp = extract_h(L_tmp << exp);
- ener1 = vo_mult(ener1, tmp);
- exp1 = exp1 - exp - 10; /* 10 -> gain_pit Q14 to Q9 */
+ exp1 = exp1 - (Q_exc + Q_exc);
+ L_tmp = vo_L_mult(gain_pit, gain_pit);
+ exp = norm_l(L_tmp);
+ tmp = extract_h(L_tmp << exp);
+ ener1 = vo_mult(ener1, tmp);
+ exp1 = exp1 - exp - 10; /* 10 -> gain_pit Q14 to Q9 */
#ifdef ASM_OPT /* asm optimization branch */
- ener2 = extract_h(Dot_product12_asm(code, code, L_subfr, &exp2));
+ ener2 = extract_h(Dot_product12_asm(code, code, L_subfr, &exp2));
#else
- ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2));
+ ener2 = extract_h(Dot_product12(code, code, L_subfr, &exp2));
#endif
- exp = norm_s(gain_code);
- tmp = gain_code << exp;
- tmp = vo_mult(tmp, tmp);
- ener2 = vo_mult(ener2, tmp);
- exp2 = exp2 - (exp + exp);
+ exp = norm_s(gain_code);
+ tmp = gain_code << exp;
+ tmp = vo_mult(tmp, tmp);
+ ener2 = vo_mult(ener2, tmp);
+ exp2 = exp2 - (exp + exp);
- i = exp1 - exp2;
+ i = exp1 - exp2;
- if (i >= 0)
- {
- ener1 = ener1 >> 1;
- ener2 = ener2 >> (i + 1);
- } else
- {
- ener1 = ener1 >> (1 - i);
- ener2 = ener2 >> 1;
- }
+ if (i >= 0)
+ {
+ ener1 = ener1 >> 1;
+ ener2 = ener2 >> (i + 1);
+ } else
+ {
+ ener1 = ener1 >> (1 - i);
+ ener2 = ener2 >> 1;
+ }
- tmp = vo_sub(ener1, ener2);
- ener1 = add1(add1(ener1, ener2), 1);
+ tmp = vo_sub(ener1, ener2);
+ ener1 = add1(add1(ener1, ener2), 1);
- if (tmp >= 0)
- {
- tmp = div_s(tmp, ener1);
- } else
- {
- tmp = vo_negate(div_s(vo_negate(tmp), ener1));
- }
+ if (tmp >= 0)
+ {
+ tmp = div_s(tmp, ener1);
+ } else
+ {
+ tmp = vo_negate(div_s(vo_negate(tmp), ener1));
+ }
- return (tmp);
+ return (tmp);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c
index 2beaefd..866a69c 100644
--- a/media/libstagefright/codecs/amrwbenc/src/wb_vad.c
+++ b/media/libstagefright/codecs/amrwbenc/src/wb_vad.c
@@ -44,30 +44,30 @@
*********************************************************************************/
static Word16 ilog2( /* return: output value of the log2 */
- Word16 mant /* i: value to be converted */
- )
+ Word16 mant /* i: value to be converted */
+ )
{
- Word16 ex, ex2, res;
- Word32 i, l_temp;
-
- if (mant <= 0)
- {
- mant = 1;
- }
- ex = norm_s(mant);
- mant = mant << ex;
-
- for (i = 0; i < 3; i++)
- mant = vo_mult(mant, mant);
- l_temp = vo_L_mult(mant, mant);
-
- ex2 = norm_l(l_temp);
- mant = extract_h(l_temp << ex2);
-
- res = (ex + 16) << 10;
- res = add1(res, (ex2 << 6));
- res = vo_sub(add1(res, 127), (mant >> 8));
- return (res);
+ Word16 ex, ex2, res;
+ Word32 i, l_temp;
+
+ if (mant <= 0)
+ {
+ mant = 1;
+ }
+ ex = norm_s(mant);
+ mant = mant << ex;
+
+ for (i = 0; i < 3; i++)
+ mant = vo_mult(mant, mant);
+ l_temp = vo_L_mult(mant, mant);
+
+ ex2 = norm_l(l_temp);
+ mant = extract_h(l_temp << ex2);
+
+ res = (ex + 16) << 10;
+ res = add1(res, (ex2 << 6));
+ res = vo_sub(add1(res, 127), (mant >> 8));
+ return (res);
}
/******************************************************************************
@@ -79,23 +79,23 @@ static Word16 ilog2( /* return: output value of the log2 *
*******************************************************************************/
static void filter5(
- Word16 * in0, /* i/o : input values; output low-pass part */
- Word16 * in1, /* i/o : input values; output high-pass part */
- Word16 data[] /* i/o : filter memory */
- )
+ Word16 * in0, /* i/o : input values; output low-pass part */
+ Word16 * in1, /* i/o : input values; output high-pass part */
+ Word16 data[] /* i/o : filter memory */
+ )
{
- Word16 temp0, temp1, temp2;
+ Word16 temp0, temp1, temp2;
- temp0 = vo_sub(*in0, vo_mult(COEFF5_1, data[0]));
- temp1 = add1(data[0], vo_mult(COEFF5_1, temp0));
- data[0] = temp0;
+ temp0 = vo_sub(*in0, vo_mult(COEFF5_1, data[0]));
+ temp1 = add1(data[0], vo_mult(COEFF5_1, temp0));
+ data[0] = temp0;
- temp0 = vo_sub(*in1, vo_mult(COEFF5_2, data[1]));
- temp2 = add1(data[1], vo_mult(COEFF5_2, temp0));
- data[1] = temp0;
+ temp0 = vo_sub(*in1, vo_mult(COEFF5_2, data[1]));
+ temp2 = add1(data[1], vo_mult(COEFF5_2, temp0));
+ data[1] = temp0;
- *in0 = extract_h((vo_L_add(temp1, temp2) << 15));
- *in1 = extract_h((vo_L_sub(temp1, temp2) << 15));
+ *in0 = extract_h((vo_L_add(temp1, temp2) << 15));
+ *in1 = extract_h((vo_L_sub(temp1, temp2) << 15));
}
/******************************************************************************
@@ -107,19 +107,19 @@ static void filter5(
*******************************************************************************/
static void filter3(
- Word16 * in0, /* i/o : input values; output low-pass part */
- Word16 * in1, /* i/o : input values; output high-pass part */
- Word16 * data /* i/o : filter memory */
- )
+ Word16 * in0, /* i/o : input values; output low-pass part */
+ Word16 * in1, /* i/o : input values; output high-pass part */
+ Word16 * data /* i/o : filter memory */
+ )
{
- Word16 temp1, temp2;
+ Word16 temp1, temp2;
- temp1 = vo_sub(*in1, vo_mult(COEFF3, *data));
- temp2 = add1(*data, vo_mult(COEFF3, temp1));
- *data = temp1;
+ temp1 = vo_sub(*in1, vo_mult(COEFF3, *data));
+ temp2 = add1(*data, vo_mult(COEFF3, temp1));
+ *data = temp1;
- *in1 = extract_h((vo_L_sub(*in0, temp2) << 15));
- *in0 = extract_h((vo_L_add(*in0, temp2) << 15));
+ *in1 = extract_h((vo_L_sub(*in0, temp2) << 15));
+ *in0 = extract_h((vo_L_add(*in0, temp2) << 15));
}
/******************************************************************************
@@ -135,36 +135,36 @@ static void filter3(
******************************************************************************/
static Word16 level_calculation( /* return: signal level */
- Word16 data[], /* i : signal buffer */
- Word16 * sub_level, /* i : level calculated at the end of the previous frame*/
- /* o : level of signal calculated from the last */
- /* (count2 - count1) samples */
- Word16 count1, /* i : number of samples to be counted */
- Word16 count2, /* i : number of samples to be counted */
- Word16 ind_m, /* i : step size for the index of the data buffer */
- Word16 ind_a, /* i : starting index of the data buffer */
- Word16 scale /* i : scaling for the level calculation */
- )
+ Word16 data[], /* i : signal buffer */
+ Word16 * sub_level, /* i : level calculated at the end of the previous frame*/
+ /* o : level of signal calculated from the last */
+ /* (count2 - count1) samples */
+ Word16 count1, /* i : number of samples to be counted */
+ Word16 count2, /* i : number of samples to be counted */
+ Word16 ind_m, /* i : step size for the index of the data buffer */
+ Word16 ind_a, /* i : starting index of the data buffer */
+ Word16 scale /* i : scaling for the level calculation */
+ )
{
- Word32 i, l_temp1, l_temp2;
- Word16 level;
+ Word32 i, l_temp1, l_temp2;
+ Word16 level;
- l_temp1 = 0L;
- for (i = count1; i < count2; i++)
- {
- l_temp1 += (abs_s(data[ind_m * i + ind_a])<<1);
- }
+ l_temp1 = 0L;
+ for (i = count1; i < count2; i++)
+ {
+ l_temp1 += (abs_s(data[ind_m * i + ind_a])<<1);
+ }
- l_temp2 = vo_L_add(l_temp1, L_shl(*sub_level, 16 - scale));
- *sub_level = extract_h(L_shl(l_temp1, scale));
+ l_temp2 = vo_L_add(l_temp1, L_shl(*sub_level, 16 - scale));
+ *sub_level = extract_h(L_shl(l_temp1, scale));
- for (i = 0; i < count1; i++)
- {
- l_temp2 += (abs_s(data[ind_m * i + ind_a])<<1);
- }
- level = extract_h(L_shl2(l_temp2, scale));
+ for (i = 0; i < count1; i++)
+ {
+ l_temp2 += (abs_s(data[ind_m * i + ind_a])<<1);
+ }
+ level = extract_h(L_shl2(l_temp2, scale));
- return level;
+ return level;
}
/******************************************************************************
@@ -176,75 +176,75 @@ static Word16 level_calculation( /* return: signal level */
*******************************************************************************/
static void filter_bank(
- VadVars * st, /* i/o : State struct */
- Word16 in[], /* i : input frame */
- Word16 level[] /* o : signal levels at each band */
- )
+ VadVars * st, /* i/o : State struct */
+ Word16 in[], /* i : input frame */
+ Word16 level[] /* o : signal levels at each band */
+ )
{
- Word32 i;
- Word16 tmp_buf[FRAME_LEN];
-
- /* shift input 1 bit down for safe scaling */
- for (i = 0; i < FRAME_LEN; i++)
- {
- tmp_buf[i] = in[i] >> 1;
- }
-
- /* run the filter bank */
- for (i = 0; i < 128; i++)
- {
- filter5(&tmp_buf[2 * i], &tmp_buf[2 * i + 1], st->a_data5[0]);
- }
- for (i = 0; i < 64; i++)
- {
- filter5(&tmp_buf[4 * i], &tmp_buf[4 * i + 2], st->a_data5[1]);
- filter5(&tmp_buf[4 * i + 1], &tmp_buf[4 * i + 3], st->a_data5[2]);
- }
- for (i = 0; i < 32; i++)
- {
- filter5(&tmp_buf[8 * i], &tmp_buf[8 * i + 4], st->a_data5[3]);
- filter5(&tmp_buf[8 * i + 2], &tmp_buf[8 * i + 6], st->a_data5[4]);
- filter3(&tmp_buf[8 * i + 3], &tmp_buf[8 * i + 7], &st->a_data3[0]);
- }
- for (i = 0; i < 16; i++)
- {
- filter3(&tmp_buf[16 * i + 0], &tmp_buf[16 * i + 8], &st->a_data3[1]);
- filter3(&tmp_buf[16 * i + 4], &tmp_buf[16 * i + 12], &st->a_data3[2]);
- filter3(&tmp_buf[16 * i + 6], &tmp_buf[16 * i + 14], &st->a_data3[3]);
- }
-
- for (i = 0; i < 8; i++)
- {
- filter3(&tmp_buf[32 * i + 0], &tmp_buf[32 * i + 16], &st->a_data3[4]);
- filter3(&tmp_buf[32 * i + 8], &tmp_buf[32 * i + 24], &st->a_data3[5]);
- }
-
- /* calculate levels in each frequency band */
-
- /* 4800 - 6400 Hz */
- level[11] = level_calculation(tmp_buf, &st->sub_level[11], 16, 64, 4, 1, 14);
- /* 4000 - 4800 Hz */
- level[10] = level_calculation(tmp_buf, &st->sub_level[10], 8, 32, 8, 7, 15);
- /* 3200 - 4000 Hz */
- level[9] = level_calculation(tmp_buf, &st->sub_level[9],8, 32, 8, 3, 15);
- /* 2400 - 3200 Hz */
- level[8] = level_calculation(tmp_buf, &st->sub_level[8],8, 32, 8, 2, 15);
- /* 2000 - 2400 Hz */
- level[7] = level_calculation(tmp_buf, &st->sub_level[7],4, 16, 16, 14, 16);
- /* 1600 - 2000 Hz */
- level[6] = level_calculation(tmp_buf, &st->sub_level[6],4, 16, 16, 6, 16);
- /* 1200 - 1600 Hz */
- level[5] = level_calculation(tmp_buf, &st->sub_level[5],4, 16, 16, 4, 16);
- /* 800 - 1200 Hz */
- level[4] = level_calculation(tmp_buf, &st->sub_level[4],4, 16, 16, 12, 16);
- /* 600 - 800 Hz */
- level[3] = level_calculation(tmp_buf, &st->sub_level[3],2, 8, 32, 8, 17);
- /* 400 - 600 Hz */
- level[2] = level_calculation(tmp_buf, &st->sub_level[2],2, 8, 32, 24, 17);
- /* 200 - 400 Hz */
- level[1] = level_calculation(tmp_buf, &st->sub_level[1],2, 8, 32, 16, 17);
- /* 0 - 200 Hz */
- level[0] = level_calculation(tmp_buf, &st->sub_level[0],2, 8, 32, 0, 17);
+ Word32 i;
+ Word16 tmp_buf[FRAME_LEN];
+
+ /* shift input 1 bit down for safe scaling */
+ for (i = 0; i < FRAME_LEN; i++)
+ {
+ tmp_buf[i] = in[i] >> 1;
+ }
+
+ /* run the filter bank */
+ for (i = 0; i < 128; i++)
+ {
+ filter5(&tmp_buf[2 * i], &tmp_buf[2 * i + 1], st->a_data5[0]);
+ }
+ for (i = 0; i < 64; i++)
+ {
+ filter5(&tmp_buf[4 * i], &tmp_buf[4 * i + 2], st->a_data5[1]);
+ filter5(&tmp_buf[4 * i + 1], &tmp_buf[4 * i + 3], st->a_data5[2]);
+ }
+ for (i = 0; i < 32; i++)
+ {
+ filter5(&tmp_buf[8 * i], &tmp_buf[8 * i + 4], st->a_data5[3]);
+ filter5(&tmp_buf[8 * i + 2], &tmp_buf[8 * i + 6], st->a_data5[4]);
+ filter3(&tmp_buf[8 * i + 3], &tmp_buf[8 * i + 7], &st->a_data3[0]);
+ }
+ for (i = 0; i < 16; i++)
+ {
+ filter3(&tmp_buf[16 * i + 0], &tmp_buf[16 * i + 8], &st->a_data3[1]);
+ filter3(&tmp_buf[16 * i + 4], &tmp_buf[16 * i + 12], &st->a_data3[2]);
+ filter3(&tmp_buf[16 * i + 6], &tmp_buf[16 * i + 14], &st->a_data3[3]);
+ }
+
+ for (i = 0; i < 8; i++)
+ {
+ filter3(&tmp_buf[32 * i + 0], &tmp_buf[32 * i + 16], &st->a_data3[4]);
+ filter3(&tmp_buf[32 * i + 8], &tmp_buf[32 * i + 24], &st->a_data3[5]);
+ }
+
+ /* calculate levels in each frequency band */
+
+ /* 4800 - 6400 Hz */
+ level[11] = level_calculation(tmp_buf, &st->sub_level[11], 16, 64, 4, 1, 14);
+ /* 4000 - 4800 Hz */
+ level[10] = level_calculation(tmp_buf, &st->sub_level[10], 8, 32, 8, 7, 15);
+ /* 3200 - 4000 Hz */
+ level[9] = level_calculation(tmp_buf, &st->sub_level[9],8, 32, 8, 3, 15);
+ /* 2400 - 3200 Hz */
+ level[8] = level_calculation(tmp_buf, &st->sub_level[8],8, 32, 8, 2, 15);
+ /* 2000 - 2400 Hz */
+ level[7] = level_calculation(tmp_buf, &st->sub_level[7],4, 16, 16, 14, 16);
+ /* 1600 - 2000 Hz */
+ level[6] = level_calculation(tmp_buf, &st->sub_level[6],4, 16, 16, 6, 16);
+ /* 1200 - 1600 Hz */
+ level[5] = level_calculation(tmp_buf, &st->sub_level[5],4, 16, 16, 4, 16);
+ /* 800 - 1200 Hz */
+ level[4] = level_calculation(tmp_buf, &st->sub_level[4],4, 16, 16, 12, 16);
+ /* 600 - 800 Hz */
+ level[3] = level_calculation(tmp_buf, &st->sub_level[3],2, 8, 32, 8, 17);
+ /* 400 - 600 Hz */
+ level[2] = level_calculation(tmp_buf, &st->sub_level[2],2, 8, 32, 24, 17);
+ /* 200 - 400 Hz */
+ level[1] = level_calculation(tmp_buf, &st->sub_level[1],2, 8, 32, 16, 17);
+ /* 0 - 200 Hz */
+ level[0] = level_calculation(tmp_buf, &st->sub_level[0],2, 8, 32, 0, 17);
}
/******************************************************************************
@@ -255,86 +255,86 @@ static void filter_bank(
*******************************************************************************/
static void update_cntrl(
- VadVars * st, /* i/o : State structure */
- Word16 level[] /* i : sub-band levels of the input frame */
- )
+ VadVars * st, /* i/o : State structure */
+ Word16 level[] /* i : sub-band levels of the input frame */
+ )
{
- Word32 i;
- Word16 num, temp, stat_rat, exp, denom;
- Word16 alpha;
-
- /* if a tone has been detected for a while, initialize stat_count */
- if (sub((Word16) (st->tone_flag & 0x7c00), 0x7c00) == 0)
- {
- st->stat_count = STAT_COUNT;
- } else
- {
- /* if 8 last vad-decisions have been "0", reinitialize stat_count */
- if ((st->vadreg & 0x7f80) == 0)
- {
- st->stat_count = STAT_COUNT;
- } else
- {
- stat_rat = 0;
- for (i = 0; i < COMPLEN; i++)
- {
- if(level[i] > st->ave_level[i])
- {
- num = level[i];
- denom = st->ave_level[i];
- } else
- {
- num = st->ave_level[i];
- denom = level[i];
- }
- /* Limit nimimum value of num and denom to STAT_THR_LEVEL */
- if(num < STAT_THR_LEVEL)
- {
- num = STAT_THR_LEVEL;
- }
- if(denom < STAT_THR_LEVEL)
- {
- denom = STAT_THR_LEVEL;
- }
- exp = norm_s(denom);
- denom = denom << exp;
-
- /* stat_rat = num/denom * 64 */
- temp = div_s(num >> 1, denom);
- stat_rat = add1(stat_rat, shr(temp, (8 - exp)));
- }
-
- /* compare stat_rat with a threshold and update stat_count */
- if(stat_rat > STAT_THR)
- {
- st->stat_count = STAT_COUNT;
- } else
- {
- if ((st->vadreg & 0x4000) != 0)
- {
-
- if (st->stat_count != 0)
- {
- st->stat_count = st->stat_count - 1;
- }
- }
- }
- }
- }
-
- /* Update average amplitude estimate for stationarity estimation */
- alpha = ALPHA4;
- if(st->stat_count == STAT_COUNT)
- {
- alpha = 32767;
- } else if ((st->vadreg & 0x4000) == 0)
- {
- alpha = ALPHA5;
- }
- for (i = 0; i < COMPLEN; i++)
- {
- st->ave_level[i] = add1(st->ave_level[i], vo_mult_r(alpha, vo_sub(level[i], st->ave_level[i])));
- }
+ Word32 i;
+ Word16 num, temp, stat_rat, exp, denom;
+ Word16 alpha;
+
+ /* if a tone has been detected for a while, initialize stat_count */
+ if (sub((Word16) (st->tone_flag & 0x7c00), 0x7c00) == 0)
+ {
+ st->stat_count = STAT_COUNT;
+ } else
+ {
+ /* if 8 last vad-decisions have been "0", reinitialize stat_count */
+ if ((st->vadreg & 0x7f80) == 0)
+ {
+ st->stat_count = STAT_COUNT;
+ } else
+ {
+ stat_rat = 0;
+ for (i = 0; i < COMPLEN; i++)
+ {
+ if(level[i] > st->ave_level[i])
+ {
+ num = level[i];
+ denom = st->ave_level[i];
+ } else
+ {
+ num = st->ave_level[i];
+ denom = level[i];
+ }
+ /* Limit nimimum value of num and denom to STAT_THR_LEVEL */
+ if(num < STAT_THR_LEVEL)
+ {
+ num = STAT_THR_LEVEL;
+ }
+ if(denom < STAT_THR_LEVEL)
+ {
+ denom = STAT_THR_LEVEL;
+ }
+ exp = norm_s(denom);
+ denom = denom << exp;
+
+ /* stat_rat = num/denom * 64 */
+ temp = div_s(num >> 1, denom);
+ stat_rat = add1(stat_rat, shr(temp, (8 - exp)));
+ }
+
+ /* compare stat_rat with a threshold and update stat_count */
+ if(stat_rat > STAT_THR)
+ {
+ st->stat_count = STAT_COUNT;
+ } else
+ {
+ if ((st->vadreg & 0x4000) != 0)
+ {
+
+ if (st->stat_count != 0)
+ {
+ st->stat_count = st->stat_count - 1;
+ }
+ }
+ }
+ }
+ }
+
+ /* Update average amplitude estimate for stationarity estimation */
+ alpha = ALPHA4;
+ if(st->stat_count == STAT_COUNT)
+ {
+ alpha = 32767;
+ } else if ((st->vadreg & 0x4000) == 0)
+ {
+ alpha = ALPHA5;
+ }
+ for (i = 0; i < COMPLEN; i++)
+ {
+ st->ave_level[i] = add1(st->ave_level[i], vo_mult_r(alpha, vo_sub(level[i], st->ave_level[i])));
+ }
}
/******************************************************************************
@@ -345,38 +345,38 @@ static void update_cntrl(
*******************************************************************************/
static Word16 hangover_addition( /* return: VAD_flag indicating final VAD decision */
- VadVars * st, /* i/o : State structure */
- Word16 low_power, /* i : flag power of the input frame */
- Word16 hang_len, /* i : hangover length */
- Word16 burst_len /* i : minimum burst length for hangover addition */
- )
+ VadVars * st, /* i/o : State structure */
+ Word16 low_power, /* i : flag power of the input frame */
+ Word16 hang_len, /* i : hangover length */
+ Word16 burst_len /* i : minimum burst length for hangover addition */
+ )
{
- /* if the input power (pow_sum) is lower than a threshold, clear counters and set VAD_flag to "0" */
- if (low_power != 0)
- {
- st->burst_count = 0;
- st->hang_count = 0;
- return 0;
- }
- /* update the counters (hang_count, burst_count) */
- if ((st->vadreg & 0x4000) != 0)
- {
- st->burst_count = st->burst_count + 1;
- if(st->burst_count >= burst_len)
- {
- st->hang_count = hang_len;
- }
- return 1;
- } else
- {
- st->burst_count = 0;
- if (st->hang_count > 0)
- {
- st->hang_count = st->hang_count - 1;
- return 1;
- }
- }
- return 0;
+ /* if the input power (pow_sum) is lower than a threshold, clear counters and set VAD_flag to "0" */
+ if (low_power != 0)
+ {
+ st->burst_count = 0;
+ st->hang_count = 0;
+ return 0;
+ }
+ /* update the counters (hang_count, burst_count) */
+ if ((st->vadreg & 0x4000) != 0)
+ {
+ st->burst_count = st->burst_count + 1;
+ if(st->burst_count >= burst_len)
+ {
+ st->hang_count = hang_len;
+ }
+ return 1;
+ } else
+ {
+ st->burst_count = 0;
+ if (st->hang_count > 0)
+ {
+ st->hang_count = st->hang_count - 1;
+ return 1;
+ }
+ }
+ return 0;
}
/******************************************************************************
@@ -387,66 +387,66 @@ static Word16 hangover_addition( /* return: VAD_flag indica
*******************************************************************************/
static void noise_estimate_update(
- VadVars * st, /* i/o : State structure */
- Word16 level[] /* i : sub-band levels of the input frame */
- )
+ VadVars * st, /* i/o : State structure */
+ Word16 level[] /* i : sub-band levels of the input frame */
+ )
{
- Word32 i;
- Word16 alpha_up, alpha_down, bckr_add = 2;
-
- /* Control update of bckr_est[] */
- update_cntrl(st, level);
-
- /* Choose update speed */
- if ((0x7800 & st->vadreg) == 0)
- {
- alpha_up = ALPHA_UP1;
- alpha_down = ALPHA_DOWN1;
- } else
- {
- if (st->stat_count == 0)
- {
- alpha_up = ALPHA_UP2;
- alpha_down = ALPHA_DOWN2;
- } else
- {
- alpha_up = 0;
- alpha_down = ALPHA3;
- bckr_add = 0;
- }
- }
-
- /* Update noise estimate (bckr_est) */
- for (i = 0; i < COMPLEN; i++)
- {
- Word16 temp;
- temp = (st->old_level[i] - st->bckr_est[i]);
-
- if (temp < 0)
- { /* update downwards */
- st->bckr_est[i] = add1(-2, add(st->bckr_est[i],vo_mult_r(alpha_down, temp)));
- /* limit minimum value of the noise estimate to NOISE_MIN */
- if(st->bckr_est[i] < NOISE_MIN)
- {
- st->bckr_est[i] = NOISE_MIN;
- }
- } else
- { /* update upwards */
- st->bckr_est[i] = add1(bckr_add, add1(st->bckr_est[i],vo_mult_r(alpha_up, temp)));
-
- /* limit maximum value of the noise estimate to NOISE_MAX */
- if(st->bckr_est[i] > NOISE_MAX)
- {
- st->bckr_est[i] = NOISE_MAX;
- }
- }
- }
-
- /* Update signal levels of the previous frame (old_level) */
- for (i = 0; i < COMPLEN; i++)
- {
- st->old_level[i] = level[i];
- }
+ Word32 i;
+ Word16 alpha_up, alpha_down, bckr_add = 2;
+
+ /* Control update of bckr_est[] */
+ update_cntrl(st, level);
+
+ /* Choose update speed */
+ if ((0x7800 & st->vadreg) == 0)
+ {
+ alpha_up = ALPHA_UP1;
+ alpha_down = ALPHA_DOWN1;
+ } else
+ {
+ if (st->stat_count == 0)
+ {
+ alpha_up = ALPHA_UP2;
+ alpha_down = ALPHA_DOWN2;
+ } else
+ {
+ alpha_up = 0;
+ alpha_down = ALPHA3;
+ bckr_add = 0;
+ }
+ }
+
+ /* Update noise estimate (bckr_est) */
+ for (i = 0; i < COMPLEN; i++)
+ {
+ Word16 temp;
+ temp = (st->old_level[i] - st->bckr_est[i]);
+
+ if (temp < 0)
+ { /* update downwards */
+ st->bckr_est[i] = add1(-2, add(st->bckr_est[i],vo_mult_r(alpha_down, temp)));
+ /* limit minimum value of the noise estimate to NOISE_MIN */
+ if(st->bckr_est[i] < NOISE_MIN)
+ {
+ st->bckr_est[i] = NOISE_MIN;
+ }
+ } else
+ { /* update upwards */
+ st->bckr_est[i] = add1(bckr_add, add1(st->bckr_est[i],vo_mult_r(alpha_up, temp)));
+
+ /* limit maximum value of the noise estimate to NOISE_MAX */
+ if(st->bckr_est[i] > NOISE_MAX)
+ {
+ st->bckr_est[i] = NOISE_MAX;
+ }
+ }
+ }
+
+ /* Update signal levels of the previous frame (old_level) */
+ for (i = 0; i < COMPLEN; i++)
+ {
+ st->old_level[i] = level[i];
+ }
}
/******************************************************************************
@@ -457,100 +457,100 @@ static void noise_estimate_update(
*******************************************************************************/
static Word16 vad_decision( /* return value : VAD_flag */
- VadVars * st, /* i/o : State structure */
- Word16 level[COMPLEN], /* i : sub-band levels of the input frame */
- Word32 pow_sum /* i : power of the input frame */
- )
+ VadVars * st, /* i/o : State structure */
+ Word16 level[COMPLEN], /* i : sub-band levels of the input frame */
+ Word32 pow_sum /* i : power of the input frame */
+ )
{
- Word32 i;
- Word32 L_snr_sum;
- Word32 L_temp;
- Word16 vad_thr, temp, noise_level;
- Word16 low_power_flag;
- Word16 hang_len, burst_len;
- Word16 ilog2_speech_level, ilog2_noise_level;
- Word16 temp2;
-
- /* Calculate squared sum of the input levels (level) divided by the background noise components
- * (bckr_est). */
- L_snr_sum = 0;
- for (i = 0; i < COMPLEN; i++)
- {
- Word16 exp;
-
- exp = norm_s(st->bckr_est[i]);
- temp = (st->bckr_est[i] << exp);
- temp = div_s((level[i] >> 1), temp);
- temp = shl(temp, (exp - (UNIRSHFT - 1)));
- L_snr_sum = L_mac(L_snr_sum, temp, temp);
- }
-
- /* Calculate average level of estimated background noise */
- L_temp = 0;
- for (i = 1; i < COMPLEN; i++) /* ignore lowest band */
- {
- L_temp = vo_L_add(L_temp, st->bckr_est[i]);
- }
-
- noise_level = extract_h((L_temp << 12));
- /* if SNR is lower than a threshold (MIN_SPEECH_SNR), and increase speech_level */
- temp = vo_mult(noise_level, MIN_SPEECH_SNR) << 3;
-
- if(st->speech_level < temp)
- {
- st->speech_level = temp;
- }
- ilog2_noise_level = ilog2(noise_level);
-
- /* If SNR is very poor, speech_level is probably corrupted by noise level. This is correctred by
- * subtracting MIN_SPEECH_SNR*noise_level from speech level */
- ilog2_speech_level = ilog2(st->speech_level - temp);
-
- temp = add1(vo_mult(NO_SLOPE, (ilog2_noise_level - NO_P1)), THR_HIGH);
-
- temp2 = add1(SP_CH_MIN, vo_mult(SP_SLOPE, (ilog2_speech_level - SP_P1)));
- if (temp2 < SP_CH_MIN)
- {
- temp2 = SP_CH_MIN;
- }
- if (temp2 > SP_CH_MAX)
- {
- temp2 = SP_CH_MAX;
- }
- vad_thr = temp + temp2;
-
- if(vad_thr < THR_MIN)
- {
- vad_thr = THR_MIN;
- }
- /* Shift VAD decision register */
- st->vadreg = (st->vadreg >> 1);
-
- /* Make intermediate VAD decision */
- if(L_snr_sum > vo_L_mult(vad_thr, (512 * COMPLEN)))
- {
- st->vadreg = (Word16) (st->vadreg | 0x4000);
- }
- /* check if the input power (pow_sum) is lower than a threshold" */
- if(pow_sum < VAD_POW_LOW)
- {
- low_power_flag = 1;
- } else
- {
- low_power_flag = 0;
- }
- /* Update background noise estimates */
- noise_estimate_update(st, level);
-
- /* Calculate values for hang_len and burst_len based on vad_thr */
- hang_len = add1(vo_mult(HANG_SLOPE, (vad_thr - HANG_P1)), HANG_HIGH);
- if(hang_len < HANG_LOW)
- {
- hang_len = HANG_LOW;
- }
- burst_len = add1(vo_mult(BURST_SLOPE, (vad_thr - BURST_P1)), BURST_HIGH);
-
- return (hangover_addition(st, low_power_flag, hang_len, burst_len));
+ Word32 i;
+ Word32 L_snr_sum;
+ Word32 L_temp;
+ Word16 vad_thr, temp, noise_level;
+ Word16 low_power_flag;
+ Word16 hang_len, burst_len;
+ Word16 ilog2_speech_level, ilog2_noise_level;
+ Word16 temp2;
+
+ /* Calculate squared sum of the input levels (level) divided by the background noise components
+ * (bckr_est). */
+ L_snr_sum = 0;
+ for (i = 0; i < COMPLEN; i++)
+ {
+ Word16 exp;
+
+ exp = norm_s(st->bckr_est[i]);
+ temp = (st->bckr_est[i] << exp);
+ temp = div_s((level[i] >> 1), temp);
+ temp = shl(temp, (exp - (UNIRSHFT - 1)));
+ L_snr_sum = L_mac(L_snr_sum, temp, temp);
+ }
+
+ /* Calculate average level of estimated background noise */
+ L_temp = 0;
+ for (i = 1; i < COMPLEN; i++) /* ignore lowest band */
+ {
+ L_temp = vo_L_add(L_temp, st->bckr_est[i]);
+ }
+
+ noise_level = extract_h((L_temp << 12));
+ /* if SNR is lower than a threshold (MIN_SPEECH_SNR), and increase speech_level */
+ temp = vo_mult(noise_level, MIN_SPEECH_SNR) << 3;
+
+ if(st->speech_level < temp)
+ {
+ st->speech_level = temp;
+ }
+ ilog2_noise_level = ilog2(noise_level);
+
+ /* If SNR is very poor, speech_level is probably corrupted by noise level. This is correctred by
+ * subtracting MIN_SPEECH_SNR*noise_level from speech level */
+ ilog2_speech_level = ilog2(st->speech_level - temp);
+
+ temp = add1(vo_mult(NO_SLOPE, (ilog2_noise_level - NO_P1)), THR_HIGH);
+
+ temp2 = add1(SP_CH_MIN, vo_mult(SP_SLOPE, (ilog2_speech_level - SP_P1)));
+ if (temp2 < SP_CH_MIN)
+ {
+ temp2 = SP_CH_MIN;
+ }
+ if (temp2 > SP_CH_MAX)
+ {
+ temp2 = SP_CH_MAX;
+ }
+ vad_thr = temp + temp2;
+
+ if(vad_thr < THR_MIN)
+ {
+ vad_thr = THR_MIN;
+ }
+ /* Shift VAD decision register */
+ st->vadreg = (st->vadreg >> 1);
+
+ /* Make intermediate VAD decision */
+ if(L_snr_sum > vo_L_mult(vad_thr, (512 * COMPLEN)))
+ {
+ st->vadreg = (Word16) (st->vadreg | 0x4000);
+ }
+ /* check if the input power (pow_sum) is lower than a threshold" */
+ if(pow_sum < VAD_POW_LOW)
+ {
+ low_power_flag = 1;
+ } else
+ {
+ low_power_flag = 0;
+ }
+ /* Update background noise estimates */
+ noise_estimate_update(st, level);
+
+ /* Calculate values for hang_len and burst_len based on vad_thr */
+ hang_len = add1(vo_mult(HANG_SLOPE, (vad_thr - HANG_P1)), HANG_HIGH);
+ if(hang_len < HANG_LOW)
+ {
+ hang_len = HANG_LOW;
+ }
+ burst_len = add1(vo_mult(BURST_SLOPE, (vad_thr - BURST_P1)), BURST_HIGH);
+
+ return (hangover_addition(st, low_power_flag, hang_len, burst_len));
}
/******************************************************************************
@@ -566,54 +566,54 @@ static Word16 vad_decision( /* return value : VAD_flag
*******************************************************************************/
static void Estimate_Speech(
- VadVars * st, /* i/o : State structure */
- Word16 in_level /* level of the input frame */
- )
+ VadVars * st, /* i/o : State structure */
+ Word16 in_level /* level of the input frame */
+ )
{
- Word16 alpha;
-
- /* if the required activity count cannot be achieved, reset counters */
- if((st->sp_est_cnt - st->sp_max_cnt) > (SP_EST_COUNT - SP_ACTIVITY_COUNT))
- {
- st->sp_est_cnt = 0;
- st->sp_max = 0;
- st->sp_max_cnt = 0;
- }
- st->sp_est_cnt += 1;
-
- if (((st->vadreg & 0x4000)||(in_level > st->speech_level)) && (in_level > MIN_SPEECH_LEVEL1))
- {
- /* update sp_max */
- if(in_level > st->sp_max)
- {
- st->sp_max = in_level;
- }
- st->sp_max_cnt += 1;
-
- if(st->sp_max_cnt >= SP_ACTIVITY_COUNT)
- {
- Word16 tmp;
- /* update speech estimate */
- tmp = (st->sp_max >> 1); /* scale to get "average" speech level */
-
- /* select update speed */
- if(tmp > st->speech_level)
- {
- alpha = ALPHA_SP_UP;
- } else
- {
- alpha = ALPHA_SP_DOWN;
- }
- if(tmp > MIN_SPEECH_LEVEL2)
- {
- st->speech_level = add1(st->speech_level, vo_mult_r(alpha, vo_sub(tmp, st->speech_level)));
- }
- /* clear all counters used for speech estimation */
- st->sp_max = 0;
- st->sp_max_cnt = 0;
- st->sp_est_cnt = 0;
- }
- }
+ Word16 alpha;
+
+ /* if the required activity count cannot be achieved, reset counters */
+ if((st->sp_est_cnt - st->sp_max_cnt) > (SP_EST_COUNT - SP_ACTIVITY_COUNT))
+ {
+ st->sp_est_cnt = 0;
+ st->sp_max = 0;
+ st->sp_max_cnt = 0;
+ }
+ st->sp_est_cnt += 1;
+
+ if (((st->vadreg & 0x4000)||(in_level > st->speech_level)) && (in_level > MIN_SPEECH_LEVEL1))
+ {
+ /* update sp_max */
+ if(in_level > st->sp_max)
+ {
+ st->sp_max = in_level;
+ }
+ st->sp_max_cnt += 1;
+
+ if(st->sp_max_cnt >= SP_ACTIVITY_COUNT)
+ {
+ Word16 tmp;
+ /* update speech estimate */
+ tmp = (st->sp_max >> 1); /* scale to get "average" speech level */
+
+ /* select update speed */
+ if(tmp > st->speech_level)
+ {
+ alpha = ALPHA_SP_UP;
+ } else
+ {
+ alpha = ALPHA_SP_DOWN;
+ }
+ if(tmp > MIN_SPEECH_LEVEL2)
+ {
+ st->speech_level = add1(st->speech_level, vo_mult_r(alpha, vo_sub(tmp, st->speech_level)));
+ }
+ /* clear all counters used for speech estimation */
+ st->sp_max = 0;
+ st->sp_max_cnt = 0;
+ st->sp_est_cnt = 0;
+ }
+ }
}
/******************************************************************************
@@ -624,30 +624,30 @@ static void Estimate_Speech(
*******************************************************************************/
Word16 wb_vad_init( /* return: non-zero with error, zero for ok. */
- VadVars ** state, /* i/o : State structure */
- VO_MEM_OPERATOR *pMemOP
- )
+ VadVars ** state, /* i/o : State structure */
+ VO_MEM_OPERATOR *pMemOP
+ )
{
- VadVars *s;
-
- if (state == (VadVars **) NULL)
- {
- fprintf(stderr, "vad_init: invalid parameter\n");
- return -1;
- }
- *state = NULL;
-
- /* allocate memory */
- if ((s = (VadVars *) mem_malloc(pMemOP, sizeof(VadVars), 32, VO_INDEX_ENC_AMRWB)) == NULL)
- {
- fprintf(stderr, "vad_init: can not malloc state structure\n");
- return -1;
- }
- wb_vad_reset(s);
-
- *state = s;
-
- return 0;
+ VadVars *s;
+
+ if (state == (VadVars **) NULL)
+ {
+ fprintf(stderr, "vad_init: invalid parameter\n");
+ return -1;
+ }
+ *state = NULL;
+
+ /* allocate memory */
+ if ((s = (VadVars *) mem_malloc(pMemOP, sizeof(VadVars), 32, VO_INDEX_ENC_AMRWB)) == NULL)
+ {
+ fprintf(stderr, "vad_init: can not malloc state structure\n");
+ return -1;
+ }
+ wb_vad_reset(s);
+
+ *state = s;
+
+ return 0;
}
/******************************************************************************
@@ -658,51 +658,51 @@ Word16 wb_vad_init( /* return: non-zero with error, zero
*******************************************************************************/
Word16 wb_vad_reset( /* return: non-zero with error, zero for ok. */
- VadVars * state /* i/o : State structure */
- )
+ VadVars * state /* i/o : State structure */
+ )
{
- Word32 i, j;
-
- if (state == (VadVars *) NULL)
- {
- fprintf(stderr, "vad_reset: invalid parameter\n");
- return -1;
- }
- state->tone_flag = 0;
- state->vadreg = 0;
- state->hang_count = 0;
- state->burst_count = 0;
- state->hang_count = 0;
-
- /* initialize memory used by the filter bank */
- for (i = 0; i < F_5TH_CNT; i++)
- {
- for (j = 0; j < 2; j++)
- {
- state->a_data5[i][j] = 0;
- }
- }
-
- for (i = 0; i < F_3TH_CNT; i++)
- {
- state->a_data3[i] = 0;
- }
-
- /* initialize the rest of the memory */
- for (i = 0; i < COMPLEN; i++)
- {
- state->bckr_est[i] = NOISE_INIT;
- state->old_level[i] = NOISE_INIT;
- state->ave_level[i] = NOISE_INIT;
- state->sub_level[i] = 0;
- }
-
- state->sp_est_cnt = 0;
- state->sp_max = 0;
- state->sp_max_cnt = 0;
- state->speech_level = SPEECH_LEVEL_INIT;
- state->prev_pow_sum = 0;
- return 0;
+ Word32 i, j;
+
+ if (state == (VadVars *) NULL)
+ {
+ fprintf(stderr, "vad_reset: invalid parameter\n");
+ return -1;
+ }
+ state->tone_flag = 0;
+ state->vadreg = 0;
+ state->hang_count = 0;
+ state->burst_count = 0;
+ state->hang_count = 0;
+
+ /* initialize memory used by the filter bank */
+ for (i = 0; i < F_5TH_CNT; i++)
+ {
+ for (j = 0; j < 2; j++)
+ {
+ state->a_data5[i][j] = 0;
+ }
+ }
+
+ for (i = 0; i < F_3TH_CNT; i++)
+ {
+ state->a_data3[i] = 0;
+ }
+
+ /* initialize the rest of the memory */
+ for (i = 0; i < COMPLEN; i++)
+ {
+ state->bckr_est[i] = NOISE_INIT;
+ state->old_level[i] = NOISE_INIT;
+ state->ave_level[i] = NOISE_INIT;
+ state->sub_level[i] = 0;
+ }
+
+ state->sp_est_cnt = 0;
+ state->sp_max = 0;
+ state->sp_max_cnt = 0;
+ state->speech_level = SPEECH_LEVEL_INIT;
+ state->prev_pow_sum = 0;
+ return 0;
}
/******************************************************************************
@@ -713,16 +713,16 @@ Word16 wb_vad_reset( /* return: non-zero with error, zero
*******************************************************************************/
void wb_vad_exit(
- VadVars ** state, /* i/o : State structure */
- VO_MEM_OPERATOR *pMemOP
- )
+ VadVars ** state, /* i/o : State structure */
+ VO_MEM_OPERATOR *pMemOP
+ )
{
- if (state == NULL || *state == NULL)
- return;
- /* deallocate memory */
- mem_free(pMemOP, *state, VO_INDEX_ENC_AMRWB);
- *state = NULL;
- return;
+ if (state == NULL || *state == NULL)
+ return;
+ /* deallocate memory */
+ mem_free(pMemOP, *state, VO_INDEX_ENC_AMRWB);
+ *state = NULL;
+ return;
}
/******************************************************************************
@@ -735,18 +735,18 @@ void wb_vad_exit(
*******************************************************************************/
void wb_vad_tone_detection(
- VadVars * st, /* i/o : State struct */
- Word16 p_gain /* pitch gain */
- )
+ VadVars * st, /* i/o : State struct */
+ Word16 p_gain /* pitch gain */
+ )
{
- /* update tone flag */
- st->tone_flag = (st->tone_flag >> 1);
-
- /* if (pitch_gain > TONE_THR) set tone flag */
- if (p_gain > TONE_THR)
- {
- st->tone_flag = (Word16) (st->tone_flag | 0x4000);
- }
+ /* update tone flag */
+ st->tone_flag = (st->tone_flag >> 1);
+
+ /* if (pitch_gain > TONE_THR) set tone flag */
+ if (p_gain > TONE_THR)
+ {
+ st->tone_flag = (Word16) (st->tone_flag | 0x4000);
+ }
}
/******************************************************************************
@@ -757,50 +757,50 @@ void wb_vad_tone_detection(
*******************************************************************************/
Word16 wb_vad( /* Return value : VAD Decision, 1 = speech, 0 = noise */
- VadVars * st, /* i/o : State structure */
- Word16 in_buf[] /* i : samples of the input frame */
- )
+ VadVars * st, /* i/o : State structure */
+ Word16 in_buf[] /* i : samples of the input frame */
+ )
{
- Word16 level[COMPLEN];
- Word32 i;
- Word16 VAD_flag, temp;
- Word32 L_temp, pow_sum;
-
- /* Calculate power of the input frame. */
- L_temp = 0L;
- for (i = 0; i < FRAME_LEN; i++)
- {
- L_temp = L_mac(L_temp, in_buf[i], in_buf[i]);
- }
-
- /* pow_sum = power of current frame and previous frame */
- pow_sum = L_add(L_temp, st->prev_pow_sum);
-
- /* save power of current frame for next call */
- st->prev_pow_sum = L_temp;
-
- /* If input power is very low, clear tone flag */
- if (pow_sum < POW_TONE_THR)
- {
- st->tone_flag = (Word16) (st->tone_flag & 0x1fff);
- }
- /* Run the filter bank and calculate signal levels at each band */
- filter_bank(st, in_buf, level);
-
- /* compute VAD decision */
- VAD_flag = vad_decision(st, level, pow_sum);
-
- /* Calculate input level */
- L_temp = 0;
- for (i = 1; i < COMPLEN; i++) /* ignore lowest band */
- {
- L_temp = vo_L_add(L_temp, level[i]);
- }
-
- temp = extract_h(L_temp << 12);
-
- Estimate_Speech(st, temp); /* Estimate speech level */
- return (VAD_flag);
+ Word16 level[COMPLEN];
+ Word32 i;
+ Word16 VAD_flag, temp;
+ Word32 L_temp, pow_sum;
+
+ /* Calculate power of the input frame. */
+ L_temp = 0L;
+ for (i = 0; i < FRAME_LEN; i++)
+ {
+ L_temp = L_mac(L_temp, in_buf[i], in_buf[i]);
+ }
+
+ /* pow_sum = power of current frame and previous frame */
+ pow_sum = L_add(L_temp, st->prev_pow_sum);
+
+ /* save power of current frame for next call */
+ st->prev_pow_sum = L_temp;
+
+ /* If input power is very low, clear tone flag */
+ if (pow_sum < POW_TONE_THR)
+ {
+ st->tone_flag = (Word16) (st->tone_flag & 0x1fff);
+ }
+ /* Run the filter bank and calculate signal levels at each band */
+ filter_bank(st, in_buf, level);
+
+ /* compute VAD decision */
+ VAD_flag = vad_decision(st, level, pow_sum);
+
+ /* Calculate input level */
+ L_temp = 0;
+ for (i = 1; i < COMPLEN; i++) /* ignore lowest band */
+ {
+ L_temp = vo_L_add(L_temp, level[i]);
+ }
+
+ temp = extract_h(L_temp << 12);
+
+ Estimate_Speech(st, temp); /* Estimate speech level */
+ return (VAD_flag);
}
diff --git a/media/libstagefright/codecs/amrwbenc/src/weight_a.c b/media/libstagefright/codecs/amrwbenc/src/weight_a.c
index a02b48d..23b774e 100644
--- a/media/libstagefright/codecs/amrwbenc/src/weight_a.c
+++ b/media/libstagefright/codecs/amrwbenc/src/weight_a.c
@@ -18,7 +18,7 @@
* File: weight_a.c *
* *
* Description:Weighting of LPC coefficients *
-* ap[i] = a[i] * (gamma ** i) *
+* ap[i] = a[i] * (gamma ** i) *
* *
************************************************************************/
@@ -26,22 +26,22 @@
#include "basic_op.h"
void Weight_a(
- Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */
- Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */
- Word16 gamma, /* (i) Q15 : Spectral expansion factor. */
- Word16 m /* (i) : LPC order. */
- )
+ Word16 a[], /* (i) Q12 : a[m+1] LPC coefficients */
+ Word16 ap[], /* (o) Q12 : Spectral expanded LPC coefficients */
+ Word16 gamma, /* (i) Q15 : Spectral expansion factor. */
+ Word16 m /* (i) : LPC order. */
+ )
{
- Word32 num = m - 1, fac;
- *ap++ = *a++;
- fac = gamma;
- do{
- *ap++ =(Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);
- fac = (vo_L_mult(fac, gamma) + 0x8000) >> 16;
- }while(--num != 0);
+ Word32 num = m - 1, fac;
+ *ap++ = *a++;
+ fac = gamma;
+ do{
+ *ap++ =(Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);
+ fac = (vo_L_mult(fac, gamma) + 0x8000) >> 16;
+ }while(--num != 0);
- *ap++ = (Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);
- return;
+ *ap++ = (Word16)(((vo_L_mult((*a++), fac)) + 0x8000) >> 16);
+ return;
}
diff --git a/media/libstagefright/codecs/common/Config.mk b/media/libstagefright/codecs/common/Config.mk
deleted file mode 100644
index a843cef..0000000
--- a/media/libstagefright/codecs/common/Config.mk
+++ /dev/null
@@ -1,24 +0,0 @@
-#
-# This configure file is just for Linux projects against Android
-#
-
-VOPRJ :=
-VONJ :=
-
-# WARNING:
-# Using v7 breaks generic build
-ifeq ($(TARGET_ARCH),arm)
-VOTT := v5
-else
-VOTT := pc
-endif
-
-# Do we also need to check on ARCH_ARM_HAVE_ARMV7A? - probably not
-ifeq ($(TARGET_ARCH),arm)
- ifeq ($(ARCH_ARM_HAVE_NEON),true)
- VOTT := v7
- endif
-endif
-
-VOTEST := 0
-
diff --git a/media/libstagefright/codecs/mp3dec/Android.mk b/media/libstagefright/codecs/mp3dec/Android.mk
index 948ae29..b3880ee 100644
--- a/media/libstagefright/codecs/mp3dec/Android.mk
+++ b/media/libstagefright/codecs/mp3dec/Android.mk
@@ -28,19 +28,22 @@ LOCAL_SRC_FILES := \
src/pvmp3_stereo_proc.cpp \
src/pvmp3_reorder.cpp \
-ifeq ($(TARGET_ARCH),arm)
-LOCAL_SRC_FILES += \
+LOCAL_SRC_FILES_arm += \
src/asm/pvmp3_polyphase_filter_window_gcc.s \
src/asm/pvmp3_mdct_18_gcc.s \
src/asm/pvmp3_dct_9_gcc.s \
src/asm/pvmp3_dct_16_gcc.s
-else
-LOCAL_SRC_FILES += \
+LOCAL_SRC_FILES_other_archs := \
src/pvmp3_polyphase_filter_window.cpp \
src/pvmp3_mdct_18.cpp \
src/pvmp3_dct_9.cpp \
src/pvmp3_dct_16.cpp
-endif
+
+LOCAL_SRC_FILES_arm64 := $(LOCAL_SRC_FILES_other_archs)
+LOCAL_SRC_FILES_mips := $(LOCAL_SRC_FILES_other_archs)
+LOCAL_SRC_FILES_mips64 := $(LOCAL_SRC_FILES_other_archs)
+LOCAL_SRC_FILES_x86 := $(LOCAL_SRC_FILES_other_archs)
+LOCAL_SRC_FILES_x86_64 := $(LOCAL_SRC_FILES_other_archs)
LOCAL_C_INCLUDES := \
frameworks/av/media/libstagefright/include \
diff --git a/media/libstagefright/codecs/on2/h264dec/Android.mk b/media/libstagefright/codecs/on2/h264dec/Android.mk
index e63b6b1..a16cbdf 100644
--- a/media/libstagefright/codecs/on2/h264dec/Android.mk
+++ b/media/libstagefright/codecs/on2/h264dec/Android.mk
@@ -84,19 +84,15 @@ MY_OMXDL_ASM_SRC := \
./omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DequantTransformResidualFromPairAndAdd_s.S \
./omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantChromaDCFromPair_s.S \
-ifeq ($(TARGET_ARCH),arm)
- ifeq ($(ARCH_ARM_HAVE_NEON),true)
+
+ifeq ($(ARCH_ARM_HAVE_NEON),true)
LOCAL_ARM_NEON := true
-# LOCAL_CFLAGS := -std=c99 -D._NEON -D._OMXDL
- LOCAL_CFLAGS := -DH264DEC_NEON -DH264DEC_OMXDL
- LOCAL_SRC_FILES += $(MY_ASM) $(MY_OMXDL_C_SRC) $(MY_OMXDL_ASM_SRC)
- LOCAL_C_INCLUDES += $(LOCAL_PATH)/./source/arm_neon_asm_gcc
- LOCAL_C_INCLUDES += $(LOCAL_PATH)/./omxdl/arm_neon/api \
+ LOCAL_CFLAGS_arm := -DH264DEC_NEON -DH264DEC_OMXDL
+ LOCAL_SRC_FILES_arm := $(MY_ASM) $(MY_OMXDL_C_SRC) $(MY_OMXDL_ASM_SRC)
+ LOCAL_C_INCLUDES_arm := $(LOCAL_PATH)/./source/arm_neon_asm_gcc
+ LOCAL_C_INCLUDES_arm += $(LOCAL_PATH)/./omxdl/arm_neon/api \
$(LOCAL_PATH)/./omxdl/arm_neon/vc/api \
$(LOCAL_PATH)/./omxdl/arm_neon/vc/m4p10/api
- # h264bsdWriteMacroblock.S does not compile with Clang.
- LOCAL_CLANG_ASFLAGS_arm += -no-integrated-as
- endif
endif
LOCAL_SHARED_LIBRARIES := \
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Average_4x_Align_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Average_4x_Align_unsafe_s.S
index 46e0018..e1ffb09 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Average_4x_Align_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Average_4x_Align_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_Average_4x4_Align0_unsafe
- .func armVCM4P10_Average_4x4_Align0_unsafe
armVCM4P10_Average_4x4_Align0_unsafe:
PUSH {r4-r6,lr}
LDR r7, =0x80808080
@@ -55,10 +54,8 @@ armVCM4P10_Average_4x4_Align0_unsafe:
EOR r4,r4,r7
STR r4,[r2],r3
POP {r4-r6,pc}
- .endfunc
.global armVCM4P10_Average_4x4_Align2_unsafe
- .func armVCM4P10_Average_4x4_Align2_unsafe
armVCM4P10_Average_4x4_Align2_unsafe:
PUSH {r4-r6,lr}
LDR r7, =0x80808080
@@ -99,10 +96,8 @@ armVCM4P10_Average_4x4_Align2_unsafe:
EOR r4,r4,r7
STR r4,[r2],r3
POP {r4-r6,pc}
- .endfunc
.global armVCM4P10_Average_4x4_Align3_unsafe
- .func armVCM4P10_Average_4x4_Align3_unsafe
armVCM4P10_Average_4x4_Align3_unsafe:
PUSH {r4-r6,lr}
LDR r7, =0x80808080
@@ -143,7 +138,6 @@ armVCM4P10_Average_4x4_Align3_unsafe:
EOR r4,r4,r7
STR r4,[r2],r3
POP {r4-r6,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingChroma_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingChroma_unsafe_s.S
index ca64a02..40ea4a9 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingChroma_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingChroma_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_DeblockingChromabSLT4_unsafe
- .func armVCM4P10_DeblockingChromabSLT4_unsafe
armVCM4P10_DeblockingChromabSLT4_unsafe:
VLD1.32 {d18[0]},[r5]!
VSUBL.U8 q11,d5,d9
@@ -50,10 +49,8 @@ armVCM4P10_DeblockingChromabSLT4_unsafe:
VQMOVUN.S16 d29,q14
VQMOVUN.S16 d24,q12
BX lr
- .endfunc
.global armVCM4P10_DeblockingChromabSGE4_unsafe
- .func armVCM4P10_DeblockingChromabSGE4_unsafe
armVCM4P10_DeblockingChromabSGE4_unsafe:
VHADD.U8 d13,d4,d9
VHADD.U8 d31,d8,d5
@@ -63,7 +60,6 @@ armVCM4P10_DeblockingChromabSGE4_unsafe:
VRHADD.U8 d13,d13,d5
VRHADD.U8 d31,d31,d9
BX lr
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingLuma_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingLuma_unsafe_s.S
index 193bc5e..05fb2c5 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingLuma_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DeblockingLuma_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_DeblockingLumabSLT4_unsafe
- .func armVCM4P10_DeblockingLumabSLT4_unsafe
armVCM4P10_DeblockingLumabSLT4_unsafe:
VSUBL.U8 q11,d5,d9
VLD1.8 {d18[]},[r5]!
@@ -66,10 +65,8 @@ armVCM4P10_DeblockingLumabSLT4_unsafe:
VBIF d24,d8,d16
VBIF d25,d9,d12
BX lr
- .endfunc
.global armVCM4P10_DeblockingLumabSGE4_unsafe
- .func armVCM4P10_DeblockingLumabSGE4_unsafe
armVCM4P10_DeblockingLumabSGE4_unsafe:
VSHR.U8 d19,d0,#2
VADD.I8 d19,d19,d15
@@ -111,7 +108,6 @@ armVCM4P10_DeblockingLumabSGE4_unsafe:
VBIF d24,d8,d16
VBIF d28,d10,d12
BX lr
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DecodeCoeffsToPair_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DecodeCoeffsToPair_s.S
index 8e0db37..27c0452 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DecodeCoeffsToPair_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_DecodeCoeffsToPair_s.S
@@ -42,7 +42,6 @@
.hidden armVCM4P10_ZigZag_4x4
.global armVCM4P10_DecodeCoeffsToPair
- .func armVCM4P10_DecodeCoeffsToPair
armVCM4P10_DecodeCoeffsToPair:
PUSH {r4-r12,lr}
SUB sp,sp,#0x40
@@ -302,7 +301,6 @@ L0x344:
L0x35c:
ADD sp,sp,#0x40
POP {r4-r12,pc}
- .endfunc
.LarmVCM4P10_CAVLCCoeffTokenTables:
.word armVCM4P10_CAVLCCoeffTokenTables-(P0+8)
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Align_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Align_unsafe_s.S
index 7206d76..1de9004 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Align_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Align_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_InterpolateLuma_HorAlign9x_unsafe
- .func armVCM4P10_InterpolateLuma_HorAlign9x_unsafe
armVCM4P10_InterpolateLuma_HorAlign9x_unsafe:
MOV r12,r8
AND r7,r0,#3
@@ -83,10 +82,8 @@ CopyEnd:
MOV r0,r12
MOV r1,#0xc
BX lr
- .endfunc
.global armVCM4P10_InterpolateLuma_VerAlign4x_unsafe
- .func armVCM4P10_InterpolateLuma_VerAlign4x_unsafe
armVCM4P10_InterpolateLuma_VerAlign4x_unsafe:
AND r7,r0,#3
BIC r0,r0,#3
@@ -132,7 +129,6 @@ CopyVEnd:
SUB r0,r8,#0x1c
MOV r1,#4
BX lr
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Copy_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Copy_unsafe_s.S
index e41d662..7ba2890 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Copy_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_Copy_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_InterpolateLuma_Copy4x4_unsafe
- .func armVCM4P10_InterpolateLuma_Copy4x4_unsafe
armVCM4P10_InterpolateLuma_Copy4x4_unsafe:
PUSH {r4-r6,lr}
AND r12,r0,#3
@@ -114,7 +113,6 @@ Copy4x4Align3:
STR r8,[r2],r3
Copy4x4End:
POP {r4-r6,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_DiagCopy_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_DiagCopy_unsafe_s.S
index c8f5cda..8b2c678 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_DiagCopy_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_DiagCopy_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_InterpolateLuma_HorDiagCopy_unsafe
- .func armVCM4P10_InterpolateLuma_HorDiagCopy_unsafe
armVCM4P10_InterpolateLuma_HorDiagCopy_unsafe:
PUSH {r4-r6,lr}
MOV lr,#4
@@ -57,10 +56,8 @@ LoopStart1:
SUB r0,r7,#0x20
MOV r1,#8
POP {r4-r6,pc}
- .endfunc
.global armVCM4P10_InterpolateLuma_VerDiagCopy_unsafe
- .func armVCM4P10_InterpolateLuma_VerDiagCopy_unsafe
armVCM4P10_InterpolateLuma_VerDiagCopy_unsafe:
PUSH {r4-r6,lr}
LDR r6, =0xfe00fe0
@@ -116,7 +113,6 @@ LoopStart:
SUB r0,r7,#0x18
MOV r1,#4
POP {r4-r6,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagHorVer4x4_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagHorVer4x4_unsafe_s.S
index f5868c0..77aa927 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagHorVer4x4_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagHorVer4x4_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_InterpolateLuma_HalfDiagHorVer4x4_unsafe
- .func armVCM4P10_InterpolateLuma_HalfDiagHorVer4x4_unsafe
armVCM4P10_InterpolateLuma_HalfDiagHorVer4x4_unsafe:
PUSH {r4-r12,lr}
VLD1.8 {d0,d1},[r0],r1
@@ -173,7 +172,6 @@ armVCM4P10_InterpolateLuma_HalfDiagHorVer4x4_unsafe:
VQMOVN.U16 d4,q2
VQMOVN.U16 d6,q3
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagVerHor4x4_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagVerHor4x4_unsafe_s.S
index 065995d..e5f7f1c 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagVerHor4x4_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfDiagVerHor4x4_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_InterpolateLuma_HalfDiagVerHor4x4_unsafe
- .func armVCM4P10_InterpolateLuma_HalfDiagVerHor4x4_unsafe
armVCM4P10_InterpolateLuma_HalfDiagVerHor4x4_unsafe:
PUSH {r4-r12,lr}
VLD1.8 {d0,d1},[r0],r1
@@ -128,7 +127,6 @@ armVCM4P10_InterpolateLuma_HalfDiagVerHor4x4_unsafe:
VQMOVN.U16 d4,q2
VQMOVN.U16 d6,q3
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfHor4x4_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfHor4x4_unsafe_s.S
index 1e2d16b..393d385 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfHor4x4_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfHor4x4_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_InterpolateLuma_HalfHor4x4_unsafe
- .func armVCM4P10_InterpolateLuma_HalfHor4x4_unsafe
armVCM4P10_InterpolateLuma_HalfHor4x4_unsafe:
PUSH {r4-r12,lr}
VLD1.8 {d22,d23},[r0],r1
@@ -81,7 +80,6 @@ armVCM4P10_InterpolateLuma_HalfHor4x4_unsafe:
VQRSHRUN.S16 d26,q13,#5
VQRSHRUN.S16 d28,q14,#5
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfVer4x4_unsafe_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfVer4x4_unsafe_s.S
index c7def2a..698e7b5 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfVer4x4_unsafe_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_InterpolateLuma_HalfVer4x4_unsafe_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_InterpolateLuma_HalfVer4x4_unsafe
- .func armVCM4P10_InterpolateLuma_HalfVer4x4_unsafe
armVCM4P10_InterpolateLuma_HalfVer4x4_unsafe:
PUSH {r4-r12,lr}
VLD1.8 {d7},[r0],r1
@@ -67,7 +66,6 @@ armVCM4P10_InterpolateLuma_HalfVer4x4_unsafe:
VQRSHRUN.S16 d4,q2,#5
VQRSHRUN.S16 d6,q3,#5
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Interpolate_Chroma_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Interpolate_Chroma_s.S
index 2f4293f..e469516 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Interpolate_Chroma_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_Interpolate_Chroma_s.S
@@ -38,7 +38,6 @@ armVCM4P10_WidthBranchTableMVIsZero:
.word WidthIs8MVIsZero-(P0+8)
.global armVCM4P10_Interpolate_Chroma
- .func armVCM4P10_Interpolate_Chroma
armVCM4P10_Interpolate_Chroma:
PUSH {r4-r12,lr}
VPUSH {d8-d15}
@@ -183,7 +182,6 @@ WidthIs2MVIsZero:
MOV r0,#0
VPOP {d8-d15}
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_TransformResidual4x4_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_TransformResidual4x4_s.S
index d4cedb5..e18bec7 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_TransformResidual4x4_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_TransformResidual4x4_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_TransformResidual4x4
- .func armVCM4P10_TransformResidual4x4
armVCM4P10_TransformResidual4x4:
VPUSH {d8}
VLD4.16 {d0,d1,d2,d3},[r1]
@@ -61,7 +60,6 @@ armVCM4P10_TransformResidual4x4:
VST1.16 {d0,d1,d2,d3},[r0]
VPOP {d8}
BX lr
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_UnpackBlock4x4_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_UnpackBlock4x4_s.S
index 1652dc6..b97efcb 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_UnpackBlock4x4_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/armVCM4P10_UnpackBlock4x4_s.S
@@ -24,9 +24,9 @@
.arm
.fpu neon
.text
+ .syntax unified
.global armVCM4P10_UnpackBlock4x4
- .func armVCM4P10_UnpackBlock4x4
armVCM4P10_UnpackBlock4x4:
PUSH {r4-r8,lr}
LDR r2,[r0,#0]
@@ -40,16 +40,15 @@ armVCM4P10_UnpackBlock4x4:
STRD r4,r5,[r1,#0x18]
unpackLoop:
TST r3,#0x10
- LDRNESB r5,[r2,#1]
- LDRNEB r4,[r2],#2
+ LDRSBNE r5,[r2,#1]
+ LDRBNE r4,[r2],#2
AND r6,r7,r3,LSL #1
- LDREQSB r4,[r2],#1
+ LDRSBEQ r4,[r2],#1
ORRNE r4,r4,r5,LSL #8
TST r3,#0x20
- LDREQB r3,[r2],#1
+ LDRBEQ r3,[r2],#1
STRH r4,[r1,r6]
BEQ unpackLoop
STR r2,[r0,#0]
POP {r4-r8,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DeblockLuma_I.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DeblockLuma_I.S
index 90b0947..6a99bde 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DeblockLuma_I.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DeblockLuma_I.S
@@ -26,7 +26,6 @@
.text
.global omxVCM4P10_DeblockLuma_I
- .func omxVCM4P10_DeblockLuma_I
omxVCM4P10_DeblockLuma_I:
PUSH {r4-r9,lr}
MOVS r6,r0
@@ -76,7 +75,6 @@ L0x64:
BL omxVCM4P10_FilterDeblockingLuma_HorEdge_I
ADD sp,sp,#0xc
POP {r4-r9,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DequantTransformResidualFromPairAndAdd_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DequantTransformResidualFromPairAndAdd_s.S
index 4a74594..17c5d8b 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DequantTransformResidualFromPairAndAdd_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_DequantTransformResidualFromPairAndAdd_s.S
@@ -26,7 +26,6 @@
.text
.global omxVCM4P10_DequantTransformResidualFromPairAndAdd
- .func omxVCM4P10_DequantTransformResidualFromPairAndAdd
omxVCM4P10_DequantTransformResidualFromPairAndAdd:
PUSH {r4-r12,lr}
VPUSH {d8-d9}
@@ -131,7 +130,6 @@ L0x130:
ADD sp,sp,#0x20
VPOP {d8-d9}
POP {r4-r12,pc}
- .endfunc
.LarmVCM4P10_QPModuloTable:
.word armVCM4P10_QPModuloTable-(P0+8)
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_HorEdge_I_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_HorEdge_I_s.S
index f20fb78..4a83516 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_HorEdge_I_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_HorEdge_I_s.S
@@ -26,7 +26,6 @@
.text
.global omxVCM4P10_FilterDeblockingChroma_HorEdge_I
- .func omxVCM4P10_FilterDeblockingChroma_HorEdge_I
omxVCM4P10_FilterDeblockingChroma_HorEdge_I:
PUSH {r4-r10,lr}
VPUSH {d8-d15}
@@ -96,7 +95,6 @@ L0xe4:
MOV r0,#0
VPOP {d8-d15}
POP {r4-r10,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_VerEdge_I_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_VerEdge_I_s.S
index 003526e..fe10931 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_VerEdge_I_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingChroma_VerEdge_I_s.S
@@ -26,7 +26,6 @@
.text
.global omxVCM4P10_FilterDeblockingChroma_VerEdge_I
- .func omxVCM4P10_FilterDeblockingChroma_VerEdge_I
omxVCM4P10_FilterDeblockingChroma_VerEdge_I:
PUSH {r4-r12,lr}
VPUSH {d8-d15}
@@ -132,7 +131,6 @@ L0x170:
MOV r0,#0
VPOP {d8-d15}
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_HorEdge_I_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_HorEdge_I_s.S
index 7ddc42e..84ffad2 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_HorEdge_I_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_HorEdge_I_s.S
@@ -26,7 +26,6 @@
.text
.global omxVCM4P10_FilterDeblockingLuma_HorEdge_I
- .func omxVCM4P10_FilterDeblockingLuma_HorEdge_I
omxVCM4P10_FilterDeblockingLuma_HorEdge_I:
PUSH {r4-r12,lr}
VPUSH {d8-d15}
@@ -116,7 +115,6 @@ L0x130:
MOV r0,#0
VPOP {d8-d15}
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_VerEdge_I_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_VerEdge_I_s.S
index f71aceb..f2a3682 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_VerEdge_I_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_FilterDeblockingLuma_VerEdge_I_s.S
@@ -26,7 +26,6 @@
.text
.global omxVCM4P10_FilterDeblockingLuma_VerEdge_I
- .func omxVCM4P10_FilterDeblockingLuma_VerEdge_I
omxVCM4P10_FilterDeblockingLuma_VerEdge_I:
PUSH {r4-r12,lr}
VPUSH {d8-d15}
@@ -166,7 +165,6 @@ L0x1f0:
MOV r0,#0
VPOP {d8-d15}
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_InterpolateLuma_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_InterpolateLuma_s.S
index 000fbeb..314eabd 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_InterpolateLuma_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_InterpolateLuma_s.S
@@ -26,7 +26,6 @@
.text
.global omxVCM4P10_InterpolateLuma
- .func omxVCM4P10_InterpolateLuma
omxVCM4P10_InterpolateLuma:
PUSH {r4-r12,lr}
VPUSH {d8-d15}
@@ -332,7 +331,6 @@ L0x434:
ADD sp,sp,#0x10
VPOP {d8-d15}
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntraChroma_8x8_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntraChroma_8x8_s.S
index 4e2cff6..50d1350 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntraChroma_8x8_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntraChroma_8x8_s.S
@@ -36,7 +36,6 @@ armVCM4P10_MultiplierTableChroma8x8:
.hword 1, 2, 3,4
.global omxVCM4P10_PredictIntraChroma_8x8
- .func omxVCM4P10_PredictIntraChroma_8x8
omxVCM4P10_PredictIntraChroma_8x8:
PUSH {r4-r10,lr}
VPUSH {d8-d15}
@@ -226,7 +225,6 @@ L0x28c:
MOV r0,#0
VPOP {d8-d15}
POP {r4-r10,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_16x16_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_16x16_s.S
index c71c93b..0044636 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_16x16_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_16x16_s.S
@@ -42,7 +42,6 @@ armVCM4P10_MultiplierTable16x16:
.global omxVCM4P10_PredictIntra_16x16
- .func omxVCM4P10_PredictIntra_16x16
omxVCM4P10_PredictIntra_16x16:
PUSH {r4-r12,lr}
VPUSH {d8-d15}
@@ -246,7 +245,6 @@ L0x2d4:
MOV r0,#0
VPOP {d8-d15}
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_4x4_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_4x4_s.S
index cd5d356..d4c8485 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_4x4_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_PredictIntra_4x4_s.S
@@ -35,7 +35,6 @@ armVCM4P10_pSwitchTable4x4:
.word OMX_VC_4x4_HU-(P0+8)
.global omxVCM4P10_PredictIntra_4x4
- .func omxVCM4P10_PredictIntra_4x4
omxVCM4P10_PredictIntra_4x4:
PUSH {r4-r12,lr}
VPUSH {d8-d12}
@@ -270,6 +269,5 @@ L0x348:
MOV r0,#0
VPOP {d8-d12}
POP {r4-r12,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantChromaDCFromPair_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantChromaDCFromPair_s.S
index 5570892..74f5103 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantChromaDCFromPair_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantChromaDCFromPair_s.S
@@ -24,9 +24,9 @@
.arm
.fpu neon
.text
+ .syntax unified
.global omxVCM4P10_TransformDequantChromaDCFromPair
- .func omxVCM4P10_TransformDequantChromaDCFromPair
omxVCM4P10_TransformDequantChromaDCFromPair:
push {r4-r10, lr}
ldr r9, [r0,#0]
@@ -36,13 +36,13 @@ omxVCM4P10_TransformDequantChromaDCFromPair:
ldrb r6, [r9], #1
unpackLoop:
tst r6, #0x10
- ldrnesb r5, [r9, #1]
- ldrneb r4, [r9], #2
+ ldrsbne r5, [r9, #1]
+ ldrbne r4, [r9], #2
and r7, r8, r6, lsl #1
- ldreqsb r4, [r9], #1
+ ldrsbeq r4, [r9], #1
orrne r4, r4, r5, lsl #8
tst r6, #0x20
- ldreqb r6, [r9], #1
+ ldrbeq r6, [r9], #1
strh r4, [r1, r7]
beq unpackLoop
ldmia r1, {r3, r4}
@@ -66,7 +66,6 @@ P1: add r6, pc
vst1.16 {d2}, [r1]
mov r0, #0
pop {r4-r10, pc}
- .endfunc
.LarmVCM4P10_QPDivTable:
.word armVCM4P10_QPDivTable-(P0+8)
diff --git a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantLumaDCFromPair_s.S b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantLumaDCFromPair_s.S
index 5b6eee0..a01030a 100644
--- a/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantLumaDCFromPair_s.S
+++ b/media/libstagefright/codecs/on2/h264dec/omxdl/arm_neon/vc/m4p10/src_gcc/omxVCM4P10_TransformDequantLumaDCFromPair_s.S
@@ -26,7 +26,6 @@
.text
.global armVCM4P10_InvTransformDequantLumaDC4x4
- .func armVCM4P10_InvTransformDequantLumaDC4x4
armVCM4P10_InvTransformDequantLumaDC4x4:
PUSH {r4-r6,lr}
VPUSH {d8-d13}
@@ -73,7 +72,6 @@ P1: ADD r3, pc
VST1.16 {d0,d1,d2,d3},[r0]
VPOP {d8-d13}
POP {r4-r6,pc}
- .endfunc
.LarmVCM4P10_QPDivTable:
.word armVCM4P10_QPDivTable-(P0+8)
@@ -81,7 +79,6 @@ P1: ADD r3, pc
.word armVCM4P10_VMatrixQPModTable-(P1+8)
.global omxVCM4P10_TransformDequantLumaDCFromPair
-.func omxVCM4P10_TransformDequantLumaDCFromPair
omxVCM4P10_TransformDequantLumaDCFromPair:
PUSH {r4-r6,lr}
MOV r4,r1
@@ -92,7 +89,6 @@ omxVCM4P10_TransformDequantLumaDCFromPair:
BL armVCM4P10_InvTransformDequantLumaDC4x4
MOV r0,#0
POP {r4-r6,pc}
- .endfunc
.end
diff --git a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/asm_common.S b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/asm_common.S
index f39f5c4..969a75c 100644
--- a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/asm_common.S
+++ b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/asm_common.S
@@ -31,11 +31,9 @@
.global \name
.endif
.type \name, %function
- .func \name
\name:
.endm
.macro endfunction
- .endfunc
.endm
diff --git a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdClearMbLayer.S b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdClearMbLayer.S
index c8a940e..3c2752f 100644
--- a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdClearMbLayer.S
+++ b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdClearMbLayer.S
@@ -16,7 +16,7 @@
#include "asm_common.S"
- preserve8
+ PRESERVE8
.fpu neon
.text
@@ -29,7 +29,7 @@
/* -- NEON registers -- */
-#define qZero Q0.U8
+#define qZero Q0
/*------------------------------------------------------------------------------
@@ -47,17 +47,17 @@
function h264bsdClearMbLayer, export=1
- VMOV qZero, #0
+ VMOV.I8 qZero, #0
ADD pTmp, pMbLayer, #16
MOV step, #32
SUBS size, size, #64
loop:
- VST1 {qZero}, [pMbLayer], step
+ VST1.8 {qZero}, [pMbLayer], step
SUBS size, size, #64
- VST1 {qZero}, [pTmp], step
- VST1 {qZero}, [pMbLayer], step
- VST1 {qZero}, [pTmp], step
+ VST1.8 {qZero}, [pTmp], step
+ VST1.8 {qZero}, [pMbLayer], step
+ VST1.8 {qZero}, [pTmp], step
BCS loop
BX lr
diff --git a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdCountLeadingZeros.S b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdCountLeadingZeros.S
index 05253d0..b1c9f60 100644
--- a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdCountLeadingZeros.S
+++ b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdCountLeadingZeros.S
@@ -15,7 +15,7 @@
@
#include "asm_common.S"
- preserve8
+ PRESERVE8
.arm
.text
diff --git a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFillRow7.S b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFillRow7.S
index 6955b9a..6ed6227 100644
--- a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFillRow7.S
+++ b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFillRow7.S
@@ -16,7 +16,7 @@
#include "asm_common.S"
- preserve8
+ PRESERVE8
.fpu neon
.text
@@ -33,12 +33,12 @@
/* -- NEON registers -- */
-#define qTmp0 Q0.U8
-#define qTmp1 Q1.U8
-#define dTmp0 D0.U8
-#define dTmp1 D1.U8
-#define dTmp2 D2.U8
-#define dTmp3 D3.U8
+#define qTmp0 Q0
+#define qTmp1 Q1
+#define dTmp0 D0
+#define dTmp1 D1
+#define dTmp2 D2
+#define dTmp3 D3
/*
void h264bsdFillRow7(const u8 * ref, u8 * fill, i32 left, i32 center,
@@ -74,40 +74,40 @@ switch_center:
B case_8
case_8:
- VLD1 {qTmp0, qTmp1}, [ref]!
+ VLD1.8 {qTmp0, qTmp1}, [ref]!
SUB center, center, #32
- VST1 {qTmp0}, [fill]!
- VST1 {qTmp1}, [fill]!
+ VST1.8 {qTmp0}, [fill]!
+ VST1.8 {qTmp1}, [fill]!
B loop_center
case_7:
- VLD1 {dTmp0,dTmp1,dTmp2}, [ref]!
+ VLD1.8 {dTmp0,dTmp1,dTmp2}, [ref]!
SUB center, center, #28
LDR tmp2, [ref], #4
- VST1 {dTmp0,dTmp1,dTmp2}, [fill]!
+ VST1.8 {dTmp0,dTmp1,dTmp2}, [fill]!
STR tmp2, [fill],#4
B loop_center
case_6:
- VLD1 {dTmp0,dTmp1,dTmp2}, [ref]!
+ VLD1.8 {dTmp0,dTmp1,dTmp2}, [ref]!
SUB center, center, #24
- VST1 {dTmp0,dTmp1,dTmp2}, [fill]!
+ VST1.8 {dTmp0,dTmp1,dTmp2}, [fill]!
B loop_center
case_5:
- VLD1 {qTmp0}, [ref]!
+ VLD1.8 {qTmp0}, [ref]!
SUB center, center, #20
LDR tmp2, [ref], #4
- VST1 {qTmp0}, [fill]!
+ VST1.8 {qTmp0}, [fill]!
STR tmp2, [fill],#4
B loop_center
case_4:
- VLD1 {qTmp0}, [ref]!
+ VLD1.8 {qTmp0}, [ref]!
SUB center, center, #16
- VST1 {qTmp0}, [fill]!
+ VST1.8 {qTmp0}, [fill]!
B loop_center
case_3:
- VLD1 {dTmp0}, [ref]!
+ VLD1.8 {dTmp0}, [ref]!
SUB center, center, #12
LDR tmp2, [ref], #4
- VST1 dTmp0, [fill]!
+ VST1.8 dTmp0, [fill]!
STR tmp2, [fill],#4
B loop_center
case_2:
diff --git a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFlushBits.S b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFlushBits.S
index b3f3191..aa88471 100644
--- a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFlushBits.S
+++ b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdFlushBits.S
@@ -16,7 +16,7 @@
#include "asm_common.S"
- preserve8
+ PRESERVE8
.arm
.text
diff --git a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdWriteMacroblock.S b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdWriteMacroblock.S
index 495d560..4093b92 100644
--- a/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdWriteMacroblock.S
+++ b/media/libstagefright/codecs/on2/h264dec/source/arm_neon_asm_gcc/h264bsdWriteMacroblock.S
@@ -16,8 +16,8 @@
#include "asm_common.S"
- require8
- preserve8
+ REQUIRE8
+ PRESERVE8
.arm
.fpu neon
@@ -34,39 +34,39 @@
/* -- NEON registers -- */
-#define qRow0 Q0.U8
-#define qRow1 Q1.U8
-#define qRow2 Q2.U8
-#define qRow3 Q3.U8
-#define qRow4 Q4.U8
-#define qRow5 Q5.U8
-#define qRow6 Q6.U8
-#define qRow7 Q7.U8
-#define qRow8 Q8.U8
-#define qRow9 Q9.U8
-#define qRow10 Q10.U8
-#define qRow11 Q11.U8
-#define qRow12 Q12.U8
-#define qRow13 Q13.U8
-#define qRow14 Q14.U8
-#define qRow15 Q15.U8
-
-#define dRow0 D0.U8
-#define dRow1 D1.U8
-#define dRow2 D2.U8
-#define dRow3 D3.U8
-#define dRow4 D4.U8
-#define dRow5 D5.U8
-#define dRow6 D6.U8
-#define dRow7 D7.U8
-#define dRow8 D8.U8
-#define dRow9 D9.U8
-#define dRow10 D10.U8
-#define dRow11 D11.U8
-#define dRow12 D12.U8
-#define dRow13 D13.U8
-#define dRow14 D14.U8
-#define dRow15 D15.U8
+#define qRow0 Q0
+#define qRow1 Q1
+#define qRow2 Q2
+#define qRow3 Q3
+#define qRow4 Q4
+#define qRow5 Q5
+#define qRow6 Q6
+#define qRow7 Q7
+#define qRow8 Q8
+#define qRow9 Q9
+#define qRow10 Q10
+#define qRow11 Q11
+#define qRow12 Q12
+#define qRow13 Q13
+#define qRow14 Q14
+#define qRow15 Q15
+
+#define dRow0 D0
+#define dRow1 D1
+#define dRow2 D2
+#define dRow3 D3
+#define dRow4 D4
+#define dRow5 D5
+#define dRow6 D6
+#define dRow7 D7
+#define dRow8 D8
+#define dRow9 D9
+#define dRow10 D10
+#define dRow11 D11
+#define dRow12 D12
+#define dRow13 D13
+#define dRow14 D14
+#define dRow15 D15
/*------------------------------------------------------------------------------
@@ -99,59 +99,58 @@ function h264bsdWriteMacroblock, export=1
@ Write luma
- VLD1 {qRow0, qRow1}, [data]!
+ VLD1.8 {qRow0, qRow1}, [data]!
LSL width, width, #4
- VLD1 {qRow2, qRow3}, [data]!
+ VLD1.8 {qRow2, qRow3}, [data]!
LSR cwidth, width, #1
- VST1 {qRow0}, [luma,:128], width
- VLD1 {qRow4, qRow5}, [data]!
- VST1 {qRow1}, [luma,:128], width
- VLD1 {qRow6, qRow7}, [data]!
- VST1 {qRow2}, [luma,:128], width
- VLD1 {qRow8, qRow9}, [data]!
- VST1 {qRow3}, [luma,:128], width
- VLD1 {qRow10, qRow11}, [data]!
- VST1 {qRow4}, [luma,:128], width
- VLD1 {qRow12, qRow13}, [data]!
- VST1 {qRow5}, [luma,:128], width
- VLD1 {qRow14, qRow15}, [data]!
- VST1 {qRow6}, [luma,:128], width
-
- VLD1 {qRow0, qRow1}, [data]! ;//cb rows 0,1,2,3
- VST1 {qRow7}, [luma,:128], width
- VLD1 {qRow2, qRow3}, [data]! ;//cb rows 4,5,6,7
- VST1 {qRow8}, [luma,:128], width
- VLD1 {qRow4, qRow5}, [data]! ;//cr rows 0,1,2,3
- VST1 {qRow9}, [luma,:128], width
- VLD1 {qRow6, qRow7}, [data]! ;//cr rows 4,5,6,7
- VST1 {qRow10}, [luma,:128], width
- VST1 {dRow0}, [cb,:64], cwidth
- VST1 {dRow8}, [cr,:64], cwidth
- VST1 {qRow11}, [luma,:128], width
- VST1 {dRow1}, [cb,:64], cwidth
- VST1 {dRow9}, [cr,:64], cwidth
- VST1 {qRow12}, [luma,:128], width
- VST1 {dRow2}, [cb,:64], cwidth
- VST1 {dRow10}, [cr,:64], cwidth
- VST1 {qRow13}, [luma,:128], width
- VST1 {dRow3}, [cb,:64], cwidth
- VST1 {dRow11}, [cr,:64], cwidth
- VST1 {qRow14}, [luma,:128], width
- VST1 {dRow4}, [cb,:64], cwidth
- VST1 {dRow12}, [cr,:64], cwidth
- VST1 {qRow15}, [luma]
- VST1 {dRow5}, [cb,:64], cwidth
- VST1 {dRow13}, [cr,:64], cwidth
- VST1 {dRow6}, [cb,:64], cwidth
- VST1 {dRow14}, [cr,:64], cwidth
- VST1 {dRow7}, [cb,:64]
- VST1 {dRow15}, [cr,:64]
+ VST1.8 {qRow0}, [luma,:128], width
+ VLD1.8 {qRow4, qRow5}, [data]!
+ VST1.8 {qRow1}, [luma,:128], width
+ VLD1.8 {qRow6, qRow7}, [data]!
+ VST1.8 {qRow2}, [luma,:128], width
+ VLD1.8 {qRow8, qRow9}, [data]!
+ VST1.8 {qRow3}, [luma,:128], width
+ VLD1.8 {qRow10, qRow11}, [data]!
+ VST1.8 {qRow4}, [luma,:128], width
+ VLD1.8 {qRow12, qRow13}, [data]!
+ VST1.8 {qRow5}, [luma,:128], width
+ VLD1.8 {qRow14, qRow15}, [data]!
+ VST1.8 {qRow6}, [luma,:128], width
+
+ VLD1.8 {qRow0, qRow1}, [data]! ;//cb rows 0,1,2,3
+ VST1.8 {qRow7}, [luma,:128], width
+ VLD1.8 {qRow2, qRow3}, [data]! ;//cb rows 4,5,6,7
+ VST1.8 {qRow8}, [luma,:128], width
+ VLD1.8 {qRow4, qRow5}, [data]! ;//cr rows 0,1,2,3
+ VST1.8 {qRow9}, [luma,:128], width
+ VLD1.8 {qRow6, qRow7}, [data]! ;//cr rows 4,5,6,7
+ VST1.8 {qRow10}, [luma,:128], width
+ VST1.8 {dRow0}, [cb,:64], cwidth
+ VST1.8 {dRow8}, [cr,:64], cwidth
+ VST1.8 {qRow11}, [luma,:128], width
+ VST1.8 {dRow1}, [cb,:64], cwidth
+ VST1.8 {dRow9}, [cr,:64], cwidth
+ VST1.8 {qRow12}, [luma,:128], width
+ VST1.8 {dRow2}, [cb,:64], cwidth
+ VST1.8 {dRow10}, [cr,:64], cwidth
+ VST1.8 {qRow13}, [luma,:128], width
+ VST1.8 {dRow3}, [cb,:64], cwidth
+ VST1.8 {dRow11}, [cr,:64], cwidth
+ VST1.8 {qRow14}, [luma,:128], width
+ VST1.8 {dRow4}, [cb,:64], cwidth
+ VST1.8 {dRow12}, [cr,:64], cwidth
+ VST1.8 {qRow15}, [luma]
+ VST1.8 {dRow5}, [cb,:64], cwidth
+ VST1.8 {dRow13}, [cr,:64], cwidth
+ VST1.8 {dRow6}, [cb,:64], cwidth
+ VST1.8 {dRow14}, [cr,:64], cwidth
+ VST1.8 {dRow7}, [cb,:64]
+ VST1.8 {dRow15}, [cr,:64]
VPOP {q4-q7}
POP {r4-r6,pc}
@ BX lr
- .endfunc
diff --git a/media/mtp/MtpUtils.cpp b/media/mtp/MtpUtils.cpp
index 0667bdd..ebf3601 100644
--- a/media/mtp/MtpUtils.cpp
+++ b/media/mtp/MtpUtils.cpp
@@ -19,8 +19,6 @@
#include <stdio.h>
#include <time.h>
-#include <../private/bionic_time.h> /* TODO: switch this code to icu4c! */
-
#include "MtpUtils.h"
namespace android {
@@ -32,38 +30,40 @@ representation, YYYY shall be replaced by the year, MM replaced by the month (01
DD replaced by the day (01-31), T is a constant character 'T' delimiting time from date,
hh is replaced by the hour (00-23), mm is replaced by the minute (00-59), and ss by the
second (00-59). The ".s" is optional, and represents tenths of a second.
+This is followed by a UTC offset given as "[+-]zzzz" or the literal "Z", meaning UTC.
*/
bool parseDateTime(const char* dateTime, time_t& outSeconds) {
int year, month, day, hour, minute, second;
- struct tm tm;
-
if (sscanf(dateTime, "%04d%02d%02dT%02d%02d%02d",
- &year, &month, &day, &hour, &minute, &second) != 6)
+ &year, &month, &day, &hour, &minute, &second) != 6)
return false;
- const char* tail = dateTime + 15;
+
// skip optional tenth of second
- if (tail[0] == '.' && tail[1])
- tail += 2;
- //FIXME - support +/-hhmm
- bool useUTC = (tail[0] == 'Z');
+ const char* tail = dateTime + 15;
+ if (tail[0] == '.' && tail[1]) tail += 2;
- // hack to compute timezone
- time_t dummy;
- localtime_r(&dummy, &tm);
+ // FIXME: "Z" means UTC, but non-"Z" doesn't mean local time.
+ // It might be that you're in Asia/Seoul on vacation and your Android
+ // device has noticed this via the network, but your camera was set to
+ // America/Los_Angeles once when you bought it and doesn't know where
+ // it is right now, so the camera says "20160106T081700-0800" but we
+ // just ignore the "-0800" and assume local time which is actually "+0900".
+ // I think to support this (without switching to Java or using icu4c)
+ // you'd want to always use timegm(3) and then manually add/subtract
+ // the UTC offset parsed from the string (taking care of wrapping).
+ // mktime(3) ignores the tm_gmtoff field, so you can't let it do the work.
+ bool useUTC = (tail[0] == 'Z');
+ struct tm tm = {};
tm.tm_sec = second;
tm.tm_min = minute;
tm.tm_hour = hour;
tm.tm_mday = day;
tm.tm_mon = month - 1; // mktime uses months in 0 - 11 range
tm.tm_year = year - 1900;
- tm.tm_wday = 0;
tm.tm_isdst = -1;
- if (useUTC)
- outSeconds = mktime(&tm);
- else
- outSeconds = mktime_tz(&tm, tm.tm_zone);
+ outSeconds = useUTC ? timegm(&tm) : mktime(&tm);
return true;
}
@@ -73,7 +73,7 @@ void formatDateTime(time_t seconds, char* buffer, int bufferLength) {
localtime_r(&seconds, &tm);
snprintf(buffer, bufferLength, "%04d%02d%02dT%02d%02d%02d",
- tm.tm_year + 1900,
+ tm.tm_year + 1900,
tm.tm_mon + 1, // localtime_r uses months in 0 - 11 range
tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec);
}
diff --git a/media/utils/BatteryNotifier.cpp b/media/utils/BatteryNotifier.cpp
index 7f9cd7a..355c231 100644
--- a/media/utils/BatteryNotifier.cpp
+++ b/media/utils/BatteryNotifier.cpp
@@ -14,6 +14,9 @@
* limitations under the License.
*/
+#define LOG_TAG "BatteryNotifier"
+//#define LOG_NDEBUG 0
+
#include "include/mediautils/BatteryNotifier.h"
#include <binder/IServiceManager.h>
diff --git a/services/audiopolicy/service/AudioPolicyEffects.cpp b/services/audiopolicy/service/AudioPolicyEffects.cpp
index e71d7a5..26857b1 100644
--- a/services/audiopolicy/service/AudioPolicyEffects.cpp
+++ b/services/audiopolicy/service/AudioPolicyEffects.cpp
@@ -40,7 +40,9 @@ namespace android {
AudioPolicyEffects::AudioPolicyEffects()
{
// load automatic audio effect modules
- if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE, R_OK) == 0) {
+ if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE2, R_OK) == 0) {
+ loadAudioEffectConfig(AUDIO_EFFECT_VENDOR_CONFIG_FILE2);
+ } else if (access(AUDIO_EFFECT_VENDOR_CONFIG_FILE, R_OK) == 0) {
loadAudioEffectConfig(AUDIO_EFFECT_VENDOR_CONFIG_FILE);
} else if (access(AUDIO_EFFECT_DEFAULT_CONFIG_FILE, R_OK) == 0) {
loadAudioEffectConfig(AUDIO_EFFECT_DEFAULT_CONFIG_FILE);
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp
index 13af3ef..f76b5c8 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImplLegacy.cpp
@@ -158,13 +158,27 @@ status_t AudioPolicyService::startOutput(audio_io_handle_t output,
return NO_INIT;
}
ALOGV("startOutput()");
- // create audio processors according to stream
+ return mOutputCommandThread->startOutputCommand(output, stream, session);
+}
+
+status_t AudioPolicyService::doStartOutput(audio_io_handle_t output,
+ audio_stream_type_t stream,
+ audio_session_t session)
+{
+ if (uint32_t(stream) >= AUDIO_STREAM_CNT) {
+ return BAD_VALUE;
+ }
+ if (mpAudioPolicy == NULL) {
+ return NO_INIT;
+ }
+ ALOGV("doStartOutput()");
sp<AudioPolicyEffects>audioPolicyEffects;
{
Mutex::Autolock _l(mLock);
audioPolicyEffects = mAudioPolicyEffects;
}
if (audioPolicyEffects != 0) {
+ // create audio processors according to stream
status_t status = audioPolicyEffects->addOutputSessionEffects(output, stream, session);
if (status != NO_ERROR && status != ALREADY_EXISTS) {
ALOGW("Failed to add effects on session %d", session);
diff --git a/services/camera/libcameraservice/api1/Camera2Client.cpp b/services/camera/libcameraservice/api1/Camera2Client.cpp
index 4338d64..1821636 100644
--- a/services/camera/libcameraservice/api1/Camera2Client.cpp
+++ b/services/camera/libcameraservice/api1/Camera2Client.cpp
@@ -1741,8 +1741,6 @@ void Camera2Client::notifyError(ICameraDeviceCallbacks::CameraErrorCode errorCod
err = CAMERA_ERROR_RELEASED;
break;
case ICameraDeviceCallbacks::ERROR_CAMERA_DEVICE:
- err = CAMERA_ERROR_UNKNOWN;
- break;
case ICameraDeviceCallbacks::ERROR_CAMERA_SERVICE:
err = CAMERA_ERROR_SERVER_DIED;
break;