Skip to content

Commit

Permalink
FEC 10479 - Multicast integraion (#714)
Browse files Browse the repository at this point in the history
* case udp

* multicast support + setup

* Update MulticastSettings.java
  • Loading branch information
giladna committed May 31, 2021
1 parent 72dcb06 commit 9363b8f
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 0 deletions.
9 changes: 9 additions & 0 deletions playkit/src/main/java/com/kaltura/playkit/Player.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import com.kaltura.playkit.player.ABRSettings;
import com.kaltura.playkit.player.LoadControlBuffers;
import com.kaltura.playkit.player.MulticastSettings;
import com.kaltura.playkit.player.PKAspectRatioResizeMode;
import com.kaltura.playkit.player.PKLowLatencyConfig;
import com.kaltura.playkit.player.PKMaxVideoSize;
Expand Down Expand Up @@ -341,6 +342,14 @@ interface Settings {
*/
Settings setMaxAudioChannelCount(int maxAudioChannelCount);

/**
* Sets the multicastSettings for udp streams.
*
* @param multicastSettings - maxPacketSize default = 3000 & socketTimeoutMillis default = 10000
* @return - Player Settings
*/
Settings setMulticastSettings(MulticastSettings multicastSettings);

/**
* If the device codec is known to fail if security level L1 is used
* then set flag to true, it will force the player to use Widevine L3
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@
import com.kaltura.android.exoplayer2.drm.DrmSessionManager;
import com.kaltura.android.exoplayer2.drm.DrmSessionManagerProvider;
import com.kaltura.android.exoplayer2.ext.okhttp.OkHttpDataSource;
import com.kaltura.android.exoplayer2.extractor.ExtractorsFactory;
import com.kaltura.android.exoplayer2.extractor.ts.DefaultTsPayloadReaderFactory;
import com.kaltura.android.exoplayer2.extractor.ts.TsExtractor;
import com.kaltura.android.exoplayer2.mediacodec.MediaCodecRenderer;
import com.kaltura.android.exoplayer2.mediacodec.MediaCodecUtil;
import com.kaltura.android.exoplayer2.metadata.Metadata;
Expand Down Expand Up @@ -71,6 +74,8 @@
import com.kaltura.android.exoplayer2.upstream.HttpDataSource;
import com.kaltura.android.exoplayer2.upstream.TeeDataSource;
import com.kaltura.android.exoplayer2.upstream.TransferListener;
import com.kaltura.android.exoplayer2.upstream.UdpDataSource;
import com.kaltura.android.exoplayer2.util.TimestampAdjuster;
import com.kaltura.android.exoplayer2.video.CustomLoadControl;

import com.kaltura.playkit.*;
Expand Down Expand Up @@ -501,6 +506,22 @@ public void onTransferEnd(@NonNull DataSource dataSource, @NonNull DataSpec data
.createMediaSource(mediaItem);
break;

case udp:
MulticastSettings multicastSettings = (playerSettings != null) ? playerSettings.getMulticastSettings() : new MulticastSettings();
if (multicastSettings.getUseExoDefaultSettings()) {
mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory)
.createMediaSource(mediaItem);
} else {
DataSource.Factory udpDatasourceFactory = () -> new UdpDataSource(multicastSettings.getMaxPacketSize(), multicastSettings.getSocketTimeoutMillis());
ExtractorsFactory tsExtractorFactory = () -> new TsExtractor[]{
new TsExtractor(multicastSettings.getExtractorMode().mode,
new TimestampAdjuster(0), new DefaultTsPayloadReaderFactory())
};
mediaSource = new ProgressiveMediaSource.Factory(udpDatasourceFactory, tsExtractorFactory)
.createMediaSource(mediaItem);
}
break;

default:
throw new IllegalArgumentException("Unknown media format: " + format + " for url: " + requestParams.url);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
package com.kaltura.playkit.player;

public class MulticastSettings {

private boolean useExoDefaultSettings = true;
// maxPacketSize The maximum datagram packet size, in bytes.
private int maxPacketSize = 3000;
// socketTimeoutMillis The socket timeout in milliseconds. A timeout of zero is interpreted
private int socketTimeoutMillis = 10000;

private ExtractorMode extractorMode = ExtractorMode.MODE_MULTI_PMT;

enum ExtractorMode {
MODE_MULTI_PMT(0),
MODE_SINGLE_PMT(1),
MODE_HLS(2);

public final int mode;
ExtractorMode(int mode) {
this.mode = mode;
}
}

public MulticastSettings() {}

public boolean getUseExoDefaultSettings() {
return useExoDefaultSettings;
}

public int getMaxPacketSize() {
return maxPacketSize;
}

public MulticastSettings setUseExoDefaultSettings(boolean useExoDefaultSettings) {
this.useExoDefaultSettings = useExoDefaultSettings;
return this;
}

public MulticastSettings setMaxPacketSize(int maxPacketSize) {
this.maxPacketSize = maxPacketSize;
this.useExoDefaultSettings = false;
return this;
}

public int getSocketTimeoutMillis() {
return socketTimeoutMillis;
}

public MulticastSettings setSocketTimeoutMillis(int socketTimeoutMillis) {
this.socketTimeoutMillis = socketTimeoutMillis;
this.useExoDefaultSettings = false;
return this;
}

public ExtractorMode getExtractorMode() {
return extractorMode;
}

public MulticastSettings setExtractorMode(ExtractorMode extractorMode) {
if (extractorMode != null) {
this.extractorMode = extractorMode;
}
this.useExoDefaultSettings = false;
return this;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public class PlayerSettings implements Player.Settings {
private Integer maxAudioBitrate;
private int maxAudioChannelCount = -1;

private MulticastSettings multicastSettings = new MulticastSettings();
private LoadControlBuffers loadControlBuffers = new LoadControlBuffers();
private SubtitleStyleSettings subtitleStyleSettings;
private PKAspectRatioResizeMode resizeMode = PKAspectRatioResizeMode.fit;
Expand Down Expand Up @@ -123,6 +124,10 @@ public PKTrackConfig getPreferredAudioTrackConfig() {
return preferredAudioTrackConfig;
}

public MulticastSettings getMulticastSettings() {
return multicastSettings;
}

public PKMediaFormat getPreferredMediaFormat() {
return preferredMediaFormat;
}
Expand Down Expand Up @@ -423,12 +428,21 @@ public Player.Settings setMaxAudioBitrate(Integer maxAudioBitrate) {
return this;
}


@Override
public Player.Settings setMaxAudioChannelCount(int maxAudioChannelCount) {
this.maxAudioChannelCount = maxAudioChannelCount;
return this;
}

@Override
public Player.Settings setMulticastSettings(MulticastSettings multicastSettings) {
if (multicastSettings != null) {
this.multicastSettings = multicastSettings;
}
return this;
}

@Override
public Player.Settings forceWidevineL3Playback(boolean forceWidevineL3Playback) {
this.forceWidevineL3Playback = forceWidevineL3Playback;
Expand Down

0 comments on commit 9363b8f

Please sign in to comment.