vothin 1 anno fa
parent
commit
4c270e3bae
49 ha cambiato i file con 926 aggiunte e 96 eliminazioni
  1. 14 4
      jni/Makefile
  2. 134 0
      jni/Makefile_20231102.bak
  3. 115 0
      jni/dep/include/audio/acoustic_echo_cancellater.h
  4. 73 0
      jni/dep/include/audio/audio_parameter.h
  5. 65 0
      jni/dep/include/audio/audio_player.h
  6. 196 0
      jni/dep/include/audio/audio_process_chain.h
  7. 35 0
      jni/dep/include/audio/audio_resampler.h
  8. 38 0
      jni/dep/include/audio/g711.h
  9. 80 0
      jni/dep/include/audio/media_player.h
  10. 79 0
      jni/dep/include/video_display_utility.h
  11. 38 0
      jni/dep/include/voip/mi_video_impl.h
  12. 55 5
      jni/dep/include/voip/telephone.h
  13. 0 86
      jni/dep/include/voip/telephone_audio_initializer.cpp
  14. 4 1
      jni/dep/include/voip/telephone_audio_initializer.h
  15. BIN
      jni/dep/lib/libaudio-utility.a
  16. BIN
      jni/dep/lib/libavcodec.a
  17. BIN
      jni/dep/lib/libavdevice.a
  18. BIN
      jni/dep/lib/libavfilter.a
  19. BIN
      jni/dep/lib/libavformat.a
  20. BIN
      jni/dep/lib/libavutil.a
  21. BIN
      jni/dep/lib/libdisplay_utility.a
  22. BIN
      jni/dep/lib/libg7221codec-arm-unknown-linux-gnueabihf.a
  23. BIN
      jni/dep/lib/libilbccodec-arm-unknown-linux-gnueabihf.a
  24. BIN
      jni/dep/lib/libpj-arm-unknown-linux-gnueabihf.a
  25. BIN
      jni/dep/lib/libpjlib-util-arm-unknown-linux-gnueabihf.a
  26. BIN
      jni/dep/lib/libpjmedia-arm-unknown-linux-gnueabihf.a
  27. BIN
      jni/dep/lib/libpjmedia-audiodev-arm-unknown-linux-gnueabihf.a
  28. BIN
      jni/dep/lib/libpjmedia-codec-arm-unknown-linux-gnueabihf.a
  29. BIN
      jni/dep/lib/libpjmedia-videodev-arm-unknown-linux-gnueabihf.a
  30. BIN
      jni/dep/lib/libpjnath-arm-unknown-linux-gnueabihf.a
  31. BIN
      jni/dep/lib/libpjsip-arm-unknown-linux-gnueabihf.a
  32. BIN
      jni/dep/lib/libpjsip-simple-arm-unknown-linux-gnueabihf.a
  33. BIN
      jni/dep/lib/libpjsip-ua-arm-unknown-linux-gnueabihf.a
  34. BIN
      jni/dep/lib/libpjsua-arm-unknown-linux-gnueabihf.a
  35. BIN
      jni/dep/lib/libpjsua2-arm-unknown-linux-gnueabihf.a
  36. BIN
      jni/dep/lib/libresample-arm-unknown-linux-gnueabihf.a
  37. BIN
      jni/dep/lib/libsrtp-arm-unknown-linux-gnueabihf.a
  38. BIN
      jni/dep/lib/libswresample.a
  39. BIN
      jni/dep/lib/libswscale.a
  40. BIN
      jni/dep/lib/libvoip.a
  41. BIN
      jni/dep/lib/libyuv-arm-unknown-linux-gnueabihf.a
  42. BIN
      jni/dependencies/libAEC_LINUX.so
  43. BIN
      jni/dependencies/libAPC_LINUX.so
  44. BIN
      libs/armeabi/libzkgui.so
  45. BIN
      obj/activity/callActivity.o
  46. BIN
      obj/activity/startActivity.o
  47. BIN
      obj/core/utilities.o
  48. BIN
      obj/dep/include/voip/telephone_audio_initializer.o
  49. BIN
      obj/service/time.o

File diff suppressed because it is too large
+ 14 - 4
jni/Makefile


+ 134 - 0
jni/Makefile_20231102.bak

