chore: establish local platform baseline
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
package media
|
||||
|
||||
import "encoding/binary"
|
||||
|
||||
func validateAudio(codec string, declaredDurationMS int, prefix []byte) string {
|
||||
if codec != "wav_pcm_s16le" {
|
||||
return "CODEC_VALIDATION_UNAVAILABLE"
|
||||
}
|
||||
if len(prefix) < 44 || string(prefix[:4]) != "RIFF" || string(prefix[8:12]) != "WAVE" {
|
||||
return "INVALID_AUDIO_CONTAINER"
|
||||
}
|
||||
var byteRate, dataSize uint32
|
||||
var audioFormat, bitsPerSample uint16
|
||||
for offset := 12; offset+8 <= len(prefix); {
|
||||
chunkID := string(prefix[offset : offset+4])
|
||||
chunkSize := int(binary.LittleEndian.Uint32(prefix[offset+4 : offset+8]))
|
||||
dataStart := offset + 8
|
||||
if chunkID == "data" {
|
||||
dataSize = uint32(chunkSize)
|
||||
break
|
||||
}
|
||||
if chunkSize < 0 || dataStart+chunkSize > len(prefix) {
|
||||
break
|
||||
}
|
||||
switch chunkID {
|
||||
case "fmt ":
|
||||
if chunkSize < 16 {
|
||||
return "INVALID_AUDIO_CONTAINER"
|
||||
}
|
||||
audioFormat = binary.LittleEndian.Uint16(prefix[dataStart : dataStart+2])
|
||||
byteRate = binary.LittleEndian.Uint32(prefix[dataStart+8 : dataStart+12])
|
||||
bitsPerSample = binary.LittleEndian.Uint16(prefix[dataStart+14 : dataStart+16])
|
||||
}
|
||||
offset = dataStart + chunkSize
|
||||
if offset%2 != 0 {
|
||||
offset++
|
||||
}
|
||||
}
|
||||
if audioFormat != 1 || bitsPerSample != 16 || byteRate == 0 || dataSize == 0 {
|
||||
return "UNSUPPORTED_AUDIO_ENCODING"
|
||||
}
|
||||
actualDurationMS := int((uint64(dataSize) * 1000) / uint64(byteRate))
|
||||
if actualDurationMS != declaredDurationMS {
|
||||
return "DURATION_MISMATCH"
|
||||
}
|
||||
return ""
|
||||
}
|
||||
Reference in New Issue
Block a user