package org.jaudiotagger.audio.real;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.RandomAccessFile;
import org.jaudiotagger.audio.exceptions.CannotReadException;
import org.jaudiotagger.audio.generic.Utils;
public class RealChunk {
protected static final String RMF = ".RMF";
protected static final String PROP = "PROP";
protected static final String MDPR = "MDPR";
protected static final String CONT = "CONT";
protected static final String DATA = "DATA";
protected static final String INDX = "INDX";
private final String id;
private final int size;
private final byte[] bytes;
public static RealChunk readChunk(RandomAccessFile raf)
throws CannotReadException, IOException {
final String id = Utils.readString(raf, 4);
final int size = Utils.readUint32AsInt(raf);
if (size < 8) {
throw new CannotReadException(
"Corrupt file: RealAudio chunk length at position "
+ (raf.getFilePointer() - 4)
+ " cannot be less than 8");
}
if (size > (raf.length() - raf.getFilePointer() + 8)) {
throw new CannotReadException(
"Corrupt file: RealAudio chunk length of " + size
+ " at position " + (raf.getFilePointer() - 4)
+ " extends beyond the end of the file");
}
final byte[] bytes = new byte[size - 8];
raf.readFully(bytes);
return new RealChunk(id, size, bytes);
}
public RealChunk(String id, int size, byte[] bytes) {
super();
this.id = id;
this.size = size;
this.bytes = bytes;
}
public DataInputStream getDataInputStream() {
return new DataInputStream(new ByteArrayInputStream(getBytes()));
}
public boolean isCONT() {
return CONT.equals(id);
}
public boolean isPROP() {
return PROP.equals(id);
}
public byte[] getBytes() {
return bytes;
}
public String getId() {
return id;
}
public int getSize() {
return size;
}
@Override
public String toString() {
return id + "\t" + size;
}
}
|