package org.jaudiotagger.tag.mp4.field; import org.jaudiotagger.audio.generic.Utils; import org.jaudiotagger.audio.mp4.atom.Mp4BoxHeader; import org.jaudiotagger.tag.TagField; import org.jaudiotagger.tag.mp4.Mp4TagField; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; /** * Represents raw binary data * <p/> * <p>We use this when we find an atom under the ilst atom that we do not recognise , that does not * follow standard conventions in order to save the data without modification so it can be safetly * written back to file */ public class Mp4TagRawBinaryField extends Mp4TagField { protected int dataSize; protected byte[] dataBytes; /** * Construct binary field from rawdata of audio file * * @param header * @param raw * @throws java.io.UnsupportedEncodingException * */ public Mp4TagRawBinaryField(Mp4BoxHeader header, ByteBuffer raw) throws UnsupportedEncodingException { super(header.getId()); dataSize = header.getDataLength(); build(raw); } public Mp4FieldType getFieldType() { return Mp4FieldType.IMPLICIT; } /** * Used when creating raw content * * @return * @throws java.io.UnsupportedEncodingException * */ protected byte[] getDataBytes() throws UnsupportedEncodingException { return dataBytes; } /** * Build from data * <p/> * <p>After returning buffers position will be after the end of this atom * * @param raw */ protected void build(ByteBuffer raw) { //Read the raw data into byte array this.dataBytes = new byte[dataSize]; for (int i = 0; i < dataBytes.length; i++) { this.dataBytes[i] = raw.get(); } } public boolean isBinary() { return true; } public boolean isEmpty() { return this.dataBytes.length == 0; } public int getDataSize() { return dataSize; } public byte[] getData() { return this.dataBytes; } public void setData(byte[] d) { this.dataBytes = d; } public void copyContent(TagField field) { throw new UnsupportedOperationException("not done"); } public byte[] getRawContent() throws UnsupportedEncodingException { //logger.fine("Getting Raw data for:" + getId()); try { ByteArrayOutputStream outerbaos = new ByteArrayOutputStream(); outerbaos.write(Utils.getSizeBEInt32(Mp4BoxHeader.HEADER_LENGTH + dataSize)); outerbaos.write(Utils.getDefaultBytes(getId(), "ISO-8859-1")); outerbaos.write(dataBytes); System.out.println("SIZE" + outerbaos.size()); return outerbaos.toByteArray(); } catch (IOException ioe) { //This should never happen as were not actually writing to/from a file throw new RuntimeException(ioe); } } }