Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

5.2.1 Changes #38

Open
wants to merge 75 commits into
base: copy_5.2.1
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
76cf6bb
maxbitrate support
alokmaurya825 Dec 21, 2018
8a768db
Fixed bitrate on ios
kushagrag Dec 24, 2018
4bd2717
added ManifestFileChange event
alokmaurya825 Feb 3, 2019
893881b
index check
alokmaurya825 Feb 3, 2019
60c4008
added duration
alokmaurya825 Feb 4, 2019
4fcc865
long Parse crash fix
milindbableshwar Feb 5, 2019
0245706
Send relative segment time instead of current time
kushagrag Feb 6, 2019
552e71b
added alpha view
alokmaurya825 Jul 1, 2019
f0fc240
added gltexture view to android exoplayer
msaikrishna Jul 3, 2019
7f4e815
changed the gltexture for working
msaikrishna Jul 3, 2019
7c80c93
changed the prop name to useGreenScreen
msaikrishna Jul 3, 2019
275d733
changed the alpha shader
msaikrishna Jul 4, 2019
7cc779c
Alpha view done for ios
kushagrag Jul 5, 2019
ec32457
changed the alpha shader
msaikrishna Jul 9, 2019
6586166
Fixed shader
kushagrag Jul 23, 2019
8e96e79
changed the alpha shader
msaikrishna Jul 23, 2019
2326753
Fixed green screen on resume and on pause
msaikrishna Jul 25, 2019
a5305a5
Added chroma files
kushagrag Aug 1, 2019
ea8fc7e
updated shader
msaikrishna Aug 1, 2019
554ad53
Updated shader in ios
kushagrag Aug 1, 2019
8f72a13
conflicts fixes
AdityaPrakash04 Jun 28, 2023
0be5aa7
method fix setTrackSelector
AdityaPrakash04 Jun 28, 2023
14a909e
exoplayerview compile fix
AdityaPrakash04 Jun 28, 2023
9ebca62
hlsmedia segment fix
AdityaPrakash04 Jun 28, 2023
33c68ff
[Sagar] upgrading androidx
vidsag Aug 14, 2019
fcc88d9
[Sagar] dependency upgrade
vidsag Sep 27, 2019
4fd2486
Fixed player error for android 10 devices
msaikrishna Jan 30, 2020
6561e0b
fixed player old
msaikrishna Jan 30, 2020
587c4e4
Checking for player null
msaikrishna Jan 31, 2020
e6a253b
added comments
msaikrishna Jan 31, 2020
abb1983
checking for specific error when android 10 crash happens
msaikrishna Feb 3, 2020
b33e828
added null check for message
msaikrishna Feb 4, 2020
4e62917
added null check for player
msaikrishna Feb 6, 2020
6464386
checking for null
msaikrishna Feb 7, 2020
35a3f3c
[Sagar] exo bump
vidsag Oct 6, 2020
b9d2b12
[Sagar] fixes
vidsag Oct 7, 2020
3479915
[Sagar] fixed ambiguity
vidsag Oct 7, 2020
f1715d0
[Sagar] fixed crash
vidsag Oct 7, 2020
36cb4c0
compile issue fixes
AdityaPrakash04 Jun 28, 2023
624c037
1. ReactExoplayerView to play encrypted media source.
shashankUnacademy Oct 13, 2020
c170053
removed old version interface
shashankUnacademy Oct 13, 2020
b2d1e87
exoplayer upgrade changes
shashankUnacademy Oct 13, 2020
a76df08
ISO-8859-1 character set included for decoding
shashankUnacademy Oct 13, 2020
482fdbd
[Sagar] adding exo fork dependency
vidsag Oct 28, 2020
b5724fa
[Sagar] missing dependency
vidsag Oct 28, 2020
ee405ad
Added try catch for surface crash
msaikrishna Nov 2, 2020
bc2db01
Fixed Encrypt mode cipher
msaikrishna Nov 3, 2020
b27f997
Fixed final variables
msaikrishna Nov 3, 2020
a4988b7
passing key throug props
msaikrishna Nov 4, 2020
af2f7a7
Added mux library
kushagrag Nov 24, 2020
3a6b029
Removed unwanted import
kushagrag Nov 24, 2020
c5071c3
[Sagar] fixing new gradle error
vidsag Dec 1, 2020
bb6dd1d
Added force reload
amit-unacademy Nov 2, 2021
f8baa51
Log bitrate and resolution of video in callbacks
amit-unacademy Jan 5, 2022
a44c524
Used metal kit for green screen removal
kushagrag Feb 11, 2022
bb088dc
Crash and memory leak fixes
kushagrag Apr 12, 2022
aaab9e4
Fixed video stalling on speed cahnge
kushagrag May 31, 2022
507aa54
Fixed max frame rate to 30
kushagrag May 31, 2022
bec68ff
Reading Encrypted file support
rishabh876 Jun 8, 2022
aa1d26d
Revert "[CLX-5538] Reading Encrypted file support"
amit-unacademy Jun 16, 2022
99073d1
merge issue fixes
AdityaPrakash04 Jun 29, 2023
a51753c
remove player controls
AdityaPrakash04 Jul 2, 2023
00a672d
fixes for player release and m4s files
AdityaPrakash04 Jul 5, 2023
426a063
Reading Encrypted file support
rishabh876 Jun 8, 2022
97ba38d
Update ReactExoplayerView.java
rishabh876 Jun 16, 2022
d42fd5b
Update EncryptedFileDataSource.java
rishabh876 Aug 23, 2022
4c0efb6
Update EncryptedFileDataSource.java
rishabh876 Aug 23, 2022
e43dd17
Create EncryptedFileDataSourceFactory.java
rishabh876 Aug 23, 2022
d4fb17d
Update EncryptedFileDataSource.java
rishabh876 Aug 23, 2022
7e65899
Fixed non green screen video play
kushagrag Nov 21, 2022
0217f96
Memory leak fix
kushagrag Dec 14, 2022
0bcda29
handled application thread execution for player
AdityaPrakash04 Jul 15, 2023
b40941f
handled llhls buffering exception
AdityaPrakash04 Aug 3, 2023
c2d883c
commented try catch to identify issues for beta release
AdityaPrakash04 Aug 30, 2023
ef92d8a
Revert "commented try catch to identify issues for beta release"
AdityaPrakash04 Aug 30, 2023
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
437 changes: 233 additions & 204 deletions Video.js

