-
Notifications
You must be signed in to change notification settings - Fork 31
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Codec failure retry timeout logic (#821)
- Loading branch information
1 parent
53ffec6
commit 6287fbc
Showing
4 changed files
with
138 additions
and
1 deletion.
There are no files selected for viewing
98 changes: 98 additions & 0 deletions
98
playkit/src/main/java/com/kaltura/playkit/KDefaultRenderersFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
package com.kaltura.playkit; | ||
|
||
import android.content.Context; | ||
import android.os.Handler; | ||
|
||
import androidx.annotation.NonNull; | ||
|
||
import com.kaltura.android.exoplayer2.DefaultRenderersFactory; | ||
import com.kaltura.android.exoplayer2.ExoPlaybackException; | ||
import com.kaltura.android.exoplayer2.PlaybackException; | ||
import com.kaltura.android.exoplayer2.Renderer; | ||
import com.kaltura.android.exoplayer2.mediacodec.MediaCodecSelector; | ||
import com.kaltura.android.exoplayer2.video.MediaCodecVideoRenderer; | ||
import com.kaltura.android.exoplayer2.video.VideoRendererEventListener; | ||
import com.kaltura.playkit.player.PlayerSettings; | ||
|
||
import java.util.ArrayList; | ||
|
||
public class KDefaultRenderersFactory { | ||
private static final PKLog log = PKLog.get("KDefaultRenderersFactory"); | ||
|
||
public static DefaultRenderersFactory createDecoderInitErrorRetryFactory( | ||
Context context, | ||
PlayerSettings playerSettings | ||
) { | ||
return new DefaultRenderersFactory(context) { | ||
@Override | ||
protected void buildVideoRenderers(@NonNull Context context, | ||
int extensionRendererMode, | ||
@NonNull MediaCodecSelector mediaCodecSelector, | ||
boolean enableDecoderFallback, | ||
@NonNull Handler eventHandler, | ||
@NonNull VideoRendererEventListener eventListener, | ||
long allowedVideoJoiningTimeMs, | ||
@NonNull ArrayList<Renderer> out) { | ||
ArrayList<Renderer> renderersArrayList = new ArrayList<>(); | ||
super.buildVideoRenderers(context, | ||
extensionRendererMode, | ||
mediaCodecSelector, | ||
enableDecoderFallback, | ||
eventHandler, | ||
eventListener, | ||
allowedVideoJoiningTimeMs, | ||
renderersArrayList); | ||
for (Renderer renderer : renderersArrayList) { | ||
if (renderer instanceof MediaCodecVideoRenderer) { | ||
out.add(new MediaCodecVideoRenderer( | ||
context, | ||
this.getCodecAdapterFactory(), | ||
mediaCodecSelector, | ||
allowedVideoJoiningTimeMs, | ||
enableDecoderFallback, | ||
eventHandler, | ||
eventListener, | ||
MAX_DROPPED_VIDEO_FRAME_COUNT_TO_NOTIFY) { | ||
@Override | ||
public void render(long positionUs, long elapsedRealtimeUs) throws ExoPlaybackException { | ||
try { | ||
super.render(positionUs, elapsedRealtimeUs); | ||
} catch (ExoPlaybackException e) { | ||
if (e.errorCode == PlaybackException.ERROR_CODE_DECODER_INIT_FAILED | ||
&& playerSettings.getCodecFailureRetryCount() > 0 && playerSettings.getCodecFailureRetryTimeout() > 0) { | ||
for(int i = 0; i < playerSettings.getCodecFailureRetryCount(); i++) { | ||
log.d("Retrying on coded init failure (" + i + ")"); | ||
super.onReset(); | ||
try { | ||
Thread.sleep(playerSettings.getCodecFailureRetryTimeout()); | ||
} catch (Exception e1) { | ||
log.d("Interrupted while sleeping: " + e1.getMessage()); | ||
e1.printStackTrace(); | ||
} | ||
try { | ||
super.render(positionUs, elapsedRealtimeUs); | ||
log.d("Retrying on coded init failure successful"); | ||
// Stop retrying if no exception was thrown | ||
break; | ||
} catch (ExoPlaybackException e2) { | ||
if (e2.errorCode != PlaybackException.ERROR_CODE_DECODER_INIT_FAILED | ||
|| i == playerSettings.getCodecFailureRetryCount() - 1) { | ||
// Some other error happened or last retry. Throw exception to the caller | ||
log.d("Codec init retry failed: " + e2.getMessage()); | ||
throw e2; | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
} | ||
); | ||
} else { | ||
out.add(renderer); | ||
} | ||
} | ||
} | ||
}; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters