diff --git a/player_decode.v b/player_decode.v index c032db7..6bfe7f9 100644 --- a/player_decode.v +++ b/player_decode.v @@ -643,9 +643,10 @@ fn (mut vp VideoPlayer) write_video_frame(mut frame VideoPlayerDecodeStreamFrame return error('aligned access unit ${vp.current_frame} exceeds its ${frame.gpu_bitstream_capacity}-byte bitstream-buffer capacity') } if aligned_size > frame.gpu_bitstream_size { + padding_size := bitstream_padding_length(aligned_size - frame.gpu_bitstream_size)! unsafe { vmemset(frame.gpu_bitstream_slice_mapped_memory_address + frame.gpu_bitstream_size, - 0, isize(aligned_size - frame.gpu_bitstream_size)) + 0, padding_size) } } frame.gpu_bitstream_size = aligned_size @@ -654,6 +655,14 @@ fn (mut vp VideoPlayer) write_video_frame(mut frame VideoPlayerDecodeStreamFrame type File = os.File +// Current V uses an int byte count for vmemset; reject narrowing overflow. +fn bitstream_padding_length(size u64) !int { + if size > u64(max_int) { + return error('bitstream padding exceeds the supported ${max_int}-byte memory-fill length') + } + return int(size) +} + // Return next byte in file, but don't move the cursor position fn (mut f File) peek() !u8 { pos_bk := f.tell()! diff --git a/video_player_test.v b/video_player_test.v index 75d9f14..b1375d1 100644 --- a/video_player_test.v +++ b/video_player_test.v @@ -7,6 +7,27 @@ import encoding.hex import os import antono2.vulkan as vk +fn test_bitstream_padding_length_is_compatible_with_vmemset() { + assert bitstream_padding_length(0)! == 0 + assert bitstream_padding_length(12)! == 12 + assert bitstream_padding_length(u64(max_int))! == max_int + mut bytes := [u8(1), 2, 3, 0xff, 0xff, 6] + unsafe { + vmemset(byteptr(bytes.data) + 3, 0, bitstream_padding_length(2)!) + } + assert bytes == [u8(1), 2, 3, 0, 0, 6] +} + +fn test_bitstream_padding_length_rejects_narrowing_overflow() { + for size in [u64(max_int) + 1, ~u64(0)] { + if _ := bitstream_padding_length(size) { + assert false, 'oversized memory-fill length was accepted' + } else { + assert err.msg().contains('bitstream padding exceeds') + } + } +} + fn test_dpb_acquire_uses_a_free_slot() { mut dpb := DPB{ reference_usage: [u8(0), 2]