diff --git a/enginekit/libs/client-release.aar b/enginekit/libs/client-release.aar new file mode 100644 index 00000000..b4eaff42 Binary files /dev/null and b/enginekit/libs/client-release.aar differ diff --git a/enginekit/libs/mars-core-release.aar b/enginekit/libs/mars-core-release.aar new file mode 100644 index 00000000..83ad45d2 Binary files /dev/null and b/enginekit/libs/mars-core-release.aar differ diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/VideoProfile.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/VideoProfile.java new file mode 100644 index 00000000..694d3ed2 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/VideoProfile.java @@ -0,0 +1,105 @@ +package cn.wildfirechat.avenginekit; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class VideoProfile { + public static final int VP120P = 0; + public static final int VP120P_3 = 2; + public static final int VP180P = 10; + public static final int VP180P_3 = 12; + public static final int VP180P_4 = 13; + public static final int VP240P = 20; + public static final int VP240P_3 = 22; + public static final int VP240P_4 = 23; + public static final int VP360P = 30; + public static final int VP360P_3 = 32; + public static final int VP360P_4 = 33; + public static final int VP360P_6 = 35; + public static final int VP360P_7 = 36; + public static final int VP360P_8 = 37; + public static final int VP480P = 40; + public static final int VP480P_3 = 42; + public static final int VP480P_4 = 43; + public static final int VP480P_6 = 45; + public static final int VP480P_8 = 47; + public static final int VP480P_9 = 48; + public static final int VP720P = 50; + public static final int VP720P_3 = 52; + public static final int VP720P_5 = 54; + public static final int VP720P_6 = 55; + public static final int VPDEFAULT = 30; + public int width; + public int height; + public int fps; + public int bitrate; + + public VideoProfile(int var1, int var2, int var3, int var4, boolean var5) { + if (var5) { + this.height = var1; + this.height = var1; + } else { + this.width = var1; + this.height = var2; + } + + this.bitrate = var4; + this.fps = var3; + } + + public static VideoProfile getVideoProfile(int var0, boolean var1) { + switch(var0) { + case 0: + return new VideoProfile(160, 120, 15, 120, var1); + case 2: + return new VideoProfile(120, 120, 15, 100, var1); + case 10: + return new VideoProfile(320, 180, 15, 280, var1); + case 12: + return new VideoProfile(180, 180, 15, 200, var1); + case 13: + return new VideoProfile(240, 180, 15, 240, var1); + case 20: + return new VideoProfile(320, 240, 15, 360, var1); + case 22: + return new VideoProfile(240, 240, 15, 240, var1); + case 23: + return new VideoProfile(424, 240, 15, 400, var1); + case 30: + return new VideoProfile(640, 360, 15, 800, var1); + case 32: + return new VideoProfile(360, 360, 15, 520, var1); + case 33: + return new VideoProfile(640, 360, 30, 1200, var1); + case 35: + return new VideoProfile(360, 360, 30, 780, var1); + case 36: + return new VideoProfile(480, 360, 15, 1000, var1); + case 37: + return new VideoProfile(480, 360, 30, 1500, var1); + case 40: + return new VideoProfile(640, 480, 15, 1000, var1); + case 42: + return new VideoProfile(480, 480, 15, 800, var1); + case 43: + return new VideoProfile(640, 480, 30, 1500, var1); + case 45: + return new VideoProfile(480, 480, 30, 1200, var1); + case 47: + return new VideoProfile(848, 480, 15, 1200, var1); + case 48: + return new VideoProfile(848, 480, 30, 1800, var1); + case 50: + return new VideoProfile(1280, 720, 15, 2400, var1); + case 52: + return new VideoProfile(1280, 720, 30, 3600, var1); + case 54: + return new VideoProfile(960, 720, 15, 1920, var1); + case 55: + return new VideoProfile(960, 720, 30, 2880, var1); + default: + return getVideoProfile(30, var1); + } + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/b.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/b.java new file mode 100644 index 00000000..0e9a2304 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/b.java @@ -0,0 +1,86 @@ +package cn.wildfirechat.avenginekit; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class b { + static { + int[] var10000; + boolean var10001; + byte var10002; + int var9; + label77: { + try { + var10000 = a; + var9 = cn.wildfirechat.avenginekit.c.a.a.ordinal(); + } catch (NoSuchFieldError var8) { + var10001 = false; + break label77; + } + + var10002 = 1; + + try { + var10000[var9] = var10002; + } catch (NoSuchFieldError var7) { + var10001 = false; + } + } + + label78: { + try { + var10000 = a; + var9 = cn.wildfirechat.avenginekit.c.a.c.ordinal(); + } catch (NoSuchFieldError var6) { + var10001 = false; + break label78; + } + + var10002 = 2; + + try { + var10000[var9] = var10002; + } catch (NoSuchFieldError var5) { + var10001 = false; + } + } + + label79: { + try { + var10000 = a; + var9 = cn.wildfirechat.avenginekit.c.a.b.ordinal(); + } catch (NoSuchFieldError var4) { + var10001 = false; + break label79; + } + + var10002 = 3; + + try { + var10000[var9] = var10002; + } catch (NoSuchFieldError var3) { + var10001 = false; + } + } + + label80: { + try { + var10000 = a; + var9 = cn.wildfirechat.avenginekit.c.a.d.ordinal(); + } catch (NoSuchFieldError var2) { + var10001 = false; + break label80; + } + + var10002 = 4; + + try { + var10000[var9] = var10002; + } catch (NoSuchFieldError var1) { + var10001 = false; + } + } + + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/c.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/c.java new file mode 100644 index 00000000..8decd325 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/c.java @@ -0,0 +1,410 @@ +package cn.wildfirechat.avenginekit; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.media.AudioDeviceInfo; +import android.media.AudioManager; +import android.preference.PreferenceManager; +import android.util.Log; + +import org.webrtc.ThreadUtils; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class c { + private static final String a = "AVAudioManager"; + private static final String b = "auto"; + private static final String c = "true"; + private static final String d = "false"; + private final Context e; + private AudioManager f; + private cn.wildfirechat.avenginekit.c.b g; + private cn.wildfirechat.avenginekit.c.c h; + private int i = -2; + private boolean j = false; + private boolean k = false; + private boolean l = false; + private cn.wildfirechat.avenginekit.c.a m; + private cn.wildfirechat.avenginekit.c.a n; + private cn.wildfirechat.avenginekit.c.a o; + private final String p; + private m q = null; + private final e r; + private Set s = new HashSet(); + private BroadcastReceiver t; + private OnAudioFocusChangeListener u; + + private void g() { + if (this.p.equals("auto")) { + if (this.s.size() == 2 && this.s.contains(cn.wildfirechat.avenginekit.c.a.c) && this.s.contains(cn.wildfirechat.avenginekit.c.a.a)) { + if (this.q.a()) { + this.c(cn.wildfirechat.avenginekit.c.a.c); + } else { + this.c(cn.wildfirechat.avenginekit.c.a.a); + } + } + + } + } + + static cn.wildfirechat.avenginekit.c a(Context var0) { + return new cn.wildfirechat.avenginekit.c(var0); + } + + private c(Context var1) { + Log.d("AVAudioManager", "ctor"); + ThreadUtils.checkIsOnMainThread(); + this.e = var1; + this.f = (AudioManager)var1.getSystemService("audio"); + this.r = cn.wildfirechat.avenginekit.e.a(var1, this); + this.t = new cn.wildfirechat.avenginekit.c.d((cn.wildfirechat.avenginekit.a)null); + this.h = cn.wildfirechat.avenginekit.c.c.a; + this.p = PreferenceManager.getDefaultSharedPreferences(var1).getString("speakerphone_preference", "auto"); + Log.d("AVAudioManager", "useSpeakerphone: " + this.p); + if (this.p.equals("false")) { + this.m = cn.wildfirechat.avenginekit.c.a.c; + } else { + this.m = cn.wildfirechat.avenginekit.c.a.a; + } + + this.q = cn.wildfirechat.avenginekit.m.a(var1, this::g); + Log.d("AVAudioManager", "defaultAudioDevice: " + this.m); + a.a("AVAudioManager"); + } + + private void c(cn.wildfirechat.avenginekit.c.a var1) { + Log.d("AVAudioManager", "setAudioDeviceInternal(device=" + var1 + ")"); + a.a(this.s.contains(var1)); + switch(cn.wildfirechat.avenginekit.b.a[var1.ordinal()]) { + case 1: + this.b(true); + break; + case 2: + case 3: + case 4: + this.b(false); + break; + default: + Log.e("AVAudioManager", "Invalid audio device selection"); + } + + this.n = var1; + } + + private void a(BroadcastReceiver var1, IntentFilter var2) { + this.e.registerReceiver(var1, var2); + } + + private void a(BroadcastReceiver var1) { + this.e.unregisterReceiver(var1); + } + + private void b(boolean var1) { + if (this.f.isSpeakerphoneOn() != var1) { + this.f.setSpeakerphoneOn(var1); + } + } + + private void a(boolean var1) { + if (this.f.isMicrophoneMute() != var1) { + this.f.setMicrophoneMute(var1); + } + } + + private boolean e() { + return this.e.getPackageManager().hasSystemFeature("android.hardware.telephony"); + } + + @Deprecated + private boolean f() { + if (VERSION.SDK_INT < 23) { + return this.f.isWiredHeadsetOn(); + } else { + AudioDeviceInfo[] var4; + int var1 = (var4 = this.f.getDevices(3)).length; + + for(int var2 = 0; var2 < var1; ++var2) { + int var3; + if ((var3 = var4[var2].getType()) == 3) { + Log.d("AVAudioManager", "hasWiredHeadset: found wired headset"); + return true; + } + + if (var3 == 11) { + Log.d("AVAudioManager", "hasWiredHeadset: found USB audio device"); + return true; + } + } + + return false; + } + } + + public void a(cn.wildfirechat.avenginekit.c.b var1) { + Log.d("AVAudioManager", "start"); + ThreadUtils.checkIsOnMainThread(); + if (this.h == cn.wildfirechat.avenginekit.c.c.c) { + Log.e("AVAudioManager", "AudioManager is already active"); + } else { + Log.d("AVAudioManager", "AudioManager starts..."); + this.g = var1; + this.h = cn.wildfirechat.avenginekit.c.c.c; + this.i = this.f.getMode(); + this.j = this.f.isSpeakerphoneOn(); + this.k = this.f.isMicrophoneMute(); + this.l = this.f(); + this.u = new cn.wildfirechat.avenginekit.a(this); + if (this.f.requestAudioFocus(this.u, 0, 2) == 1) { + Log.d("AVAudioManager", "Audio focus request granted for VOICE_CALL streams"); + } else { + Log.e("AVAudioManager", "Audio focus request failed"); + } + + this.f.setMode(0); + this.f.setSpeakerphoneOn(true); + this.a(false); + this.n = this.o = cn.wildfirechat.avenginekit.c.a.e; + this.s.clear(); + this.r.b(); + this.d(); + this.a(this.t, new IntentFilter("android.intent.action.HEADSET_PLUG")); + Log.d("AVAudioManager", "AudioManager started"); + this.q.b(); + } + } + + public void c() { + Log.d("AVAudioManager", "stop"); + ThreadUtils.checkIsOnMainThread(); + if (this.h != cn.wildfirechat.avenginekit.c.c.c) { + Log.e("AVAudioManager", "Trying to stop AudioManager in incorrect state: " + this.h); + } else { + this.h = cn.wildfirechat.avenginekit.c.c.a; + this.a(this.t); + this.r.d(); + this.b(this.j); + this.a(this.k); + this.f.setMode(this.i); + this.f.abandonAudioFocus(this.u); + this.u = null; + Log.d("AVAudioManager", "Abandoned audio focus for VOICE_CALL streams"); + m var1; + if ((var1 = this.q) != null) { + var1.c(); + this.q = null; + } + + this.g = null; + Log.d("AVAudioManager", "AudioManager stopped"); + } + } + + public void b(cn.wildfirechat.avenginekit.c.a var1) { + label17: { + ThreadUtils.checkIsOnMainThread(); + int var2; + if ((var2 = cn.wildfirechat.avenginekit.b.a[var1.ordinal()]) != 1) { + if (var2 != 2) { + Log.e("AVAudioManager", "Invalid default audio device selection"); + break label17; + } + + if (!this.e()) { + this.m = cn.wildfirechat.avenginekit.c.a.a; + break label17; + } + } + + this.m = var1; + } + + Log.d("AVAudioManager", "setDefaultAudioDevice(device=" + this.m + ")"); + this.d(); + } + + public void a(cn.wildfirechat.avenginekit.c.a var1) { + ThreadUtils.checkIsOnMainThread(); + if (!this.s.contains(var1)) { + Log.e("AVAudioManager", "Can not select " + var1 + " from available " + this.s); + } + + this.o = var1; + this.d(); + } + + public Set a() { + ThreadUtils.checkIsOnMainThread(); + return Collections.unmodifiableSet(new HashSet(this.s)); + } + + public cn.wildfirechat.avenginekit.c.a b() { + ThreadUtils.checkIsOnMainThread(); + return this.n; + } + + public void d() { + ThreadUtils.checkIsOnMainThread(); + Log.d("AVAudioManager", "--- updateAudioDeviceState: wired headset=" + this.l + ", BT state=" + this.r.a()); + Log.d("AVAudioManager", "Device status: available=" + this.s + ", selected=" + this.n + ", user selected=" + this.o); + if (this.r.a() == cn.wildfirechat.avenginekit.e.c.d || this.r.a() == cn.wildfirechat.avenginekit.e.c.c || this.r.a() == cn.wildfirechat.avenginekit.e.c.e) { + this.r.f(); + } + + HashSet var1; + var1 = new HashSet.(); + if (this.r.a() == cn.wildfirechat.avenginekit.e.c.g || this.r.a() == cn.wildfirechat.avenginekit.e.c.f || this.r.a() == cn.wildfirechat.avenginekit.e.c.d) { + var1.add(cn.wildfirechat.avenginekit.c.a.d); + } + + if (this.l) { + var1.add(cn.wildfirechat.avenginekit.c.a.b); + } else { + var1.add(cn.wildfirechat.avenginekit.c.a.a); + if (this.e()) { + var1.add(cn.wildfirechat.avenginekit.c.a.c); + } + } + + HashSet var10002 = var1; + boolean var4 = this.s.equals(var1) ^ true; + this.s = var10002; + if (this.r.a() == cn.wildfirechat.avenginekit.e.c.c && this.o == cn.wildfirechat.avenginekit.c.a.d) { + this.o = cn.wildfirechat.avenginekit.c.a.e; + } + + if (this.l && this.o == cn.wildfirechat.avenginekit.c.a.a) { + this.o = cn.wildfirechat.avenginekit.c.a.b; + } + + if (!this.l && this.o == cn.wildfirechat.avenginekit.c.a.b) { + this.o = cn.wildfirechat.avenginekit.c.a.a; + } + + cn.wildfirechat.avenginekit.c.a var2; + boolean var5; + if (this.r.a() != cn.wildfirechat.avenginekit.e.c.d || (var2 = this.o) != cn.wildfirechat.avenginekit.c.a.e && var2 != cn.wildfirechat.avenginekit.c.a.d) { + var5 = false; + } else { + var5 = true; + } + + cn.wildfirechat.avenginekit.c.a var3; + boolean var7; + if ((this.r.a() == cn.wildfirechat.avenginekit.e.c.g || this.r.a() == cn.wildfirechat.avenginekit.e.c.f) && (var3 = this.o) != cn.wildfirechat.avenginekit.c.a.e && var3 != cn.wildfirechat.avenginekit.c.a.d) { + var7 = true; + } else { + var7 = false; + } + + if (this.r.a() == cn.wildfirechat.avenginekit.e.c.d || this.r.a() == cn.wildfirechat.avenginekit.e.c.f || this.r.a() == cn.wildfirechat.avenginekit.e.c.g) { + Log.d("AVAudioManager", "Need BT audio: start=" + var5 + ", stop=" + var7 + ", BT state=" + this.r.a()); + } + + if (var7) { + this.r.e(); + this.r.f(); + } + + if (var5 && !var7 && !this.r.c()) { + this.s.remove(cn.wildfirechat.avenginekit.c.a.d); + var4 = true; + } + + if (this.r.a() == cn.wildfirechat.avenginekit.e.c.g) { + var2 = cn.wildfirechat.avenginekit.c.a.d; + } else if (this.l) { + var2 = cn.wildfirechat.avenginekit.c.a.b; + } else { + var2 = this.m; + } + + if (var2 != this.n || var4) { + this.c(var2); + Log.d("AVAudioManager", "New device status: available=" + this.s + ", selected=" + var2); + cn.wildfirechat.avenginekit.c.b var6; + if ((var6 = this.g) != null) { + var6.a(this.n, this.s); + } + } + + Log.d("AVAudioManager", "--- updateAudioDeviceState done"); + } + + private class d extends BroadcastReceiver { + private static final int a = 0; + private static final int b = 1; + private static final int c = 0; + private static final int d = 1; + + private d() { + } + + public void onReceive(Context var1, Intent var2) { + int var7; + int var10000 = var7 = var2.getIntExtra("state", 0); + int var3 = var2.getIntExtra("microphone", 0); + String var4 = var2.getStringExtra("name"); + String var5 = "AVAudioManager"; + StringBuilder var9 = (new StringBuilder()).append("WiredHeadsetReceiver.onReceive").append(a.a()).append(": a=").append(var2.getAction()).append(", s="); + String var6; + if (var10000 == 0) { + var6 = "unplugged"; + } else { + var6 = "plugged"; + } + + var9 = var9.append(var6).append(", m="); + String var11; + if (var3 == 1) { + var11 = "mic"; + } else { + var11 = "no mic"; + } + + var10000 = var7; + Log.d(var5, var9.append(var11).append(", n=").append(var4).append(", sb=").append(this.isInitialStickyBroadcast()).toString()); + cn.wildfirechat.avenginekit.c var8 = c.this; + boolean var10; + if (var10000 == 1) { + var10 = true; + } else { + var10 = false; + } + + var8.l = var10; + c.this.d(); + } + } + + public interface b { + void a(cn.wildfirechat.avenginekit.c.a var1, Set var2); + } + + public static enum c { + a, + b, + c; + + private c() { + } + } + + public static enum a { + a, + b, + c, + d, + e; + + private a() { + } + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/d.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/d.java new file mode 100644 index 00000000..0b81bbc8 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/d.java @@ -0,0 +1,15 @@ +package cn.wildfirechat.avenginekit; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class d implements Runnable { + d(e var1) { + this.a = var1; + } + + public void run() { + e.a(this.a); + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/e.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/e.java new file mode 100644 index 00000000..d8fe8211 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/e.java @@ -0,0 +1,383 @@ +package cn.wildfirechat.avenginekit; + +import android.annotation.SuppressLint; +import android.bluetooth.BluetoothAdapter; +import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothHeadset; +import android.bluetooth.BluetoothProfile; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.media.AudioManager; +import android.os.Handler; +import android.os.Looper; +import android.os.Process; +import android.util.Log; + +import org.webrtc.ThreadUtils; + +import java.util.Iterator; +import java.util.List; +import java.util.Set; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class e { + private static final String a = "AVBluetoothManager"; + private static final int b = 4000; + private static final int c = 2; + private final Context d; + private final cn.wildfirechat.avenginekit.c e; + private final AudioManager f; + private final Handler g; + int h; + private e.c i; + private final BluetoothProfile.ServiceListener j; + private BluetoothAdapter k; + private BluetoothHeadset l; + private BluetoothDevice m; + private final BroadcastReceiver n; + private final Runnable o = new d(this); + + static e a(Context var0, cn.wildfirechat.avenginekit.c var1) { + Log.d("AVBluetoothManager", "create" + a.a()); + return new e(var0, var1); + } + + protected e(Context var1, cn.wildfirechat.avenginekit.c var2) { + Log.d("AVBluetoothManager", "ctor"); + ThreadUtils.checkIsOnMainThread(); + this.d = var1; + this.e = var2; + this.f = this.a(var1); + this.i = e.c.a; + this.j = new e.b((d)null); + this.n = new e.a((d)null); + this.g = new Handler(Looper.getMainLooper()); + } + + private void k() { + ThreadUtils.checkIsOnMainThread(); + Log.d("AVBluetoothManager", "updateAudioDeviceState"); + this.e.d(); + } + + private void j() { + ThreadUtils.checkIsOnMainThread(); + Log.d("AVBluetoothManager", "startTimer"); + this.g.postDelayed(this.o, 4000L); + } + + private void h() { + ThreadUtils.checkIsOnMainThread(); + Log.d("AVBluetoothManager", "cancelTimer"); + this.g.removeCallbacks(this.o); + } + + private void g() { + ThreadUtils.checkIsOnMainThread(); + if (this.i != e.c.a && this.l != null) { + Log.d("AVBluetoothManager", "bluetoothTimeout: BT state=" + this.i + ", attempts: " + this.h + ", SCO is on: " + this.i()); + if (this.i == e.c.f) { + boolean var1 = false; + List var2; + if ((var2 = this.l.getConnectedDevices()).size() > 0) { + this.m = (BluetoothDevice)var2.get(0); + if (this.l.isAudioConnected(this.m)) { + Log.d("AVBluetoothManager", "SCO connected with " + this.m.getName()); + var1 = true; + } else { + Log.d("AVBluetoothManager", "SCO is not connected with " + this.m.getName()); + } + } + + if (var1) { + this.i = e.c.g; + this.h = 0; + } else { + Log.w("AVBluetoothManager", "BT failed to connect after timeout"); + this.e(); + } + + this.k(); + Log.d("AVBluetoothManager", "bluetoothTimeout done: BT state=" + this.i); + } + } + } + + private boolean i() { + return this.f.isBluetoothScoOn(); + } + + private String a(int var1) { + switch(var1) { + case 0: + return "DISCONNECTED"; + case 1: + return "CONNECTING"; + case 2: + return "CONNECTED"; + case 3: + return "DISCONNECTING"; + default: + switch(var1) { + case 10: + return "OFF"; + case 11: + return "TURNING_ON"; + case 12: + return "ON"; + case 13: + return "TURNING_OFF"; + default: + return "INVALID"; + } + } + } + + public e.c a() { + ThreadUtils.checkIsOnMainThread(); + return this.i; + } + + public void b() { + ThreadUtils.checkIsOnMainThread(); + Log.d("AVBluetoothManager", "start"); + if (!this.a(this.d, "android.permission.BLUETOOTH")) { + Log.w("AVBluetoothManager", "Process (pid=" + Process.myPid() + ") lacks BLUETOOTH permission"); + } else if (this.i != e.c.a) { + Log.w("AVBluetoothManager", "Invalid BT state"); + } else { + this.l = null; + this.m = null; + this.h = 0; + this.k = BluetoothAdapter.getDefaultAdapter(); + if (this.k == null) { + Log.w("AVBluetoothManager", "Device does not support Bluetooth"); + } else if (!this.f.isBluetoothScoAvailableOffCall()) { + Log.e("AVBluetoothManager", "Bluetooth SCO audio is not available off call"); + } else { + this.a(this.k); + if (!this.a(this.d, this.j, 1)) { + Log.e("AVBluetoothManager", "BluetoothAdapter.getProfileProxy(HEADSET) failed"); + } else { + IntentFilter var1; + IntentFilter var10003 = var1 = new IntentFilter; + var10003.(); + var10003.addAction("android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED"); + var10003.addAction("android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED"); + this.a(this.n, var1); + Log.d("AVBluetoothManager", "HEADSET profile state: " + this.a(this.k.getProfileConnectionState(1))); + Log.d("AVBluetoothManager", "Bluetooth proxy for headset profile has started"); + this.i = e.c.c; + Log.d("AVBluetoothManager", "start done: BT state=" + this.i); + } + } + } + } + + public void d() { + ThreadUtils.checkIsOnMainThread(); + Log.d("AVBluetoothManager", "stop: BT state=" + this.i); + if (this.k != null) { + this.e(); + if (this.i != e.c.a) { + this.a(this.n); + this.h(); + BluetoothHeadset var1; + if ((var1 = this.l) != null) { + this.k.closeProfileProxy(1, var1); + this.l = null; + } + + this.k = null; + this.m = null; + this.i = e.c.a; + Log.d("AVBluetoothManager", "stop done: BT state=" + this.i); + } + } + } + + public boolean c() { + ThreadUtils.checkIsOnMainThread(); + Log.d("AVBluetoothManager", "startSco: BT state=" + this.i + ", attempts: " + this.h + ", SCO is on: " + this.i()); + if (this.h >= 2) { + Log.e("AVBluetoothManager", "BT SCO connection fails - no more attempts"); + return false; + } else if (this.i != e.c.d) { + Log.e("AVBluetoothManager", "BT SCO connection fails - no headset available"); + return false; + } else { + Log.d("AVBluetoothManager", "Starting Bluetooth SCO and waits for ACTION_AUDIO_STATE_CHANGED..."); + this.i = e.c.f; + this.f.startBluetoothSco(); + this.f.setBluetoothScoOn(true); + ++this.h; + this.j(); + Log.d("AVBluetoothManager", "startScoAudio done: BT state=" + this.i + ", SCO is on: " + this.i()); + return true; + } + } + + public void e() { + ThreadUtils.checkIsOnMainThread(); + Log.d("AVBluetoothManager", "stopScoAudio: BT state=" + this.i + ", SCO is on: " + this.i()); + e.c var1; + if ((var1 = this.i) == e.c.f || var1 == e.c.g) { + this.h(); + this.f.stopBluetoothSco(); + this.f.setBluetoothScoOn(false); + this.i = e.c.e; + Log.d("AVBluetoothManager", "stopScoAudio done: BT state=" + this.i + ", SCO is on: " + this.i()); + } + } + + public void f() { + if (this.i != e.c.a && this.l != null) { + Log.d("AVBluetoothManager", "updateDevice"); + List var1; + if ((var1 = this.l.getConnectedDevices()).isEmpty()) { + this.m = null; + this.i = e.c.c; + Log.d("AVBluetoothManager", "No connected bluetooth headset"); + } else { + this.m = (BluetoothDevice)var1.get(0); + this.i = e.c.d; + Log.d("AVBluetoothManager", "Connected bluetooth headset: name=" + this.m.getName() + ", state=" + this.a(this.l.getConnectionState(this.m)) + ", SCO audio=" + this.l.isAudioConnected(this.m)); + } + + Log.d("AVBluetoothManager", "updateDevice done: BT state=" + this.i); + } + } + + protected AudioManager a(Context var1) { + return (AudioManager)var1.getSystemService("audio"); + } + + protected void a(BroadcastReceiver var1, IntentFilter var2) { + this.d.registerReceiver(var1, var2); + } + + protected void a(BroadcastReceiver var1) { + this.d.unregisterReceiver(var1); + } + + protected boolean a(Context var1, BluetoothProfile.ServiceListener var2, int var3) { + return this.k.getProfileProxy(var1, var2, var3); + } + + protected boolean a(Context var1, String var2) { + return this.d.checkPermission(var2, Process.myPid(), Process.myUid()) == 0; + } + + @SuppressLint({"HardwareIds"}) + protected void a(BluetoothAdapter var1) { + Log.d("AVBluetoothManager", "BluetoothAdapter: enabled=" + var1.isEnabled() + ", state=" + this.a(var1.getState()) + ", name=" + var1.getName() + ", address=" + var1.getAddress()); + Set var2; + if (!(var2 = var1.getBondedDevices()).isEmpty()) { + Log.d("AVBluetoothManager", "paired devices:"); + Iterator var3 = var2.iterator(); + + while(var3.hasNext()) { + BluetoothDevice var4 = (BluetoothDevice)var3.next(); + Log.d("AVBluetoothManager", " name=" + var4.getName() + ", address=" + var4.getAddress()); + } + } + + } + + private class a extends BroadcastReceiver { + private a() { + } + + public void onReceive(Context var1, Intent var2) { + if (e.this.i != e.c.a) { + int var10000; + String var3; + int var4; + e var5; + if ((var3 = var2.getAction()).equals("android.bluetooth.headset.profile.action.CONNECTION_STATE_CHANGED")) { + var10000 = var4 = var2.getIntExtra("android.bluetooth.profile.extra.STATE", 0); + Log.d("AVBluetoothManager", "BluetoothHeadsetBroadcastReceiver.onReceive: a=ACTION_CONNECTION_STATE_CHANGED, s=" + e.this.a(var4) + ", sb=" + this.isInitialStickyBroadcast() + ", BT state: " + e.this.i); + if (var10000 == 2) { + var5 = e.this; + var5.h = 0; + var5.k(); + } else if (var4 != 1 && var4 != 3 && var4 == 0) { + e.this.e(); + e.this.k(); + } + } else if (var3.equals("android.bluetooth.headset.profile.action.AUDIO_STATE_CHANGED")) { + var10000 = var4 = var2.getIntExtra("android.bluetooth.profile.extra.STATE", 10); + Log.d("AVBluetoothManager", "BluetoothHeadsetBroadcastReceiver.onReceive: a=ACTION_AUDIO_STATE_CHANGED, s=" + e.this.a(var4) + ", sb=" + this.isInitialStickyBroadcast() + ", BT state: " + e.this.i); + if (var10000 == 12) { + e.this.h(); + if (e.this.i == e.c.f) { + Log.d("AVBluetoothManager", "+++ Bluetooth audio SCO is now connected"); + e.this.i = e.c.g; + var5 = e.this; + var5.h = 0; + var5.k(); + } else { + Log.w("AVBluetoothManager", "Unexpected state BluetoothHeadset.STATE_AUDIO_CONNECTED"); + } + } else if (var4 == 11) { + Log.d("AVBluetoothManager", "+++ Bluetooth audio SCO is now connecting..."); + } else if (var4 == 10) { + Log.d("AVBluetoothManager", "+++ Bluetooth audio SCO is now disconnected"); + if (this.isInitialStickyBroadcast()) { + Log.d("AVBluetoothManager", "Ignore STATE_AUDIO_DISCONNECTED initial sticky broadcast."); + return; + } + + e.this.k(); + } + } + + Log.d("AVBluetoothManager", "onReceive done: BT state=" + e.this.i); + } + } + } + + private class b implements BluetoothProfile.ServiceListener { + private b() { + } + + public void onServiceConnected(int var1, BluetoothProfile var2) { + if (var1 == 1 && e.this.i != e.c.a) { + Log.d("AVBluetoothManager", "BluetoothServiceListener.onServiceConnected: BT state=" + e.this.i); + e.this.l = (BluetoothHeadset)var2; + e.this.k(); + Log.d("AVBluetoothManager", "onServiceConnected done: BT state=" + e.this.i); + } + } + + public void onServiceDisconnected(int var1) { + if (var1 == 1 && e.this.i != e.c.a) { + Log.d("AVBluetoothManager", "BluetoothServiceListener.onServiceDisconnected: BT state=" + e.this.i); + e.this.e(); + e.this.l = null; + e.this.m = null; + e.this.i = e.c.c; + e.this.k(); + Log.d("AVBluetoothManager", "onServiceDisconnected done: BT state=" + e.this.i); + } + } + } + + public static enum c { + a, + b, + c, + d, + e, + f, + g; + + private c() { + } + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/f.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/f.java new file mode 100644 index 00000000..3a89ddd5 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/f.java @@ -0,0 +1,149 @@ +package cn.wildfirechat.avenginekit; + +import android.telecom.VideoProfile; +import android.util.Log; + +import org.json.JSONArray; +import org.json.JSONObject; +import org.webrtc.IceCandidate; +import org.webrtc.SessionDescription; +import org.webrtc.StatsReport; +import org.webrtc.VideoRenderer; +import org.webrtc.VideoTrack; + + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class f implements c { + f(AVEngineKit var1) { + this.a = var1; + } + + public void a(SessionDescription var1) { + j var2; + var2 = new j. < init > (AVEngineKit.CallSession.a(AVEngineKit.a(this.a))); + JSONObject var3; + JSONObject var10001 = var3 = new JSONObject; + var3. (); + AVEngineKit.a(var10001, "sdp", var1.description); + if (AVEngineKit.h(this.a)) { + AVEngineKit.a(var3, "type", "offer"); + } else { + AVEngineKit.a(var3, "type", "answer"); + } + + f var10000 = this; + var2.a(var3.toString().getBytes()); + AVEngineKit var10002 = this.a; + AVEngineKit.a(var10002, var2, CallSession.e(AVEngineKit.a(var10002)), true); + VideoProfile var4 = VideoProfile.getVideoProfile(AVEngineKit.i(this.a), AVEngineKit.j(this.a)); + Log.d("CallRTCClient", "Set video maximum bitrate: " + var4.bitrate); + AVEngineKit.k(var10000.a).a(var4.bitrate); + } + + public void onIceCandidate(IceCandidate var1) { + f var10000 = this; + j var2; + j var10001 = var2 = new j; + var10001. (CallSession.a(AVEngineKit.a(this.a))); + JSONObject var3; + JSONObject var10002 = var3 = new JSONObject; + var3. (); + AVEngineKit.a(var3, "type", "candidate"); + AVEngineKit.a(var3, "label", var1.sdpMLineIndex); + AVEngineKit.a(var3, "id", var1.sdpMid); + AVEngineKit.a(var10002, "candidate", var1.sdp); + var10001.a(var10002.toString().getBytes()); + AVEngineKit var4 = var10000.a; + AVEngineKit.a(var4, var2, CallSession.e(AVEngineKit.a(var4)), false); + } + + public void onIceCandidatesRemoved(IceCandidate[] var1) { + JSONObject var2; + JSONObject var10001 = var2 = new JSONObject; + var10001. (); + AVEngineKit.a(var10001, "type", "remove-candidates"); + JSONArray var3; + var3 = new JSONArray. < init > (); + int var4 = var1.length; + + for (int var5 = 0; var5 < var4; ++var5) { + var3.put(AVEngineKit.a(var1[var5])); + } + + AVEngineKit.a(var2, "candidates", var3); + j var6; + j var7 = var6 = new j; + var6. (CallSession.a(AVEngineKit.a(this.a))); + var7.a(var2.toString().getBytes()); + AVEngineKit var10000 = this.a; + AVEngineKit.a(var10000, var6, CallSession.e(AVEngineKit.a(var10000)), false); + } + + public void d() { + AVEngineKit.b(this.a).submit(() -> { + if (AVEngineKit.k(this.a) != null && AVEngineKit.a(this.a) != null && AVEngineKit.a(this.a).getState() != CallState.Idle) { + CallSession.a(AVEngineKit.a(this.a), System.currentTimeMillis()); + AVEngineKit.k(this.a).a(true, 1000); + CallSession.a(AVEngineKit.a(this.a), CallState.Connected); + } else { + Log.w("CallRTCClient", "Call is connected in closed or error state"); + } + }); + } + + public void b() { + AVEngineKit.b(this.a).submit(() -> { + if (AVEngineKit.a(this.a) != null && AVEngineKit.a(this.a).getState() != CallState.Idle) { + CallSession.a(AVEngineKit.a(this.a), CallEndReason.MediaError); + } + + }); + } + + public void c(VideoTrack var1) { + AVEngineKit.b(this.a).submit(() -> { + AVEngineKit.b(this.a, var1); + CallSession.b(AVEngineKit.a(this.a)).didReceiveRemoteVideoTrack(); + }); + } + + public void b(VideoTrack var1) { + AVEngineKit.b(this.a).submit(() -> { + AVEngineKit.b(this.a, (VideoTrack) null); + if (AVEngineKit.a(this.a) != null) { + CallSession.a(AVEngineKit.a(this.a), (VideoRenderer) null); + } + + }); + } + + public void a(VideoTrack var1) { + AVEngineKit.b(this.a).submit(() -> { + AVEngineKit.a(this.a, var1); + CallSession.b(AVEngineKit.a(this.a)).didCreateLocalVideoTrack(); + }); + } + + public void a() { + AVEngineKit.b(this.a).submit(() -> { + AVEngineKit.a(this.a, (VideoTrack) null); + }); + } + + public void c() { + } + + public void a(StatsReport[] var1) { + CallSession.b(AVEngineKit.a(this.a)).didGetStats(var1); + } + + public void a(String var1) { + AVEngineKit.b(this.a).submit(() -> { + CallSession.b(AVEngineKit.a(this.a)).didError(var1); + CallSession.a(AVEngineKit.a(this.a), CallEndReason.MediaError); + }); + } +} \ No newline at end of file diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/g.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/g.java new file mode 100644 index 00000000..3274195d --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/g.java @@ -0,0 +1,26 @@ +package cn.wildfirechat.avenginekit; + +import cn.wildfirechat.remote.SendMessageCallback; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class g implements SendMessageCallback { + g(h var1) { + this.a = var1; + } + + public void onSuccess(long var1, long var3) { + long var10000 = this.a.c.messageId; + } + + public void onFail(int var1) { + } + + public void onPrepare(long var1, long var3) { + } + + public void onMediaUpload(String var1) { + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/h.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/h.java new file mode 100644 index 00000000..ac4e6de5 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/h.java @@ -0,0 +1,59 @@ +package cn.wildfirechat.avenginekit; + +import android.util.Log; + +import cn.wildfirechat.client.NotInitializedExecption; +import cn.wildfirechat.message.CallStartMessageContent; +import cn.wildfirechat.message.Message; +import cn.wildfirechat.message.MessageContent; +import cn.wildfirechat.remote.ChatManager; +import cn.wildfirechat.remote.SendMessageCallback; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class h implements SendMessageCallback { + h(AVEngineKit var1, MessageContent var2, String var3, Message var4, boolean var5) { + this.e = var1; + this.a = var2; + this.b = var3; + this.c = var4; + this.d = var5; + } + + public void onSuccess(long var1, long var3) { + Log.d("CallRTCClient", "send message success"); + if (this.a instanceof CallStartMessageContent && AVEngineKit.a(this.e) != null && this.b.equals(AVEngineKit.CallSession.e(AVEngineKit.a(this.e)))) { + AVEngineKit.CallSession.b(AVEngineKit.a(this.e), this.c.messageId); + } + + } + + public void onFail(int var1) { + if (this.d) { + AVEngineKit.b(this.e).submit(() -> { + if (AVEngineKit.a(this.e) != null && AVEngineKit.a(this.e).getState() != AVEngineKit.CallState.Idle) { + AVEngineKit.CallSession.b(AVEngineKit.a(this.e)).didError("Signal error"); + AVEngineKit.CallSession.a(AVEngineKit.a(this.e), AVEngineKit.CallEndReason.SignalError); + } + + }); + } else { + try { + ChatManager.Instance().sendMessage(this.c, new g(this)); + } catch (NotInitializedExecption var2) { + var2.printStackTrace(); + } + } + + } + + public void onPrepare(long var1, long var3) { + Log.d("CallRTCClient", "send message prepared"); + } + + public void onMediaUpload(String var1) { + } +} + diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/i.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/i.java new file mode 100644 index 00000000..0236fb65 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/i.java @@ -0,0 +1,23 @@ +package cn.wildfirechat.avenginekit; + +import java.util.concurrent.Callable; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class i implements Callable { + i(AVEngineKit.CallSession var1, boolean var2) { + this.b = var1; + this.a = var2; + } + + public Boolean call() { + if (AVEngineKit.k(this.b.n) != null) { + AVEngineKit.k(this.b.n).a(this.a ^ true); + return true; + } else { + return false; + } + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/j.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/j.java new file mode 100644 index 00000000..e1bf5ad5 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/j.java @@ -0,0 +1,23 @@ +package cn.wildfirechat.avenginekit; + +import java.util.concurrent.Callable; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class j implements Callable { + j(AVEngineKit.CallSession var1, boolean var2) { + this.b = var1; + this.a = var2; + } + + public Boolean call() { + if (AVEngineKit.k(this.b.n) != null) { + AVEngineKit.k(this.b.n).b(this.a ^ true); + return true; + } else { + return false; + } + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/k.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/k.java new file mode 100644 index 00000000..f9974f81 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/k.java @@ -0,0 +1,30 @@ +package cn.wildfirechat.avenginekit; + +import java.util.TimerTask; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class k extends TimerTask { + k(AVEngineKit.CallSession var1) { + this.a = var1; + } + + public void run() { + if (AVEngineKit.a(this.a.n) != null && CallSession.c(AVEngineKit.a(this.a.n)) != CallState.Connected) { + AVEngineKit.b(this.a.n).submit(() -> { + if (AVEngineKit.a(this.a.n) != null && CallSession.c(AVEngineKit.a(this.a.n)) != CallState.Connected) { + if (CallSession.b(AVEngineKit.a(this.a.n)) != null) { + CallSession.b(AVEngineKit.a(this.a.n)).didError("Wait anwser timeout"); + } + + CallSession.a(AVEngineKit.a(this.a.n), CallEndReason.Timeout); + } + + }); + } + + } +} + diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/l.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/l.java new file mode 100644 index 00000000..c6913b56 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/l.java @@ -0,0 +1,26 @@ +package cn.wildfirechat.avenginekit; + +import java.util.TimerTask; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class l extends TimerTask { + l(CallSession var1) { + this.a = var1; + } + + public void run() { + if (AVEngineKit.a(this.a.n) != null && CallSession.c(AVEngineKit.a(this.a.n)) != CallState.Connected) { + AVEngineKit.b(this.a.n).submit(() -> { + if (AVEngineKit.a(this.a.n) != null && CallSession.c(AVEngineKit.a(this.a.n)) != CallState.Connected) { + CallSession.b(AVEngineKit.a(this.a.n)).didError("Connect timeout"); + CallSession.a(AVEngineKit.a(this.a.n), CallEndReason.Timeout); + } + + }); + } + + } +} \ No newline at end of file diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/m.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/m.java new file mode 100644 index 00000000..03ade417 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/m.java @@ -0,0 +1,127 @@ +package cn.wildfirechat.avenginekit; + +import android.content.Context; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; +import android.hardware.SensorManager; +import android.os.Build; +import android.util.Log; + +import org.webrtc.ThreadUtils; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class m implements SensorEventListener { + private static final String a = "AVProximitySensor"; + private final ThreadUtils.ThreadChecker b = new ThreadUtils.ThreadChecker(); + private final Runnable c; + private final SensorManager d; + private Sensor e = null; + private boolean f = false; + + static m a(Context var0, Runnable var1) { + return new m(var0, var1); + } + + private m(Context var1, Runnable var2) { + Log.d("AVProximitySensor", "AVProximitySensor" + a.a()); + this.c = var2; + this.d = (SensorManager)var1.getSystemService("sensor"); + } + + private boolean d() { + if (this.e != null) { + return true; + } else { + this.e = this.d.getDefaultSensor(8); + if (this.e == null) { + return false; + } else { + this.e(); + return true; + } + } + } + + private void e() { + if (this.e != null) { + StringBuilder var1; + StringBuilder var10000 = var1 = new StringBuilder; + var10000.("Proximity sensor: "); + var10000.append("name=").append(this.e.getName()); + var10000.append(", vendor: ").append(this.e.getVendor()); + var10000.append(", power: ").append(this.e.getPower()); + var10000.append(", resolution: ").append(this.e.getResolution()); + var10000.append(", max range: ").append(this.e.getMaximumRange()); + var10000.append(", min delay: ").append(this.e.getMinDelay()); + if (Build.VERSION.SDK_INT >= 20) { + var1.append(", type: ").append(this.e.getStringType()); + } + + if (Build.VERSION.SDK_INT >= 21) { + var1.append(", max delay: ").append(this.e.getMaxDelay()); + var1.append(", reporting mode: ").append(this.e.getReportingMode()); + var1.append(", isWakeUpSensor: ").append(this.e.isWakeUpSensor()); + } + + Log.d("AVProximitySensor", var1.toString()); + } + } + + public boolean b() { + this.b.checkIsOnValidThread(); + Log.d("AVProximitySensor", "start" + a.a()); + if (!this.d()) { + return false; + } else { + this.d.registerListener(this, this.e, 3); + return true; + } + } + + public void c() { + this.b.checkIsOnValidThread(); + Log.d("AVProximitySensor", "stop" + a.a()); + Sensor var1; + if ((var1 = this.e) != null) { + this.d.unregisterListener(this, var1); + } + } + + public boolean a() { + this.b.checkIsOnValidThread(); + return this.f; + } + + public final void onAccuracyChanged(Sensor var1, int var2) { + this.b.checkIsOnValidThread(); + a.a(var1.getType() == 8); + if (var2 == 0) { + Log.e("AVProximitySensor", "The values returned by this sensor cannot be trusted"); + } + + } + + public final void onSensorChanged(SensorEvent var1) { + this.b.checkIsOnValidThread(); + a.a(var1.sensor.getType() == 8); + if (var1.values[0] < this.e.getMaximumRange()) { + Log.d("AVProximitySensor", "Proximity sensor => NEAR state"); + this.f = true; + } else { + Log.d("AVProximitySensor", "Proximity sensor => FAR state"); + this.f = false; + } + + Runnable var3; + if ((var3 = this.c) != null) { + var3.run(); + } + + Log.d("AVProximitySensor", "onSensorChanged" + a.a() + ": accuracy=" + var1.accuracy + ", timestamp=" + var1.timestamp + ", distance=" + var1.values[0]); + } +} + diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/o.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/o.java new file mode 100644 index 00000000..d2b5a570 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/o.java @@ -0,0 +1,21 @@ +package cn.wildfirechat.avenginekit; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class o implements Runnable { + o(w var1) { + this.a = var1; + } + + public void run() { + try { + w.o(this.a); + w.p(this.a); + } catch (Exception var2) { + w.a(this.a, "Failed to create peer connection: " + var2.getMessage()); + throw var2; + } + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/p.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/p.java new file mode 100644 index 00000000..dd984fc7 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/p.java @@ -0,0 +1,30 @@ +package cn.wildfirechat.avenginekit; + +import android.util.Log; + +import org.webrtc.voiceengine.WebRtcAudioRecord; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class p implements WebRtcAudioRecord.WebRtcAudioRecordErrorCallback { + p(w var1) { + this.a = var1; + } + + public void onWebRtcAudioRecordInitError(String var1) { + Log.e("PCRTCClient", "onWebRtcAudioRecordInitError: " + var1); + w.a(this.a, var1); + } + + public void onWebRtcAudioRecordStartError(WebRtcAudioRecord.AudioRecordStartErrorCode var1, String var2) { + Log.e("PCRTCClient", "onWebRtcAudioRecordStartError: " + var1 + ". " + var2); + w.a(this.a, var2); + } + + public void onWebRtcAudioRecordError(String var1) { + Log.e("PCRTCClient", "onWebRtcAudioRecordError: " + var1); + w.a(this.a, var1); + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/q.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/q.java new file mode 100644 index 00000000..e5a5c1ca --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/q.java @@ -0,0 +1,30 @@ +package cn.wildfirechat.avenginekit; + +import android.util.Log; + +import org.webrtc.voiceengine.WebRtcAudioTrack; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class q implements WebRtcAudioTrack.ErrorCallback { + q(w var1) { + this.a = var1; + } + + public void onWebRtcAudioTrackInitError(String var1) { + Log.e("PCRTCClient", "onWebRtcAudioTrackInitError: " + var1); + w.a(this.a, var1); + } + + public void onWebRtcAudioTrackStartError(WebRtcAudioTrack.AudioTrackStartErrorCode var1, String var2) { + Log.e("PCRTCClient", "onWebRtcAudioTrackStartError: " + var1 + ". " + var2); + w.a(this.a, var2); + } + + public void onWebRtcAudioTrackError(String var1) { + Log.e("PCRTCClient", "onWebRtcAudioTrackError: " + var1); + w.a(this.a, var1); + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/r.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/r.java new file mode 100644 index 00000000..bf5ce814 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/r.java @@ -0,0 +1,18 @@ +package cn.wildfirechat.avenginekit; + +import org.webrtc.StatsObserver; +import org.webrtc.StatsReport; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class r implements StatsObserver { + r(w var1) { + this.a = var1; + } + + public void onComplete(StatsReport[] var1) { + w.q(this.a).a(var1); + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/s.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/s.java new file mode 100644 index 00000000..5853635e --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/s.java @@ -0,0 +1,15 @@ +package cn.wildfirechat.avenginekit; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class s implements Runnable { + s(t var1) { + this.a = var1; + } + + public void run() { + w.r(this.a.a); + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/t.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/t.java new file mode 100644 index 00000000..a2616975 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/t.java @@ -0,0 +1,17 @@ +package cn.wildfirechat.avenginekit; + +import java.util.TimerTask; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class t extends TimerTask { + t(w var1) { + this.a = var1; + } + + public void run() { + w.a().execute(new s(this)); + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/u.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/u.java new file mode 100644 index 00000000..81c68dc8 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/u.java @@ -0,0 +1,20 @@ +package cn.wildfirechat.avenginekit; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class u implements Runnable { + u(w var1, boolean var2) { + this.b = var1; + this.a = var2; + } + + public void run() { + w.b(this.b, this.a); + if (w.a(this.b) != null) { + w.a(this.b).setEnabled(w.s(this.b)); + } + + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/v.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/v.java new file mode 100644 index 00000000..107b1115 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/v.java @@ -0,0 +1,24 @@ +package cn.wildfirechat.avenginekit; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class v implements Runnable { + v(w var1, boolean var2) { + this.b = var1; + this.a = var2; + } + + public void run() { + w.a(this.b, this.a); + if (w.c(this.b) != null) { + w.c(this.b).setEnabled(w.b(this.b)); + } + + if (w.d(this.b) != null) { + w.d(this.b).setEnabled(w.b(this.b)); + } + + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/w.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/w.java new file mode 100644 index 00000000..4fe4aa30 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/w.java @@ -0,0 +1,1231 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by Fernflower decompiler) +// + +package cn.wildfirechat.avenginekit; + +import android.content.Context; +import android.os.Environment; +import android.os.ParcelFileDescriptor; +import android.util.Log; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.Timer; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.webrtc.AudioSource; +import org.webrtc.AudioTrack; +import org.webrtc.CameraVideoCapturer; +import org.webrtc.DataChannel; +import org.webrtc.DefaultVideoDecoderFactory; +import org.webrtc.DefaultVideoEncoderFactory; +import org.webrtc.EglBase; +import org.webrtc.IceCandidate; +import org.webrtc.Logging; +import org.webrtc.MediaConstraints; +import org.webrtc.MediaStream; +import org.webrtc.MediaStreamTrack; +import org.webrtc.PeerConnection; +import org.webrtc.PeerConnectionFactory; +import org.webrtc.RtpParameters; +import org.webrtc.RtpReceiver; +import org.webrtc.RtpSender; +import org.webrtc.SdpObserver; +import org.webrtc.SessionDescription; +import org.webrtc.SoftwareVideoDecoderFactory; +import org.webrtc.SoftwareVideoEncoderFactory; +import org.webrtc.StatsReport; +import org.webrtc.VideoCapturer; +import org.webrtc.VideoDecoderFactory; +import org.webrtc.VideoEncoderFactory; +import org.webrtc.VideoSource; +import org.webrtc.VideoTrack; +import org.webrtc.CameraVideoCapturer.CameraSwitchHandler; +import org.webrtc.DataChannel.Init; +import org.webrtc.Logging.Severity; +import org.webrtc.MediaConstraints.KeyValuePair; +import org.webrtc.PeerConnection.BundlePolicy; +import org.webrtc.PeerConnection.ContinualGatheringPolicy; +import org.webrtc.PeerConnection.IceConnectionState; +import org.webrtc.PeerConnection.IceGatheringState; +import org.webrtc.PeerConnection.IceServer; +import org.webrtc.PeerConnection.KeyType; +import org.webrtc.PeerConnection.Observer; +import org.webrtc.PeerConnection.RTCConfiguration; +import org.webrtc.PeerConnection.RtcpMuxPolicy; +import org.webrtc.PeerConnection.SignalingState; +import org.webrtc.PeerConnection.TcpCandidatePolicy; +import org.webrtc.PeerConnectionFactory.InitializationOptions; +import org.webrtc.PeerConnectionFactory.Options; +import org.webrtc.RtpParameters.Encoding; +import org.webrtc.voiceengine.WebRtcAudioManager; +import org.webrtc.voiceengine.WebRtcAudioRecord; +import org.webrtc.voiceengine.WebRtcAudioTrack; +import org.webrtc.voiceengine.WebRtcAudioUtils; + +public class w { + public static final String a = "ARDAMSv0"; + public static final String b = "ARDAMSa0"; + public static final String c = "video"; + private static final String d = "PCRTCClient"; + private static final String e = "VP8"; + private static final String f = "VP9"; + private static final String g = "H264"; + private static final String h = "H264 Baseline"; + private static final String i = "H264 High"; + private static final String j = "opus"; + private static final String k = "ISAC"; + private static final String l = "x-google-start-bitrate"; + private static final String m = "WebRTC-FlexFEC-03-Advertised/Enabled/WebRTC-FlexFEC-03/Enabled/"; + private static final String n = "WebRTC-IntelVP8/Enabled/"; + private static final String o = "WebRTC-H264HighProfile/Enabled/"; + private static final String p = "WebRTC-Audio-MinimizeResamplingOnMobile/Enabled/"; + private static final String q = "VideoFrameEmit/Enabled/"; + private static final String r = "maxaveragebitrate"; + private static final String s = "googEchoCancellation"; + private static final String t = "googAutoGainControl"; + private static final String u = "googHighpassFilter"; + private static final String v = "googNoiseSuppression"; + private static final String w = "levelControl"; + private static final String x = "DtlsSrtpKeyAgreement"; + private static final int y = 1280; + private static final int z = 720; + private static final int A = 1000; + private static final ExecutorService B = Executors.newSingleThreadExecutor(); + private final w.b C = new w.b((o)null); + private final w.e D = new w.e((o)null); + private final EglBase E = EglBase.create(); + private PeerConnectionFactory F; + private PeerConnection G; + Options H = null; + private AudioSource I; + private VideoSource J; + private boolean K; + private boolean L; + private String M; + private boolean N; + private boolean O; + private Timer P; + public List Q; + private int R; + private int S; + private int T; + private MediaConstraints U; + private MediaConstraints V; + private w.d W; + private List X; + private w.c Y; + private boolean Z; + private SessionDescription aa; + private MediaStream ba; + private VideoCapturer ca; + private boolean da; + private VideoTrack ea; + private VideoTrack fa; + private RtpSender ga; + private boolean ha; + private AudioTrack ia; + private DataChannel ja; + private boolean ka; + + public w() { + } + + private void a(Context var1) { + this.O = false; + String var2 = ""; + if (this.W.i) { + var2 = var2 + "WebRTC-FlexFEC-03-Advertised/Enabled/WebRTC-FlexFEC-03/Enabled/"; + Log.d("PCRTCClient", "Enable FlexFEC field trial."); + } + + var2 = var2 + "WebRTC-IntelVP8/Enabled/"; + if (this.W.s) { + var2 = var2 + "WebRTC-Audio-MinimizeResamplingOnMobile/Enabled/"; + Log.d("PCRTCClient", "Disable WebRTC AGC field trial."); + } + + var2 = var2 + "VideoFrameEmit/Enabled/"; + this.M = "VP8"; + String var3; + if (this.K && (var3 = this.W.g) != null) { + byte var4 = -1; + int var5; + if ((var5 = var3.hashCode()) != -2140422726) { + if (var5 != -1031013795) { + if (var5 != 85182) { + if (var5 == 85183 && var3.equals("VP9")) { + var4 = 1; + } + } else if (var3.equals("VP8")) { + var4 = 0; + } + } else if (var3.equals("H264 Baseline")) { + var4 = 2; + } + } else if (var3.equals("H264 High")) { + var4 = 3; + } + + switch(var4) { + case 0: + default: + this.M = "VP8"; + break; + case 1: + this.M = "VP9"; + break; + case 2: + this.M = "H264"; + break; + case 3: + var2 = var2 + "WebRTC-H264HighProfile/Enabled/"; + this.M = "H264"; + } + } + + Log.d("PCRTCClient", "Preferred video codec: " + this.M); + Log.d("PCRTCClient", "Initialize WebRTC. Field trials: " + var2 + " Enable video HW acceleration: " + this.W.h); + PeerConnectionFactory.initialize(InitializationOptions.builder(var1).setFieldTrials(var2).setEnableVideoHwAcceleration(this.W.h).setEnableInternalTracer(true).createInitializationOptions()); + if (this.W.b) { + PeerConnectionFactory.startInternalTracingCapture(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "webrtc-trace.txt"); + } + + String var6; + boolean var7; + if ((var6 = this.W.k) != null && var6.equals("ISAC")) { + var7 = true; + } else { + var7 = false; + } + + this.L = var7; + if (!this.W.n) { + Log.d("PCRTCClient", "Disable OpenSL ES audio even if device supports it"); + WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(true); + } else { + Log.d("PCRTCClient", "Allow OpenSL ES audio if device supports it"); + WebRtcAudioManager.setBlacklistDeviceForOpenSLESUsage(false); + } + + if (this.W.o) { + Log.d("PCRTCClient", "Disable built-in AEC even if device supports it"); + WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true); + } else { + Log.d("PCRTCClient", "Enable built-in AEC if device supports it"); + WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(false); + } + + if (this.W.p) { + Log.d("PCRTCClient", "Disable built-in AGC even if device supports it"); + WebRtcAudioUtils.setWebRtcBasedAutomaticGainControl(true); + } else { + Log.d("PCRTCClient", "Enable built-in AGC if device supports it"); + WebRtcAudioUtils.setWebRtcBasedAutomaticGainControl(false); + } + + if (this.W.q) { + Log.d("PCRTCClient", "Disable built-in NS even if device supports it"); + WebRtcAudioUtils.setWebRtcBasedNoiseSuppressor(true); + } else { + Log.d("PCRTCClient", "Enable built-in NS if device supports it"); + WebRtcAudioUtils.setWebRtcBasedNoiseSuppressor(false); + } + + WebRtcAudioRecord.setErrorCallback(new p(this)); + WebRtcAudioTrack.setErrorCallback(new q(this)); + if (this.H != null) { + Log.d("PCRTCClient", "Factory networkIgnoreMask option: " + this.H.networkIgnoreMask); + } + + var7 = "H264 High".equals(this.W.g); + Object var8; + Object var9; + if (this.W.h) { + var9 = new DefaultVideoEncoderFactory.(this.E.getEglBaseContext(), true, var7); + var8 = new DefaultVideoDecoderFactory.(this.E.getEglBaseContext()); + } else { + var9 = new SoftwareVideoEncoderFactory.(); + var8 = new SoftwareVideoDecoderFactory.(); + } + + this.F = new PeerConnectionFactory(this.H, (VideoEncoderFactory)var9, (VideoDecoderFactory)var8); + Log.d("PCRTCClient", "Peer connection factory created."); + } + + private void n() { + if (this.ca == null) { + Log.w("PCRTCClient", "No camera on device. Switch to audio only call."); + this.K = false; + } + + if (this.K) { + w.d var1; + this.R = (var1 = this.W).c; + this.S = var1.d; + this.T = var1.e; + if (this.R == 0 || this.S == 0) { + this.R = 1280; + this.S = 720; + } + + if (this.T == 0) { + this.T = 30; + } + + Logging.d("PCRTCClient", "Capturing format: " + this.R + "x" + this.S + "@" + this.T); + } + + this.U = new MediaConstraints(); + if (this.W.l) { + Log.d("PCRTCClient", "Disabling audio processing"); + this.U.mandatory.add(new KeyValuePair("googEchoCancellation", "false")); + this.U.mandatory.add(new KeyValuePair("googAutoGainControl", "false")); + this.U.mandatory.add(new KeyValuePair("googHighpassFilter", "false")); + this.U.mandatory.add(new KeyValuePair("googNoiseSuppression", "false")); + } + + if (this.W.r) { + Log.d("PCRTCClient", "Enabling level control."); + this.U.mandatory.add(new KeyValuePair("levelControl", "true")); + } + + this.V = new MediaConstraints(); + this.V.mandatory.add(new KeyValuePair("OfferToReceiveAudio", "true")); + if (this.K) { + this.V.mandatory.add(new KeyValuePair("OfferToReceiveVideo", "true")); + } else { + this.V.mandatory.add(new KeyValuePair("OfferToReceiveVideo", "false")); + } + + } + + private void o() { + if (this.F != null && !this.O) { + Log.d("PCRTCClient", "Create peer connection."); + this.X = new ArrayList(); + if (this.K) { + this.F.setVideoHwAccelerationOptions(this.E.getEglBaseContext(), this.E.getEglBaseContext()); + } + + RTCConfiguration var1; + RTCConfiguration var10003 = var1 = new RTCConfiguration; + var10003.(this.Q); + var10003.tcpCandidatePolicy = TcpCandidatePolicy.DISABLED; + var10003.bundlePolicy = BundlePolicy.MAXBUNDLE; + var10003.rtcpMuxPolicy = RtcpMuxPolicy.REQUIRE; + var10003.continualGatheringPolicy = ContinualGatheringPolicy.GATHER_CONTINUALLY; + var10003.keyType = KeyType.ECDSA; + var10003.enableDtlsSrtp = true; + this.G = this.F.createPeerConnection(var1, this.C); + if (this.ka) { + Init var8; + Init var10002 = var8 = new Init; + var8.(); + var8.ordered = this.W.t.a; + var8.negotiated = this.W.t.e; + var8.maxRetransmits = this.W.t.c; + var8.maxRetransmitTimeMs = this.W.t.b; + var8.id = this.W.t.f; + var10002.protocol = this.W.t.d; + this.ja = this.G.createDataChannel("AVEngineKit data", var8); + } + + this.Z = false; + Logging.enableLogToDebugOutput(Severity.LS_INFO); + this.ba = this.F.createLocalMediaStream("ARDAMS"); + if (this.K) { + this.ba.addTrack(this.a(this.ca)); + } + + this.ba.addTrack(this.m()); + this.G.addStream(this.ba); + if (this.K) { + this.q(); + } + + if (this.W.m) { + label52: { + IOException var10000; + label65: { + w var9; + File var10; + File var12; + StringBuilder var16; + boolean var10001; + try { + var9 = this; + var10 = new File; + var12 = var10; + var16 = (new StringBuilder()).append(Environment.getExternalStorageDirectory().getPath()).append(File.separator); + } catch (IOException var5) { + var10000 = var5; + var10001 = false; + break label65; + } + + String var10004 = "Download/audio.aecdump"; + + try { + var12.(var16.append(var10004).toString()); + } catch (IOException var4) { + var10000 = var4; + var10001 = false; + break label65; + } + + int var14 = 1006632960; + + PeerConnectionFactory var11; + int var13; + try { + ParcelFileDescriptor var6 = ParcelFileDescriptor.open(var10, var14); + var11 = var9.F; + var13 = var6.getFd(); + } catch (IOException var3) { + var10000 = var3; + var10001 = false; + break label65; + } + + byte var15 = -1; + + try { + var11.startAecDump(var13, var15); + break label52; + } catch (IOException var2) { + var10000 = var2; + var10001 = false; + } + } + + IOException var7 = var10000; + Log.e("PCRTCClient", "Can not open aecdump file", var7); + } + } + + Log.d("PCRTCClient", "Peer connection created."); + } else { + Log.e("PCRTCClient", "Peerconnection factory is not created"); + } + } + + private void l() { + PeerConnectionFactory var1; + if ((var1 = this.F) != null && this.W.m) { + var1.stopAecDump(); + } + + Log.d("PCRTCClient", "Closing peer connection."); + this.P.cancel(); + DataChannel var2; + if ((var2 = this.ja) != null) { + var2.dispose(); + this.ja = null; + } + + PeerConnection var3; + if ((var3 = this.G) != null) { + var3.dispose(); + this.G = null; + } + + Log.d("PCRTCClient", "Closing audio source."); + AudioSource var4; + if ((var4 = this.I) != null) { + var4.dispose(); + this.I = null; + } + + Log.d("PCRTCClient", "Stopping capture."); + if (this.ca != null) { + this.N = true; + this.ca = null; + } + + Log.d("PCRTCClient", "Closing video source."); + VideoSource var5; + if ((var5 = this.J) != null) { + var5.dispose(); + this.J = null; + } + + Log.d("PCRTCClient", "Closing peer connection factory."); + if ((var1 = this.F) != null) { + var1.dispose(); + this.F = null; + } + + this.H = null; + this.E.release(); + Log.d("PCRTCClient", "Closing peer connection done."); + this.Y.c(); + PeerConnectionFactory.stopInternalTracingCapture(); + PeerConnectionFactory.shutdownInternalTracer(); + this.Y = null; + } + + private void r() { + PeerConnection var1; + if ((var1 = this.G) != null && !this.O) { + if (!var1.getStats(new r(this), (MediaStreamTrack)null)) { + Log.e("PCRTCClient", "getStats() returns false!"); + } + + } + } + + private void b(String var1) { + Log.e("PCRTCClient", "Peerconnection error: " + var1); + B.execute(() -> { + if (!this.O) { + this.Y.a(var1); + this.O = true; + } + + }); + } + + private AudioTrack m() { + this.I = this.F.createAudioSource(this.U); + this.ia = this.F.createAudioTrack("ARDAMSa0", this.I); + this.ia.setEnabled(this.ha); + return this.ia; + } + + private void q() { + Iterator var1 = this.G.getSenders().iterator(); + + while(var1.hasNext()) { + RtpSender var2; + if ((var2 = (RtpSender)var1.next()).track() != null && var2.track().kind().equals("video")) { + Log.d("PCRTCClient", "Found video sender."); + this.ga = var2; + } + } + + } + + private static String a(String var0, boolean var1, String var2, int var3) { + String[] var4 = var2.split("\r\n"); + byte var5 = -1; + boolean var6 = false; + String var7 = null; + Pattern var8 = Pattern.compile("^a=rtpmap:(\\d+) " + var0 + "(/\\d+)+[\r]?$"); + int var9 = 0; + + while(true) { + if (var9 >= var4.length) { + var9 = var5; + break; + } + + Matcher var10; + if ((var10 = var8.matcher(var4[var9])).matches()) { + var7 = var10.group(1); + break; + } + + ++var9; + } + + if (var7 == null) { + Log.w("PCRTCClient", "No rtpmap for " + var0 + " codec"); + return var2; + } else { + Log.d("PCRTCClient", "Found " + var0 + " rtpmap " + var7 + " at " + var4[var9]); + Pattern var12 = Pattern.compile("^a=fmtp:" + var7 + " \\w+=\\d+.*[\r]?$"); + + StringBuilder var11; + for(int var14 = 0; var14 < var4.length; ++var14) { + if (var12.matcher(var4[var14]).matches()) { + Log.d("PCRTCClient", "Found " + var0 + " " + var4[var14]); + StringBuilder var10002; + if (var1) { + var10002 = var11 = new StringBuilder; + var11.(); + var4[var14] = var10002.append(var4[var14]).append("; x-google-start-bitrate=").append(var3).toString(); + } else { + var10002 = var11 = new StringBuilder; + var11.(); + var4[var14] = var10002.append(var4[var14]).append("; maxaveragebitrate=").append(var3 * 1000).toString(); + } + + Log.d("PCRTCClient", "Update remote SDP line: " + var4[var14]); + var6 = true; + break; + } + } + + var11 = new StringBuilder.(); + + for(int var13 = 0; var13 < var4.length; ++var13) { + var11.append(var4[var13]).append("\r\n"); + if (!var6 && var13 == var9) { + String var15; + if (var1) { + var15 = "a=fmtp:" + var7 + " " + "x-google-start-bitrate" + "=" + var3; + } else { + var15 = "a=fmtp:" + var7 + " " + "maxaveragebitrate" + "=" + var3 * 1000; + } + + Log.d("PCRTCClient", "Add remote SDP line: " + var15); + var11.append(var15).append("\r\n"); + } + } + + return var11.toString(); + } + } + + private static int a(boolean var0, String[] var1) { + String var3; + if (var0) { + var3 = "m=audio "; + } else { + var3 = "m=video "; + } + + for(int var2 = 0; var2 < var1.length; ++var2) { + if (var1[var2].startsWith(var3)) { + return var2; + } + } + + return -1; + } + + private static String a(Iterable var0, String var1, boolean var2) { + Iterator var4; + if (!(var4 = var0.iterator()).hasNext()) { + return ""; + } else { + StringBuilder var3; + var3 = new StringBuilder.((CharSequence)var4.next()); + + while(var4.hasNext()) { + var3.append(var1).append((CharSequence)var4.next()); + } + + if (var2) { + var3.append(var1); + } + + return var3.toString(); + } + } + + private static String a(List var0, String var1) { + List var2; + if ((var2 = Arrays.asList(var1.split(" "))).size() <= 3) { + Log.e("PCRTCClient", "Wrong SDP media description format: " + var1); + return null; + } else { + List var4 = var2.subList(0, 3); + ArrayList var3; + ArrayList var10000 = var3 = new ArrayList; + var3.(var2.subList(3, var2.size())); + var10000.removeAll(var0); + ArrayList var5; + var10000 = var5 = new ArrayList; + var5.(); + var5.addAll(var4); + var5.addAll(var0); + var10000.addAll(var3); + return a((Iterable)var10000, " ", false); + } + } + + private static String b(String var0, String var1, boolean var2) { + int var3; + String[] var9; + if ((var3 = a(var2, var9 = var0.split("\r\n"))) == -1) { + Log.w("PCRTCClient", "No mediaDescription line, so can't prefer " + var1); + return var0; + } else { + ArrayList var4; + var4 = new ArrayList.(); + Pattern var5 = Pattern.compile("^a=rtpmap:(\\d+) " + var1 + "(/\\d+)+[\r]?$"); + int var6 = var9.length; + + for(int var7 = 0; var7 < var6; ++var7) { + Matcher var8; + if ((var8 = var5.matcher(var9[var7])).matches()) { + var4.add(var8.group(1)); + } + } + + if (var4.isEmpty()) { + Log.w("PCRTCClient", "No payload types with name " + var1); + return var0; + } else if ((var1 = a((List)var4, (String)var9[var3])) == null) { + return var0; + } else { + Log.d("PCRTCClient", "Change media description from: " + var9[var3] + " to " + var1); + var9[var3] = var1; + return a((Iterable)Arrays.asList(var9), "\r\n", true); + } + } + } + + private void p() { + if (this.X != null) { + Log.d("PCRTCClient", "Add " + this.X.size() + " remote candidates"); + Iterator var1 = this.X.iterator(); + + while(var1.hasNext()) { + IceCandidate var2 = (IceCandidate)var1.next(); + this.G.addIceCandidate(var2); + } + + this.X = null; + } + + } + + private void y() { + if (this.ca instanceof CameraVideoCapturer) { + if (!this.K || this.O) { + Log.e("PCRTCClient", "Failed to switch camera. Video: " + this.K + ". Error : " + this.O); + return; + } + + Log.d("PCRTCClient", "Switch camera"); + ((CameraVideoCapturer)this.ca).switchCamera((CameraSwitchHandler)null); + } else { + Log.d("PCRTCClient", "Will not switch camera, video caputurer is not a camera"); + } + + } + + private void b(int var1, int var2, int var3) { + if (this.K && !this.O && this.ca != null) { + Log.d("PCRTCClient", "changeCaptureFormat: " + var1 + "x" + var2 + "@" + var3); + this.J.adaptOutputFormat(var1, var2, var3); + } else { + Log.e("PCRTCClient", "Failed to change capture format. Video: " + this.K + ". Error : " + this.O); + } + } + + public void a(Options var1) { + this.H = var1; + } + + public void a(Context var1, w.c var2, boolean var3, int var4, int var5, int var6, int var7) { + this.W = new w.d(var3, false, var4, var5, var6, var7, "H264 Baseline", true, true, 0, "OPUS", false, false, false, true, true, true, false, false, (w.a)null); + this.Y = var2; + w.d var8; + this.K = (var8 = this.W).a; + boolean var9; + if (var8.t != null) { + var9 = true; + } else { + var9 = false; + } + + this.ka = var9; + this.F = null; + this.G = null; + this.L = false; + this.N = false; + this.O = false; + this.X = null; + this.aa = null; + this.ba = null; + this.ca = null; + this.da = true; + this.ea = null; + this.fa = null; + this.ga = null; + this.ha = true; + this.ia = null; + this.P = new Timer(); + if ((var8 = this.W).a) { + this.R = var8.c; + this.S = var8.d; + this.T = var8.e; + if (var4 == 0 || var5 == 0) { + this.R = 1280; + this.S = 720; + } + + if (this.T == 0) { + this.T = 30; + } + + Logging.d("PCRTCClient", "Capturing format: " + var4 + "x" + var5 + "@" + var6); + } + + this.a(var1); + } + + public void h() { + MediaStream var1; + VideoTrack var2; + if ((var1 = this.ba) != null && (var2 = this.ea) != null) { + var1.removeTrack(var2); + this.ea.dispose(); + this.ea = null; + this.K = false; + this.Y.a(); + } + + } + + public void a(VideoCapturer var1, List var2) { + if (this.W == null) { + Log.e("PCRTCClient", "Creating peer connection without initializing factory."); + } else { + this.ca = var1; + this.Q = var2; + B.execute(new o(this)); + } + } + + public void b() { + B.execute(() -> { + this.l(); + }); + } + + public boolean g() { + return this.K; + } + + public boolean f() { + return this.K && this.R * this.S >= 921600; + } + + public org.webrtc.EglBase.Context e() { + return this.E.getEglBaseContext(); + } + + public void a(boolean var1, int var2) { + if (var1) { + Exception var10000; + label26: { + boolean var10001; + Timer var6; + t var7; + try { + var6 = this.P; + var7 = new t(this); + } catch (Exception var4) { + var10000 = var4; + var10001 = false; + break label26; + } + + long var10002 = 0L; + long var10003 = (long)var2; + + try { + var6.schedule(var7, var10002, var10003); + return; + } catch (Exception var3) { + var10000 = var3; + var10001 = false; + } + } + + Exception var5 = var10000; + Log.e("PCRTCClient", "Can not schedule statistics timer", var5); + } else { + this.P.cancel(); + } + + } + + public void a(boolean var1) { + B.execute(new u(this, var1)); + } + + public void b(boolean var1) { + B.execute(new v(this, var1)); + } + + public void d() { + B.execute(() -> { + if (this.G != null && !this.O) { + Log.d("PCRTCClient", "PC Create OFFER"); + this.Z = true; + this.G.createOffer(this.D, this.V); + } + + }); + } + + public void c() { + B.execute(() -> { + if (this.G != null && !this.O) { + Log.d("PCRTCClient", "PC create ANSWER"); + this.Z = false; + this.G.createAnswer(this.D, this.V); + } + + }); + } + + public void a(IceCandidate var1) { + B.execute(() -> { + PeerConnection var2; + if ((var2 = this.G) != null && !this.O) { + List var3; + if ((var3 = this.X) != null) { + var3.add(var1); + } else { + var2.addIceCandidate(var1); + } + } + + }); + } + + public void a(IceCandidate[] var1) { + B.execute(() -> { + if (this.G != null && !this.O) { + this.p(); + this.G.removeIceCandidates(var1); + } + }); + } + + public void a(SessionDescription var1) { + B.execute(() -> { + if (this.G != null && !this.O) { + String var2 = var1.description; + if (this.L) { + var2 = b(var2, "ISAC", true); + } + + if (this.K) { + var2 = b(var2, this.M, false); + } + + int var3; + if ((var3 = this.W.j) > 0) { + var2 = a("opus", false, var2, var3); + } + + Log.d("PCRTCClient", "Set remote SDP."); + SessionDescription var4; + var4 = new SessionDescription.(var1.type, var2); + this.G.setRemoteDescription(this.D, var4); + } + }); + } + + public void j() { + B.execute(() -> { + if (this.ca != null && !this.N) { + w var10000 = this; + Log.d("PCRTCClient", "Stop video source."); + + try { + var10000.ca.stopCapture(); + } catch (InterruptedException var1) { + } + + this.N = true; + } + + }); + } + + public void i() { + B.execute(() -> { + if (this.ca != null && this.N) { + Log.d("PCRTCClient", "Restart video source."); + this.ca.startCapture(this.R, this.S, this.T); + this.N = false; + } + + }); + } + + public void a(Integer var1) { + B.execute(() -> { + if (this.G != null && this.ga != null && !this.O) { + Log.d("PCRTCClient", "Requested max video bitrate: " + var1); + RtpSender var2; + if ((var2 = this.ga) == null) { + Log.w("PCRTCClient", "Sender is not ready."); + } else { + RtpParameters var6; + if ((var6 = var2.getParameters()).encodings.size() == 0) { + Log.w("PCRTCClient", "RtpParameters are not ready."); + } else { + Encoding var4; + Integer var5; + for(Iterator var3 = var6.encodings.iterator(); var3.hasNext(); var4.maxBitrateBps = var5) { + var4 = (Encoding)var3.next(); + if (var1 == null) { + var5 = null; + } else { + var5 = var1 * 1000; + } + } + + if (!this.ga.setParameters(var6)) { + Log.e("PCRTCClient", "RtpSender.setParameters failed."); + } + + Log.d("PCRTCClient", "Configured max video bitrate to: " + var1); + } + } + } + }); + } + + public VideoTrack a(VideoCapturer var1) { + this.ca = var1; + VideoTrack var2; + if ((var2 = this.ea) != null) { + return var2; + } else { + this.J = this.F.createVideoSource(var1); + var1.startCapture(this.R, this.S, this.T); + this.ea = this.F.createVideoTrack("ARDAMSv0", this.J); + this.ea.setEnabled(this.da); + this.Y.a(this.ea); + return this.ea; + } + } + + public void k() { + B.execute(() -> { + this.y(); + }); + } + + public void a(int var1, int var2, int var3) { + B.execute(() -> { + this.b(var1, var2, var3); + }); + } + + private class e implements SdpObserver { + private e() { + } + + public void onCreateSuccess(SessionDescription var1) { + if (w.this.aa != null) { + w.this.b("Multiple SDP create."); + } else { + String var2 = var1.description; + if (w.this.L) { + var2 = cn.wildfirechat.avenginekit.w.b(var2, "ISAC", true); + } + + if (w.this.K) { + var2 = cn.wildfirechat.avenginekit.w.b(var2, w.this.M, false); + } + + SessionDescription var3; + var3 = new SessionDescription.(var1.type, var2); + w.this.aa = var3; + cn.wildfirechat.avenginekit.w.B.execute(new y(this, var3)); + } + } + + public void onSetSuccess() { + cn.wildfirechat.avenginekit.w.B.execute(new z(this)); + } + + public void onCreateFailure(String var1) { + w.this.b("createSDP error: " + var1); + } + + public void onSetFailure(String var1) { + w.this.b("setSDP error: " + var1); + } + } + + private class b implements Observer { + private b() { + } + + public void onIceCandidate(IceCandidate var1) { + cn.wildfirechat.avenginekit.w.B.execute(() -> { + w.this.Y.onIceCandidate(var1); + }); + } + + public void onIceCandidatesRemoved(IceCandidate[] var1) { + cn.wildfirechat.avenginekit.w.B.execute(() -> { + w.this.Y.onIceCandidatesRemoved(var1); + }); + } + + public void onSignalingChange(SignalingState var1) { + Log.d("PCRTCClient", "SignalingState: " + var1); + } + + public void onIceConnectionChange(IceConnectionState var1) { + cn.wildfirechat.avenginekit.w.B.execute(() -> { + Log.d("PCRTCClient", "IceConnectionState: " + var1); + if (var1 == IceConnectionState.CONNECTED) { + if (w.this.Y != null) { + w.this.Y.d(); + } + } else if (var1 == IceConnectionState.DISCONNECTED) { + if (w.this.Y != null) { + w.this.Y.b(); + } + } else if (var1 == IceConnectionState.FAILED) { + w.this.b("ICE connection failed."); + } + + }); + } + + public void onIceGatheringChange(IceGatheringState var1) { + Log.d("PCRTCClient", "IceGatheringState: " + var1); + } + + public void onIceConnectionReceivingChange(boolean var1) { + Log.d("PCRTCClient", "IceConnectionReceiving changed to " + var1); + } + + public void onAddStream(MediaStream var1) { + cn.wildfirechat.avenginekit.w.B.execute(() -> { + if (w.this.G != null && !w.this.O) { + if (var1.audioTracks.size() <= 1 && var1.videoTracks.size() <= 1) { + if (var1.videoTracks.size() == 1) { + w.this.fa = (VideoTrack)var1.videoTracks.get(0); + w.this.fa.setEnabled(w.this.da); + w.this.Y.c(w.this.fa); + } + + } else { + w.this.b("Weird-looking stream: " + var1); + } + } + }); + } + + public void onRemoveStream(MediaStream var1) { + cn.wildfirechat.avenginekit.w.B.execute(() -> { + if (w.this.Y != null) { + w.this.Y.b(w.this.fa); + } + + w.this.fa = null; + }); + } + + public void onDataChannel(DataChannel var1) { + Log.d("PCRTCClient", "New Data channel " + var1.label()); + if (w.this.ka) { + var1.registerObserver(new x(this, var1)); + } + } + + public void onRenegotiationNeeded() { + } + + public void onAddTrack(RtpReceiver var1, MediaStream[] var2) { + } + } + + public interface c { + void a(SessionDescription var1); + + void onIceCandidate(IceCandidate var1); + + void onIceCandidatesRemoved(IceCandidate[] var1); + + void d(); + + void b(); + + void c(VideoTrack var1); + + void b(VideoTrack var1); + + void a(VideoTrack var1); + + void a(); + + void c(); + + void a(StatsReport[] var1); + + void a(String var1); + } + + private static class d { + public final boolean a; + public final boolean b; + public final int c; + public final int d; + public final int e; + public final int f; + public final String g; + public final boolean h; + public final boolean i; + public final int j; + public final String k; + public final boolean l; + public final boolean m; + public final boolean n; + public final boolean o; + public final boolean p; + public final boolean q; + public final boolean r; + public final boolean s; + private final w.a t; + + public d(boolean var1, boolean var2, int var3, int var4, int var5, int var6, String var7, boolean var8, boolean var9, int var10, String var11, boolean var12, boolean var13, boolean var14, boolean var15, boolean var16, boolean var17, boolean var18, boolean var19) { + this(var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, var11, var12, var13, var14, var15, var16, var17, var18, var19, (w.a)null); + } + + public d(boolean var1, boolean var2, int var3, int var4, int var5, int var6, String var7, boolean var8, boolean var9, int var10, String var11, boolean var12, boolean var13, boolean var14, boolean var15, boolean var16, boolean var17, boolean var18, boolean var19, w.a var20) { + this.a = var1; + this.b = var2; + this.c = var3; + this.d = var4; + this.e = var5; + this.f = var6; + this.g = var7; + this.i = var9; + this.h = var8; + this.j = var10; + this.k = var11; + this.l = var12; + this.m = var13; + this.n = var14; + this.o = var15; + this.p = var16; + this.q = var17; + this.r = var18; + this.s = var19; + this.t = var20; + } + } + + private static class a { + public final boolean a; + public final int b; + public final int c; + public final String d; + public final boolean e; + public final int f; + + public a(boolean var1, int var2, int var3, String var4, boolean var5, int var6) { + this.a = var1; + this.b = var2; + this.c = var3; + this.d = var4; + this.e = var5; + this.f = var6; + } + } +} diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/x.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/x.java new file mode 100644 index 00000000..5af82ad3 --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/x.java @@ -0,0 +1,41 @@ +package cn.wildfirechat.avenginekit; + +import android.util.Log; + +import org.webrtc.DataChannel; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class x implements DataChannel.Observer { + x(w.b var1, DataChannel var2) { + this.b = var1; + this.a = var2; + } + + public void onBufferedAmountChange(long var1) { + Log.d("PCRTCClient", "Data channel buffered amount changed: " + this.a.label() + ": " + this.a.state()); + } + + public void onStateChange() { + Log.d("PCRTCClient", "Data channel state changed: " + this.a.label() + ": " + this.a.state()); + } + + public void onMessage(DataChannel.Buffer var1) { + if (var1.binary) { + Log.d("PCRTCClient", "Received binary msg over " + this.a); + } else { + ByteBuffer var10000 = var1.data; + byte[] var3; + var10000.get(var3 = new byte[var10000.capacity()]); + String var2; + var2 = new String.(var3, Charset.forName("UTF-8")); + Log.d("PCRTCClient", "Got msg: " + var2 + " over " + this.a); + } + } +} + diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/y.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/y.java new file mode 100644 index 00000000..70575f4b --- /dev/null +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/y.java @@ -0,0 +1,25 @@ +package cn.wildfirechat.avenginekit; + +import android.util.Log; + +import org.webrtc.SessionDescription; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class y implements Runnable { + y(e var1, SessionDescription var2) { + this.b = var1; + this.a = var2; + } + + public void run() { + if (w.f(this.b.a) != null && !w.g(this.b.a)) { + Log.d("PCRTCClient", "Set local SDP from " + this.a.type); + w.f(this.b.a).setLocalDescription(w.l(this.b.a), this.a); + } + + } +} + diff --git a/enginekit/src/main/java/cn/wildfirechat/avenginekit/z.java b/enginekit/src/main/java/cn/wildfirechat/avenginekit/z.java index a5834f13..bdbcc92a 100644 --- a/enginekit/src/main/java/cn/wildfirechat/avenginekit/z.java +++ b/enginekit/src/main/java/cn/wildfirechat/avenginekit/z.java @@ -6,7 +6,7 @@ * Created by dds on 2019/7/23. * android_shuai@163.com */ -public class z { +public class z implements Runnable { z(e var1) { this.a = var1; } diff --git a/gradlew b/gradlew index 9d82f789..599afba6 100644 --- a/gradlew +++ b/gradlew @@ -88,7 +88,7 @@ fi if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + if [ "$MAX_FD" = "maximum" -cn.wildfirechat.avenginekit.o "$MAX_FD" = "max" ] ; then MAX_FD="$MAX_FD_LIMIT" fi ulimit -n $MAX_FD diff --git a/libskywebrtc/src/main/java/com/dds/webrtclib/CallEndReason.java b/libskywebrtc/src/main/java/com/dds/webrtclib/CallEndReason.java new file mode 100644 index 00000000..3338e1cb --- /dev/null +++ b/libskywebrtc/src/main/java/com/dds/webrtclib/CallEndReason.java @@ -0,0 +1,19 @@ +package com.dds.webrtclib; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public enum CallEndReason { + Busy, + SignalError, + Hangup, + MediaError, + RemoteHangup, + OpenCameraFailure, + Timeout, + AcceptByOtherClient; + + private CallEndReason() { + } +} diff --git a/libskywebrtc/src/main/java/com/dds/webrtclib/CallState.java b/libskywebrtc/src/main/java/com/dds/webrtclib/CallState.java new file mode 100644 index 00000000..b5f42305 --- /dev/null +++ b/libskywebrtc/src/main/java/com/dds/webrtclib/CallState.java @@ -0,0 +1,16 @@ +package com.dds.webrtclib; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public enum CallState { + Idle, + Outgoing, + Incoming, + Connecting, + Connected; + + private CallState() { + } +} \ No newline at end of file diff --git a/libskywebrtc/src/main/java/com/dds/webrtclib/PeerConnectionHelper.java b/libskywebrtc/src/main/java/com/dds/webrtclib/PeerConnectionHelper.java index a9681d39..125e3004 100644 --- a/libskywebrtc/src/main/java/com/dds/webrtclib/PeerConnectionHelper.java +++ b/libskywebrtc/src/main/java/com/dds/webrtclib/PeerConnectionHelper.java @@ -3,9 +3,10 @@ import android.content.Context; import android.media.AudioManager; -import androidx.annotation.Nullable; import android.util.Log; +import androidx.annotation.Nullable; + import com.dds.webrtclib.bean.MediaType; import com.dds.webrtclib.bean.MyIceServer; import com.dds.webrtclib.ws.IWebSocket; @@ -630,7 +631,7 @@ private PeerConnection createPeerConnection() { } - // ===================================替换编码方式========================================= + // ===================================替换编码方式优先级======================================== private static String preferCodec(String sdpDescription, String codec, boolean isAudio) { final String[] lines = sdpDescription.split("\r\n"); final int mLineIndex = findMediaDescriptionLine(isAudio, lines); diff --git a/libskywebrtc/src/main/java/com/dds/webrtclib/VideoProfile.java b/libskywebrtc/src/main/java/com/dds/webrtclib/VideoProfile.java new file mode 100644 index 00000000..2c279081 --- /dev/null +++ b/libskywebrtc/src/main/java/com/dds/webrtclib/VideoProfile.java @@ -0,0 +1,105 @@ +package com.dds.webrtclib; + +/** + * Created by dds on 2019/7/24. + * android_shuai@163.com + */ +public class VideoProfile { + public static final int VP120P = 0; + public static final int VP120P_3 = 2; + public static final int VP180P = 10; + public static final int VP180P_3 = 12; + public static final int VP180P_4 = 13; + public static final int VP240P = 20; + public static final int VP240P_3 = 22; + public static final int VP240P_4 = 23; + public static final int VP360P = 30; + public static final int VP360P_3 = 32; + public static final int VP360P_4 = 33; + public static final int VP360P_6 = 35; + public static final int VP360P_7 = 36; + public static final int VP360P_8 = 37; + public static final int VP480P = 40; + public static final int VP480P_3 = 42; + public static final int VP480P_4 = 43; + public static final int VP480P_6 = 45; + public static final int VP480P_8 = 47; + public static final int VP480P_9 = 48; + public static final int VP720P = 50; + public static final int VP720P_3 = 52; + public static final int VP720P_5 = 54; + public static final int VP720P_6 = 55; + public static final int VPDEFAULT = 30; + public int width; + public int height; + public int fps; + public int bitrate; + + public VideoProfile(int width, int height, int bitrate, int fps, boolean var5) { + if (var5) { + this.height = width; + this.height = width; + } else { + this.width = width; + this.height = height; + } + + this.bitrate = bitrate; + this.fps = fps; + } + + public static VideoProfile getVideoProfile(int var0, boolean var1) { + switch (var0) { + case 0: + return new VideoProfile(160, 120, 15, 120, var1); + case 2: + return new VideoProfile(120, 120, 15, 100, var1); + case 10: + return new VideoProfile(320, 180, 15, 280, var1); + case 12: + return new VideoProfile(180, 180, 15, 200, var1); + case 13: + return new VideoProfile(240, 180, 15, 240, var1); + case 20: + return new VideoProfile(320, 240, 15, 360, var1); + case 22: + return new VideoProfile(240, 240, 15, 240, var1); + case 23: + return new VideoProfile(424, 240, 15, 400, var1); + case 30: + return new VideoProfile(640, 360, 15, 800, var1); + case 32: + return new VideoProfile(360, 360, 15, 520, var1); + case 33: + return new VideoProfile(640, 360, 30, 1200, var1); + case 35: + return new VideoProfile(360, 360, 30, 780, var1); + case 36: + return new VideoProfile(480, 360, 15, 1000, var1); + case 37: + return new VideoProfile(480, 360, 30, 1500, var1); + case 40: + return new VideoProfile(640, 480, 15, 1000, var1); + case 42: + return new VideoProfile(480, 480, 15, 800, var1); + case 43: + return new VideoProfile(640, 480, 30, 1500, var1); + case 45: + return new VideoProfile(480, 480, 30, 1200, var1); + case 47: + return new VideoProfile(848, 480, 15, 1200, var1); + case 48: + return new VideoProfile(848, 480, 30, 1800, var1); + case 50: + return new VideoProfile(1280, 720, 15, 2400, var1); + case 52: + return new VideoProfile(1280, 720, 30, 3600, var1); + case 54: + return new VideoProfile(960, 720, 15, 1920, var1); + case 55: + return new VideoProfile(960, 720, 30, 2880, var1); + default: + return getVideoProfile(VPDEFAULT, var1); + } + } +}