package com.limegroup.gnutella.metadata; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import com.limegroup.gnutella.ByteOrder; import com.limegroup.gnutella.util.IOUtils; public class RIFFMetaData extends VideoMetaData { public RIFFMetaData(File f) throws IOException { super(f); } protected void parseFile(File f) throws IOException { InputStream is = null; try { is = new FileInputStream(f); DataInputStream dis = new DataInputStream(is); readRIFFHeader(dis); } finally { IOUtils.close(is); } } private void readRIFFHeader(DataInputStream dis) throws IOException { byte[] dword = new byte[4]; dis.readFully(dword); if (dword[0] != 'R' || dword[1] != 'I' || dword[2] != 'F' || dword[3] != 'F') return; // skip the file size IOUtils.ensureSkip(dis, 4); dis.readFully(dword); if (dword[0] != 'A' || dword[1] != 'V' || dword[2] != 'I' || dword[3] != ' ') return; // skip some more pointless chunk IDs IOUtils.ensureSkip(dis, 12); // begin AVIMAINHEADER // boring data IOUtils.ensureSkip(dis, 8); // read microseconds per frame dis.readFully(dword); int microsPerFrame = ByteOrder.leb2int(dword, 0, 4); // boring data IOUtils.ensureSkip(dis, 12); // read total number of frames dis.readFully(dword); int totalFrames = ByteOrder.leb2int(dword, 0, 4); setLength((short) (1L * microsPerFrame * totalFrames / 1000 )); // boring data IOUtils.ensureSkip(dis, 4); // number of streams dis.readFully(dword); int numStreams = ByteOrder.leb2int(dword, 0, 4); // boring data IOUtils.ensureSkip(dis, 4); // width in pixel dis.readFully(dword); setWidth(ByteOrder.leb2int(dword, 0, 4)); // height in pixel dis.readFully(dword); setHeight(ByteOrder.leb2int(dword, 0, 4)); // reserved stuff IOUtils.ensureSkip(dis, 16); // there are more headers but we are not currently interested in parsing // them } }