Added VideoLog player. Classes in future could be removed. Purpose of this video player is to learn how to decode grabbed H264 video stream from ARDrone 2.0.

Esse commit está contido em:
Denis Shmyga
2013-01-09 20:55:48 +02:00
commit 1c8ade86d5
4 arquivos alterados com 215 adições e 0 exclusões
@@ -0,0 +1,71 @@
package com.codeminders.ardrone.data.reader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.codeminders.ardrone.data.logger.ChannelDataChunk;
public abstract class FileDataReader implements Runnable {
private boolean done;
private Logger log = Logger.getLogger(this.getClass().getName());
File dataFile;
FileInputStream fin;
DataInputStream din;
long lastFrameTime = 0;
public FileDataReader(File dataFile) throws FileNotFoundException {
super();
this.dataFile = dataFile;
fin = new FileInputStream(dataFile);
}
@Override
public void run() {
din = new DataInputStream(fin);
ChannelDataChunk dataChunk = null;
try {
while (!done) {
dataChunk = ChannelDataChunk.readFromStream(din);
if (null == dataChunk.getData()) {
break;
}
if (lastFrameTime > 0 && dataChunk.getIoDelay() > 0) {
Thread.sleep(dataChunk.getIoDelay() - lastFrameTime);
}
lastFrameTime = dataChunk.getIoDelay();
handleData(ByteBuffer.wrap(dataChunk.getData()), dataChunk.getData().length);
}
} catch (IOException e) {
log.log(Level.SEVERE, "DataReading is stoped", e);
} catch (Exception e) {
log.log(Level.SEVERE, "DataReading is stoped", e);
} finally {
try {
fin.close();
} catch (IOException e) {
log.log(Level.SEVERE, "Failed to correctly close input stream", e);
}
}
}
public abstract void handleData(ByteBuffer buf, int len) throws Exception;
public synchronized void finish()
{
done = true;
}
}
@@ -0,0 +1,24 @@
package com.codeminders.ardrone.decoder;
import java.io.File;
import java.io.FileNotFoundException;
import java.nio.ByteBuffer;
import com.codeminders.ardrone.data.decoder.DataDecoder;
import com.codeminders.ardrone.data.reader.FileDataReader;
public class FileDataReaderAndDecoder extends FileDataReader {
DataDecoder dataDecoder;
public FileDataReaderAndDecoder(File dataFile, DataDecoder dataDecoder) throws FileNotFoundException {
super(dataFile);
this.dataDecoder = dataDecoder;
}
@Override
public void handleData(ByteBuffer inbuf, int len) throws Exception {
dataDecoder.decodeData(inbuf, len);
}
}
@@ -0,0 +1,20 @@
package com.codeminders.ardrone.logs.video;
import java.awt.Graphics;
import java.awt.Image;
import javax.swing.JPanel;
public class PlayerFrame extends JPanel {
private static final long serialVersionUID = 5986493337737408886L;
public Image lastFrame;
public void paint(Graphics g) {
Image img = lastFrame;
if(img != null) {
g.drawImage(lastFrame, 0, 0, img.getWidth(this), img.getHeight(this), this);
}
}
}
@@ -0,0 +1,100 @@
package com.codeminders.ardrone.logs.video;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.net.UnknownHostException;
import javax.swing.JFrame;
import com.codeminders.ardrone.ARDrone;
import com.codeminders.ardrone.DroneVideoListener;
import com.codeminders.ardrone.data.decoder.VideoDataDecoder;
import com.codeminders.ardrone.decoder.FileDataReaderAndDecoder;
public class VideoPlayer implements Runnable, DroneVideoListener {
private PlayerFrame displayPanel;
private String fileName;
public Image lastFrame;
ARDrone drone;
public VideoPlayer(String[] args) {
if(args.length < 1) {
return;
} else {
try {
drone = new ARDrone();
} catch (UnknownHostException ex) {
ex.printStackTrace();
System.exit(-1);
}
drone.addImageListener(this);
JFrame frame = new JFrame("Player");
displayPanel = new PlayerFrame();
frame.getContentPane().add(displayPanel, BorderLayout.CENTER);
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
displayPanel.setVisible(true);
frame.pack();
frame.setVisible(true);
frame.setSize(new Dimension(645, 380));
fileName = args[0];
new Thread(this).start();
}
}
public static void main(String[] args) {
new VideoPlayer(args);
}
@Override
public void run() {
try {
File in = new File(fileName);
VideoDataDecoder video_decoder = new VideoDataDecoder(drone, 100 * 1024);
FileDataReaderAndDecoder video_reader = new FileDataReaderAndDecoder(in, video_decoder);
video_decoder.start();
Thread video_reader_thread = new Thread(video_reader);
video_reader_thread.setName("Video Reader");
video_reader_thread.start();
video_reader_thread.join();
video_decoder.finish();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void frameReceived(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize) {
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
image.setRGB(startX, startY, w, h, rgbArray, offset, scansize);
displayPanel.lastFrame = image;
displayPanel.invalidate();
displayPanel.updateUI();
}
}