Large diffs are not rendered by default.

24 changes: 21 additions & 3 deletions android-exoplayer/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@ def safeExtGet(prop, fallback) {
rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
}

repositories {
flatDir {
dirs 'libs'
}
}

android {
compileSdkVersion safeExtGet('compileSdkVersion', 28)
buildToolsVersion safeExtGet('buildToolsVersion', '28.0.3')
Expand All @@ -20,9 +26,11 @@ android {
versionName "1.0"
}

compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
configurations.all {
resolutionStrategy {
force 'androidx.customview:customview:1.0.0'
force 'androidx.core:core:1.1.0'
}
}
}

Expand All @@ -31,6 +39,16 @@ dependencies {
implementation('com.google.android.exoplayer:exoplayer:2.13.3') {
exclude group: 'com.android.support'
}
implementation "androidx.security:security-crypto:1.1.0-alpha03"
implementation(name: "mux", ext: "aar")
// implementation files('libs/mux.aar')
implementation ('com.google.guava:guava:27.1-android') {
exclude group: 'com.google.code.findbugs', module: 'jsr305'
exclude group: 'org.checkerframework', module: 'checker-compat-qual'
exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
exclude group: 'com.google.j2objc', module: 'j2objc-annotations'
exclude group: 'org.codehaus.mojo', module: 'animal-sniffer-annotations'
}

// All support libs must use the same version
implementation "androidx.annotation:annotation:1.1.0"
Expand Down
Binary file added android-exoplayer/libs/mux.aar
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,17 @@
import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.upstream.HttpDataSource;
import com.google.android.exoplayer2.upstream.TransferListener;
import com.google.android.exoplayer2.util.Util;

import okhttp3.JavaNetCookieJar;
import okhttp3.OkHttpClient;
import java.util.Map;

import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;


public class DataSourceUtil {

private DataSourceUtil() {
Expand All @@ -23,6 +28,7 @@ private DataSourceUtil() {
private static DataSource.Factory rawDataSourceFactory = null;
private static DataSource.Factory defaultDataSourceFactory = null;
private static HttpDataSource.Factory defaultHttpDataSourceFactory = null;
private static DataSource.Factory encryptedDataSourceFactory = null;
private static String userAgent = null;

public static void setUserAgent(String userAgent) {
Expand Down Expand Up @@ -84,11 +90,19 @@ private static HttpDataSource.Factory buildHttpDataSourceFactory(ReactContext co
CookieJarContainer container = (CookieJarContainer) client.cookieJar();
ForwardingCookieHandler handler = new ForwardingCookieHandler(context);
container.setCookieJar(new JavaNetCookieJar(handler));
OkHttpDataSourceFactory okHttpDataSourceFactory = new OkHttpDataSourceFactory(client, getUserAgent(context), bandwidthMeter);
OkHttpDataSourceFactory okHttpDataSourceFactory = new OkHttpDataSourceFactory(client, getUserAgent(context), null, null);

if (requestHeaders != null)
okHttpDataSourceFactory.getDefaultRequestProperties().set(requestHeaders);

return okHttpDataSourceFactory;
}

public static DataSource.Factory getEncryptedDataSourceFactory(SecretKeySpec mSecretKeySpec, IvParameterSpec mIvParameterSpec,
boolean forceInitialisation){
if(encryptedDataSourceFactory == null || forceInitialisation) {
encryptedDataSourceFactory = new EncryptedDataSourceFactory(mSecretKeySpec,mIvParameterSpec);
}
return encryptedDataSourceFactory;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,225 @@
package com.brentvatne.exoplayer;

import android.net.Uri;

import com.google.android.exoplayer2.C;
import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DataSpec;
import com.google.android.exoplayer2.upstream.TransferListener;

import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

/**
* Created by michaeldunn on 3/13/17.
*/

public final class EncryptedDataSource implements DataSource {

private TransferListener mTransferListener;
private StreamingCipherInputStream mInputStream;
private Uri mUri;
private long mBytesRemaining;
private boolean mOpened;
private Cipher mCipher;
private SecretKeySpec mSecretKeySpec;
private IvParameterSpec mIvParameterSpec;


public EncryptedDataSource(Cipher cipher, SecretKeySpec secretKeySpec, IvParameterSpec ivParameterSpec) {
mCipher = cipher;
mSecretKeySpec = secretKeySpec;
mIvParameterSpec = ivParameterSpec;
}

@Override
public void addTransferListener(TransferListener transferListener) {
this.mTransferListener = transferListener;
}

@Override
public long open(DataSpec dataSpec) throws EncryptedFileDataSourceException {
if (mOpened) {
return mBytesRemaining;
}
mUri = dataSpec.uri;
try {
setupInputStream();
skipToPosition(dataSpec);
computeBytesRemaining(dataSpec);
} catch (IOException e) {
throw new EncryptedFileDataSourceException(e);
}
mOpened = true;
if (mTransferListener != null) {
mTransferListener.onTransferStart(this, dataSpec,false);
}
return mBytesRemaining;
}

private void setupInputStream() throws FileNotFoundException {
File encryptedFile = new File(mUri.getPath());
FileInputStream fileInputStream = new FileInputStream(encryptedFile);
mInputStream = new StreamingCipherInputStream(fileInputStream, mCipher, mSecretKeySpec, mIvParameterSpec);
}

private void skipToPosition(DataSpec dataSpec) throws IOException {
mInputStream.forceSkip(dataSpec.position);
}

private void computeBytesRemaining(DataSpec dataSpec) throws IOException {
if (dataSpec.length != C.LENGTH_UNSET) {
mBytesRemaining = dataSpec.length;
} else {
mBytesRemaining = mInputStream.available();
if (mBytesRemaining == Integer.MAX_VALUE) {
mBytesRemaining = C.LENGTH_UNSET;
}
}
}

@Override
public int read(byte[] buffer, int offset, int readLength) throws EncryptedFileDataSourceException {
// fast-fail if there's 0 quantity requested or we think we've already processed everything
if (readLength == 0) {
return 0;
} else if (mBytesRemaining == 0) {
return C.RESULT_END_OF_INPUT;
}
// constrain the read length and try to read from the cipher input stream
int bytesToRead = getBytesToRead(readLength);
int bytesRead;
try {
bytesRead = mInputStream.read(buffer, offset, bytesToRead);
} catch (IOException e) {
throw new EncryptedFileDataSourceException(e);
}
// if we get a -1 that means we failed to read - we're either going to EOF error or broadcast EOF
if (bytesRead == -1) {
if (mBytesRemaining != C.LENGTH_UNSET) {
throw new EncryptedFileDataSourceException(new EOFException());
}
return C.RESULT_END_OF_INPUT;
}
// we can't decrement bytes remaining if it's just a flag representation (as opposed to a mutable numeric quantity)
if (mBytesRemaining != C.LENGTH_UNSET) {
mBytesRemaining -= bytesRead;
}
// notify
if (mTransferListener != null) {
mTransferListener.onBytesTransferred(this,null, false, bytesRead);
}
// report
return bytesRead;
}

private int getBytesToRead(int bytesToRead) {
if (mBytesRemaining == C.LENGTH_UNSET) {
return bytesToRead;
}
return (int) Math.min(mBytesRemaining, bytesToRead);
}

@Override
public Uri getUri() {
return mUri;
}

@Override
public void close() throws EncryptedFileDataSourceException {
mUri = null;
try {
if (mInputStream != null) {
mInputStream.close();
}
} catch (IOException e) {
throw new EncryptedFileDataSourceException(e);
} finally {
mInputStream = null;
if (mOpened) {
mOpened = false;
if (mTransferListener != null) {
mTransferListener.onTransferEnd(this, null, false);
}
}
}
}

public static final class EncryptedFileDataSourceException extends IOException {
public EncryptedFileDataSourceException(IOException cause) {
super(cause);
}
}

public static class StreamingCipherInputStream extends CipherInputStream {

private static final int AES_BLOCK_SIZE = 16;

private InputStream mUpstream;
private Cipher mCipher;
private SecretKeySpec mSecretKeySpec;
private IvParameterSpec mIvParameterSpec;

public StreamingCipherInputStream(InputStream inputStream, Cipher cipher, SecretKeySpec secretKeySpec, IvParameterSpec ivParameterSpec) {
super(inputStream, cipher);
mUpstream = inputStream;
mCipher = cipher;
mSecretKeySpec = secretKeySpec;
mIvParameterSpec = ivParameterSpec;
}

@Override
public int read(byte[] b, int off, int len) throws IOException {
return super.read(b, off, len);
}

public long forceSkip(long bytesToSkip) throws IOException {
long skipped = mUpstream.skip(bytesToSkip);
try {
int skip = (int) (bytesToSkip % AES_BLOCK_SIZE);
long blockOffset = bytesToSkip - skip;
long numberOfBlocks = blockOffset / AES_BLOCK_SIZE;
// from here to the next inline comment, i don't understand
BigInteger ivForOffsetAsBigInteger = new BigInteger(1, mIvParameterSpec.getIV()).add(BigInteger.valueOf(numberOfBlocks));
byte[] ivForOffsetByteArray = ivForOffsetAsBigInteger.toByteArray();
IvParameterSpec computedIvParameterSpecForOffset;
if (ivForOffsetByteArray.length < AES_BLOCK_SIZE) {
byte[] resizedIvForOffsetByteArray = new byte[AES_BLOCK_SIZE];
System.arraycopy(ivForOffsetByteArray, 0, resizedIvForOffsetByteArray, AES_BLOCK_SIZE - ivForOffsetByteArray.length, ivForOffsetByteArray.length);
computedIvParameterSpecForOffset = new IvParameterSpec(resizedIvForOffsetByteArray);
} else {
computedIvParameterSpecForOffset = new IvParameterSpec(ivForOffsetByteArray, ivForOffsetByteArray.length - AES_BLOCK_SIZE, AES_BLOCK_SIZE);
}
mCipher.init(Cipher.ENCRYPT_MODE, mSecretKeySpec, computedIvParameterSpecForOffset);
byte[] skipBuffer = new byte[skip];
// i get that we need to update, but i don't get how we're able to take the shortcut from here to the previous comment
mCipher.update(skipBuffer, 0, skip, skipBuffer);
Arrays.fill(skipBuffer, (byte) 0);
} catch (Exception e) {
return 0;
}
return skipped;
}

// We need to return the available bytes from the upstream.
// In this implementation we're front loading it, but it's possible the value might change during the lifetime
// of this instance, and reference to the stream should be retained and queried for available bytes instead
@Override
public int available() throws IOException {
return mUpstream.available();
}

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.brentvatne.exoplayer;

import android.util.Base64;

import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.TransferListener;

import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class EncryptedDataSourceFactory implements DataSource.Factory {

private Cipher mCipher;
private SecretKeySpec mSecretKeySpec;
private IvParameterSpec mIvParameterSpec;

public EncryptedDataSourceFactory(SecretKeySpec mSecretKeySpec,IvParameterSpec mIvParameterSpec) {
this.mSecretKeySpec = mSecretKeySpec;
this.mIvParameterSpec = mIvParameterSpec;
mCipher = getCipher();
}

private Cipher getCipher(){
try {
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, mSecretKeySpec, mIvParameterSpec);
return cipher;
}catch (Exception e){
e.printStackTrace();
}
return null;
}



@Override
public EncryptedDataSource createDataSource() {
return new EncryptedDataSource(mCipher, mSecretKeySpec, mIvParameterSpec);
}
}
Loading