1 2 package android.webkit; 3 4 import android.Manifest.permission; 5 import android.content.pm.PackageManager; 6 import android.graphics.SurfaceTexture; 7 import android.media.MediaPlayer; 8 import android.webkit.HTML5VideoView; 9 import android.webkit.HTML5VideoViewProxy; 10 import android.view.Surface; 11 import android.opengl.GLES20; 12 import android.os.PowerManager; 13 14 /** 15 * @hide This is only used by the browser 16 */ 17 public class HTML5VideoInline extends HTML5VideoView{ 18 19 // Due to the fact that the decoder consume a lot of memory, we make the 20 // surface texture as singleton. But the GL texture (m_textureNames) 21 // associated with the surface texture can be used for showing the screen 22 // shot when paused, so they are not singleton. 23 private static SurfaceTexture mSurfaceTexture = null; 24 private int[] mTextureNames; 25 // Every time when the VideoLayer Id change, we need to recreate the 26 // SurfaceTexture in order to delete the old video's decoder memory. 27 private static int mVideoLayerUsingSurfaceTexture = -1; 28 29 // Video control FUNCTIONS: 30 @Override 31 public void start() { 32 if (!getPauseDuringPreparing()) { 33 super.start(); 34 } 35 } 36 37 HTML5VideoInline(int videoLayerId, int position, 38 boolean autoStart) { 39 init(videoLayerId, position, autoStart); 40 mTextureNames = null; 41 } 42 43 @Override 44 public void decideDisplayMode() { 45 SurfaceTexture surfaceTexture = getSurfaceTexture(getVideoLayerId()); 46 Surface surface = new Surface(surfaceTexture); 47 mPlayer.setSurface(surface); 48 surface.release(); 49 } 50 51 // Normally called immediately after setVideoURI. But for full screen, 52 // this should be after surface holder created 53 @Override 54 public void prepareDataAndDisplayMode(HTML5VideoViewProxy proxy) { 55 super.prepareDataAndDisplayMode(proxy); 56 setFrameAvailableListener(proxy); 57 // TODO: This is a workaround, after b/5375681 fixed, we should switch 58 // to the better way. 59 if (mProxy.getContext().checkCallingOrSelfPermission(permission.WAKE_LOCK) 60 == PackageManager.PERMISSION_GRANTED) { 61 mPlayer.setWakeMode(proxy.getContext(), PowerManager.FULL_WAKE_LOCK); 62 } 63 } 64 65 // Pause the play and update the play/pause button 66 @Override 67 public void pauseAndDispatch(HTML5VideoViewProxy proxy) { 68 super.pauseAndDispatch(proxy); 69 } 70 71 // Inline Video specific FUNCTIONS: 72 73 @Override 74 public SurfaceTexture getSurfaceTexture(int videoLayerId) { 75 // Create the surface texture. 76 if (videoLayerId != mVideoLayerUsingSurfaceTexture 77 || mSurfaceTexture == null 78 || mTextureNames == null) { 79 if (mTextureNames != null) { 80 GLES20.glDeleteTextures(1, mTextureNames, 0); 81 } 82 mTextureNames = new int[1]; 83 GLES20.glGenTextures(1, mTextureNames, 0); 84 mSurfaceTexture = new SurfaceTexture(mTextureNames[0]); 85 } 86 mVideoLayerUsingSurfaceTexture = videoLayerId; 87 return mSurfaceTexture; 88 } 89 90 public boolean surfaceTextureDeleted() { 91 return (mSurfaceTexture == null); 92 } 93 94 @Override 95 public void deleteSurfaceTexture() { 96 mSurfaceTexture = null; 97 mVideoLayerUsingSurfaceTexture = -1; 98 return; 99 } 100 101 @Override 102 public int getTextureName() { 103 if (mTextureNames != null) { 104 return mTextureNames[0]; 105 } else { 106 return 0; 107 } 108 } 109 110 private void setFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener l) { 111 mSurfaceTexture.setOnFrameAvailableListener(l); 112 } 113 114 } 115