Skip to content
This repository has been archived by the owner on Feb 11, 2022. It is now read-only.

ALL-3936/Intel hack #52

Merged
merged 5 commits into from
Jun 26, 2017
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package com.novoda.noplayer.exoplayer;

import com.google.android.exoplayer2.mediacodec.MediaCodecInfo;
import com.google.android.exoplayer2.mediacodec.MediaCodecSelector;
import com.google.android.exoplayer2.mediacodec.MediaCodecUtil;

/**
* CodecSelector that allows overriding of the requiresSecureDecoder to allow
* downgrading of security but not upgrading.
*/
class CodecSelector implements MediaCodecSelector {

private final InternalMediaCodecUtil internalMediaCodecUtil;
private final boolean overrideSecureDecoder;

public static CodecSelector newInstance(boolean useSecureCodec) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can create two factories instead ;)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

useSecureCodec seems to mean the opposite of overrideSecureDecoder no?

useSecureCodec = true -> "go ahead, use the secure codec"
overrideSecureCodec = true -> "override that secure codec, use the insecure one instead"

So... which one is it?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We got confused with this CodecSelector too, we decided to invert the logic and do some renaming to make it make sense. 😄 65008cf

InternalMediaCodecUtil internalMediaCodecUtil = new InternalMediaCodecUtil();
return new CodecSelector(internalMediaCodecUtil, useSecureCodec);
}

CodecSelector(InternalMediaCodecUtil internalMediaCodecUtil, boolean overrideSecureDecoder) {
this.internalMediaCodecUtil = internalMediaCodecUtil;
this.overrideSecureDecoder = overrideSecureDecoder;
}

@Override
public MediaCodecInfo getDecoderInfo(String mimeType, boolean contentRequiresSecureDecoder)
throws MediaCodecUtil.DecoderQueryException {
return internalMediaCodecUtil.getDecoderInfo(mimeType, contentRequiresSecureDecoder && overrideSecureDecoder);
}

@Override
public MediaCodecInfo getPassthroughDecoderInfo() throws MediaCodecUtil.DecoderQueryException {
return internalMediaCodecUtil.getPassthroughDecoderInfo();
}

