• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.webkit;
18 
19 import android.Manifest.permission;
20 import android.content.pm.PackageManager;
21 import android.graphics.SurfaceTexture;
22 import android.webkit.HTML5VideoView;
23 import android.webkit.HTML5VideoViewProxy;
24 import android.view.Surface;
25 import android.opengl.GLES20;
26 import android.os.PowerManager;
27 
28 /**
29  * @hide This is only used by the browser
30  */
31 public class HTML5VideoInline extends HTML5VideoView{
32 
33     // Due to the fact that the decoder consume a lot of memory, we make the
34     // surface texture as singleton. But the GL texture (m_textureNames)
35     // associated with the surface texture can be used for showing the screen
36     // shot when paused, so they are not singleton.
37     private static SurfaceTexture mSurfaceTexture = null;
38     private static int[] mTextureNames = null;
39     // Every time when the VideoLayer Id change, we need to recreate the
40     // SurfaceTexture in order to delete the old video's decoder memory.
41     private static int mVideoLayerUsingSurfaceTexture = -1;
42 
43     // Video control FUNCTIONS:
44     @Override
start()45     public void start() {
46         if (!getPauseDuringPreparing()) {
47             super.start();
48         }
49     }
50 
HTML5VideoInline(int videoLayerId, int position, boolean skipPrepare)51     HTML5VideoInline(int videoLayerId, int position, boolean skipPrepare) {
52         init(videoLayerId, position, skipPrepare);
53     }
54 
55     @Override
decideDisplayMode()56     public void decideDisplayMode() {
57         SurfaceTexture surfaceTexture = getSurfaceTexture(getVideoLayerId());
58         Surface surface = new Surface(surfaceTexture);
59         mPlayer.setSurface(surface);
60         surface.release();
61     }
62 
63     // Normally called immediately after setVideoURI. But for full screen,
64     // this should be after surface holder created
65     @Override
prepareDataAndDisplayMode(HTML5VideoViewProxy proxy)66     public void prepareDataAndDisplayMode(HTML5VideoViewProxy proxy) {
67         super.prepareDataAndDisplayMode(proxy);
68         setFrameAvailableListener(proxy);
69         // TODO: This is a workaround, after b/5375681 fixed, we should switch
70         // to the better way.
71         if (mProxy.getContext().checkCallingOrSelfPermission(permission.WAKE_LOCK)
72                 == PackageManager.PERMISSION_GRANTED) {
73             mPlayer.setWakeMode(proxy.getContext(), PowerManager.FULL_WAKE_LOCK);
74         }
75     }
76 
77     // Pause the play and update the play/pause button
78     @Override
pauseAndDispatch(HTML5VideoViewProxy proxy)79     public void pauseAndDispatch(HTML5VideoViewProxy proxy) {
80         super.pauseAndDispatch(proxy);
81     }
82 
83     // Inline Video specific FUNCTIONS:
84 
getSurfaceTexture(int videoLayerId)85     public static SurfaceTexture getSurfaceTexture(int videoLayerId) {
86         // Create the surface texture.
87         if (videoLayerId != mVideoLayerUsingSurfaceTexture
88             || mSurfaceTexture == null
89             || mTextureNames == null) {
90             // The GL texture will store in the VideoLayerManager at native side.
91             // They will be clean up when requested.
92             // The reason we recreated GL texture name is for screen shot support.
93             mTextureNames = new int[1];
94             GLES20.glGenTextures(1, mTextureNames, 0);
95             mSurfaceTexture = new SurfaceTexture(mTextureNames[0]);
96         }
97         mVideoLayerUsingSurfaceTexture = videoLayerId;
98         return mSurfaceTexture;
99     }
100 
surfaceTextureDeleted()101     public static boolean surfaceTextureDeleted() {
102         return (mSurfaceTexture == null);
103     }
104 
105     @Override
deleteSurfaceTexture()106     public void deleteSurfaceTexture() {
107         cleanupSurfaceTexture();
108         return;
109     }
110 
cleanupSurfaceTexture()111     public static void cleanupSurfaceTexture() {
112         mSurfaceTexture = null;
113         mVideoLayerUsingSurfaceTexture = -1;
114         return;
115     }
116 
117     @Override
getTextureName()118     public int getTextureName() {
119         if (mTextureNames != null) {
120             return mTextureNames[0];
121         } else {
122             return 0;
123         }
124     }
125 
setFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener l)126     private void setFrameAvailableListener(SurfaceTexture.OnFrameAvailableListener l) {
127         if (mSurfaceTexture != null) {
128             mSurfaceTexture.setOnFrameAvailableListener(l);
129         }
130     }
131 
132 }
133