@@ -0,0 +1,134 @@
+#一般情况无需修改该文件
+
+LOCAL_PATH=$(dir  $(abspath $(lastword $(MAKEFILE_LIST))))
+ZKSW_PREBUILT_LIB_PATH := $(ZKSW_REAL_PREBUILT)/lib
+ZKSW_PREBUILT_INCLUDE_PATH := $(ZKSW_REAL_PREBUILT)/include
+
+EASYUI_COMMON_INCLUDE := $(LOCAL_PATH)/include
+
+#配置源文件目录
+PROJ_ROOT_PATH  :=./
+#源文件后缀名
+PROJ_SRC_SUFFIX := %.cpp %.c
+PROJ_HEAD_SUFFIX := %.h
+# 递归遍历目录下的所有的文件 
+rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))  
+# 获取相应的源文件
+PROJ_ALL_FILES := $(foreach src_path,$(PROJ_ROOT_PATH), $(call rwildcard,$(src_path),*.*) )   
+PROJ_SRC_FILES := $(filter $(PROJ_SRC_SUFFIX),$(PROJ_ALL_FILES))   
+PROJ_HEAD_FILES := $(filter $(PROJ_HEAD_SUFFIX),$(PROJ_ALL_FILES))   
+
+# 获取相应的源文件
+LOCAL_SRC_FILES  := $(PROJ_SRC_FILES) 
+LOCAL_HEAD_FILES := $(PROJ_HEAD_FILES) 
+
+#源文件目录结构
+PROJ_DIR_TREE := $(dir $(foreach src_path, $(LOCAL_SRC_FILES), $(call rwildcard,$(src_path),*/) ) )  
+PROJ_DIR_TREE := $(sort $(PROJ_DIR_TREE))  
+
+
+OBJS_ROOT_DIR=../obj/
+OBJS_1 = $(patsubst %.cpp,%.o,$(LOCAL_SRC_FILES))
+OBJS_2 = $(patsubst %.c,%.o,$(OBJS_1))
+OBJS   = $(addprefix $(OBJS_ROOT_DIR),$(OBJS_2))
+OBJS_DIR_TREE=$(addprefix $(OBJS_ROOT_DIR),$(PROJ_DIR_TREE))
+
+CFLAGS=-Os -pipe  -fno-caller-saves -Wno-unused-result -mfloat-abi=hard -mfpu=vfp -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro -Wl,--warn-common -Wl,--warn-once -Wl,-z,combreloc -Wl,-z,defs -DUSE_ANDROID_LOG 
+CXXFLAGS=-Os -pipe  -fno-caller-saves -Wno-unused-result -mfloat-abi=hard -mfpu=vfp -Wformat -Werror=format-security -fstack-protector -D_FORTIFY_SOURCE=1 -Wl,-z,now -Wl,-z,relro -Wl,-z,defs -DUSE_ANDROID_LOG
+
+CXXFLAGS+= -fexceptions -Wall -lstdc++ -std=c++11 \
+          -DPJ_IS_LITTLE_ENDIAN=1 -DPJ_IS_BIG_ENDIAN=0	\
+          -D__PLAT_Z21__=1
+
+STATIC_LIB = curl/libcurl.a zlib/libz.a
+
+INCLUDE_DIR := -I$(EASYUI_COMMON_INCLUDE) \
+               -I$(ZKSW_PREBUILT_INCLUDE_PATH) \
+               -I. \
+               -Idep/include
+
+LDFLAGS += -lcurl -lcares -lssl -lcrypto
+
+LDFLAGS += -lvoip \
+           -lpjsua2-arm-unknown-linux-gnueabihf \
+           -lstdc++ -lpjsua-arm-unknown-linux-gnueabihf \
+           -lpjsip-ua-arm-unknown-linux-gnueabihf \
+           -lpjsip-simple-arm-unknown-linux-gnueabihf \
+           -lpjsip-arm-unknown-linux-gnueabihf \
+           -lpjmedia-codec-arm-unknown-linux-gnueabihf \
+           -lpjmedia-arm-unknown-linux-gnueabihf \
+           -lpjmedia-videodev-arm-unknown-linux-gnueabihf \
+           -lpjmedia-audiodev-arm-unknown-linux-gnueabihf \
+           -lpjmedia-arm-unknown-linux-gnueabihf \
+           -lpjnath-arm-unknown-linux-gnueabihf \
+           -lpjlib-util-arm-unknown-linux-gnueabihf  \
+           -lsrtp-arm-unknown-linux-gnueabihf \
+           -lresample-arm-unknown-linux-gnueabihf \
+           -lg7221codec-arm-unknown-linux-gnueabihf \
+           -lyuv-arm-unknown-linux-gnueabihf  \
+           -lpj-arm-unknown-linux-gnueabihf \
+           -lopus \
+           -lzkaudio \
+           -lpaho-mqtt3c
+           
+LDFLAGS += -lsqlite3
+
+LDFLAGS += -lswscale -lswresample -lavfilter -lavformat -lavcodec \
+           -lavdevice -lavutil
+           
+LDFLAGS += -lopenh264 
+LDFLAGS += -lz
+LDFLAGS += -lmi_panel -lmi_disp -lmi_ai -lmi_ao -lmi_sys -lmi_common -lcam_os_wrapper
+LDFLAGS += -lzkhardware -lzknet -leasyui -llog -pthread -lm -ldl
+LDFLAGS += -L$(ZKSW_PREBUILT_LIB_PATH) -L. -Ldep/lib
+
+TARGET=../libs/armeabi/libzkgui.so
+
+ifeq ($(TARGET), $(wildcard $(TARGET)))
+	DELETE_TARGET=$(TARGET)
+endif
+
+# alias commads if compile on windows
+RM =rm
+MKDIR=mkdir
+ECHO=echo
+ifeq ($(OS),Windows_NT)
+	RM=win32-rm
+	MKDIR=win32-mkdir
+	ECHO=win32-echo
+else
+	#keep default
+endif
+#alias end
+
+all: prepare $(TARGET)
+	@$(ECHO)
+	@$(ECHO) "[armeabi] Install        : libzkgui.so => libs/armeabi/libzkgui.so"
+	
+
+$(OBJS_ROOT_DIR)%.o: %.cpp $(LOCAL_HEAD_FILES)
+	@$(ECHO) "[armeabi] Compile++      : "$< 
+	@$(CC) -c $< -o $@ $(CXXFLAGS) $(INCLUDE_DIR) $(LDFLAGS) 
+	
+$(OBJS_ROOT_DIR)%.o: %.c $(LOCAL_HEAD_FILES)
+	@$(ECHO) "[armeabi] Compile++      : "$< 
+	@$(CC) -c $< -o $@ $(CFLAGS) $(INCLUDE_DIR) $(LDFLAGS) 
+
+$(TARGET):$(OBJS) 
+	@$(ECHO) "[armeabi] SharedLibrary  : "$@ 
+	@$(CC) -fPIC -shared $^ -o $@ $(LDFLAGS) $(CXXFLAGS)
+	@$(CROSS_COMPILE)strip $@ 
+	
+prepare: 
+	@$(ECHO) "[armeabi] GCC            : "$(CC) 
+	@-$(MKDIR) ../libs/armeabi -p 
+	@-$(MKDIR) $(OBJS_DIR_TREE) -p 
+	@-$(RM) $(TARGET) -rf 
+	
+clean:
+	@$(ECHO) "[armeabi] Clean          : "$(OBJS_ROOT_DIR) 
+	@-$(RM)  $(OBJS_ROOT_DIR) -rf 
+	@$(ECHO) "[armeabi] Clean          : "$(TARGET)
+	@-$(RM)  $(TARGET) -rf 
+
+.PHONY:all clean prepare $(TARGET)

