📄 oggvorbistagreader.java
字号:
}
//Now should be at start of next packet, check this is the vorbis setup header
byte[]b = new byte[VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH];
raf.read(b);
if(!isVorbisSetupHeader(b))
{
throw new CannotReadException("Unable to find setup header(2), unable to write ogg file");
}
//Go back to start of setupheader data
raf.seek(raf.getFilePointer()
-(VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH));
//Read data
if(setupPageHeader.getPacketList().size()>1)
{
b = new byte[ setupPageHeader.getPacketList().get(1).getLength()];
raf.read(b);
baos.write(b);
}
else
{
b = new byte[ setupPageHeader.getPacketList().get(0).getLength()];
raf.read(b);
baos.write(b);
}
//Return Data
if(!setupPageHeader.isLastPacketIncomplete())
{
logger.info("Setupheader finishes on this page");
return baos.toByteArray();
}
//The Setupheader extends to the next page, so should be at end of page already
//so carry on reading pages until we get to the end of comment
while(true)
{
logger.info("Reading another page");
OggPageHeader nextPageHeader = OggPageHeader.read (raf);
b = new byte[ nextPageHeader.getPacketList().get(0).getLength()];
raf.read(b);
baos.write(b);
//Because there is at least one other packet this means the Setupheader Packet has finished
//on this page so thats all we need and we can return
if(nextPageHeader.getPacketList().size()>1)
{
logger.info("Setupheader finishes on this page");
return baos.toByteArray();
}
//There is only the Setupheader packet on page if it has completed on this page we can return
if(!nextPageHeader.isLastPacketIncomplete())
{
logger.info("Setupheader finish on Page because this packet is complete");
return baos.toByteArray();
}
}
}
/** Calculate the size of the packet data for the comment and setup headers
*
* @param raf
* @return
* @throws CannotReadException
* @throws IOException
*/
public OggVorbisHeaderSizes readOggVorbisHeaderSizes(RandomAccessFile raf) throws CannotReadException, IOException
{
logger.fine("Started to read comment and setup header sizes:");
//Stores filepointers so return file in same state
long filepointer = raf.getFilePointer();
long commentHeaderStartPosition=0;
long setupHeaderStartPosition=0;
int commentHeaderSize=0;
int setupHeaderSize=0;
//1st page = codec infos
OggPageHeader pageHeader = OggPageHeader.read (raf);
//Skip over data to end of page header 1
raf.seek(raf.getFilePointer() + pageHeader.getPageLength());
//2nd page = comment, may extend to additional pages or not , may also have setup header
pageHeader = OggPageHeader.read (raf);
commentHeaderStartPosition = raf.getFilePointer()
- (OggPageHeader.OGG_PAGE_HEADER_FIXED_LENGTH + pageHeader.getSegmentTable().length);
//Now at start of packets on page 2 , check this is the vorbis comment header
byte [] b = new byte[VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH];
raf.read(b);
if(!isVorbisCommentHeader (b))
{
throw new CannotReadException("Cannot find comment block (no vorbiscomment header)");
}
raf.seek(raf.getFilePointer() - (VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH));
logger.fine("Found start of comment header at:"+raf.getFilePointer());
//Calculate Comment Size (not inc header)
while(true)
{
List<OggPageHeader.PacketStartAndLength> packetList = pageHeader.getPacketList();
commentHeaderSize+=packetList.get(0).getLength();
raf.skipBytes(packetList.get(0).getLength());
if(packetList.size()>1 ||!pageHeader.isLastPacketIncomplete())
{
//done comment size
logger.fine("Found end of comment:size:"+commentHeaderSize+"finishes at:"+raf.getFilePointer());
break;
}
pageHeader = OggPageHeader.read (raf);
}
//Calculate setupHeader Size (should be straight afterwards)
//TODO need to be more robust in case setup starts on next page
List<OggPageHeader.PacketStartAndLength> packetList = pageHeader.getPacketList();
//Now at start of next packet , check this is the vorbis setup header
b = new byte[VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH];
raf.read(b);
if(!isVorbisSetupHeader(b))
{
throw new CannotReadException("Cannot find vorbis setup header)");
}
raf.seek(raf.getFilePointer() - (VorbisHeader.FIELD_PACKET_TYPE_LENGTH + VorbisHeader.FIELD_CAPTURE_PATTERN_LENGTH));
logger.fine("Found start of vorbis setup header at:"+raf.getFilePointer());
//Set this to the start of the OggPage that setupheader was found on
setupHeaderStartPosition = raf.getFilePointer()
- (OggPageHeader.OGG_PAGE_HEADER_FIXED_LENGTH + pageHeader.getSegmentTable().length)
- packetList.get(0).getLength();
//Add packet data to size to the setup header size
setupHeaderSize=packetList.get(1).getLength();
logger.fine("Adding:"+packetList.get(1).getLength() + " to setup header size");
//Skip over the packet data
raf.skipBytes(packetList.get(1).getLength());
if(!pageHeader.isLastPacketIncomplete())
{
logger.fine("Found end of setupheader:size:"+setupHeaderSize+"finishes at:"+raf.getFilePointer());
//done setup size
}
else
{
pageHeader = OggPageHeader.read (raf);
packetList = pageHeader.getPacketList();
while(true)
{
setupHeaderSize+=packetList.get(0).getLength();
logger.fine("Adding:"+packetList.get(0).getLength() + " to setup header size");
raf.skipBytes(packetList.get(0).getLength());
if(!pageHeader.isLastPacketIncomplete())
{
//done setup size
logger.fine("Found end of setupheader:size:"+setupHeaderSize+"finishes at:"+raf.getFilePointer());
break;
}
pageHeader = OggPageHeader.read (raf);
}
}
raf.seek(filepointer);
return new OggVorbisHeaderSizes(commentHeaderStartPosition,setupHeaderStartPosition,commentHeaderSize,setupHeaderSize);
}
/**
* Find the length of the raw packet data and the start position of the ogg page header they start in
* for the two OggVorbisHeader we need to know about when writing data (sizes included vorbis header)
*/
public static class OggVorbisHeaderSizes
{
private long commentHeaderStartPosition;
private long setupHeaderStartPosition;
private int commentHeaderSize;
private int setupHeaderSize;
OggVorbisHeaderSizes(long commentHeaderStartPosition,long setupHeaderStartPosition,int commentHeaderSize,int setupHeaderSize)
{
this.commentHeaderStartPosition=commentHeaderStartPosition;
this.setupHeaderStartPosition=setupHeaderStartPosition;
this.commentHeaderSize=commentHeaderSize;
this.setupHeaderSize=setupHeaderSize;
}
/**
*
* @return the size of the raw packet data for the vorbis comment header (includes vorbis header)
*/
public int getCommentHeaderSize()
{
return commentHeaderSize;
}
/**
*
* @return he size of the raw packet data for the vorbis setup header (includes vorbis header)
*/
public int getSetupHeaderSize()
{
return setupHeaderSize;
}
/**
*
* @return the start position in the file of the ogg header which contains the start of the Vorbis Comment
*/
public long getCommentHeaderStartPosition()
{
return commentHeaderStartPosition;
}
/**
*
* @return the start position in the file of the ogg header which contains the start of the Setup Header
*/
public long getSetupHeaderStartPosition()
{
return setupHeaderStartPosition;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -