From 5f38c8d1b8e842652e55410333870acfc5395ea6 Mon Sep 17 00:00:00 2001 From: "glaznev@webrtc.org" Date: Mon, 3 Nov 2014 22:18:52 +0000 Subject: [PATCH] Android AppRTCDemo improvements: - Add a room list to ConnectActivity with buttons to add/remove rooms. - Add loopback call button. - Add option to toggle full screen / letterbox video. - Add camera fps settings. - Fix device to landscape orientation for HD video until issue 3936 will be fixed. - Fix a few crashes by avoiding calling peer connection and GAE signaling function while connection is closing. - Better handling GAE channel error - catch channel exceptions and display dialog with error messages. BUG=3939, 3935 R=kjellander@webrtc.org, pthatcher@webrtc.org, tkchin@webrtc.org Review URL: https://webrtc-codereview.appspot.com/26979004 git-svn-id: http://webrtc.googlecode.com/svn/trunk@7601 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../android/org/webrtc/VideoRendererGui.java | 136 ++++---- .../drawable-hdpi/ic_action_full_screen.png | Bin 0 -> 587 bytes .../ic_action_return_from_full_screen.png | Bin 0 -> 663 bytes .../res/drawable-hdpi/ic_loopback_call.png | Bin 0 -> 1859 bytes .../drawable-ldpi/ic_action_full_screen.png | Bin 0 -> 461 bytes .../ic_action_return_from_full_screen.png | Bin 0 -> 477 bytes .../res/drawable-ldpi/ic_loopback_call.png | Bin 0 -> 1859 bytes .../drawable-mdpi/ic_action_full_screen.png | Bin 0 -> 461 bytes .../ic_action_return_from_full_screen.png | Bin 0 -> 477 bytes .../res/drawable-mdpi/ic_loopback_call.png | Bin 0 -> 1859 bytes .../drawable-xhdpi/ic_action_full_screen.png | Bin 0 -> 743 bytes .../ic_action_return_from_full_screen.png | Bin 0 -> 761 bytes .../res/drawable-xhdpi/ic_loopback_call.png | Bin 0 -> 1859 bytes .../android/res/layout/activity_connect.xml | 67 ++-- .../android/res/layout/fragment_menubar.xml | 10 + talk/examples/android/res/values/arrays.xml | 7 + talk/examples/android/res/values/strings.xml | 15 +- talk/examples/android/res/xml/preferences.xml | 8 + .../src/org/appspot/apprtc/AppRTCClient.java | 4 +- .../appspot/apprtc/AppRTCDemoActivity.java | 184 ++++++---- .../org/appspot/apprtc/ConnectActivity.java | 210 +++++++++--- .../org/appspot/apprtc/GAEChannelClient.java | 82 ++--- .../src/org/appspot/apprtc/GAERTCClient.java | 151 ++++----- .../appspot/apprtc/PeerConnectionClient.java | 317 +++++++++++------- .../org/appspot/apprtc/SettingsActivity.java | 6 +- talk/libjingle_examples.gyp | 20 +- 26 files changed, 766 insertions(+), 451 deletions(-) create mode 100644 talk/examples/android/res/drawable-hdpi/ic_action_full_screen.png create mode 100644 talk/examples/android/res/drawable-hdpi/ic_action_return_from_full_screen.png create mode 100644 talk/examples/android/res/drawable-hdpi/ic_loopback_call.png create mode 100644 talk/examples/android/res/drawable-ldpi/ic_action_full_screen.png create mode 100644 talk/examples/android/res/drawable-ldpi/ic_action_return_from_full_screen.png create mode 100644 talk/examples/android/res/drawable-ldpi/ic_loopback_call.png create mode 100644 talk/examples/android/res/drawable-mdpi/ic_action_full_screen.png create mode 100644 talk/examples/android/res/drawable-mdpi/ic_action_return_from_full_screen.png create mode 100644 talk/examples/android/res/drawable-mdpi/ic_loopback_call.png create mode 100644 talk/examples/android/res/drawable-xhdpi/ic_action_full_screen.png create mode 100644 talk/examples/android/res/drawable-xhdpi/ic_action_return_from_full_screen.png create mode 100644 talk/examples/android/res/drawable-xhdpi/ic_loopback_call.png diff --git a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java index acaa31e785..dd1692cf0f 100644 --- a/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java +++ b/talk/app/webrtc/java/android/org/webrtc/VideoRendererGui.java @@ -253,6 +253,8 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { private FloatBuffer textureCoords; // Flag if texture vertices or coordinates update is needed. private boolean updateTextureProperties; + // Texture properties update lock. + private final Object updateTextureLock = new Object(); // Viewport dimensions. private int screenWidth; private int screenHeight; @@ -319,64 +321,68 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { scalingType == ScalingType.SCALE_FILL) { return; } - // Re - calculate texture vertices to preserve video aspect ratio. - float texRight = this.texRight; - float texLeft = this.texLeft; - float texTop = this.texTop; - float texBottom = this.texBottom; - float texOffsetU = 0; - float texOffsetV = 0; - float displayWidth = (texRight - texLeft) * screenWidth / 2; - float displayHeight = (texTop - texBottom) * screenHeight / 2; - Log.d(TAG, "ID: " + id + ". Display: " + displayWidth + - " x " + displayHeight + ". Video: " + videoWidth + - " x " + videoHeight); - if (displayWidth > 1 && displayHeight > 1 && - videoWidth > 1 && videoHeight > 1) { - float displayAspectRatio = displayWidth / displayHeight; - float videoAspectRatio = (float)videoWidth / videoHeight; - if (scalingType == ScalingType.SCALE_ASPECT_FIT) { - // Need to re-adjust vertices width or height to match video AR. - if (displayAspectRatio > videoAspectRatio) { - float deltaX = (displayWidth - videoAspectRatio * displayHeight) / - instance.screenWidth; - texRight -= deltaX; - texLeft += deltaX; - } else { - float deltaY = (displayHeight - displayWidth / videoAspectRatio) / - instance.screenHeight; - texTop -= deltaY; - texBottom += deltaY; + synchronized(updateTextureLock) { + // Re - calculate texture vertices to preserve video aspect ratio. + float texRight = this.texRight; + float texLeft = this.texLeft; + float texTop = this.texTop; + float texBottom = this.texBottom; + float texOffsetU = 0; + float texOffsetV = 0; + float displayWidth = (texRight - texLeft) * screenWidth / 2; + float displayHeight = (texTop - texBottom) * screenHeight / 2; + Log.d(TAG, "ID: " + id + ". Display: " + displayWidth + + " x " + displayHeight + ". Video: " + videoWidth + + " x " + videoHeight); + if (displayWidth > 1 && displayHeight > 1 && + videoWidth > 1 && videoHeight > 1) { + float displayAspectRatio = displayWidth / displayHeight; + float videoAspectRatio = (float)videoWidth / videoHeight; + if (scalingType == ScalingType.SCALE_ASPECT_FIT) { + // Need to re-adjust vertices width or height to match video AR. + if (displayAspectRatio > videoAspectRatio) { + float deltaX = (displayWidth - videoAspectRatio * displayHeight) / + instance.screenWidth; + texRight -= deltaX; + texLeft += deltaX; + } else { + float deltaY = (displayHeight - displayWidth / videoAspectRatio) / + instance.screenHeight; + texTop -= deltaY; + texBottom += deltaY; + } } - } - if (scalingType == ScalingType.SCALE_ASPECT_FILL) { - // Need to re-adjust UV coordinates to match display AR. - if (displayAspectRatio > videoAspectRatio) { - texOffsetV = (1.0f - videoAspectRatio / displayAspectRatio) / 2.0f; - } else { - texOffsetU = (1.0f - displayAspectRatio / videoAspectRatio) / 2.0f; + if (scalingType == ScalingType.SCALE_ASPECT_FILL) { + // Need to re-adjust UV coordinates to match display AR. + if (displayAspectRatio > videoAspectRatio) { + texOffsetV = (1.0f - videoAspectRatio / displayAspectRatio) / + 2.0f; + } else { + texOffsetU = (1.0f - displayAspectRatio / videoAspectRatio) / + 2.0f; + } } - } - Log.d(TAG, " Texture vertices: (" + texLeft + "," + texBottom + - ") - (" + texRight + "," + texTop + ")"); - float textureVeticesFloat[] = new float[] { - texLeft, texTop, - texLeft, texBottom, - texRight, texTop, - texRight, texBottom - }; - textureVertices = directNativeFloatBuffer(textureVeticesFloat); + Log.d(TAG, " Texture vertices: (" + texLeft + "," + texBottom + + ") - (" + texRight + "," + texTop + ")"); + float textureVeticesFloat[] = new float[] { + texLeft, texTop, + texLeft, texBottom, + texRight, texTop, + texRight, texBottom + }; + textureVertices = directNativeFloatBuffer(textureVeticesFloat); - Log.d(TAG, " Texture UV offsets: " + texOffsetU + ", " + texOffsetV); - float textureCoordinatesFloat[] = new float[] { - texOffsetU, texOffsetV, // left top - texOffsetU, 1.0f - texOffsetV, // left bottom - 1.0f - texOffsetU, texOffsetV, // right top - 1.0f - texOffsetU, 1.0f - texOffsetV // right bottom - }; - textureCoords = directNativeFloatBuffer(textureCoordinatesFloat); + Log.d(TAG, " Texture UV offsets: " + texOffsetU + ", " + texOffsetV); + float textureCoordinatesFloat[] = new float[] { + texOffsetU, texOffsetV, // left top + texOffsetU, 1.0f - texOffsetV, // left bottom + 1.0f - texOffsetU, texOffsetV, // right top + 1.0f - texOffsetU, 1.0f - texOffsetV // right bottom + }; + textureCoords = directNativeFloatBuffer(textureCoordinatesFloat); + } + updateTextureProperties = false; } - updateTextureProperties = false; } private void draw() { @@ -489,19 +495,23 @@ public class VideoRendererGui implements GLSurfaceView.Renderer { } public void setScreenSize(final int screenWidth, final int screenHeight) { - this.screenWidth = screenWidth; - this.screenHeight = screenHeight; - updateTextureProperties = true; + synchronized(updateTextureLock) { + this.screenWidth = screenWidth; + this.screenHeight = screenHeight; + updateTextureProperties = true; + } } public void setPosition(int x, int y, int width, int height, ScalingType scalingType) { - texLeft = (x - 50) / 50.0f; - texTop = (50 - y) / 50.0f; - texRight = Math.min(1.0f, (x + width - 50) / 50.0f); - texBottom = Math.max(-1.0f, (50 - y - height) / 50.0f); - this.scalingType = scalingType; - updateTextureProperties = true; + synchronized(updateTextureLock) { + texLeft = (x - 50) / 50.0f; + texTop = (50 - y) / 50.0f; + texRight = Math.min(1.0f, (x + width - 50) / 50.0f); + texBottom = Math.max(-1.0f, (50 - y - height) / 50.0f); + this.scalingType = scalingType; + updateTextureProperties = true; + } } @Override diff --git a/talk/examples/android/res/drawable-hdpi/ic_action_full_screen.png b/talk/examples/android/res/drawable-hdpi/ic_action_full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..22f30d31ca8e3b1dea9072f43f67afbcaa6e74d7 GIT binary patch literal 587 zcmV-R0<`^!P)?jHnBuJ1T zTb5W-Xxlc|AEjHZ+ar$SuQ?skczgZXJux-jeMmnAY?7gO1Asncv|&=z8VRUpVluX` zxSv~UAB;7LK;1F+1bQ zl7hK^UM$zqjM3`o_Q|ar&@BzUt4rouibM(MmjB9mtH$xJ8)P%G>JVD>CVq7qO{Oe+ z&uM(>BEe%Puh2h$1eACTIK`xmbSj0DSOD5~)m#K7UF^{dy>9}U59b|8cnzUET3&K5 z1c018*Q*3{9v~~Q14FDr09mI3Lqx<*M{eNJkGp&(9Kpw3B|UJh{&_t}kRU;VY+Jqs Z7ywhGh57>;H-7*C002ovPDHLkV1h~e@ZkUe literal 0 HcmV?d00001 diff --git a/talk/examples/android/res/drawable-hdpi/ic_action_return_from_full_screen.png b/talk/examples/android/res/drawable-hdpi/ic_action_return_from_full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..d9436e5248883f7ac916854d836fabea9cb64040 GIT binary patch literal 663 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 literal 0 HcmV?d00001 diff --git a/talk/examples/android/res/drawable-ldpi/ic_action_full_screen.png b/talk/examples/android/res/drawable-ldpi/ic_action_full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a9ff0a8e0130a794cd63f907cc18d3e8d38593 GIT binary patch literal 461 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 literal 0 HcmV?d00001 diff --git a/talk/examples/android/res/drawable-mdpi/ic_action_full_screen.png b/talk/examples/android/res/drawable-mdpi/ic_action_full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a9ff0a8e0130a794cd63f907cc18d3e8d38593 GIT binary patch literal 461 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 literal 0 HcmV?d00001 diff --git a/talk/examples/android/res/drawable-xhdpi/ic_action_full_screen.png b/talk/examples/android/res/drawable-xhdpi/ic_action_full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..6d90c071d5f9b3b339d43e7303eeafc7324500b8 GIT binary patch literal 743 zcmV?P)R$#R1F!%c zplhT9Gy^1KBm2QK1<_#jYUa|FnNC-heaO*v!OfXPBuyncWJu-x@R6UVM zB$6a3-JlGFWGI|W0Tlh6oAmN`TEvi ziI{X7%=Rh0@c^KihG1rhf#CG>K}nF>UY+UbM?+u)&+n;iaCc60_uA-~DBIRTi)_UaBlN?Jfi&!=+rqofjvL?V$$Boc{4f9Xqr Z0RZxLy7e4pk^%q#002ovPDHLkV1oTcMn?bu literal 0 HcmV?d00001 diff --git a/talk/examples/android/res/drawable-xhdpi/ic_action_return_from_full_screen.png b/talk/examples/android/res/drawable-xhdpi/ic_action_return_from_full_screen.png new file mode 100644 index 0000000000000000000000000000000000000000..a773b342089106c0f5b0f7c9bcafd19a1ea0a41a GIT binary patch literal 761 zcmVcxM5`0=&ZlH$d;51=<1V0A&CM;8Mvwg^;$f^HUD_ldRJ8w=@)2M)bGXVLc&5zJLq7X@MaD{y$2wSteP}9An0J zUU&&c0J!%CLxN)b96^9ShpqAGC72M`p=#9710AGnmHTe;0Y69PKCAaj`Ihn(!gw+P z2og+Q^f5ATiF_2N;G0qjuv`u%19Qq)2;-dya3Enx91D_mod_V3upo{FsX3epP)Imf z-kuT1R2+O2TwVx(fVhpg1h&3P@6?m=m~7y~0|u+kXarDGq5R#_=2{FATs>d~g-Rvm zium2aApi={)$06#XCPzd82pMJuULXRFTpT9zvp0peoaRO5x)j$E6K{|*JUCiK@!t_ z3$#+}hCmUNfuUD9-UtSR!3d0)L9ojRHbJl*zr}d2SpY+GrTf!$ck~o@>PdrN$~;1; zFB%}G@!fQtIU2iG49yS~VP$zOH|P`!DHWv5Vk!@~h{u)}rjj##;$kYvZaHlxD}||D zAybhS-iQdRA~6 r<--2p6@$TGFc=I5gTZ*huK)u81gQRI%bw>700000NkvXXu0mjf1bavy literal 0 HcmV?d00001 diff --git a/talk/examples/android/res/drawable-xhdpi/ic_loopback_call.png b/talk/examples/android/res/drawable-xhdpi/ic_loopback_call.png new file mode 100644 index 0000000000000000000000000000000000000000..39311853b36e67569b67a1f31fea06f99720c29b GIT binary patch literal 1859 zcmV-J2fX-+P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^)8 z76u}qY>AEl00zTJL_t(|+U=ZsY!pQt$3Jsa-jQn)L=1-V@PU$Wg%U&%+5q8^7{P$m zs-e^(;G?36i7`hkx_{sw1|&u>Bo-o%6eFMpDgnY%NKUf`0eb@f*=TjAP9mW2!bF8f*=TjAP9ocHqcsEXszpY z%c&G=CU5*&?JZL?#dZM?j9&tTJTBKv5x_mUK9nmc0tgu`K!FI5{((Ix0=VP2Ph|^< z0O=K=Km>3{olj*Ok_iGRkNWF#KDdq%rBt@Gfb_M3pw>Dh0=Q$hPvx5`0=Q$BPvvX( zQxaZ{0YTuLPi4$gO5MDR3!`IU%bWXZ5iZM<<;4vsr6OAEI-h*^nLc`2?dnO`uWqPa z55!&y@Hs-#WVN7=dkUBZ!kmBp2uls%-mEToTd#0AiK04xT|fom%1F(7(@wLp)<3`qEPk@x`v<^_jyGbrTOxag z=?ts^9tR@8j8wXyxi;hf0z3kA2S#`A*!_2as>4+*Ke!x#`z@@Nx^&bTzHG56}^~6L{O4yB!GI3|eY4{&}Fx#P13e z0$<*w=4S)jjPZ{dakr<^0=@-?nY}4kRNKx?2DSj?-<8k7c?Zc~md~NnhXB~}>=q{9 zJ2@7;`e-#%KAD0&eu5SdpT{JK?bl*4G(ih+mnQN3-3DASd#AAIV~&3V3^&J1uvq2V z4UN7vtOf=FJAfHjQMWynG2j7PxF+sgZ2!n#N21$5kHk)nynAG`$oBol_{QZ7-5`$x zw($K9WxRQs=s58lPz($PvJ=>&mo5CDExb8No7DilfekAR;Tw87{4)(QHk;}9tA0; zxoSK1H*lFS1LNFMJ0ID?O9)d!m^%p5+1TK-8+b<%U;=O$=mBgc%xLE(7ItXD(HgQ0 z7y~>3+yi`_AZFE^;d4d+x$}n4W6$wDtUtV-V`q;sYQ?DQB9G}irhd&YEY4-N1doSA=;q`4(W&fJG7TG_c*& zp8w2t2k;CQPj(1&SO^dZ1gI*iV$Jk5jPF05oGv+ZP#wtWlEb+E<5)d?HM`4p_tWp_ zF%CJt1iWTkw=2L2U=c7e=Fg{==1t%Y;3)8~iBkbQ?{ME5i@Byd*#Mj}*FJANzez4^ z_XjY}xbNM7&A!eWYOU*W|KV1hQYx=i&TO`kxu8TWOlHzeYh96Pb3wiepp;rka#P7~ zX{`%H0B?CU$@m*(j@0|HpfbtN(`z&3%eY%5Ku~LaP8MpUSA?l4EYzqF%Xurp#uP*- z5zBeo71fIf=@lWA;<_;r!9x+|r&9#2b*@>}S)#Sh%~TO8Qxsvb2Q4t(Bim`j2xgiH zsV;Bbn2NC+jIR@jQK7XixD~BKrCER=(N929`S_|1nC0rTMPq!ES1`rAA~b!3T&I-U zl*tcijhu6{sM}@D&)jDe4-8c4)Fqj|-7i8SLKF4zGpRls-;-9*YL=;*zPyms7yab| zJIw%{Yh2b=KcCd9)(IOC@@U!T=u?6EwqX2LCx8(lVp>A`@G{z(0F5FjrKXYGD@_r= z2O%neX~qW^0n#MGCZHewt-uihTy{x?MBgt*M1b@OvBY>uyF`HWiE!MshH3csqYx3m z<=BvCJf(;TkiM~@!VJ=FQiyi(&$zZMM7#QFUz`xLXvZt;+YDxwwbF<80iL|0Rv9Kn z0q_{n-=TRim!Ivhsz(HHAx6*$G1iDtkmMzr)-#9zp0(cc?1wvb$!FEWV`ovB@@ xlsYa}69hpJ1VIo4K@bE%5ClOG1VL!!{0~l11xCL;8Gir(002ovPDHLkV1hhsO#A=< literal 0 HcmV?d00001 diff --git a/talk/examples/android/res/layout/activity_connect.xml b/talk/examples/android/res/layout/activity_connect.xml index 2d6f6f8adc..5ca0f191b1 100644 --- a/talk/examples/android/res/layout/activity_connect.xml +++ b/talk/examples/android/res/layout/activity_connect.xml @@ -7,37 +7,66 @@ android:weightSum="1" android:layout_margin="8dp" android:layout_centerHorizontal="true"> + + + + + + + + android:layout_margin="5dp" + android:text="@string/room_description"/> + android:imeOptions="actionDone"/> - + -