+ 115 - 0
jni/dep/include/audio/acoustic_echo_cancellater.h

@@ -0,0 +1,115 @@
+/*
+ * acoustic_echo_cancellater.h
+ *
+ *  Created on: 2022年6月10日
+ *      Author: pengzc
+ */
+
+#ifndef JNI_VOIP_ACOUSTIC_ECHO_CANCELLATER_H_
+#define JNI_VOIP_ACOUSTIC_ECHO_CANCELLATER_H_
+
+#include <string.h>
+#include <string>
+
+namespace base {
+
+/**
+ * 回声消除(Acoustic Echo Cancellation,简称AEC),是一种用于抑制远程回声的功能。
+ * 回声常见于会议系统、楼宇对讲、安防监控等场景,
+ * 当远程声音从喇叭播放出来后,麦克风在非常小的延时后,重新采集喇叭播放出来的声音并传输回远程,
+ * 这个延迟的原始信号将导致远程听到回声。
+ */
+class AcousticEchoCancellater {
+public:
+
+  struct Configuration {
+    /**
+     * 在AEC后加入舒适噪声,避免回声消除后部分段落静音,让用户有断线的感觉。
+     * 若AEC后有开启Noise reduction,建议开启comfort noise,帮助NR收敛噪声。
+     *
+     * 使能该参数后,AEC算法会在没有声音时添加一些舒适噪声。
+     * 当客户对稳定的底噪有要求或AEC消得太干净导致NR收敛时间太长时,可使能该功能。
+     */
+    bool comfort_noise_enable;
+
+    /**
+     * 左右声道间的回声延迟样本
+     * 当Stereo cost down 开启时,可以根据麦克风摆放位置先行设定样本延迟数,减少双声道所需运算量。
+     * 默认为0,单位是sample数 取值范围:-9-9
+     *
+     * 由于麦克风和喇叭的放置位置、麦克风间的距离等会造成左右声道接收到回声的时间点不一致,
+     * 两个声道之间回声延迟有差异。
+     * 此值表示左声道比右声道提早多少个采样点收到回声。
+     * 可以调整此值来对齐左右声道的资料,设置时,请以左声道作为参考。
+     * 例如左声道的回声比右声道的回声快4个样本,则s16DelaySample设置为4,反之设置为-4。
+     */
+    short delay_sample;
+
+    /**
+     * AEC处理的频段划分,将不同取样率所能解析的最高频率等分成128等分,
+     * 设定六个值可切出七个段落设定不同AEC强度。
+     * 取值范围:1-127
+     *
+     *
+     */
+    unsigned int suppression_mode_freq[6];
+
+    /**
+     * 配合suppression_mode_freq所切割出来的七个段落分别设定七种强度。
+     * 取值范围:0-25
+     *
+     * 该数组代表各个频段的回声消除强度,各个元素与suppression_mode_freq划分出来的7个频段一一对应。
+     * 强度越大,消除的细节越多,声音越不自然。
+     */
+    unsigned int suppression_mode_intensity[7];
+
+    /**
+     * 近端的信道数(即麦克风的信道数)
+     */
+    unsigned int nearend_channel;
+
+    /**
+     * 远端的信道数(即喇叭的通道数)
+     */
+    unsigned int farend_channel;
+
+    /**
+     * 采样率
+     */
+    unsigned int sample_rate;
+
+    Configuration();
+
+    std::string ToString() const;
+    static Configuration FromString(const std::string& str);
+  };
+
+  AcousticEchoCancellater();
+  virtual ~AcousticEchoCancellater();
+
+  /**
+   * 初始化,成功返回0,失败返回非0
+   * @param configuration
+   * @return
+   */
+  int Initialize(const AcousticEchoCancellater::Configuration& configuration);
+
+  /**
+   * 数据的长度必须与录音的每一帧长度相同,所以这里没有长度参数
+   *
+   * 处理结果将写回pss_audio_near_end
+   *
+   * @param pss_audio_near_end 近端数据
+   * @param pss_audio_far_end 远端数据
+   * @return 0 success
+   */
+  int Process(short* pss_audio_near_end, short* pss_audio_far_end);
+
+private:
+  class Impl;
+  Impl* impl_;
+};
+
+} /* namespace base */
+
+#endif /* JNI_VOIP_ECHO_CANCELLATER_H_ */

+ 73 - 0
jni/dep/include/audio/audio_parameter.h

