Coverage Report - org.jaudiotagger.audio.real.RealFileReader
 
Classes in this File Line Coverage Branch Coverage Complexity
RealFileReader
100%
40/40
60%
6/10
0
 
 1  
 package org.jaudiotagger.audio.real;
 2  
 
 3  
 import org.jaudiotagger.audio.exceptions.CannotReadException;
 4  
 import org.jaudiotagger.audio.generic.AudioFileReader;
 5  
 import org.jaudiotagger.audio.generic.GenericAudioHeader;
 6  
 import org.jaudiotagger.audio.generic.GenericTag;
 7  
 import org.jaudiotagger.audio.generic.Utils;
 8  
 import org.jaudiotagger.tag.Tag;
 9  
 
 10  
 import java.io.DataInputStream;
 11  
 import java.io.IOException;
 12  
 import java.io.RandomAccessFile;
 13  
 
 14  
 /**
 15  
  * Real Media File Format: Major Chunks: .RMF PROP MDPR CONT DATA INDX
 16  
  */
 17  42
 public class RealFileReader extends AudioFileReader
 18  
 {
 19  
 
 20  
     @Override
 21  
     protected GenericAudioHeader getEncodingInfo(RandomAccessFile raf) throws CannotReadException, IOException
 22  
     {
 23  13
         final GenericAudioHeader rv = new GenericAudioHeader();
 24  13
         final RealChunk prop = findPropChunk(raf);
 25  13
         final DataInputStream dis = prop.getDataInputStream();
 26  13
         final int objVersion = Utils.readUint16(dis);
 27  13
         if (objVersion == 0)
 28  
         {
 29  13
             final long maxBitRate = Utils.readUint32(dis) / 1000;
 30  13
             final long avgBitRate = Utils.readUint32(dis) / 1000;
 31  13
             final long maxPacketSize = Utils.readUint32(dis);
 32  13
             final long avgPacketSize = Utils.readUint32(dis);
 33  13
             final long packetCnt = Utils.readUint32(dis);
 34  13
             final int duration = Utils.readUint32AsInt(dis) / 1000;
 35  13
             final long preroll = Utils.readUint32(dis);
 36  13
             final long indexOffset = Utils.readUint32(dis);
 37  13
             final long dataOffset = Utils.readUint32(dis);
 38  13
             final int numStreams = Utils.readUint16(dis);
 39  13
             final int flags = Utils.readUint16(dis);
 40  13
             rv.setBitrate((int) avgBitRate);
 41  13
             rv.setLength(duration);
 42  13
             rv.setVariableBitRate(maxBitRate != avgBitRate);
 43  
         }
 44  13
         return rv;
 45  
     }
 46  
 
 47  
     private RealChunk findPropChunk(RandomAccessFile raf) throws IOException, CannotReadException
 48  
     {
 49  13
         final RealChunk rmf = RealChunk.readChunk(raf);
 50  13
         final RealChunk prop = RealChunk.readChunk(raf);
 51  13
         return prop;
 52  
     }
 53  
 
 54  
     private RealChunk findContChunk(RandomAccessFile raf) throws IOException, CannotReadException
 55  
     {
 56  13
         final RealChunk rmf = RealChunk.readChunk(raf);
 57  13
         final RealChunk prop = RealChunk.readChunk(raf);
 58  13
         RealChunk rv = RealChunk.readChunk(raf);
 59  33
         while (!rv.isCONT()) rv = RealChunk.readChunk(raf);
 60  13
         return rv;
 61  
     }
 62  
 
 63  
     @Override
 64  
     protected Tag getTag(RandomAccessFile raf) throws CannotReadException, IOException
 65  
     {
 66  13
         final RealChunk cont = findContChunk(raf);
 67  13
         final DataInputStream dis = cont.getDataInputStream();
 68  13
         final String title = Utils.readString(dis, Utils.readUint16(dis));
 69  13
         final String author = Utils.readString(dis, Utils.readUint16(dis));
 70  13
         final String copyright = Utils.readString(dis, Utils.readUint16(dis));
 71  13
         final String comment = Utils.readString(dis, Utils.readUint16(dis));
 72  13
         final RealTag rv = new RealTag();
 73  
         // NOTE: frequently these fields are off-by-one, thus the crazy
 74  
         // logic below...
 75  13
         rv.addTitle(title.length() == 0 ? author : title);
 76  13
         rv.addArtist(title.length() == 0 ? copyright : author);
 77  13
         rv.addComment(comment);
 78  13
         return rv;
 79  
     }
 80  
 
 81  
 }
 82