From 9ba0627e74e49d2b009be81b27d5040d696495db Mon Sep 17 00:00:00 2001 From: Gilad Nadav Date: Sun, 30 May 2021 23:23:04 +0300 Subject: [PATCH 1/6] case udp --- .../playkit/player/ExoPlayerWrapper.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java b/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java index 1ac9b7797..2f04659f4 100644 --- a/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java +++ b/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java @@ -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; @@ -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.*; @@ -497,10 +502,23 @@ public void onTransferEnd(@NonNull DataSource dataSource, @NonNull DataSpec data // mp4 and mp3 both use ExtractorMediaSource case mp4: case mp3: + //case udp: mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem); break; + case udp: + int MODE_SINGLE_PMT = 1; + DataSource.Factory udpDatasourceFactory = () -> new UdpDataSource(300000, 100000); + ExtractorsFactory tsExtractorFactory = () -> new TsExtractor[] { + new TsExtractor(MODE_SINGLE_PMT, + 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); } From e7dcc57babcbaa6b8bd3b04dfa53f743908284a7 Mon Sep 17 00:00:00 2001 From: Gilad Nadav Date: Mon, 31 May 2021 08:01:16 +0300 Subject: [PATCH 2/6] multicast support + setup --- .../main/java/com/kaltura/playkit/Player.java | 9 +++ .../playkit/player/ExoPlayerWrapper.java | 23 ++++--- .../playkit/player/MulticastSettings.java | 63 +++++++++++++++++++ .../playkit/player/PlayerSettings.java | 14 +++++ 4 files changed, 99 insertions(+), 10 deletions(-) create mode 100644 playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java diff --git a/playkit/src/main/java/com/kaltura/playkit/Player.java b/playkit/src/main/java/com/kaltura/playkit/Player.java index 1202f8a11..c2d222790 100644 --- a/playkit/src/main/java/com/kaltura/playkit/Player.java +++ b/playkit/src/main/java/com/kaltura/playkit/Player.java @@ -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; @@ -341,6 +342,14 @@ interface Settings { */ Settings setMaxAudioChannelCount(int maxAudioChannelCount); + /** + * Sets the multicastSettings for udp streams. + * + * @param multicastSettings - maxPacketSize default = 3000 & socketTimeoutMillis default = 100000 + * @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 diff --git a/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java b/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java index 2f04659f4..b397a9eca 100644 --- a/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java +++ b/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java @@ -502,21 +502,24 @@ public void onTransferEnd(@NonNull DataSource dataSource, @NonNull DataSpec data // mp4 and mp3 both use ExtractorMediaSource case mp4: case mp3: - //case udp: mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem); break; case udp: - int MODE_SINGLE_PMT = 1; - DataSource.Factory udpDatasourceFactory = () -> new UdpDataSource(300000, 100000); - ExtractorsFactory tsExtractorFactory = () -> new TsExtractor[] { - new TsExtractor(MODE_SINGLE_PMT, - new TimestampAdjuster(0), new DefaultTsPayloadReaderFactory()) - }; - - mediaSource = new ProgressiveMediaSource.Factory(udpDatasourceFactory, tsExtractorFactory) - .createMediaSource(mediaItem); + MulticastSettings multicastSettings = playerSettings.getMulticastSettings(); + 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: diff --git a/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java b/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java new file mode 100644 index 000000000..ce316c700 --- /dev/null +++ b/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java @@ -0,0 +1,63 @@ +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 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; + } +} \ No newline at end of file diff --git a/playkit/src/main/java/com/kaltura/playkit/player/PlayerSettings.java b/playkit/src/main/java/com/kaltura/playkit/player/PlayerSettings.java index c4030c141..691e6c919 100644 --- a/playkit/src/main/java/com/kaltura/playkit/player/PlayerSettings.java +++ b/playkit/src/main/java/com/kaltura/playkit/player/PlayerSettings.java @@ -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; @@ -123,6 +124,10 @@ public PKTrackConfig getPreferredAudioTrackConfig() { return preferredAudioTrackConfig; } + public MulticastSettings getMulticastSettings() { + return multicastSettings; + } + public PKMediaFormat getPreferredMediaFormat() { return preferredMediaFormat; } @@ -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; From 0f67f019736c725eba525c24164ea9518cee38bc Mon Sep 17 00:00:00 2001 From: GouravSna <38206744+GouravSna@users.noreply.github.com> Date: Mon, 31 May 2021 11:15:57 +0530 Subject: [PATCH 3/6] Update MulticastSettings.java --- .../java/com/kaltura/playkit/player/MulticastSettings.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java b/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java index ce316c700..29f0673cd 100644 --- a/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java +++ b/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java @@ -9,9 +9,7 @@ public class MulticastSettings { private int socketTimeoutMillis = 10000; private ExtractorMode extractorMode = ExtractorMode.MODE_MULTI_PMT; - - - + enum ExtractorMode { MODE_MULTI_PMT(0), MODE_SINGLE_PMT(1), @@ -60,4 +58,4 @@ public MulticastSettings setExtractorMode(ExtractorMode extractorMode) { this.useExoDefaultSettings = false; return this; } -} \ No newline at end of file +} From 266638a946f8dd9115c3ff0bb991e5eecdc3ebf2 Mon Sep 17 00:00:00 2001 From: GouravSna <38206744+GouravSna@users.noreply.github.com> Date: Mon, 31 May 2021 11:18:15 +0530 Subject: [PATCH 4/6] Updated javadoc with correct timeout values --- playkit/src/main/java/com/kaltura/playkit/Player.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playkit/src/main/java/com/kaltura/playkit/Player.java b/playkit/src/main/java/com/kaltura/playkit/Player.java index c2d222790..6bac92818 100644 --- a/playkit/src/main/java/com/kaltura/playkit/Player.java +++ b/playkit/src/main/java/com/kaltura/playkit/Player.java @@ -345,7 +345,7 @@ interface Settings { /** * Sets the multicastSettings for udp streams. * - * @param multicastSettings - maxPacketSize default = 3000 & socketTimeoutMillis default = 100000 + * @param multicastSettings - maxPacketSize default = 3000 & socketTimeoutMillis default = 10000 * @return - Player Settings */ Settings setMulticastSettings(MulticastSettings multicastSettings); From c1d901636c7500368120ac255c4f12b9b34bd1ed Mon Sep 17 00:00:00 2001 From: Gilad Nadav Date: Mon, 31 May 2021 10:00:14 +0300 Subject: [PATCH 5/6] null protection --- .../main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java b/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java index b397a9eca..83fbd0856 100644 --- a/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java +++ b/playkit/src/main/java/com/kaltura/playkit/player/ExoPlayerWrapper.java @@ -507,7 +507,7 @@ public void onTransferEnd(@NonNull DataSource dataSource, @NonNull DataSpec data break; case udp: - MulticastSettings multicastSettings = playerSettings.getMulticastSettings(); + MulticastSettings multicastSettings = (playerSettings != null) ? playerSettings.getMulticastSettings() : new MulticastSettings(); if (multicastSettings.getUseExoDefaultSettings()) { mediaSource = new ProgressiveMediaSource.Factory(dataSourceFactory) .createMediaSource(mediaItem); From d9bc1588d4145346a75ad2ad5ccfd6b46228d42d Mon Sep 17 00:00:00 2001 From: Gilad Nadav Date: Mon, 31 May 2021 12:06:05 +0300 Subject: [PATCH 6/6] expose setUseExoDefaultSettings on MulticastSettings --- .../java/com/kaltura/playkit/player/MulticastSettings.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java b/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java index 29f0673cd..92f867a9c 100644 --- a/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java +++ b/playkit/src/main/java/com/kaltura/playkit/player/MulticastSettings.java @@ -9,7 +9,7 @@ public class MulticastSettings { private int socketTimeoutMillis = 10000; private ExtractorMode extractorMode = ExtractorMode.MODE_MULTI_PMT; - + enum ExtractorMode { MODE_MULTI_PMT(0), MODE_SINGLE_PMT(1), @@ -31,6 +31,11 @@ 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;