@@ -0,0 +1,73 @@
+/*
+ * audio_parameter1.h
+ *
+ *  Created on: 2022年5月6日
+ *      Author: pengzc
+ */
+
+#ifndef JNI_VOIP_AUDIO_PARAMETER_H_
+#define JNI_VOIP_AUDIO_PARAMETER_H_
+
+#include <string>
+
+namespace base {
+
+enum SampleFormat {
+    SAMPLE_FMT_U8,          ///< unsigned 8 bits
+    SAMPLE_FMT_S16,         ///< signed 16 bits
+    SAMPLE_FMT_S32,         ///< signed 32 bits
+    SAMPLE_FMT_FLT,         ///< float
+    SAMPLE_FMT_DBL,         ///< double
+
+    SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar
+    SAMPLE_FMT_S16P,        ///< signed 16 bits, planar
+    SAMPLE_FMT_S32P,        ///< signed 32 bits, planar
+    SAMPLE_FMT_FLTP,        ///< float, planar
+    SAMPLE_FMT_DBLP,        ///< double, planar
+    SAMPLE_FMT_S64,         ///< signed 64 bits
+    SAMPLE_FMT_S64P,        ///< signed 64 bits, planar
+};
+
+enum SampleRate {
+  SAMPLE_RATE_8000 = 8000,         /* 8kHz sampling rate */
+  SAMPLE_RATE_11025 = 11025,       /* 11.025kHz sampling rate */
+  SAMPLE_RATE_12000 = 12000,       /* 12kHz sampling rate */
+  SAMPLE_RATE_16000 = 16000,       /* 16kHz sampling rate */
+  SAMPLE_RATE_22050 = 22050,       /* 22.05kHz sampling rate */
+  SAMPLE_RATE_24000 = 24000,       /* 24kHz sampling rate */
+  SAMPLE_RATE_32000 = 32000,       /* 32kHz sampling rate */
+  SAMPLE_RATE_44100 = 44100,       /* 44.1kHz sampling rate */
+  SAMPLE_RATE_48000 = 48000,       /* 48kHz sampling rate */
+  SAMPLE_RATE_96000 = 96000,       /* 96kHz sampling rate */
+};
+
+enum ChannelLayout {
+
+};
+
+struct AudioParameter {
+  int number_of_channels;
+  int sample_rate;
+  int sample_format;
+
+  AudioParameter() {
+    number_of_channels = 0;
+    sample_rate = 0;
+    sample_format = 0;
+  }
+
+  AudioParameter(int number_of_channels, int sample_rate, int sample_format) {
+    this->number_of_channels = number_of_channels;
+    this->sample_rate = sample_rate;
+    this->sample_format = sample_format;
+  }
+
+  std::string ToString();
+};
+
+} /* namespace base */
+
+bool operator==(const base::AudioParameter& a, const base::AudioParameter& b);
+bool operator!=(const base::AudioParameter& a, const base::AudioParameter& b);
+
+#endif /* JNI_VOIP_AUDIO_PARAMETER_H_ */

+ 65 - 0
jni/dep/include/audio/audio_player.h

@@ -0,0 +1,65 @@
+#ifndef JNI_AUDIO_PLAYER_H_
+#define JNI_AUDIO_PLAYER_H_
+
+#include <string>
+
+#include "../audio/audio_parameter.h"
+#include "../audio/audio_process_chain.h"
+
+namespace base {
+
+/**
+ * 可多实例的,带重采样的PCM播放器
+ */
+class AudioPlayer {
+public:
+  AudioPlayer(const AudioParameter& input_parameter);
+  AudioPlayer(const AudioParameter& input_parameter,
+      const AudioProcessChain::Configuration& apc_conf);
+  virtual ~AudioPlayer();
+
+  int Play();
+  int Pause();
+  int Resume();
+  int Stop();
+
+  int PutSamples(const uint8_t* samples, int length);
+
+  /**
+   * 等待,直到播放完成
+   */
+  void Wait();
+
+private:
+  class Impl;
+  Impl* impl_;
+};
+
+} /* namespace fy */
+
+extern "C" base::AudioPlayer* CreateAudioPlayer();
+extern "C" void DestroyAudioPlayer(base::AudioPlayer* stream_player);
+
+/**
+ * 当所有的StreamPlayer停止播放后,将关闭音频输出设备
+ * 默认延迟5000毫秒关闭
+ * @param millis 延迟时间  (毫秒)
+ */
+extern "C" void SetAudioPlayerDisableAudioOutputDeviceDelayed(int millis);
+
+struct StreamPlayerMuteHandler {
+  /**
+   * 播放器设置是否静音
+   * @param mute
+   * @return
+   */
+  int (*SetMute)(bool mute);
+  /**
+   * 是否静音,静音返回true
+   * @return
+   */
+  bool (*GetMute)();
+};
+extern "C" void SetAudioPlayerMuteHandler(const StreamPlayerMuteHandler& handler);
+
+#endif /* JNI_STREAM_PLAYER_H_ */

+ 196 - 0
jni/dep/include/audio/audio_process_chain.h

