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