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