@@ -0,0 +1,196 @@
+/*
+ * audio_process_chain.h
+ *
+ *  Created on: 2022年6月9日
+ *      Author: pengzc
+ */
+
+#ifndef JNI_VOIP_AUDIO_PROCESS_CHAIN_H_
+#define JNI_VOIP_AUDIO_PROCESS_CHAIN_H_
+
+#include <string.h>
+#include <string>
+
+namespace base {
+
+struct AudioAnrConfig {
+  /**
+   * 是否使能Anr算法
+   */
+  unsigned int enable;
+  /**
+   * Anr算法运行的模式
+   * 0,表示Anr算法完全不使用其他的Anr参数,而是使用Anr算法内部的设定;
+   * 1或2表示完全使用应用下的Anr参数
+   */
+  unsigned int user_mode;
+  /**
+   * 降噪频率范围 范围[1,127];步长1
+   */
+  int intensity_band[6];
+  /**
+   * 降噪强度,值越大降噪强度越高,但同时也会带来细节的丢失/损伤,建议值:10。
+   * 范围[0,30];步长1
+   */
+  int intensity[7];
+  /**
+   * 频域平滑程度,建议值:10 范围[0,10];步长1
+   */
+  unsigned int smooth_level;
+  /**
+   * 噪声收敛速度,建议值 1
+   * 取值范围 [0,2] ,0最低,2最高
+   */
+  int converge_speed;
+
+  AudioAnrConfig();
+};
+
+struct AudioEqConfig {
+  /**
+   * 是否使能Eq算法
+   */
+  unsigned int enable;
+  /**
+   * Eq算法的运行模式
+   * 0,表示Eq使用预设的参数,预设参数全为0,不做任何增益或衰减;
+   * 1,表示完全使用应用下的Eq参数。
+   */
+  unsigned int user_mode;
+  /**
+   * Eq算法增益调节取值,将当前采样率的频率范围分成129个频率范围来进行调节,
+   * 单位为1dB 范围[-50,20];步长1
+   */
+  short gain_db[129];
+
+  AudioEqConfig();
+};
+
+struct AgcGainInfo {
+  int gain_max;  //gain maximum
+  int gain_min;  //gain minimum
+  int gain_init; //default gain (initial gain)
+};
+
+struct AudioAgcConfig {
+  /**
+   * 是否使能Agc算法
+   */
+  unsigned int enable;
+  /**
+   * Agc算法的运行模式
+   */
+  unsigned int user_mode;
+  /**
+   * Agc算法的增益信息,定义AGC增益的最大、最小和初始值
+   */
+  AgcGainInfo gain_info;
+  /**
+   * 瞬间增益下降的最大值,防止输出饱和,
+   * 若输出加上当前Gain超出drop_gain_threshold所设定的dB值,
+   * Agc会瞬间降低Gain避免当前信号的峰值超过drop_gain_threshold。
+   * 范围[0,60];步长1 注意:此值仅代表能下降的范围,但具体能下降到何值还需参考AGC增益的最小值。
+   */
+  unsigned int drop_gain_max;
+  /**
+   * 增益下降的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否降Gain 范围[1,20];步长1
+   */
+  unsigned int attack_time;
+  /**
+   * 增益增加的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否升Gain 范围[1, 20] ;步长1
+   */
+  unsigned int release_time;
+  /**
+   * 配合compression_ratio_output 使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。
+   * 范围[-80,0]dBFS;步长1
+   */
+  short compression_ratio_input[7];
+  /**
+   * 配合compression_ratio_input使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。
+   * 范围[-80,0]dBFS;步长1
+   */
+  short compression_ratio_output[7];
+  /**
+   * 衰减阈值,当信号峰值幅度超过此值后,会瞬间衰减,衰减幅度受drop_gain_max跟gain_info所限制。
+   * 范围[-80,0]dB;步长1
+   */
+  int drop_gain_threshold;
+  /**
+   * 噪声阈值,当信号小于此值时,当作噪声处理,
+   * Case1: 若设定noise_gate_db 从-80到0,当前gain值会根据release/attack time的时间将Gain值收敛成0。
+   * Case2: 若设定noise_gate_db 从1到80,当信号小于此值时,Gain值将不会做更改,会保留前一帧的Gain值。
+   * 范围[-80,80];步长1
+   */
+  int noise_gate_db;
+  /**
+   * 当噪声阈值起效果时,输入源的衰减百分比
+   * 范围[0,100];步长1
+   */
+  unsigned int noise_gate_attenuation_db;
+  /**
+   * 套用增益的速率,以0.5dB为一个单位,若设定为1,则每帧依照需求套用±0.5dB。
+   * 此值设定的越高,拉升和降低音量的速率越快。 范围[1,10]; 步长1
+   */
+  unsigned int gain_step;
+
+  AudioAgcConfig();
+};
+
+/**
+ * APC(Audio Process Chain)音频处理链路,是一个包含降噪、均衡器和自动增益控制的算法组合。
+ * APC的主要目的是提高音频质量。
+ * APC的内部的算法串接流程为Anr → Eq/Hpf → Agc。
+ * 透过降噪消除噪声提升SNR,再根据客户所需曲线调整EQ/HPF,最后输出透过AGC放大或压抑。
+ *
+ * AGC(Automatic Gain Control),自动增益控制,用于控制数字输出增益。
+ * EQ(Equalizer),均衡器处理,用于对特定频段进行增益或衰减。
+ * ANR(Acoustic Noise Reduction),降噪,用于去除环境中持续存在,频率固定的噪声。
+ * HPF(High-Pass Filtering),高通滤波
+ *
+ */
+class AudioProcessChain {
+public:
+  struct Configuration {
+    AudioAnrConfig anr;
+    AudioEqConfig eq;
+    AudioAgcConfig agc;
+
+    /**
+     * 通道数
+     */
+    unsigned int number_of_channels;
+    /**
+     * 采样率
+     */
+    unsigned int sample_rate;
+
+    Configuration();
+    std::string ToString() const ;
+    static Configuration FromString(const std::string& str);
+  };
+
+  AudioProcessChain();
+  virtual ~AudioProcessChain();
+
+  /**
+   *
+   * @return 0 success
+   */
+  int Initialize(const AudioProcessChain::Configuration& conf);
+
+  /**
+   *
+   * @param pss_audio_in_out
+   * @param number_of_samples
+   * @return 0 success
+   */
+  int Process(short* pss_audio_in_out, int number_of_samples);
+
+private:
+  class Impl;
+  Impl* impl_;
+};
+
+} /* namespace base */
+
+#endif /* JNI_VOIP_AUDIO_PROCESS_CHAIN_H_ */

+ 35 - 0
jni/dep/include/audio/audio_resampler.h

