Skip to content

Commit cfcc103

Browse files
committed
vaapi: av1: submit slice parameters as an array
All tiles belonging to the same tile group must be submitted to the vaapi driver as an array. The Intel driver, in particular, expects one array of Slice Parameters per instance of Slice Data when submitting the data for an AV1 Tile Group. It will produce a corrupted frame if the slice parameters are submitted separately (i.e.: in their own VABuffers). This was discovered by Nicolas Dufresne.
1 parent e9e3070 commit cfcc103

File tree

1 file changed

+11
-14
lines changed

1 file changed

+11
-14
lines changed

src/decoder/stateless/av1/vaapi.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -536,11 +536,12 @@ fn build_pic_param<M: SurfaceMemoryDescriptor>(
536536
))
537537
}
538538

539-
fn build_slice_params_for_tg(tg: &TileGroupObu) -> anyhow::Result<Vec<libva::BufferType>> {
540-
let mut slice_params = vec![];
539+
fn build_slice_params_for_tg(tg: &TileGroupObu) -> anyhow::Result<libva::BufferType> {
540+
let mut slice_params = libva::SliceParameterBufferAV1::new();
541541

542542
for tile in &tg.tiles {
543-
let slice_param = libva::SliceParameterBufferAV1::new(
543+
/* all tiles must be submitted in the same slice parameter array */
544+
slice_params.add_slice_parameter(
544545
tile.tile_size,
545546
tile.tile_offset,
546547
0,
@@ -551,13 +552,11 @@ fn build_slice_params_for_tg(tg: &TileGroupObu) -> anyhow::Result<Vec<libva::Buf
551552
0,
552553
0,
553554
);
554-
555-
slice_params.push(libva::BufferType::SliceParameter(
556-
libva::SliceParameter::AV1(slice_param),
557-
));
558555
}
559556

560-
Ok(slice_params)
557+
Ok(libva::BufferType::SliceParameter(
558+
libva::SliceParameter::AV1(slice_params),
559+
))
561560
}
562561

563562
fn build_slice_data_for_tg(tg: TileGroupObu) -> libva::BufferType {
@@ -652,13 +651,11 @@ impl<M: SurfaceMemoryDescriptor + 'static> StatelessAV1DecoderBackend for VaapiB
652651
let metadata = self.metadata_state.get_parsed()?;
653652
let context = &metadata.context;
654653

655-
for slice_param in slice_params {
656-
let buffer = context
657-
.create_buffer(slice_param)
658-
.context("Failed to create slice parameter buffer")?;
654+
let buffer = context
655+
.create_buffer(slice_params)
656+
.context("Failed to create slice parameter buffer")?;
659657

660-
picture.add_buffer(buffer)
661-
}
658+
picture.add_buffer(buffer);
662659

663660
let buffer = context
664661
.create_buffer(slice_data)

0 commit comments

Comments
 (0)