Reading comments seems to be working great thanks to wilbert and others.
Moving on to writing comments.
The first thing is to ensure we are reading the page sequence and checksums correctly.
I have modyfird infratecs checksum routine to calculate a checksum from a buffer and written a smal program to check an og vorbis files integrity as a start:-
Code: Select all
EnableExplicit
; >> Structures <<
Structure OGGPage
CapturePattern.l
Version.a
HeaderType.a
GranulePosition.q
BitstreamSerialNumber.l
PageSequenceNumber.l
Checksum.l
PageSegments.a
SegmentTable.a[255]
EndStructure
Structure Page
PageNumber.i
Start.i
Finish.i
EndStructure
Structure Error
PageNumber.i
Error.s
EndStructure
Global NewList Errors.Error()
Global PageCount.i,OriginalCheckSum.s, CalculatedChecksum.s
Global NewList PageOffsets.Page()
Global *Buffer
Procedure.i checksumbuffer(*Buffer,BufferLength.i)
Define iLoop.i
Protected crc_reg.l, b.a
For iLoop = 0 To BufferLength - 1
b = PeekA(*Buffer + iLoop)
crc_reg = (crc_reg << 8) ! PeekL(?crc_lookup + (((crc_reg >> 24) & $ff) ! b) * 4)
Next iLoop
ProcedureReturn crc_reg
EndProcedure
Procedure CheckPage(FileHandle.i,Start.i,Finish.i)
Protected Result.i
Define BufferSize.i
Define BufferStart.i,BufferEnd.i
If IsFile(FileHandle)
BufferSize = Finish - Start
FileSeek(FileHandle,Start)
If Finish > start
If *buffer
FreeMemory(*Buffer)
EndIf
*Buffer = AllocateMemory(BufferSize)
ReadData(FileHandle,*Buffer,BufferSize)
OriginalCheckSum = Hex(PeekL(*Buffer + 22),#PB_Long)
;Zero Checksum Bytes
PokeL(*buffer + 22,0)
;Get Checksum Of Buffer
result = checksumbuffer(*Buffer,BufferSize)
CalculatedCheckSum = Hex(result,#PB_Long)
If CalculatedCheckSum <> OriginalCheckSum
AddElement(Errors())
Errors()\PageNumber = PageOffsets()\PageNumber
Errors()\Error = "Bad Checksum"
EndIf
EndIf
EndIf
EndProcedure
Procedure ParseOGG(Filename.s)
Protected OGGFile.i, NextPageLoc.q, Page.OGGPage
Protected *Mem.Long, *CommentPacket, BitstreamSerialNumber.l
Protected.i i, NextPage, LastSegment, BytesToRead, PacketSize, Length
OGGFile = ReadFile(#PB_Any, Filename)
If OGGFile
ClearList(PageOffsets())
PageCount = 0
AddElement(PageOffsets())
PageOffsets()\PageNumber = PageCount
PageOffsets()\Start = 0
; >> Process pages <<
While ReadData(OGGFile, @Page, 27) = 27 And
Page\CapturePattern = $5367674F And
ReadData(OGGFile, @Page + 27, Page\PageSegments) = Page\PageSegments
; >> Calculate file position of next page <<
LastSegment = Page\PageSegments - 1
NextPageLoc = Loc(OGGFile)
For i = 0 To LastSegment
NextPageLoc + Page\SegmentTable[i]
Next
PageOffsets()\Finish = NextPageLoc
If PageCount <> Page\PageSequenceNumber
AddElement(Errors())
Errors()\PageNumber = Page\PageSequenceNumber
Errors()\Error = "Page sequence Error"
EndIf
PageCount + 1
AddElement(PageOffsets())
PageOffsets()\PageNumber = PageCount
PageOffsets()\Start = NextPageLoc
; Set the file pointer to the next page
FileSeek(OGGFile, NextPageLoc)
Wend
CloseFile(OGGFile)
EndIf
EndProcedure
Define FileHandle.i,FileToSearch.s
FileToSearch = OpenFileRequester("Please choose ogg file", "", "Song Files (*.ogg)|*.ogg", 0)
If FileToSearch
ParseOGG(FileToSearch)
FileHandle = ReadFile(#PB_Any,FileToSearch)
If IsFile(FileHandle)
ForEach PageOffsets()
CheckPage(FileHandle,PageOffsets()\Start,PageOffsets()\Finish)
Next
EndIf
If ListSize(Errors()) > 0
ForEach Errors()
Debug Errors()\PageNumber
Debug Errors()\Error
Next
Else
Debug "No Errors Found"
EndIf
EndIf
End
DataSection
crc_lookup:
Data.l $00000000,$04c11db7,$09823b6e,$0d4326d9
Data.l $130476dc,$17c56b6b,$1a864db2,$1e475005
Data.l $2608edb8,$22c9f00f,$2f8ad6d6,$2b4bcb61
Data.l $350c9b64,$31cd86d3,$3c8ea00a,$384fbdbd
Data.l $4c11db70,$48d0c6c7,$4593e01e,$4152fda9
Data.l $5f15adac,$5bd4b01b,$569796c2,$52568b75
Data.l $6a1936c8,$6ed82b7f,$639b0da6,$675a1011
Data.l $791d4014,$7ddc5da3,$709f7b7a,$745e66cd
Data.l $9823b6e0,$9ce2ab57,$91a18d8e,$95609039
Data.l $8b27c03c,$8fe6dd8b,$82a5fb52,$8664e6e5
Data.l $be2b5b58,$baea46ef,$b7a96036,$b3687d81
Data.l $ad2f2d84,$a9ee3033,$a4ad16ea,$a06c0b5d
Data.l $d4326d90,$d0f37027,$ddb056fe,$d9714b49
Data.l $c7361b4c,$c3f706fb,$ceb42022,$ca753d95
Data.l $f23a8028,$f6fb9d9f,$fbb8bb46,$ff79a6f1
Data.l $e13ef6f4,$e5ffeb43,$e8bccd9a,$ec7dd02d
Data.l $34867077,$30476dc0,$3d044b19,$39c556ae
Data.l $278206ab,$23431b1c,$2e003dc5,$2ac12072
Data.l $128e9dcf,$164f8078,$1b0ca6a1,$1fcdbb16
Data.l $018aeb13,$054bf6a4,$0808d07d,$0cc9cdca
Data.l $7897ab07,$7c56b6b0,$71159069,$75d48dde
Data.l $6b93dddb,$6f52c06c,$6211e6b5,$66d0fb02
Data.l $5e9f46bf,$5a5e5b08,$571d7dd1,$53dc6066
Data.l $4d9b3063,$495a2dd4,$44190b0d,$40d816ba
Data.l $aca5c697,$a864db20,$a527fdf9,$a1e6e04e
Data.l $bfa1b04b,$bb60adfc,$b6238b25,$b2e29692
Data.l $8aad2b2f,$8e6c3698,$832f1041,$87ee0df6
Data.l $99a95df3,$9d684044,$902b669d,$94ea7b2a
Data.l $e0b41de7,$e4750050,$e9362689,$edf73b3e
Data.l $f3b06b3b,$f771768c,$fa325055,$fef34de2
Data.l $c6bcf05f,$c27dede8,$cf3ecb31,$cbffd686
Data.l $d5b88683,$d1799b34,$dc3abded,$d8fba05a
Data.l $690ce0ee,$6dcdfd59,$608edb80,$644fc637
Data.l $7a089632,$7ec98b85,$738aad5c,$774bb0eb
Data.l $4f040d56,$4bc510e1,$46863638,$42472b8f
Data.l $5c007b8a,$58c1663d,$558240e4,$51435d53
Data.l $251d3b9e,$21dc2629,$2c9f00f0,$285e1d47
Data.l $36194d42,$32d850f5,$3f9b762c,$3b5a6b9b
Data.l $0315d626,$07d4cb91,$0a97ed48,$0e56f0ff
Data.l $1011a0fa,$14d0bd4d,$19939b94,$1d528623
Data.l $f12f560e,$f5ee4bb9,$f8ad6d60,$fc6c70d7
Data.l $e22b20d2,$e6ea3d65,$eba91bbc,$ef68060b
Data.l $d727bbb6,$d3e6a601,$dea580d8,$da649d6f
Data.l $c423cd6a,$c0e2d0dd,$cda1f604,$c960ebb3
Data.l $bd3e8d7e,$b9ff90c9,$b4bcb610,$b07daba7
Data.l $ae3afba2,$aafbe615,$a7b8c0cc,$a379dd7b
Data.l $9b3660c6,$9ff77d71,$92b45ba8,$9675461f
Data.l $8832161a,$8cf30bad,$81b02d74,$857130c3
Data.l $5d8a9099,$594b8d2e,$5408abf7,$50c9b640
Data.l $4e8ee645,$4a4ffbf2,$470cdd2b,$43cdc09c
Data.l $7b827d21,$7f436096,$7200464f,$76c15bf8
Data.l $68860bfd,$6c47164a,$61043093,$65c52d24
Data.l $119b4be9,$155a565e,$18197087,$1cd86d30
Data.l $029f3d35,$065e2082,$0b1d065b,$0fdc1bec
Data.l $3793a651,$3352bbe6,$3e119d3f,$3ad08088
Data.l $2497d08d,$2056cd3a,$2d15ebe3,$29d4f654
Data.l $c5a92679,$c1683bce,$cc2b1d17,$c8ea00a0
Data.l $d6ad50a5,$d26c4d12,$df2f6bcb,$dbee767c
Data.l $e3a1cbc1,$e760d676,$ea23f0af,$eee2ed18
Data.l $f0a5bd1d,$f464a0aa,$f9278673,$fde69bc4
Data.l $89b8fd09,$8d79e0be,$803ac667,$84fbdbd0
Data.l $9abc8bd5,$9e7d9662,$933eb0bb,$97ffad0c
Data.l $afb010b1,$ab710d06,$a6322bdf,$a2f33668
Data.l $bcb4666d,$b8757bda,$b5365d03,$b1f740b4
EndDataSection
Run the programme and select an ogg file the file will be checked for page sequence errors and every pages checksum will be checked.