@@ -0,0 +1,35 @@
+/*
+ * audio_resample.h
+ *
+ *  Created on: 2022年2月22日
+ *      Author: pengzc
+ */
+
+#ifndef JNI_VOIP_AUDIO_RESAMPLE_H_
+#define JNI_VOIP_AUDIO_RESAMPLE_H_
+
+#include <stdint.h>
+#include "../audio/audio_parameter.h"
+
+namespace base {
+
+class AudioResampler {
+public:
+  AudioResampler(const AudioParameter& in, const AudioParameter& out);
+  virtual ~AudioResampler();
+
+  /**
+   * 0 转换成功
+   * 非0 失败
+   */
+  int Convert(const uint8_t *in , int in_count,
+      uint8_t **out, int* out_count);
+
+private:
+  class Impl;
+  Impl* impl_;
+};
+
+} /* namespace voip */
+
+#endif /* JNI_VOIP_AUDIO_RESAMPLE_H_ */

+ 38 - 0
jni/dep/include/audio/g711.h

@@ -0,0 +1,38 @@
+/*
+ * g711.h
+ *
+ *  Created on: 2022年7月30日
+ *      Author: pengzc
+ */
+
+#ifndef JNI_VOIP_G711_H_
+#define JNI_VOIP_G711_H_
+
+#include <stdint.h>
+
+namespace base {
+
+/**
+ * 解码G711U数据
+ * @param g711u_data
+ * @param g711u_data_size
+ * @param out 输出缓冲区至少是输入长度的两倍
+ * @param out_size 输出缓冲区长度
+ * @return 返回解码后的有效字节数,否则返回0或者负数
+ */
+int g711u_decode(uint8_t* g711u_data, int g711u_data_size, uint8_t* out, int out_size);
+
+/**
+ * 编码G711U数据
+ * @param data
+ * @param data_size
+ * @param out
+ * @param out_size
+ * @return 返回编码后的有效字节数,否则返回0或者负数
+ */
+int g711u_encode(uint8_t* data, int data_size, uint8_t* out, int out_size);
+
+
+} /* namespace base */
+
+#endif /* JNI_VOIP_G711_H_ */

+ 80 - 0
jni/dep/include/audio/media_player.h

@@ -0,0 +1,80 @@
+/*
+ * media_player.h
+ *
+ *  Created on: 2022年5月26日
+ *      Author: pengzc
+ */
+
+#ifndef JNI_VOIP_MEDIA_PLAYER_H_
+#define JNI_VOIP_MEDIA_PLAYER_H_
+
+#include <stdint.h>
+#include <string>
+
+namespace base {
+
+class MediaPlayer {
+public:
+  typedef void (*CompletionCallback)(MediaPlayer* player,
+      int what, void* user_data);
+  typedef void (*ErrorCallback)(MediaPlayer* player,
+      int what, const std::string& str, void* user_data);
+  typedef int (*AudioCallback)(MediaPlayer* player,
+      uint8_t* data, int length, void* user_data);
+
+  enum class PlayMode {
+    Default,
+    Loop,
+  };
+
+  MediaPlayer();
+  virtual ~MediaPlayer();
+
+  int Play(const std::string& url);
+  int Play(const std::string& url, const std::string& headers, int timeout_millis);
+  /**
+   *
+   * @param url 文件或者链接
+   * @param headers 指定HTTP协议的Header字段
+   *        例如
+   *        IP直连,绕过DNS, headers 指定Host字段
+   *        Host: download.flythings.cn
+   * @param timeout_millis 读取超时时间,默认5000毫秒
+   * @param mode 播放模式
+   * @return 成功返回0
+   */
+  int Play(const std::string& url, const std::string& headers,
+      int timeout_millis, PlayMode mode);
+  int Pause();
+  int Resume();
+  int Stop();
+
+  /**
+   * 当前播放位置
+   */
+  double GetCurrentPositon();
+
+  /**
+   * 总时长
+   */
+  double GetDuration();
+
+  void SetErrorCallback(MediaPlayer::ErrorCallback callback, void* user_data);
+  void SetCompletionCallback(MediaPlayer::CompletionCallback callback, void* user_data);
+  void SetAudioCallback(MediaPlayer::AudioCallback callback, void* user_data);
+
+  /**
+   * 设置视频区域
+   */
+  void SetVideoRectangle(int x, int y, int w, int h);
+
+  void Seek(int64_t millisecond);
+
+private:
+  class Impl;
+  Impl* impl_;
+};
+
+} /* namespace base */
+
+#endif /* JNI_VOIP_MEDIA_PLAYER_H_ */

+ 79 - 0
jni/dep/include/video_display_utility.h