static class InternalMediaCodecUtil {

MediaCodecInfo getDecoderInfo(String mimeType, boolean requiresSecureDecoder) throws MediaCodecUtil.DecoderQueryException {
return MediaCodecUtil.getDecoderInfo(mimeType, requiresSecureDecoder);
}

MediaCodecInfo getPassthroughDecoderInfo() throws MediaCodecUtil.DecoderQueryException {
return MediaCodecUtil.getPassthroughDecoderInfo();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,21 @@
import android.support.annotation.NonNull;

import com.google.android.exoplayer2.DefaultLoadControl;
import com.google.android.exoplayer2.DefaultRenderersFactory;
import com.google.android.exoplayer2.ExoPlayerFactory;
import com.google.android.exoplayer2.RenderersFactory;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.drm.DrmSessionManager;
import com.google.android.exoplayer2.drm.FrameworkMediaCrypto;
import com.google.android.exoplayer2.trackselection.DefaultTrackSelector;
import com.novoda.noplayer.drm.DrmSessionCreator;
import com.novoda.noplayer.exoplayer.forwarder.ExoPlayerDrmSessionEventListener;

import static com.novoda.noplayer.exoplayer.SimpleRenderersFactory.EXTENSION_RENDERER_MODE_OFF;

class ExoPlayerCreator {

private static final long DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS = 5000;

private final Context context;
private final DefaultTrackSelector trackSelector;

Expand All @@ -24,9 +28,16 @@ class ExoPlayerCreator {
}

@NonNull
public SimpleExoPlayer create(DrmSessionCreator drmSessionCreator, ExoPlayerDrmSessionEventListener exoPlayerDrmSessionEventListener) {
public SimpleExoPlayer create(DrmSessionCreator drmSessionCreator, ExoPlayerDrmSessionEventListener exoPlayerDrmSessionEventListener, boolean useSecureCodec) {
DrmSessionManager<FrameworkMediaCrypto> drmSessionManager = drmSessionCreator.create(exoPlayerDrmSessionEventListener);
DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(context, drmSessionManager);
RenderersFactory renderersFactory = new SimpleRenderersFactory(
context,
drmSessionManager,
EXTENSION_RENDERER_MODE_OFF,
DEFAULT_ALLOWED_VIDEO_JOINING_TIME_MS,
CodecSelector.newInstance(useSecureCodec)
);

DefaultLoadControl loadControl = new DefaultLoadControl();
return ExoPlayerFactory.newSimpleInstance(renderersFactory, trackSelector, loadControl);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,8 @@ void stop() {
exoPlayer.stop();
}

void loadVideo(DrmSessionCreator drmSessionCreator, Uri uri, ContentType contentType, ExoPlayerForwarder forwarder) {
exoPlayer = exoPlayerCreator.create(drmSessionCreator, forwarder.drmSessionEventListener());
void loadVideo(DrmSessionCreator drmSessionCreator, Uri uri, ContentType contentType, ExoPlayerForwarder forwarder, boolean useSecureCodec) {
exoPlayer = exoPlayerCreator.create(drmSessionCreator, forwarder.drmSessionEventListener(), useSecureCodec);
rendererTypeRequester = rendererTypeRequesterCreator.createfrom(exoPlayer);
exoPlayer.addListener(forwarder.exoPlayerEventListener());
exoPlayer.setVideoDebugListener(forwarder.videoRendererEventListener());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public class ExoPlayerTwoImpl implements Player {
private final ExoPlayerForwarder forwarder;
private final Heart heart;
private final DrmSessionCreator drmSessionCreator;
private final boolean useSecureCodec;
private final LoadTimeout loadTimeout;

private SurfaceHolderRequester surfaceHolderRequester;
Expand All @@ -45,13 +46,15 @@ public class ExoPlayerTwoImpl implements Player {
ExoPlayerForwarder exoPlayerForwarder,
LoadTimeout loadTimeoutParam,
Heart heart,
DrmSessionCreator drmSessionCreator) {
DrmSessionCreator drmSessionCreator,
boolean useSecureCodec) {
this.exoPlayer = exoPlayer;
this.listenersHolder = listenersHolder;
this.loadTimeout = loadTimeoutParam;
this.forwarder = exoPlayerForwarder;
this.heart = heart;
this.drmSessionCreator = drmSessionCreator;
this.useSecureCodec = useSecureCodec;
}

public void initialise() {
Expand Down Expand Up @@ -171,7 +174,7 @@ public void loadVideo(Uri uri, ContentType contentType) {
reset();
}
listenersHolder.getPreparedListeners().resetPreparedState();
exoPlayer.loadVideo(drmSessionCreator, uri, contentType, forwarder);
exoPlayer.loadVideo(drmSessionCreator, uri, contentType, forwarder, useSecureCodec);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@

public class ExoPlayerTwoImplFactory {

public ExoPlayerTwoImpl create(Context context, DrmSessionCreator drmSessionCreator) {
public ExoPlayerTwoImpl create(Context context, DrmSessionCreator drmSessionCreator, boolean useSecureCodec) {
DefaultDataSourceFactory defaultDataSourceFactory = new DefaultDataSourceFactory(context, "user-agent");
Handler handler = new Handler(Looper.getMainLooper());
MediaSourceFactory mediaSourceFactory = new MediaSourceFactory(defaultDataSourceFactory, handler);
Expand Down Expand Up @@ -55,7 +55,8 @@ public ExoPlayerTwoImpl create(Context context, DrmSessionCreator drmSessionCrea
exoPlayerForwarder,
loadTimeout,
heart,
drmSessionCreator
drmSessionCreator,
useSecureCodec
);
}
}
Loading