Skip to content

Commit 5851cfc

Browse files
committed
decoder: h264: vaapi: Use slice arrays instead multiple buffers
Fixes: chromeos#44
1 parent 54fca7c commit 5851cfc

File tree

1 file changed

+38
-22
lines changed

1 file changed

+38
-22
lines changed

src/decoder/stateless/h264/vaapi.rs

+38-22
Original file line numberDiff line numberDiff line change
@@ -347,13 +347,15 @@ fn fill_ref_pic_list<M: SurfaceMemoryDescriptor>(
347347
}
348348

349349
fn build_slice_param<M: SurfaceMemoryDescriptor>(
350+
params: &mut libva::SliceParameterBufferH264,
351+
offset: u32,
350352
hdr: &SliceHeader,
351353
slice_size: usize,
352354
ref_list_0: &[&DpbEntry<VADecodedHandle<M>>],
353355
ref_list_1: &[&DpbEntry<VADecodedHandle<M>>],
354356
sps: &Sps,
355357
pps: &Pps,
356-
) -> anyhow::Result<BufferType> {
358+
) -> anyhow::Result<()> {
357359
let ref_list_0 = fill_ref_pic_list(ref_list_0);
358360
let ref_list_1 = fill_ref_pic_list(ref_list_1);
359361
let pwt = &hdr.pred_weight_table;
@@ -422,9 +424,9 @@ fn build_slice_param<M: SurfaceMemoryDescriptor>(
422424
}
423425
}
424426

425-
let slice_param = libva::SliceParameterBufferH264::new(
427+
params.add_slice_parameter(
426428
slice_size as u32,
427-
0,
429+
offset,
428430
libva::constants::VA_SLICE_DATA_FLAG_ALL,
429431
hdr.header_bit_size as u16,
430432
hdr.first_mb_in_slice as u16,
@@ -455,13 +457,13 @@ fn build_slice_param<M: SurfaceMemoryDescriptor>(
455457
chroma_offset_l1,
456458
);
457459

458-
Ok(BufferType::SliceParameter(SliceParameter::H264(
459-
slice_param,
460-
)))
460+
Ok(())
461461
}
462462

463463
pub struct VaapiH264Picture<Picture> {
464464
picture: Picture,
465+
slice_params: libva::SliceParameterBufferH264,
466+
slice_data: Vec<u8>,
465467
}
466468

467469
impl<M: SurfaceMemoryDescriptor + 'static> StatelessDecoderBackendPicture<H264>
@@ -515,33 +517,43 @@ impl<M: SurfaceMemoryDescriptor + 'static> StatelessH264DecoderBackend for Vaapi
515517
ref_pic_list0: &[&DpbEntry<Self::Handle>],
516518
ref_pic_list1: &[&DpbEntry<Self::Handle>],
517519
) -> StatelessBackendResult<()> {
520+
build_slice_param(
521+
&mut picture.slice_params,
522+
picture.slice_data.len() as u32,
523+
&slice.header,
524+
slice.nalu.size,
525+
ref_pic_list0,
526+
ref_pic_list1,
527+
sps,
528+
pps,
529+
)?;
530+
531+
picture.slice_data.extend(slice.nalu.as_ref());
532+
533+
Ok(())
534+
}
535+
536+
fn submit_picture(
537+
&mut self,
538+
mut picture: Self::Picture,
539+
) -> StatelessBackendResult<Self::Handle> {
518540
let metadata = self.metadata_state.get_parsed()?;
519541
let context = &metadata.context;
520-
let picture = &mut picture.picture;
521542

522543
let slice_param = context
523-
.create_buffer(build_slice_param(
524-
&slice.header,
525-
slice.nalu.size,
526-
ref_pic_list0,
527-
ref_pic_list1,
528-
sps,
529-
pps,
530-
)?)
544+
.create_buffer(BufferType::SliceParameter(SliceParameter::H264(
545+
picture.slice_params,
546+
)))
531547
.context("while creating slice params buffer")?;
532548

533-
picture.add_buffer(slice_param);
549+
picture.picture.add_buffer(slice_param);
534550

535551
let slice_data = context
536-
.create_buffer(BufferType::SliceData(Vec::from(slice.nalu.as_ref())))
552+
.create_buffer(BufferType::SliceData(picture.slice_data))
537553
.context("while creating slice data buffer")?;
538554

539-
picture.add_buffer(slice_data);
540-
541-
Ok(())
542-
}
555+
picture.picture.add_buffer(slice_data);
543556

544-
fn submit_picture(&mut self, picture: Self::Picture) -> StatelessBackendResult<Self::Handle> {
545557
self.process_picture::<H264>(picture.picture)
546558
}
547559

@@ -559,6 +571,8 @@ impl<M: SurfaceMemoryDescriptor + 'static> StatelessH264DecoderBackend for Vaapi
559571

560572
Ok(VaapiH264Picture {
561573
picture: VaPicture::new(timestamp, Rc::clone(&metadata.context), surface),
574+
slice_params: libva::SliceParameterBufferH264::new_array(),
575+
slice_data: Vec::new(),
562576
})
563577
}
564578

@@ -573,6 +587,8 @@ impl<M: SurfaceMemoryDescriptor + 'static> StatelessH264DecoderBackend for Vaapi
573587
picture: first_field
574588
.borrow()
575589
.new_picture_from_same_surface(timestamp),
590+
slice_params: libva::SliceParameterBufferH264::new_array(),
591+
slice_data: Vec::new(),
576592
})
577593
}
578594
}

0 commit comments

Comments
 (0)