HTML5VideoInline.java revision fdd646b2b105e23cdc8517ac055448340a667e37
110ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 210ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhupackage android.webkit; 310ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 4fb2fd5f52c3de68ea8395eb0b5e5543e8ab26763Teng-Hui Zhuimport android.Manifest.permission; 5fb2fd5f52c3de68ea8395eb0b5e5543e8ab26763Teng-Hui Zhuimport android.content.pm.PackageManager; 610ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhuimport android.graphics.SurfaceTexture; 710ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhuimport android.media.MediaPlayer; 810ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhuimport android.webkit.HTML5VideoView; 910ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhuimport android.webkit.HTML5VideoViewProxy; 10fd8feeef498be4adf4830b8f39d55a2653ecc21bJamie Gennisimport android.view.Surface; 1110ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhuimport android.opengl.GLES20; 12690ad5409000ba8a40046e29516cfd4c7612b320Teng-Hui Zhuimport android.os.PowerManager; 1310ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 1410ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu/** 1510ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu * @hide This is only used by the browser 1610ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu */ 1710ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhupublic class HTML5VideoInline extends HTML5VideoView{ 1810ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 193fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu // Due to the fact that the decoder consume a lot of memory, we make the 203fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu // surface texture as singleton. But the GL texture (m_textureNames) 213fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu // associated with the surface texture can be used for showing the screen 223fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu // shot when paused, so they are not singleton. 2310ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu private static SurfaceTexture mSurfaceTexture = null; 243fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu private int[] mTextureNames; 253fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu // Every time when the VideoLayer Id change, we need to recreate the 263fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu // SurfaceTexture in order to delete the old video's decoder memory. 273fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu private static int mVideoLayerUsingSurfaceTexture = -1; 2810ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 2910ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu // Video control FUNCTIONS: 3010ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu @Override 3110ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu public void start() { 32158fbdb29b8fdda57f942ec2056d908714c326beTeng-Hui Zhu if (!getPauseDuringPreparing()) { 33158fbdb29b8fdda57f942ec2056d908714c326beTeng-Hui Zhu super.start(); 34158fbdb29b8fdda57f942ec2056d908714c326beTeng-Hui Zhu } 3510ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu } 3610ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 37e4c89e321c7a33a7baf1a90237d21220d637e966Teng-Hui Zhu HTML5VideoInline(int videoLayerId, int position) { 38e4c89e321c7a33a7baf1a90237d21220d637e966Teng-Hui Zhu init(videoLayerId, position); 393fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu mTextureNames = null; 4010ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu } 4110ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 4210ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu @Override 4310ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu public void decideDisplayMode() { 44fd8feeef498be4adf4830b8f39d55a2653ecc21bJamie Gennis SurfaceTexture surfaceTexture = getSurfaceTexture(getVideoLayerId()); 45fd8feeef498be4adf4830b8f39d55a2653ecc21bJamie Gennis Surface surface = new Surface(surfaceTexture); 46fd8feeef498be4adf4830b8f39d55a2653ecc21bJamie Gennis mPlayer.setSurface(surface); 47fd8feeef498be4adf4830b8f39d55a2653ecc21bJamie Gennis surface.release(); 4810ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu } 4910ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 5010ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu // Normally called immediately after setVideoURI. But for full screen, 5110ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu // this should be after surface holder created 5210ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu @Override 5310ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu public void prepareDataAndDisplayMode(HTML5VideoViewProxy proxy) { 5410ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu super.prepareDataAndDisplayMode(proxy); 5510ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu setFrameAvailableListener(proxy); 56fb2fd5f52c3de68ea8395eb0b5e5543e8ab26763Teng-Hui Zhu // TODO: This is a workaround, after b/5375681 fixed, we should switch 57fb2fd5f52c3de68ea8395eb0b5e5543e8ab26763Teng-Hui Zhu // to the better way. 58fb2fd5f52c3de68ea8395eb0b5e5543e8ab26763Teng-Hui Zhu if (mProxy.getContext().checkCallingOrSelfPermission(permission.WAKE_LOCK) 59fb2fd5f52c3de68ea8395eb0b5e5543e8ab26763Teng-Hui Zhu == PackageManager.PERMISSION_GRANTED) { 60fb2fd5f52c3de68ea8395eb0b5e5543e8ab26763Teng-Hui Zhu mPlayer.setWakeMode(proxy.getContext(), PowerManager.FULL_WAKE_LOCK); 61fb2fd5f52c3de68ea8395eb0b5e5543e8ab26763Teng-Hui Zhu } 6210ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu } 6310ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 6410ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu // Pause the play and update the play/pause button 6510ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu @Override 6610ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu public void pauseAndDispatch(HTML5VideoViewProxy proxy) { 6710ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu super.pauseAndDispatch(proxy); 6810ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu } 6910ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 7010ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu // Inline Video specific FUNCTIONS: 7110ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 7210ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu @Override 733fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu public SurfaceTexture getSurfaceTexture(int videoLayerId) { 743fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu // Create the surface texture. 753fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu if (videoLayerId != mVideoLayerUsingSurfaceTexture 761f5467338115c7e5ad1cfa54c362be86028bd6eaTeng-Hui Zhu || mSurfaceTexture == null 771f5467338115c7e5ad1cfa54c362be86028bd6eaTeng-Hui Zhu || mTextureNames == null) { 781f5467338115c7e5ad1cfa54c362be86028bd6eaTeng-Hui Zhu if (mTextureNames != null) { 791f5467338115c7e5ad1cfa54c362be86028bd6eaTeng-Hui Zhu GLES20.glDeleteTextures(1, mTextureNames, 0); 803fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu } 811f5467338115c7e5ad1cfa54c362be86028bd6eaTeng-Hui Zhu mTextureNames = new int[1]; 821f5467338115c7e5ad1cfa54c362be86028bd6eaTeng-Hui Zhu GLES20.glGenTextures(1, mTextureNames, 0); 833fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu mSurfaceTexture = new SurfaceTexture(mTextureNames[0]); 843fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu } 853fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu mVideoLayerUsingSurfaceTexture = videoLayerId; 8610ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu return mSurfaceTexture; 8710ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu } 8810ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 893fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu public boolean surfaceTextureDeleted() { 903fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu return (mSurfaceTexture == null); 913fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu } 923fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu 9310ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu @Override 9410ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu public void deleteSurfaceTexture() { 95fdd646b2b105e23cdc8517ac055448340a667e37Teng-Hui Zhu cleanupSurfaceTexture(); 96fdd646b2b105e23cdc8517ac055448340a667e37Teng-Hui Zhu return; 97fdd646b2b105e23cdc8517ac055448340a667e37Teng-Hui Zhu } 98fdd646b2b105e23cdc8517ac055448340a667e37Teng-Hui Zhu 99fdd646b2b105e23cdc8517ac055448340a667e37Teng-Hui Zhu public static void cleanupSurfaceTexture() { 10010ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu mSurfaceTexture = null; 1013fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu mVideoLayerUsingSurfaceTexture = -1; 10210ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu return; 10310ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu } 10410ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 10510ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu @Override 10610ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu public int getTextureName() { 1073fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu if (mTextureNames != null) { 1083fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu return mTextureNames[0]; 1093fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu } else { 1103fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu return 0; 1113fafd39d0776a15c3613795183043a2c28277691Teng-Hui Zhu } 11210ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu } 11310ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 11410ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu private void setFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener l) { 11510ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu mSurfaceTexture.setOnFrameAvailableListener(l); 11610ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu } 11710ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu 11810ab654943b386c0816a33dbd639c3b8d6260b01Teng-Hui Zhu} 119