@@ -0,0 +1,79 @@
+/*
+ * video_display_utility.h
+ *
+ *  Created on: 2023年3月11日
+ *      Author: dingxy
+ */
+
+#ifndef DISPLAY_VIDEO_DISPLAY_UTILITY_H_
+#define DISPLAY_VIDEO_DISPLAY_UTILITY_H_
+
+enum DisplayImageFormat {
+  DISPLAY_IMAGE_FORMAT_I420,
+  DISPLAY_IMAGE_FORMAT_NV21,
+
+  DISPLAY_IMAGE_FORMAT_INVALID = 999,
+};
+
+//视频画面旋转角度
+enum Disp_Rot_E {
+    E_DISP_ROT_0,
+    E_DISP_ROT_90,
+    E_DISP_ROT_180,
+    E_DISP_ROT_270,
+};
+
+struct Display_PositionL {
+  int in_w;   //输入的视频分辨率
+  int in_h;
+  int out_x;  //视频位置x轴
+  int out_y;  //视频位置y轴
+  int out_w;  //输出的视频分辨率
+  int out_h;
+  Disp_Rot_E rot; //视频旋转角度
+  Display_PositionL();
+};
+
+/**
+ * 设置视频显示效果
+ * @param 亮度 luminance:   0 ~ 100 default: 50
+ * @param 对比度 contrast :   0 ~ 100 default: 50
+ * @param 色调 hue      :   0 ~ 100 default: 50
+ * @param 饱和度 saturation:  0 ~ 100 default: 50
+ */
+struct Display_ParamL {
+  int luminance;
+  int contrast;
+  int hue;
+  int saturation;
+  Display_ParamL();
+};
+
+/*
+ * 设置视频输出亮度、对比度、色调、饱和度
+ * */
+void setDisplayEffectL(Display_ParamL param);
+
+/**
+ * 初始化视频参数,设置视频位置
+ * */
+int DisplayInitL(Display_PositionL Position);
+/**
+ * 将一帧画面刷在视频控件上
+ * @param 一帧yuv图片数据
+*/
+int DisplayUpdateL(const char* image);
+void DisplayDeInitL();
+
+
+/**
+ * 将一帧画面刷在视频控件上
+*/
+int DisplayUpdateDef(DisplayImageFormat format, const char* image, int in_w, int in_h);
+/**
+ * 将视频层置为黑色
+*/
+void DisplayInvalidateDef(int x, int y);
+
+
+#endif /* DISPLAY_VIDEO_DISPLAY_UTILITY_H_ */

+ 38 - 0
jni/dep/include/voip/mi_video_impl.h

@@ -0,0 +1,38 @@
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct {
+  int (*init)(int w, int h);
+  int (*get_output_size)(int* w, int* h);
+  int (*put_frame)(const uint8_t* frame, int len);
+  int (*destroy)(void* data);
+
+} ssd_video_impl_t;
+
+void register_ssd_video_impl(ssd_video_impl_t impl);
+
+void cbar_enable_transmit_frame(uint8_t enable);
+
+/**
+ * @brief 获取发送的视频帧数据,固定 YUV420格式,默认尺寸
+ */
+
+typedef struct {
+  uint8_t* buffer; //存放帧数据的缓冲区
+  uint32_t buffer_size; //缓冲区大小,以字节为单位
+  uint32_t width; //目标帧宽度
+  uint32_t height; //目标帧高度
+} cbar_frame_t;
+typedef int (*cbar_frame_provider)(cbar_frame_t* frame);
+
+typedef struct {
+  void (*start)();
+  void (*stop)();
+  cbar_frame_provider provider;
+} cbar_impl_t;
+void register_cbar_impl(cbar_impl_t impl);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */

+ 55 - 5
jni/dep/include/voip/telephone.h

@@ -11,8 +11,9 @@
 #include <string>
 #include <map>
 #include <functional>
-#include "acoustic_echo_cancellater.h"
-#include "audio_process_chain.h"
+#include <audio/acoustic_echo_cancellater.h>
+#include <audio/audio_process_chain.h>
+#include <video_display_utility.h>
 
 namespace voip {
 
@@ -37,11 +38,18 @@ enum SIPStatusCode {
   SIP_STATUS_CODE_DECLINE = 603,
 };
 
-enum SIPTranstorpType {
+enum SIPTransportType {
   SIP_TRANSPORT_UDP = 1,
   SIP_TRANSPORT_TCP,
 };
 
+enum video_display {
+    VIDEO_DISP_ROT_0 = 0,
+    VIDEO_DISP_ROT_90,
+    VIDEO_DISP_ROT_180,
+    VIDEO_DISP_ROT_270,
+};
+
 struct RtcpStreamStat {
   /**
    * 上次更新时间
@@ -103,11 +111,20 @@ struct CallInfo {
    */
   std::string remote_contact;
   /**
+   * 联系人别名
+   */
+  std::string remote_alias;
+  /**
    * 已通话时长,未接通时为0
    * 单位 毫秒
    */
   int duration;
 
+  /**
+   * 通话别名
+   */
+  std::string displayname;
+
   CallInfo();
 };
 
@@ -165,7 +182,7 @@ struct Configuration {
   /**
    * 传输协议类型
    */
-  SIPTranstorpType transtorp_type;
+  SIPTransportType transport_type;
 
 
   /**
@@ -175,6 +192,20 @@ struct Configuration {
   bool auto_transmit_video_to_remote;
 
   /**
+   * 旋转视频
+   */
+  video_display rotating_video;
+
+  /*
+   * 通话时,视频显示为全屏,
+   * 默认 true 全屏, false 实际视频
+   */
+  bool enable_full_screen;
+
+  /** 启用视频请求关键帧,默认 true*/
+  bool enable_req_keyframe;
+
+  /**
    * 启用ICE
    */
   bool enable_ice;
@@ -184,6 +215,8 @@ struct Configuration {
 
   std::string outbound_proxy;
 
+  Display_PositionL display_pos;
+
   Configuration();
 };
 
@@ -240,18 +273,29 @@ public:
    */
   int GetCallCount();
 
-  typedef void (*CallStateListener)(Telephone*, int call_id, State state);
   /**
    * 监听电话状态
    */
+  typedef void (*CallStateListener)(Telephone*, int call_id, State state);
   void AddCallStateListener(CallStateListener listener);
   void RemoveCallStateListener(CallStateListener listener);
 
+  /**
+   * 监听注册状态
+   * @param listener
+   */
   typedef void (*RegisteredStateListener)(Telephone* telephone, int code);
   void AddRegisteredStateListener(RegisteredStateListener listener);
   void RemoveRegisteredStateListener(RegisteredStateListener listener);
 
   /**
+   * 监听sip消息
+   */
+  typedef void (*MessagePagerListener)(void* context, const char* from, const char* type);
+  void AddMessagePagerListener(MessagePagerListener listener);
+  void RemoveMessagePagerListener(MessagePagerListener listener);
+
+  /**
    * 获取SIP注册状态码
    * @return
    */
@@ -334,6 +378,12 @@ public:
    */
   int SetInputPcmGainSize(float size);
 
+  /**
+   * 输出音频的增益
+   * @param size 增益倍数1~10
+   */
+  int SetOutputPcmGainSize(float size);
+
 private:
   class Impl;
   Impl* impl_;

+ 0 - 86
jni/dep/include/voip/telephone_audio_initializer.cpp

@@ -1,86 +0,0 @@
-/*
- * telephone_audio_initializer.cpp
- *
- *  Created on: 2022年6月27日
- *      Author: pengzc
- */
-
-#include "telephone_audio_initializer.h"
-
-#include <sstream>
-#include <fstream>
-#include <utils/Log.h>
-#include <json/json.h>
-#include "zkaudio.h"
-
-static int GetInt(Json::Value& json_object, const std::string& key, int def) {
-  if (json_object.isObject() && json_object.isMember(key)
-      && json_object[key].isInt()) {
-    return json_object[key].asInt();
-  }
-  return def;
-}
-
-#define LOG_TAG "TelephoneAudioInitializer"
-
-int TelephoneAudioInitializer::Setup(voip::Telephone* telephone,
-    const std::string& filename) {
-  if (telephone == NULL) {
-    LOGE("telephone must not be null");
-    return -1;
-  }
-  std::string str;
-  {
-    std::ifstream ifs(filename, std::ios::in | std::ios::binary);
-    if (!ifs.is_open()) {
-      LOGE("can not open file, %s", filename.c_str());
-      return -1;
-    }
-    std::stringstream ss;
-    ss << ifs.rdbuf();
-    str = ss.str();
-    ifs.close();
-  }
-  Json::Value obj;
-  {
-    Json::Reader reader;
-    if (!reader.parse(str.c_str(), str.c_str() + str.length(), obj, false)) {
-      LOGE("invalid json string");
-      return -1;
-    }
-  }
-
-  if(obj.isMember("input_volume")) {
-    auto input = obj["input_volume"];
-    int ch_0_vol = GetInt(input, "channel_0", 0);
-    int ch_1_vol = GetInt(input, "channel_1", 0);
-    zk_audio_input_set_volume_native(0, ch_0_vol);
-    zk_audio_input_set_volume_native(1, ch_1_vol);
-    LOGD("input volume [%d,%d]", ch_0_vol, ch_1_vol);
-  } else {
-    LOGE("not found input_volume");
-  }
-  int out_vol = GetInt(obj, "output_volume", 0);
-  zk_audio_output_set_volume_native(out_vol);
-  LOGD("output volume %d", out_vol);
-
-  const char* AEC_KEY = "acoustic_echo_cancellater";
-  base::AcousticEchoCancellater::Configuration aec_conf;
-  if (obj.isMember(AEC_KEY)) {
-    aec_conf = aec_conf.FromString(
-        obj[AEC_KEY].toStyledString());
-  } else {
-    LOGE("not found acoustic_echo_cancellater");
-  }
-  const char* APC_KEY = "audio_process_chain";
-  base::AudioProcessChain::Configuration apc_conf;
-  if (obj.isMember(APC_KEY)) {
-    apc_conf = apc_conf.FromString(obj[APC_KEY].toStyledString());
-  } else {
-    LOGE("not found audio_process_chain");
-  }
-  LOGD("aec configuration\n%s", aec_conf.ToString().c_str());
-  LOGD("apc configuration\n%s",apc_conf.ToString().c_str());
-  telephone->SetInputAecApcConfig(aec_conf, apc_conf);
-  return 0;
-}

+ 4 - 1
jni/dep/include/voip/telephone_audio_initializer.h

@@ -9,7 +9,10 @@
 #define TELEPHONE_AUDIO_INITIALIZER_H_
 
 #include <string>
-#include "voip/telephone.h"
+
+namespace voip {
+class Telephone;
+} /* namespace voip */
 
 class TelephoneAudioInitializer {
 public:

BIN
jni/dep/lib/libaudio-utility.a


BIN
jni/dep/lib/libavcodec.a


BIN
jni/dep/lib/libavdevice.a


BIN
jni/dep/lib/libavfilter.a


BIN
jni/dep/lib/libavformat.a


BIN
jni/dep/lib/libavutil.a


BIN
jni/dep/lib/libdisplay_utility.a


BIN
jni/dep/lib/libg7221codec-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libilbccodec-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpj-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjlib-util-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjmedia-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjmedia-audiodev-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjmedia-codec-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjmedia-videodev-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjnath-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjsip-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjsip-simple-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjsip-ua-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjsua-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libpjsua2-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libresample-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libsrtp-arm-unknown-linux-gnueabihf.a


BIN
jni/dep/lib/libswresample.a


BIN
jni/dep/lib/libswscale.a


BIN
jni/dep/lib/libvoip.a


BIN
jni/dep/lib/libyuv-arm-unknown-linux-gnueabihf.a


BIN
jni/dependencies/libAEC_LINUX.so


BIN
jni/dependencies/libAPC_LINUX.so


BIN
libs/armeabi/libzkgui.so


BIN
obj/activity/callActivity.o


BIN
obj/activity/startActivity.o


BIN
obj/core/utilities.o


BIN
obj/dep/include/voip/telephone_audio_initializer.o


BIN
obj/service/time.o