[Change]
开始USB摄像头的功能集成,还无法获取usb连接广播需要调试
Signed-off-by: donghongyu <donghongyu@zhidaoauto.com>
(cherry picked from commit b10306fc45)
This commit is contained in:
@@ -0,0 +1,248 @@
|
||||
package com.serenegiant.glutils;
|
||||
/*
|
||||
* libcommon
|
||||
* utility/helper classes for myself
|
||||
*
|
||||
* Copyright (c) 2014-2018 saki t_saki@serenegiant.com
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
import android.graphics.SurfaceTexture;
|
||||
import android.util.Log;
|
||||
import android.view.Surface;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
|
||||
/**
|
||||
* OpenGL|ESでのSurfaceへの描画処理をDelegaterを介して行うためのIRenderer
|
||||
*/
|
||||
public class DumbRenderer implements IRenderer {
|
||||
// private static final boolean DEBUG = BuildConfig.DEBUG && false;
|
||||
private static final String TAG = DumbRenderer.class.getSimpleName();
|
||||
|
||||
public interface RendererDelegater {
|
||||
public void onStart(final EGLBase eglBase);
|
||||
public void onStop(final EGLBase eglBase);
|
||||
public void onSetSurface(final EGLBase eglBase, final Object surface);
|
||||
public void onResize(final EGLBase eglBase, final int width, final int height);
|
||||
/**
|
||||
* 描画実行
|
||||
* @param eglBase
|
||||
* @param args #requestRenderの引数
|
||||
*/
|
||||
public void onDraw(final EGLBase eglBase, final Object... args);
|
||||
public void onMirror(final EGLBase eglBase, final int mirror);
|
||||
}
|
||||
|
||||
/** レンダリングスレッドの排他制御用オブジェクト */
|
||||
private final Object mSync = new Object();
|
||||
private RendererTask mRendererTask;
|
||||
@MirrorMode
|
||||
private int mMirror = MIRROR_NORMAL;
|
||||
|
||||
public DumbRenderer(final EGLBase.IContext sharedContext,
|
||||
final int flags, final RendererDelegater delegater) {
|
||||
|
||||
this(3, sharedContext, flags, delegater);
|
||||
}
|
||||
|
||||
public DumbRenderer(final int maxClientVersion,
|
||||
final EGLBase.IContext sharedContext,
|
||||
final int flags, final RendererDelegater delegater) {
|
||||
|
||||
mRendererTask = new RendererTask(maxClientVersion, sharedContext, flags, delegater);
|
||||
new Thread(mRendererTask, TAG).start();
|
||||
if (!mRendererTask.waitReady()) {
|
||||
// 初期化に失敗した時
|
||||
throw new RuntimeException("failed to start renderer thread");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void release() {
|
||||
synchronized (mSync) {
|
||||
if (mRendererTask != null) {
|
||||
// 描画タスクを開放
|
||||
mRendererTask.release();
|
||||
mRendererTask = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSurface(final Surface surface) {
|
||||
synchronized (mSync) {
|
||||
if (mRendererTask != null) {
|
||||
mRendererTask.offer(REQUEST_SET_SURFACE, surface);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setSurface(final SurfaceTexture surface) {
|
||||
synchronized (mSync) {
|
||||
if (mRendererTask != null) {
|
||||
mRendererTask.offer(REQUEST_SET_SURFACE, surface);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setMirror(@MirrorMode final int mirror) {
|
||||
synchronized (mSync) {
|
||||
if (mMirror != mirror) {
|
||||
mMirror = mirror;
|
||||
if (mRendererTask != null) {
|
||||
mRendererTask.offer(REQUEST_MIRROR, mirror % 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@MirrorMode
|
||||
public int getMirror() {
|
||||
return mMirror;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void resize(final int width, final int height) {
|
||||
synchronized (mSync) {
|
||||
if (mRendererTask != null) {
|
||||
mRendererTask.offer(REQUEST_RESIZE, width, height);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void requestRender(final Object... args) {
|
||||
synchronized (mSync) {
|
||||
if (mRendererTask != null) {
|
||||
mRendererTask.offer(REQUEST_DRAW, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static final int REQUEST_SET_SURFACE = 1;
|
||||
private static final int REQUEST_DRAW = 2;
|
||||
private static final int REQUEST_RESIZE = 3;
|
||||
private static final int REQUEST_MIRROR = 4;
|
||||
|
||||
private static class RendererTask extends EglTask {
|
||||
private final RendererDelegater mDelegater;
|
||||
/** 最後にレンダリングしたフレームサイズ, 0ならまで一度も描画されていない */
|
||||
private int frameWidth, frameHeight, frameRotation;
|
||||
/** 描画先Surfaceのサイズ */
|
||||
private int surfaceWidth, surfaceHeight;
|
||||
/** 映像を左右反転させるかどうか */
|
||||
private boolean mirror;
|
||||
|
||||
public RendererTask(final EGLBase.IContext sharedContext,
|
||||
final int flags, @NonNull final RendererDelegater delegater) {
|
||||
|
||||
this(3, sharedContext, flags, delegater);
|
||||
}
|
||||
|
||||
public RendererTask(final int maxClientVersion,
|
||||
final EGLBase.IContext sharedContext,
|
||||
final int flags, @NonNull final RendererDelegater delegater) {
|
||||
|
||||
super(maxClientVersion, sharedContext, flags);
|
||||
mDelegater = delegater;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart() {
|
||||
makeCurrent();
|
||||
try {
|
||||
mDelegater.onStart(getEgl());
|
||||
} catch (final Exception e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop() {
|
||||
makeCurrent();
|
||||
try {
|
||||
mDelegater.onStop(getEgl());
|
||||
} catch (final Exception e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Object processRequest(final int request,
|
||||
final int arg1, final int arg2, final Object obj) throws TaskBreak {
|
||||
|
||||
switch (request) {
|
||||
case REQUEST_SET_SURFACE:
|
||||
handleSetSurface(obj);
|
||||
break;
|
||||
case REQUEST_DRAW:
|
||||
handleDraw(obj);
|
||||
break;
|
||||
case REQUEST_RESIZE:
|
||||
handleResize(arg1, arg2);
|
||||
break;
|
||||
case REQUEST_MIRROR:
|
||||
handleMirror(arg1);
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void handleSetSurface(final Object surface) {
|
||||
makeCurrent();
|
||||
try {
|
||||
mDelegater.onSetSurface(getEgl(), surface);
|
||||
} catch (final Exception e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleResize(final int width, final int height) {
|
||||
if ((surfaceWidth != width) || (surfaceHeight != height)) {
|
||||
surfaceWidth = width;
|
||||
surfaceHeight = height;
|
||||
makeCurrent();
|
||||
try {
|
||||
mDelegater.onResize(getEgl(), width, height);
|
||||
} catch (final Exception e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
handleDraw();
|
||||
}
|
||||
}
|
||||
|
||||
private void handleDraw(final Object... args) {
|
||||
makeCurrent();
|
||||
try {
|
||||
mDelegater.onDraw(getEgl(), args);
|
||||
} catch (final Exception e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
|
||||
private void handleMirror(final int mirror) {
|
||||
makeCurrent();
|
||||
try {
|
||||
mDelegater.onMirror(getEgl(), mirror);
|
||||
} catch (final Exception e) {
|
||||
Log.w(TAG, e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user