Skip to content

Commit

Permalink
fix: lazy load android native libriries, fixes #234
Browse files Browse the repository at this point in the history
  • Loading branch information
befovy committed May 16, 2020
1 parent 7fa63a5 commit 3788cfe
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 30 deletions.
70 changes: 43 additions & 27 deletions android/src/main/java/com/befovy/fijkplayer/FijkPlayer.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,40 +87,50 @@ public class FijkPlayer implements MethodChannel.MethodCallHandler, IjkEventList
private TextureRegistry.SurfaceTextureEntry mSurfaceTextureEntry;
private SurfaceTexture mSurfaceTexture;
private Surface mSurface;
final private boolean mJustSurface;

FijkPlayer(@NonNull FijkEngine engine) {
FijkPlayer(@NonNull FijkEngine engine, boolean justSurface) {
mEngine = engine;
mPlayerId = atomicId.incrementAndGet();
mState = 0;
mIjkMediaPlayer = new IjkMediaPlayer();
mIjkMediaPlayer.addIjkEventListener(this);
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-position-notify", 1);
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);

IjkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_INFO);
mMethodChannel = new MethodChannel(mEngine.messenger(), "befovy.com/fijkplayer/" + mPlayerId);
mMethodChannel.setMethodCallHandler(this);
mIjkMediaPlayer.setOnSnapShotListener(this);

mEventChannel = new EventChannel(mEngine.messenger(), "befovy.com/fijkplayer/event/" + mPlayerId);
mEventChannel.setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object o, EventChannel.EventSink eventSink) {
mEventSink.setDelegate(eventSink);
}
mJustSurface = justSurface;
if (justSurface) {
mIjkMediaPlayer = null;
mEventChannel = null;
mMethodChannel = null;
} else {
mIjkMediaPlayer = new IjkMediaPlayer();
mIjkMediaPlayer.addIjkEventListener(this);
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "enable-position-notify", 1);
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "start-on-prepared", 0);

// IjkMediaPlayer.native_setLogLevel(IjkMediaPlayer.IJK_LOG_INFO);
mMethodChannel = new MethodChannel(mEngine.messenger(), "befovy.com/fijkplayer/" + mPlayerId);
mMethodChannel.setMethodCallHandler(this);
mIjkMediaPlayer.setOnSnapShotListener(this);

mEventChannel = new EventChannel(mEngine.messenger(), "befovy.com/fijkplayer/event/" + mPlayerId);
mEventChannel.setStreamHandler(new EventChannel.StreamHandler() {
@Override
public void onListen(Object o, EventChannel.EventSink eventSink) {
mEventSink.setDelegate(eventSink);
}

@Override
public void onCancel(Object o) {
mEventSink.setDelegate(null);
}
});
@Override
public void onCancel(Object o) {
mEventSink.setDelegate(null);
}
});
}
}

int getPlayerId() {
return mPlayerId;
}

void setup() {
if (mJustSurface)
return;
if (mHostOptions.getIntOption(HostOption.ENABLE_SNAPSHOT,0) > 0) {
mIjkMediaPlayer.setAmcGlesRender();
mIjkMediaPlayer.setOption(IjkMediaPlayer.OPT_CATEGORY_PLAYER, "overlay-format", "fcc-_es2");
Expand All @@ -134,14 +144,18 @@ long setupSurface() {
mSurfaceTextureEntry = surfaceTextureEntry;
mSurfaceTexture = surfaceTextureEntry.surfaceTexture();
mSurface = new Surface(mSurfaceTexture);
mIjkMediaPlayer.setSurface(mSurface);
if (!mJustSurface) {
mIjkMediaPlayer.setSurface(mSurface);
}
}
return mSurfaceTextureEntry.id();
}

void release() {
handleEvent(PLAYBACK_STATE_CHANGED, end, mState, null);
mIjkMediaPlayer.release();
if (!mJustSurface) {
handleEvent(PLAYBACK_STATE_CHANGED, end, mState, null);
mIjkMediaPlayer.release();
}
if (mSurfaceTextureEntry != null) {
mSurfaceTextureEntry.release();
mSurfaceTextureEntry = null;
Expand All @@ -154,8 +168,10 @@ void release() {
mSurface.release();
mSurface = null;
}
mMethodChannel.setMethodCallHandler(null);
mEventChannel.setStreamHandler(null);
if (!mJustSurface) {
mMethodChannel.setMethodCallHandler(null);
mEventChannel.setStreamHandler(null);
}
}

private boolean isPlayable(int state) {
Expand Down
7 changes: 4 additions & 3 deletions android/src/main/java/com/befovy/fijkplayer/FijkPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public static void registerWith(Registrar registrar) {
plugin.initWithRegistrar(registrar);
channel.setMethodCallHandler(plugin);

final FijkPlayer player = new FijkPlayer(plugin);
final FijkPlayer player = new FijkPlayer(plugin, true);
player.setupSurface();
player.release();
}
Expand All @@ -118,7 +118,7 @@ public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
initWithBinding(binding);
channel.setMethodCallHandler(this);

final FijkPlayer player = new FijkPlayer(this);
final FijkPlayer player = new FijkPlayer(this, true);
player.setupSurface();
player.release();

Expand Down Expand Up @@ -270,7 +270,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
result.success(null);
break;
case "createPlayer": {
FijkPlayer fijkPlayer = new FijkPlayer(this);
FijkPlayer fijkPlayer = new FijkPlayer(this, false);
int playerId = fijkPlayer.getPlayerId();
fijkPlayers.append(playerId, fijkPlayer);
result.success(playerId);
Expand All @@ -297,6 +297,7 @@ public void onMethodCall(@NonNull MethodCall call, @NonNull Result result) {
level = level / 100;
level = Math.max(level, 0);
level = Math.min(level, 8);
IjkMediaPlayer.loadLibrariesOnce(null);
IjkMediaPlayer.native_setLogLevel(level);
result.success(null);
break;
Expand Down
4 changes: 4 additions & 0 deletions lib/core/fijklog.dart
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,10 @@ class FijkLog {
const FijkLog._();

/// Set global whole log level
///
/// Call this method on Android platform will load natvie shared libraries.
/// If you care about app boot performance,
/// you should call this method as late as possiable. Call this method before the first time you consturctor new [FijkPlayer]
static setLevel(final FijkLogLevel level) {
assert(level != null);
_level = level;
Expand Down

0 comments on commit 3788cfe

Please sign in to comment.