Beispiel #1
0
func constructReservoirFrame(dest []byte, header *mp3agic.FrameHeader, minResSize int, absStartSample int64) int {
	// increase for 10-byte-header inclusion
	minResSize += 10
	h32 := header.getHeader32() | 0x00010000 // switch off CRC usage
	fh2 := &FrameHeader{}
	for bri := 1; bri <= 14; bri++ {
		h32 = (h32 & 0xFFFF0FFF) + (bri << 12)
		fh2.setHeader32(h32)
		frameSize := fh2.getFrameSize()
		sideInfoEnd := fh2.getSideInfoEnd()
		mainDataBlockSize := frameSize - sideInfoEnd
		if mainDataBlockSize >= minResSize {
			dest[0] = byte(h32 >> 24)
			dest[1] = byte(h32 >> 16)
			dest[2] = byte(h32 >> 8)
			dest[3] = byte(h32)
			fill(dest[4:sideInfoEnd], 0)
			fill(dest[sideInfoEnd:frameSize], 0x78)
			// Arrays.fill(dest, 4, sideInfoEnd, (byte) 0);
			// Arrays.fill(dest, sideInfoEnd, frameSize, (byte) 0x78);
			copy(dest[sideInfoEnd:], []byte("PCUT"))
			// dest[sideInfoEnd] = 0x50; // P
			// dest[sideInfoEnd + 1] = 0x43; // C
			// dest[sideInfoEnd + 2] = 0x55; // U
			// dest[sideInfoEnd + 3] = 0x54; // T
			copy(dest[sideInfoEnd+4:], []byte{
				// revision 0
				0,
				// absolute sample start pos
				byte(uint64(absStartSample) >> 32),
				byte(uint64(absStartSample) >> 24),
				byte(uint64(absStartSample) >> 16),
				byte(uint64(absStartSample) >> 8),
				byte(uint64(absStartSample))})
			return frameSize
		}
	}
	return -1
}