Share some code between the fake and OMX video decoder

This commit is contained in:
Iwan Timmer
2014-06-25 23:48:50 +02:00
parent c402c87805
commit 0ce21aaa86
3 changed files with 73 additions and 78 deletions

View File

@@ -0,0 +1,65 @@
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;
@Override
public void start(final VideoDepacketizer depacketizer) {
last = System.currentTimeMillis();
thread = new Thread(new Runnable() {
@Override
public void run() {
while (running) {
try {
DecodeUnit decodeUnit = depacketizer.takeNextDecodeUnit();
dataSize += decodeUnit.getDataLength();
decodeUnit(decodeUnit);
if (System.currentTimeMillis()>last+2000) {
int bitrate = (dataSize/2)/1024;
System.out.println("Video " + bitrate + "kB/s");
dataSize = 0;
last = System.currentTimeMillis();
}
} catch (InterruptedException ex) { }
}
}
});
running = true;
thread.start();
}
@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;
}
}

View File

@@ -3,8 +3,6 @@ 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;
@@ -14,14 +12,8 @@ import java.io.OutputStream;
* Implementation of a video decoder and renderer.
* @author Iwan Timmer
*/
public class FakeVideoRenderer implements VideoDecoderRenderer {
private Thread thread;
private boolean running;
public class FakeVideoRenderer extends AbstractVideoRenderer {
private int dataSize;
private long last;
private OutputStream out;
public FakeVideoRenderer(String videoFile) {
@@ -38,33 +30,10 @@ public class FakeVideoRenderer implements VideoDecoderRenderer {
System.out.println("Fake " + width + "x" + height + " " + redrawRate + "fps video output");
}
@Override
public void start(final VideoDepacketizer depacketizer) {
last = System.currentTimeMillis();
thread = new Thread(new Runnable() {
@Override
public void run() {
while (running) {
try {
decodeUnit(depacketizer.takeNextDecodeUnit());
} catch (InterruptedException ex) { }
}
}
});
running = true;
thread.start();
}
@Override
public void stop() {
running = false;
thread.interrupt();
try {
thread.join();
} catch (InterruptedException ex) {
LimeLog.severe(ex.getMessage());
}
super.stop();
try {
if (out!=null)
out.close();
@@ -77,31 +46,16 @@ public class FakeVideoRenderer implements VideoDecoderRenderer {
public void release() {
}
public boolean decodeUnit(DecodeUnit decodeUnit) {
if (System.currentTimeMillis()>last+2000) {
int bitrate = (dataSize/2)/1024;
System.out.println("Video " + bitrate + "kB/s");
dataSize = 0;
last = System.currentTimeMillis();
}
dataSize += decodeUnit.getDataLength();
@Override
public void decodeUnit(DecodeUnit decodeUnit) {
if (out!=null) {
try {
for (ByteBufferDescriptor buf:decodeUnit.getBufferList())
out.write(buf.data, buf.offset, buf.length);
} catch (IOException e) {
LimeLog.severe(e.getMessage());
return false;
}
}
return true;
}
@Override
public int getCapabilities() {
return 0;
}
}

View File

@@ -2,8 +2,6 @@ package com.limelight.binding.video;
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;
@@ -11,12 +9,9 @@ import java.util.List;
* Implementation of a video decoder and renderer.
* @author Iwan Timmer
*/
public class OmxDecoderRenderer implements VideoDecoderRenderer {
public class OmxDecoderRenderer extends AbstractVideoRenderer {
private final static byte[] BITSTREAM_RESTRICTIONS = new byte[] {(byte) 0xF1, (byte) 0x83, 0x2A, 0x00};
private Thread thread;
private boolean running;
@Override
public void setup(int width, int height, int redrawRate, Object renderTarget, int drFlags) {
@@ -25,24 +20,9 @@ public class OmxDecoderRenderer implements VideoDecoderRenderer {
throw new IllegalStateException("AVC decoder initialization failure: "+err);
}
@Override
public void start(final VideoDepacketizer depacketizer) {
thread = new Thread(new Runnable() {
@Override
public void run() {
while (running) {
try {
decodeUnit(depacketizer.takeNextDecodeUnit());
} catch (InterruptedException ex) { }
}
}
});
running = true;
thread.start();
}
@Override
public void stop() {
super.stop();
OmxDecoder.stop();
}
@@ -51,6 +31,7 @@ public class OmxDecoderRenderer implements VideoDecoderRenderer {
OmxDecoder.destroy();
}
@Override
public void decodeUnit(DecodeUnit decodeUnit) {
List<ByteBufferDescriptor> units = decodeUnit.getBufferList();
@@ -72,11 +53,6 @@ public class OmxDecoderRenderer implements VideoDecoderRenderer {
}
}
@Override
public int getCapabilities() {
return 0;
}
/**
* Replace bits in array
* @param source array in which bits should be replaced