Update to new VideoDecoderRenderer API

This commit is contained in:
Iwan Timmer
2015-03-09 12:24:44 +01:00
parent 40508c2ac2
commit b1e72f9bcf
6 changed files with 51 additions and 112 deletions

View File

@@ -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<String> inputs, String mappingFile, String audioDevice, boolean tests, boolean debug) {
private void startUp(StreamConfiguration streamConfig, List<String> 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"))

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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<ByteBufferDescriptor> 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;
}
}

View File

@@ -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<ByteBufferDescriptor> 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;
}
}