From b1e72f9bcfa6d945f4f1f704a5bfcd2aa3905b50 Mon Sep 17 00:00:00 2001 From: Iwan Timmer Date: Mon, 9 Mar 2015 12:24:44 +0100 Subject: [PATCH] Update to new VideoDecoderRenderer API --- src/com/limelight/Limelight.java | 6 +- .../limelight/binding/PlatformBinding.java | 6 +- .../binding/video/AbstractVideoRenderer.java | 93 ------------------- .../binding/video/FakeVideoRenderer.java | 19 +++- .../binding/video/ImxDecoderRenderer.java | 20 +++- .../binding/video/OmxDecoderRenderer.java | 19 +++- 6 files changed, 51 insertions(+), 112 deletions(-) delete mode 100644 src/com/limelight/binding/video/AbstractVideoRenderer.java diff --git a/src/com/limelight/Limelight.java b/src/com/limelight/Limelight.java index dc8d371..56cc74f 100644 --- a/src/com/limelight/Limelight.java +++ b/src/com/limelight/Limelight.java @@ -56,7 +56,7 @@ public class Limelight implements NvConnectionListener { /* * Creates a connection to the host and starts up the stream. */ - private void startUp(StreamConfiguration streamConfig, List inputs, String mappingFile, String audioDevice, boolean tests, boolean debug) { + private void startUp(StreamConfiguration streamConfig, List inputs, String mappingFile, String audioDevice, boolean tests) { if (tests) { boolean test = true; String vm = System.getProperties().getProperty("java.vm.name"); @@ -105,7 +105,7 @@ public class Limelight implements NvConnectionListener { conn.start(PlatformBinding.getDeviceName(), null, VideoDecoderRenderer.FLAG_PREFER_QUALITY, PlatformBinding.getAudioRenderer(audioDevice), - PlatformBinding.getVideoDecoderRenderer(debug)); + PlatformBinding.getVideoDecoderRenderer()); } /* @@ -405,7 +405,7 @@ public class Limelight implements NvConnectionListener { if (action.equals("fake")) limelight.startUpFake(streamConfig, video); else - limelight.startUp(streamConfig, inputs, mapping, audio, tests, debug.intValue() <= Level.WARNING.intValue()); + limelight.startUp(streamConfig, inputs, mapping, audio, tests); } else if (action.equals("pair")) limelight.pair(); else if (action.equals("list")) diff --git a/src/com/limelight/binding/PlatformBinding.java b/src/com/limelight/binding/PlatformBinding.java index 7f6153c..3657c88 100644 --- a/src/com/limelight/binding/PlatformBinding.java +++ b/src/com/limelight/binding/PlatformBinding.java @@ -11,7 +11,6 @@ import com.limelight.binding.video.ImxDecoderRenderer; import com.limelight.binding.crypto.PcCryptoProvider; import com.limelight.binding.video.OmxDecoder; import com.limelight.binding.video.OmxDecoderRenderer; -import com.limelight.binding.video.AbstractVideoRenderer; import com.limelight.nvstream.av.audio.AudioDecoderRenderer; import com.limelight.nvstream.av.video.VideoDecoderRenderer; import com.limelight.nvstream.http.LimelightCryptoProvider; @@ -27,14 +26,13 @@ public class PlatformBinding { * Gets an instance of a video decoder/renderer. * @return a video decoder and renderer */ - public static VideoDecoderRenderer getVideoDecoderRenderer(boolean debug) { - AbstractVideoRenderer renderer = null; + public static VideoDecoderRenderer getVideoDecoderRenderer() { + VideoDecoderRenderer renderer = null; if (OmxDecoder.load()) renderer = new OmxDecoderRenderer(); else if (ImxDecoder.load()) renderer = new ImxDecoderRenderer(); - renderer.debug = debug; return renderer; } diff --git a/src/com/limelight/binding/video/AbstractVideoRenderer.java b/src/com/limelight/binding/video/AbstractVideoRenderer.java deleted file mode 100644 index 63ebaa8..0000000 --- a/src/com/limelight/binding/video/AbstractVideoRenderer.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.limelight.binding.video; - -import com.limelight.LimeLog; -import com.limelight.nvstream.av.DecodeUnit; -import com.limelight.nvstream.av.video.VideoDecoderRenderer; -import com.limelight.nvstream.av.video.VideoDepacketizer; - -/** - * Abstract implementation of a video decoder. - * @author Iwan Timmer - */ -public abstract class AbstractVideoRenderer implements VideoDecoderRenderer { - - private Thread thread; - private boolean running; - - private int dataSize; - private long last; - - private long endToEndLatency; - private long decodeLatency; - private long packets; - private long maxLatency; - - public boolean debug; - - @Override - public boolean start(final VideoDepacketizer depacketizer) { - last = System.currentTimeMillis(); - thread = new Thread(new Runnable() { - @Override - public void run() { - while (running) { - try { - DecodeUnit decodeUnit = depacketizer.takeNextDecodeUnit(); - long latency = System.currentTimeMillis()-decodeUnit.getReceiveTimestamp(); - endToEndLatency += latency; - - dataSize += decodeUnit.getDataLength(); - decodeUnit(decodeUnit); - - latency = System.currentTimeMillis()-decodeUnit.getReceiveTimestamp(); - decodeLatency += latency; - - if (latency>maxLatency) - maxLatency = latency; - - if (debug && System.currentTimeMillis()>last+2000) { - int bitrate = (dataSize/2)/1024; - System.out.println("Video " + bitrate + "kB/s " + maxLatency + "ms"); - maxLatency = 0; - dataSize = 0; - last = System.currentTimeMillis(); - } - depacketizer.freeDecodeUnit(decodeUnit); - } catch (InterruptedException ex) { } - } - } - }); - running = true; - thread.start(); - return true; - } - - @Override - public void stop() { - running = false; - thread.interrupt(); - try { - thread.join(); - } catch (InterruptedException ex) { - LimeLog.severe(ex.getMessage()); - } - } - - public abstract void decodeUnit(DecodeUnit decodeUnit); - - @Override - public int getCapabilities() { - return 0; - } - - @Override - public int getAverageEndToEndLatency() { - return (int) (endToEndLatency / packets); - } - - @Override - public int getAverageDecoderLatency() { - return (int) (decodeLatency / packets); - } - -} diff --git a/src/com/limelight/binding/video/FakeVideoRenderer.java b/src/com/limelight/binding/video/FakeVideoRenderer.java index b44ad23..52071b6 100644 --- a/src/com/limelight/binding/video/FakeVideoRenderer.java +++ b/src/com/limelight/binding/video/FakeVideoRenderer.java @@ -3,6 +3,8 @@ package com.limelight.binding.video; import com.limelight.LimeLog; import com.limelight.nvstream.av.ByteBufferDescriptor; import com.limelight.nvstream.av.DecodeUnit; +import com.limelight.nvstream.av.video.VideoDecoderRenderer; +import com.limelight.nvstream.av.video.VideoDepacketizer; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; @@ -12,13 +14,12 @@ import java.io.OutputStream; * Implementation of a video decoder and renderer. * @author Iwan Timmer */ -public class FakeVideoRenderer extends AbstractVideoRenderer { +public class FakeVideoRenderer extends VideoDecoderRenderer { private OutputStream out; public FakeVideoRenderer(String videoFile) { try { - this.debug = true; if (videoFile!=null) out = new FileOutputStream(videoFile); } catch (FileNotFoundException e) { @@ -34,8 +35,6 @@ public class FakeVideoRenderer extends AbstractVideoRenderer { @Override public void stop() { - super.stop(); - try { if (out!=null) out.close(); @@ -49,7 +48,7 @@ public class FakeVideoRenderer extends AbstractVideoRenderer { } @Override - public void decodeUnit(DecodeUnit decodeUnit) { + public void directSubmitDecodeUnit(DecodeUnit decodeUnit) { if (out!=null) { try { for (ByteBufferDescriptor buf:decodeUnit.getBufferList()) @@ -59,5 +58,15 @@ public class FakeVideoRenderer extends AbstractVideoRenderer { } } } + + @Override + public boolean start(VideoDepacketizer depacketizer) { + throw new UnsupportedOperationException("CAPABILITY_DIRECT_SUBMIT requires directSubmitDecodeUnit()"); + } + + @Override + public int getCapabilities() { + return CAPABILITY_DIRECT_SUBMIT; + } } diff --git a/src/com/limelight/binding/video/ImxDecoderRenderer.java b/src/com/limelight/binding/video/ImxDecoderRenderer.java index a52229a..2b7b209 100644 --- a/src/com/limelight/binding/video/ImxDecoderRenderer.java +++ b/src/com/limelight/binding/video/ImxDecoderRenderer.java @@ -3,6 +3,8 @@ package com.limelight.binding.video; import com.limelight.LimeLog; import com.limelight.nvstream.av.ByteBufferDescriptor; import com.limelight.nvstream.av.DecodeUnit; +import com.limelight.nvstream.av.video.VideoDecoderRenderer; +import com.limelight.nvstream.av.video.VideoDepacketizer; import java.util.List; @@ -10,7 +12,7 @@ import java.util.List; * Implementation of a video decoder and renderer. * @author Iwan Timmer */ -public class ImxDecoderRenderer extends AbstractVideoRenderer { +public class ImxDecoderRenderer extends VideoDecoderRenderer { @Override public boolean setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { @@ -21,9 +23,12 @@ public class ImxDecoderRenderer extends AbstractVideoRenderer { public void release() { ImxDecoder.destroy(); } + + @Override + public void stop() { } @Override - public void decodeUnit(DecodeUnit decodeUnit) { + public void directSubmitDecodeUnit(DecodeUnit decodeUnit) { List units = decodeUnit.getBufferList(); boolean ok = true; @@ -38,4 +43,15 @@ public class ImxDecoderRenderer extends AbstractVideoRenderer { } } } + + @Override + public boolean start(VideoDepacketizer depacketizer) { + throw new UnsupportedOperationException("CAPABILITY_DIRECT_SUBMIT requires directSubmitDecodeUnit()"); + } + + @Override + public int getCapabilities() { + return CAPABILITY_DIRECT_SUBMIT; + } + } diff --git a/src/com/limelight/binding/video/OmxDecoderRenderer.java b/src/com/limelight/binding/video/OmxDecoderRenderer.java index 6c1b5eb..396ac22 100644 --- a/src/com/limelight/binding/video/OmxDecoderRenderer.java +++ b/src/com/limelight/binding/video/OmxDecoderRenderer.java @@ -3,6 +3,8 @@ package com.limelight.binding.video; import com.limelight.LimeLog; import com.limelight.nvstream.av.ByteBufferDescriptor; import com.limelight.nvstream.av.DecodeUnit; +import com.limelight.nvstream.av.video.VideoDecoderRenderer; +import com.limelight.nvstream.av.video.VideoDepacketizer; import org.jcodec.codecs.h264.io.model.SeqParameterSet; import org.jcodec.codecs.h264.io.model.VUIParameters; @@ -14,10 +16,8 @@ import java.nio.ByteBuffer; * Implementation of a video decoder and renderer. * @author Iwan Timmer */ -public class OmxDecoderRenderer extends AbstractVideoRenderer { +public class OmxDecoderRenderer extends VideoDecoderRenderer { - private final static byte[] BITSTREAM_RESTRICTIONS = new byte[] {(byte) 0xF1, (byte) 0x83, 0x2A, 0x00}; - @Override public boolean setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) { return OmxDecoder.init() == 0; @@ -25,7 +25,6 @@ public class OmxDecoderRenderer extends AbstractVideoRenderer { @Override public void stop() { - super.stop(); OmxDecoder.stop(); } @@ -35,7 +34,7 @@ public class OmxDecoderRenderer extends AbstractVideoRenderer { } @Override - public void decodeUnit(DecodeUnit decodeUnit) { + public void directSubmitDecodeUnit(DecodeUnit decodeUnit) { List units = decodeUnit.getBufferList(); ByteBufferDescriptor header = units.get(0); @@ -87,4 +86,14 @@ public class OmxDecoderRenderer extends AbstractVideoRenderer { } } } + + @Override + public boolean start(VideoDepacketizer depacketizer) { + throw new UnsupportedOperationException("CAPABILITY_DIRECT_SUBMIT requires directSubmitDecodeUnit()"); + } + + @Override + public int getCapabilities() { + return CAPABILITY_DIRECT_SUBMIT; + } }