Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion player_decode.v
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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()!
Expand Down
21 changes: 21 additions & 0 deletions video_player_test.v
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down
Loading