提交 a848b551 编写于 作者: S shuyu

prepare 7.1.0

上级 23356a23
......@@ -189,6 +189,29 @@ ExoSourceManager.setExoMediaSourceInterceptListener(new ExoMediaSourceInterceptL
## 五、近期版本
### 7.1.0(2019-09-01)
* update ExoPlayer to 2.10.4
* 添加沉浸式支持
* 增加 IPlayerInitSuccessListener 播放器初始化成果回调
```
GSYVideoManager
.instance()
.setPlayerInitSuccessListener(new IPlayerInitSuccessListener() {
///播放器初始化成果回调,可用于播放前的自定义设置
@Override
public void onPlayerInitSuccess(IMediaPlayer player, GSYModel model) {
if (player instanceof IjkExo2MediaPlayer) {
((IjkExo2MediaPlayer) player).setTrackSelector(new DefaultTrackSelector());
((IjkExo2MediaPlayer) player).setLoadControl(new DefaultLoadControl());
}
}
});
```
* fix #2142
* 增加硬解码不花屏幕 [RecyclerView3Activity](https://github.com/CarGuo/GSYVideoPlayer/blob/master/app/src/main/java/com/example/gsyvideoplayer/RecyclerView3Activity.java)
### 7.0.2(2019-07-01)
* update ExoPlayer 到 2.10.0
* 增加 allowCrossProtocolRedirects
......
package com.example.gsyvideoplayer;
import android.net.Uri;
import androidx.multidex.MultiDexApplication;
import tv.danmaku.ijk.media.exo2.Exo2PlayerManager;
import tv.danmaku.ijk.media.exo2.ExoMediaSourceInterceptListener;
import tv.danmaku.ijk.media.exo2.ExoSourceManager;
import com.example.gsyvideoplayer.source.CustomSourceTag;
import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.hls.HlsMediaSource;
import tv.danmaku.ijk.media.exo2.Exo2PlayerManager;
import tv.danmaku.ijk.media.exo2.IjkExo2MediaPlayer;
import tv.danmaku.ijk.media.player.IMediaPlayer;
import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.shuyu.gsyvideoplayer.GSYVideoManager;
import com.shuyu.gsyvideoplayer.model.GSYModel;
import com.shuyu.gsyvideoplayer.player.BasePlayerManager;
import com.shuyu.gsyvideoplayer.player.IPlayerInitSuccessListener;
import com.shuyu.gsyvideoplayer.player.PlayerFactory;
import com.shuyu.gsyvideoplayer.utils.GSYVideoType;
import com.shuyu.gsyvideoplayer.utils.Debuger;
import com.squareup.leakcanary.LeakCanary;
import java.io.File;
import static com.google.android.exoplayer2.util.Util.inferContentType;
/**
* Created by shuyu on 2016/11/11.
Created by shuyu on 2016/11/11.
*/
public class GSYApplication extends MultiDexApplication {
......@@ -38,7 +37,7 @@ public class GSYApplication extends MultiDexApplication {
//GSYVideoType.enableMediaCodec();
//GSYVideoType.enableMediaCodecTexture();
//PlayerFactory.setPlayManager(Exo2PlayerManager.class);//EXO模式
PlayerFactory.setPlayManager(Exo2PlayerManager.class);//EXO模式
//ExoSourceManager.setSkipSSLChain(true);
......@@ -70,6 +69,18 @@ public class GSYApplication extends MultiDexApplication {
}
});*/
/*GSYVideoManager.instance().setPlayerInitSuccessListener(new IPlayerInitSuccessListener() {
///播放器初始化成果回调
@Override
public void onPlayerInitSuccess(IMediaPlayer player, GSYModel model) {
if (player instanceof IjkExo2MediaPlayer) {
((IjkExo2MediaPlayer) player).setTrackSelector(new DefaultTrackSelector());
((IjkExo2MediaPlayer) player).setLoadControl(new DefaultLoadControl());
}
}
});*/
}
......
......@@ -8,7 +8,7 @@ import android.view.Surface;
import com.google.android.exoplayer2.video.DummySurface;
import com.shuyu.gsyvideoplayer.cache.ICacheManager;
import com.shuyu.gsyvideoplayer.model.VideoOptionModel;
import com.shuyu.gsyvideoplayer.player.IPlayerManager;
import com.shuyu.gsyvideoplayer.player.BasePlayerManager;
import java.util.List;
......@@ -18,7 +18,7 @@ import tv.danmaku.ijk.media.player.IMediaPlayer;
* Created by guoshuyu on 2018/5/16.
* 自定义player管理器,装载自定义exo player,实现无缝切换效果
*/
public class GSYExoPlayerManager implements IPlayerManager {
public class GSYExoPlayerManager extends BasePlayerManager {
private GSYExo2MediaPlayer mediaPlayer;
......
package com.shuyu.gsyvideoplayer.player;
import com.shuyu.gsyvideoplayer.model.GSYModel;
/**
* 播放器差异管理接口
Created by guoshuyu on 2018/1/11.
*/
public abstract class BasePlayerManager implements IPlayerManager {
protected IPlayerInitSuccessListener mPlayerInitSuccessListener;
public IPlayerInitSuccessListener getPlayerPreparedSuccessListener() {
return mPlayerInitSuccessListener;
}
public void setPlayerInitSuccessListener(IPlayerInitSuccessListener listener) {
this.mPlayerInitSuccessListener = listener;
}
protected void initSuccess(GSYModel gsyModel) {
if (mPlayerInitSuccessListener != null) {
mPlayerInitSuccessListener.onPlayerInitSuccess(getMediaPlayer(), gsyModel);
}
}
}
package com.shuyu.gsyvideoplayer.player;
import com.shuyu.gsyvideoplayer.model.GSYModel;
import tv.danmaku.ijk.media.player.IMediaPlayer;
/**
播放器初始化成果回调
*/
public interface IPlayerInitSuccessListener {
void onPlayerInitSuccess(IMediaPlayer player, GSYModel model);
}
......@@ -4,8 +4,6 @@ import android.content.Context;
import android.media.AudioManager;
import android.net.TrafficStats;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.Surface;
......@@ -16,9 +14,7 @@ import com.google.android.exoplayer2.video.DummySurface;
import com.shuyu.gsyvideoplayer.cache.ICacheManager;
import com.shuyu.gsyvideoplayer.model.GSYModel;
import com.shuyu.gsyvideoplayer.model.VideoOptionModel;
import com.shuyu.gsyvideoplayer.player.IPlayerManager;
import java.text.DecimalFormat;
import com.shuyu.gsyvideoplayer.player.BasePlayerManager;
import java.util.List;
import tv.danmaku.ijk.media.player.IMediaPlayer;
......@@ -28,7 +24,7 @@ import tv.danmaku.ijk.media.player.IMediaPlayer;
* Created by guoshuyu on 2018/1/11.
*/
public class Exo2PlayerManager implements IPlayerManager {
public class Exo2PlayerManager extends BasePlayerManager {
private Context context;
......@@ -76,6 +72,7 @@ public class Exo2PlayerManager implements IPlayerManager {
} catch (Exception e) {
e.printStackTrace();
}
initSuccess(gsyModel);
}
@Override
......
......@@ -5,8 +5,10 @@ import android.content.Context;
import android.net.Uri;
import android.os.Handler;
import android.os.Looper;
import androidx.annotation.Nullable;
import androidx.annotation.Size;
import android.view.Surface;
import android.view.SurfaceHolder;
......@@ -16,6 +18,7 @@ import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlaybackException;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.Format;
import com.google.android.exoplayer2.LoadControl;
import com.google.android.exoplayer2.PlaybackParameters;
import com.google.android.exoplayer2.Player;
import com.google.android.exoplayer2.SeekParameters;
......@@ -28,6 +31,7 @@ import com.google.android.exoplayer2.source.MediaSource;
import com.google.android.exoplayer2.source.MediaSourceEventListener;
import com.google.android.exoplayer2.source.TrackGroupArray;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.google.android.exoplayer2.trackselection.MappingTrackSelector;
import com.google.android.exoplayer2.trackselection.TrackSelectionArray;
import java.io.File;
......@@ -44,8 +48,8 @@ import tv.danmaku.ijk.media.player.misc.IjkTrackInfo;
/**
* Created by guoshuyu on 2018/1/10.
* Exo
Created by guoshuyu on 2018/1/10.
Exo
*/
public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.EventListener, AnalyticsListener {
......@@ -57,9 +61,10 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
protected Context mAppContext;
protected SimpleExoPlayer mInternalPlayer;
protected EventLogger mEventLogger;
protected DefaultRenderersFactory rendererFactory;
protected DefaultRenderersFactory mRendererFactory;
protected MediaSource mMediaSource;
protected DefaultTrackSelector mTrackSelector;
protected MappingTrackSelector mTrackSelector;
protected LoadControl mLoadControl;
protected String mDataSource;
protected Surface mSurface;
protected Map<String, String> mHeaders = new HashMap<>();
......@@ -72,23 +77,23 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
protected boolean isBuffering = false;
protected boolean isLooping = false;
/**
* 是否带上header
是否带上header
*/
protected boolean isPreview = false;
/**
* 是否开启缓存
是否开启缓存
*/
protected boolean isCache = false;
/**
* dataSource等的帮组类
dataSource等的帮组类
*/
protected ExoSourceManager mExoHelper;
/**
* 缓存目录,可以为空
缓存目录,可以为空
*/
protected File mCacheDir;
/**
* 类型覆盖
类型覆盖
*/
private String mOverrideExtension;
......@@ -338,7 +343,9 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
new Runnable() {
@Override
public void run() {
mTrackSelector = new DefaultTrackSelector();
if (mTrackSelector == null) {
mTrackSelector = new DefaultTrackSelector();
}
mEventLogger = new EventLogger(mTrackSelector);
boolean preferExtensionDecoders = true;
boolean useExtensionRenderers = true;//是否开启扩展
......@@ -346,10 +353,14 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
? (preferExtensionDecoders ? DefaultRenderersFactory.EXTENSION_RENDERER_MODE_PREFER
: DefaultRenderersFactory.EXTENSION_RENDERER_MODE_ON)
: DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF;
rendererFactory = new DefaultRenderersFactory(mAppContext, extensionRendererMode);
DefaultLoadControl loadControl = new DefaultLoadControl();
mInternalPlayer = ExoPlayerFactory.newSimpleInstance(mAppContext, rendererFactory, mTrackSelector, loadControl, null, Looper.getMainLooper());
if (mRendererFactory != null) {
mRendererFactory = new DefaultRenderersFactory(mAppContext);
mRendererFactory.setExtensionRendererMode(extensionRendererMode);
}
if (mLoadControl == null) {
mLoadControl = new DefaultLoadControl();
}
mInternalPlayer = ExoPlayerFactory.newSimpleInstance(mAppContext, mRendererFactory, mTrackSelector, mLoadControl, null, Looper.getMainLooper());
mInternalPlayer.addListener(IjkExo2MediaPlayer.this);
mInternalPlayer.addAnalyticsListener(IjkExo2MediaPlayer.this);
mInternalPlayer.addListener(mEventLogger);
......@@ -379,10 +390,10 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
}
/**
* 是否需要带上header
* setDataSource之前生效
*
* @param preview
是否需要带上header
setDataSource之前生效
@param preview
*/
public void setPreview(boolean preview) {
isPreview = preview;
......@@ -398,18 +409,18 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
/**
* 设置seek 的临近帧。
设置seek 的临近帧。
**/
public void setSeekParameter(@Nullable SeekParameters seekParameters) {
public void setSeekParameter(@Nullable SeekParameters seekParameters) {
mInternalPlayer.setSeekParameters(seekParameters);
}
/**
* 是否开启cache
* setDataSource之前生效
*
* @param cache
是否开启cache
setDataSource之前生效
@param cache
*/
public void setCache(boolean cache) {
isCache = cache;
......@@ -420,10 +431,10 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
}
/**
* cache文件的目录
* setDataSource之前生效
*
* @param cacheDir
cache文件的目录
setDataSource之前生效
@param cacheDir
*/
public void setCacheDir(File cacheDir) {
this.mCacheDir = cacheDir;
......@@ -442,10 +453,10 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
}
/**
* 倍速播放
*
* @param speed 倍速播放,默认为1
* @param pitch 音量缩放,默认为1,修改会导致声音变调
倍速播放
@param speed 倍速播放,默认为1
@param pitch 音量缩放,默认为1,修改会导致声音变调
*/
public void setSpeed(@Size(min = 0) float speed, @Size(min = 0) float pitch) {
PlaybackParameters playbackParameters = new PlaybackParameters(speed, pitch);
......@@ -472,6 +483,30 @@ public class IjkExo2MediaPlayer extends AbstractMediaPlayer implements Player.Ev
}
public MappingTrackSelector getTrackSelector() {
return mTrackSelector;
}
public void setTrackSelector(MappingTrackSelector trackSelector) {
this.mTrackSelector = trackSelector;
}
public LoadControl getLoadControl() {
return mLoadControl;
}
public void setLoadControl(LoadControl loadControl) {
this.mLoadControl = loadControl;
}
public DefaultRenderersFactory getRendererFactory() {
return mRendererFactory;
}
public void setRendererFactory(DefaultRenderersFactory rendererFactory) {
this.mRendererFactory = rendererFactory;
}
@Override
public void onTracksChanged(TrackGroupArray trackGroups, TrackSelectionArray trackSelections) {
......
......@@ -3,10 +3,11 @@ package com.shuyu.gsyvideoplayer;
import android.content.Context;
import android.media.MediaPlayer;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import androidx.annotation.Nullable;
import android.text.TextUtils;
import android.view.Surface;
......@@ -15,6 +16,8 @@ import com.shuyu.gsyvideoplayer.cache.ICacheManager;
import com.shuyu.gsyvideoplayer.listener.GSYMediaPlayerListener;
import com.shuyu.gsyvideoplayer.model.GSYModel;
import com.shuyu.gsyvideoplayer.model.VideoOptionModel;
import com.shuyu.gsyvideoplayer.player.BasePlayerManager;
import com.shuyu.gsyvideoplayer.player.IPlayerInitSuccessListener;
import com.shuyu.gsyvideoplayer.player.IPlayerManager;
import com.shuyu.gsyvideoplayer.player.PlayerFactory;
import com.shuyu.gsyvideoplayer.utils.Debuger;
......@@ -28,9 +31,9 @@ import java.util.Map;
import tv.danmaku.ijk.media.player.IMediaPlayer;
/**
* 基类管理器
* GSYVideoViewBridge接口说明可以查阅GSYVideoViewBridge类
* Created by guoshuyu on 2018/1/25.
基类管理器
GSYVideoViewBridge接口说明可以查阅GSYVideoViewBridge类
Created by guoshuyu on 2018/1/25.
*/
public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedListener, IMediaPlayer.OnCompletionListener,
......@@ -59,84 +62,86 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
protected WeakReference<GSYMediaPlayerListener> lastListener;
protected IPlayerInitSuccessListener mPlayerInitSuccessListener;
/**
* 配置ijk option
配置ijk option
*/
protected List<VideoOptionModel> optionModelList;
/**
* 播放的tag,防止错位置,因为普通的url也可能重复
播放的tag,防止错位置,因为普通的url也可能重复
*/
protected String playTag = "";
/**
* 播放内核管理
播放内核管理
*/
protected IPlayerManager playerManager;
/**
* 缓存管理
缓存管理
*/
protected ICacheManager cacheManager;
/**
* 当前播放的视频宽的高
当前播放的视频宽的高
*/
protected int currentVideoWidth = 0;
/**
* 当前播放的视屏的高
当前播放的视屏的高
*/
protected int currentVideoHeight = 0;
/**
* 当前视频的最后状态
当前视频的最后状态
*/
protected int lastState;
/**
* 播放的tag,防止错位置,因为普通的url也可能重复
播放的tag,防止错位置,因为普通的url也可能重复
*/
protected int playPosition = -22;
/**
* 缓冲比例
缓冲比例
*/
protected int bufferPoint;
/**
* 播放超时
播放超时
*/
protected int timeOut = 8 * 1000;
/**
* 是否需要静音
是否需要静音
*/
protected boolean needMute = false;
/**
* 是否需要外部超时判断
是否需要外部超时判断
*/
protected boolean needTimeOutOther;
/**
* 删除默认所有缓存文件
删除默认所有缓存文件
*/
public void clearAllDefaultCache(Context context) {
clearDefaultCache(context, null, null);
}
/**
* 清除缓存
*
* @param cacheDir 缓存目录,为空是使用默认目录
* @param url 指定url缓存,为空时清除所有
清除缓存
@param cacheDir 缓存目录,为空是使用默认目录
@param url 指定url缓存,为空时清除所有
*/
public void clearDefaultCache(Context context, @Nullable File cacheDir, @Nullable String url) {
if (cacheManager != null) {
cacheManager.clearCache(context, cacheDir, url);
} else {
if(getCacheManager() != null) {
if (getCacheManager() != null) {
getCacheManager().clearCache(context, cacheDir, url);
}
}
......@@ -401,15 +406,15 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
}
/**
* 这里只是用于点击时判断是否已经缓存
* 所以每次直接通过一个CacheManager对象判断即可
这里只是用于点击时判断是否已经缓存
所以每次直接通过一个CacheManager对象判断即可
*/
@Override
public boolean cachePreview(Context context, File cacheDir, String url) {
if(getCacheManager() != null) {
if (getCacheManager() != null) {
return getCacheManager().cachePreview(context, cacheDir, url);
}
return false;
return false;
}
@Override
......@@ -595,6 +600,10 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
if (cacheManager != null) {
cacheManager.setCacheAvailableListener(this);
}
if (playerManager instanceof BasePlayerManager) {
((BasePlayerManager) playerManager)
.setPlayerInitSuccessListener(mPlayerInitSuccessListener);
}
playerManager.initVideoPlayer(context, msg, optionModelList, cacheManager);
setNeedMute(needMute);
......@@ -616,7 +625,7 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
/**
* 启动十秒的定时器进行 缓存操作
启动十秒的定时器进行 缓存操作
*/
protected void startTimeOutBuffer() {
// 启动定时
......@@ -626,7 +635,7 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
}
/**
* 取消 十秒的定时器进行 缓存操作
取消 十秒的定时器进行 缓存操作
*/
protected void cancelTimeOutBuffer() {
Debuger.printfError("cancelTimeOutBuffer");
......@@ -655,7 +664,7 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
}
/**
* 后面再修改设计模式吧,现在先用着
后面再修改设计模式吧,现在先用着
*/
private void showDisplay(Message msg) {
if (playerManager != null) {
......@@ -668,9 +677,9 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
}
/**
* 打开raw播放支持
*
* @param context
打开raw播放支持
@param context
*/
public void enableRawPlay(Context context) {
this.context = context.getApplicationContext();
......@@ -681,7 +690,7 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
}
/**
* 设置IJK视频的option
设置IJK视频的option
*/
public void setOptionModelList(List<VideoOptionModel> optionModelList) {
this.optionModelList = optionModelList;
......@@ -692,7 +701,7 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
}
/**
* 是否需要静音
是否需要静音
*/
public void setNeedMute(boolean needMute) {
this.needMute = needMute;
......@@ -710,22 +719,22 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
}
/**
* 是否需要在buffer缓冲时,增加外部超时判断
* <p>
* 超时后会走onError接口,播放器通过onPlayError回调出
* <p>
* 错误码为 : BUFFER_TIME_OUT_ERROR = -192
* <p>
* 由于onError之后执行GSYVideoPlayer的OnError,如果不想触发错误,
* 可以重载onError,在super之前拦截处理。
* <p>
* public void onError(int what, int extra){
* do you want before super and return;
* super.onError(what, extra)
* }
*
* @param timeOut 超时时间,毫秒 默认8000
* @param needTimeOutOther 是否需要延时设置,默认关闭
是否需要在buffer缓冲时,增加外部超时判断
<p>
超时后会走onError接口,播放器通过onPlayError回调出
<p>
错误码为 : BUFFER_TIME_OUT_ERROR = -192
<p>
由于onError之后执行GSYVideoPlayer的OnError,如果不想触发错误,
可以重载onError,在super之前拦截处理。
<p>
public void onError(int what, int extra){
do you want before super and return;
super.onError(what, extra)
}
@param timeOut 超时时间,毫秒 默认8000
@param needTimeOutOther 是否需要延时设置,默认关闭
*/
public void setTimeOut(int timeOut, boolean needTimeOutOther) {
this.timeOut = timeOut;
......@@ -739,4 +748,15 @@ public abstract class GSYVideoBaseManager implements IMediaPlayer.OnPreparedList
public ICacheManager getCurCacheManager() {
return cacheManager;
}
public IPlayerInitSuccessListener getPlayerPreparedSuccessListener() {
return mPlayerInitSuccessListener;
}
/**
播放器初始化后接口
*/
public void setPlayerInitSuccessListener(IPlayerInitSuccessListener listener) {
this.mPlayerInitSuccessListener = listener;
}
}
......@@ -25,14 +25,14 @@ import tv.danmaku.ijk.media.player.IjkLibLoader;
import tv.danmaku.ijk.media.player.IjkMediaPlayer;
/**
* IJKPLayer
* Created by guoshuyu on 2018/1/11.
IJKPLayer
Created by guoshuyu on 2018/1/11.
*/
public class IjkPlayerManager implements IPlayerManager {
public class IjkPlayerManager extends BasePlayerManager {
/**
* log level
log level
*/
private static int logLevel = IjkMediaPlayer.IJK_LOG_DEFAULT;
......@@ -99,6 +99,8 @@ public class IjkPlayerManager implements IPlayerManager {
} catch (IOException e) {
e.printStackTrace();
}
initSuccess(gsyModel);
}
@Override
......
......@@ -24,7 +24,7 @@ import tv.danmaku.ijk.media.player.IMediaPlayer;
* Created by guoshuyu on 2018/1/11.
*/
public class SystemPlayerManager implements IPlayerManager {
public class SystemPlayerManager extends BasePlayerManager {
private Context context;
......@@ -63,6 +63,7 @@ public class SystemPlayerManager implements IPlayerManager {
} catch (Exception e) {
e.printStackTrace();
}
initSuccess(gsyModel);
}
@Override
......
......@@ -60,7 +60,6 @@ public class GSYTextureView extends TextureView implements TextureView.SurfaceTe
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
if (mSaveTexture == null) {
Debuger.printfError("FFFFFFFFFFFF 1");
mSaveTexture = surface;
mSurface = new Surface(surface);
if (mIGSYSurfaceListener != null) {
......@@ -68,7 +67,6 @@ public class GSYTextureView extends TextureView implements TextureView.SurfaceTe
}
} else {
setSurfaceTexture(mSaveTexture);
Debuger.printfError("FFFFFFFFFFFF 2");
//mSurface = new Surface(mSaveTexture);
}
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册