1 /*
2  * Copyright (C) 2014 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.media.cts;
18 
19 import java.util.concurrent.Semaphore;
20 import java.util.concurrent.TimeUnit;
21 
22 import android.content.Context;
23 import android.graphics.SurfaceTexture;
24 import android.util.AttributeSet;
25 import android.util.Log;
26 import android.view.Surface;
27 import android.view.TextureView;
28 
29 public class CompositionTextureView extends TextureView
30     implements TextureView.SurfaceTextureListener {
31     private static final String TAG = "CompositionTextureView";
32     private static final boolean DBG = true;
33     private static final boolean DBG_VERBOSE = false;
34 
35     private final Semaphore mInitWaitSemaphore = new Semaphore(0);
36     private Surface mSurface;
37 
CompositionTextureView(Context context)38     public CompositionTextureView(Context context) {
39         super(context);
40         if (DBG) {
41             Log.i(TAG, "CompositionTextureView");
42         }
43     }
44 
CompositionTextureView(Context context, AttributeSet attrs)45     public CompositionTextureView(Context context, AttributeSet attrs) {
46         super(context, attrs);
47         if (DBG) {
48             Log.i(TAG, "CompositionTextureView");
49         }
50     }
51 
CompositionTextureView(Context context, AttributeSet attrs, int defStyle)52     public CompositionTextureView(Context context, AttributeSet attrs, int defStyle) {
53         super(context, attrs, defStyle);
54         if (DBG) {
55             Log.i(TAG, "CompositionTextureView");
56         }
57     }
58 
startListening()59     public void startListening() {
60         if (DBG) {
61             Log.i(TAG, "startListening");
62         }
63         setSurfaceTextureListener(this);
64     }
65 
66     @Override
onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2)67     public void onSurfaceTextureAvailable(SurfaceTexture arg0, int arg1, int arg2) {
68         if (DBG) {
69             Log.i(TAG, "onSurfaceTextureAvailable");
70         }
71         recreateSurface(arg0);
72         mInitWaitSemaphore.release();
73     }
74 
75     @Override
onSurfaceTextureDestroyed(SurfaceTexture arg0)76     public boolean onSurfaceTextureDestroyed(SurfaceTexture arg0) {
77         if (DBG) {
78             Log.i(TAG, "onSurfaceTextureDestroyed");
79         }
80         return true;
81     }
82 
83     @Override
onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1, int arg2)84     public void onSurfaceTextureSizeChanged(SurfaceTexture arg0, int arg1, int arg2) {
85         if (DBG) {
86             Log.i(TAG, "onSurfaceTextureSizeChanged");
87         }
88         recreateSurface(arg0);
89         mInitWaitSemaphore.release();
90     }
91 
92     @Override
onSurfaceTextureUpdated(SurfaceTexture arg0)93     public void onSurfaceTextureUpdated(SurfaceTexture arg0) {
94         if (DBG_VERBOSE) {
95             Log.i(TAG, "onSurfaceTextureUpdated");
96         }
97         //ignore
98     }
99 
waitForSurfaceReady(long timeoutMs)100     public boolean waitForSurfaceReady(long timeoutMs) throws Exception {
101         if (isSurfaceTextureAvailable()) {
102             return true;
103         }
104         if (mInitWaitSemaphore.tryAcquire(timeoutMs, TimeUnit.MILLISECONDS)) {
105             return true;
106         }
107         return isSurfaceTextureAvailable();
108     }
109 
isSurfaceTextureAvailable()110     private boolean isSurfaceTextureAvailable() {
111         SurfaceTexture surfaceTexture = getSurfaceTexture();
112         if (mSurface == null && surfaceTexture != null) {
113             recreateSurface(surfaceTexture);
114         }
115         return (mSurface != null);
116     }
117 
recreateSurface(SurfaceTexture surfaceTexture)118     private synchronized void recreateSurface(SurfaceTexture surfaceTexture) {
119         if (mSurface != null) {
120             mSurface.release();
121         }
122         mSurface = new Surface(surfaceTexture);
123     }
124 
getSurface()125     public Surface getSurface() {
126         return mSurface;
127     }
128 
129 }
130