@@ -347,13 +347,15 @@ fn fill_ref_pic_list<M: SurfaceMemoryDescriptor>(
347
347
}
348
348
349
349
fn build_slice_param < M : SurfaceMemoryDescriptor > (
350
+ params : & mut libva:: SliceParameterBufferH264 ,
351
+ offset : u32 ,
350
352
hdr : & SliceHeader ,
351
353
slice_size : usize ,
352
354
ref_list_0 : & [ & DpbEntry < VADecodedHandle < M > > ] ,
353
355
ref_list_1 : & [ & DpbEntry < VADecodedHandle < M > > ] ,
354
356
sps : & Sps ,
355
357
pps : & Pps ,
356
- ) -> anyhow:: Result < BufferType > {
358
+ ) -> anyhow:: Result < ( ) > {
357
359
let ref_list_0 = fill_ref_pic_list ( ref_list_0) ;
358
360
let ref_list_1 = fill_ref_pic_list ( ref_list_1) ;
359
361
let pwt = & hdr. pred_weight_table ;
@@ -422,9 +424,9 @@ fn build_slice_param<M: SurfaceMemoryDescriptor>(
422
424
}
423
425
}
424
426
425
- let slice_param = libva :: SliceParameterBufferH264 :: new (
427
+ params . add_slice_parameter (
426
428
slice_size as u32 ,
427
- 0 ,
429
+ offset ,
428
430
libva:: constants:: VA_SLICE_DATA_FLAG_ALL ,
429
431
hdr. header_bit_size as u16 ,
430
432
hdr. first_mb_in_slice as u16 ,
@@ -455,13 +457,13 @@ fn build_slice_param<M: SurfaceMemoryDescriptor>(
455
457
chroma_offset_l1,
456
458
) ;
457
459
458
- Ok ( BufferType :: SliceParameter ( SliceParameter :: H264 (
459
- slice_param,
460
- ) ) )
460
+ Ok ( ( ) )
461
461
}
462
462
463
463
pub struct VaapiH264Picture < Picture > {
464
464
picture : Picture ,
465
+ slice_params : libva:: SliceParameterBufferH264 ,
466
+ slice_data : Vec < u8 > ,
465
467
}
466
468
467
469
impl < M : SurfaceMemoryDescriptor + ' static > StatelessDecoderBackendPicture < H264 >
@@ -515,33 +517,43 @@ impl<M: SurfaceMemoryDescriptor + 'static> StatelessH264DecoderBackend for Vaapi
515
517
ref_pic_list0 : & [ & DpbEntry < Self :: Handle > ] ,
516
518
ref_pic_list1 : & [ & DpbEntry < Self :: Handle > ] ,
517
519
) -> 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 > {
518
540
let metadata = self . metadata_state . get_parsed ( ) ?;
519
541
let context = & metadata. context ;
520
- let picture = & mut picture. picture ;
521
542
522
543
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
+ ) ) )
531
547
. context ( "while creating slice params buffer" ) ?;
532
548
533
- picture. add_buffer ( slice_param) ;
549
+ picture. picture . add_buffer ( slice_param) ;
534
550
535
551
let slice_data = context
536
- . create_buffer ( BufferType :: SliceData ( Vec :: from ( slice . nalu . as_ref ( ) ) ) )
552
+ . create_buffer ( BufferType :: SliceData ( picture . slice_data ) )
537
553
. context ( "while creating slice data buffer" ) ?;
538
554
539
- picture. add_buffer ( slice_data) ;
540
-
541
- Ok ( ( ) )
542
- }
555
+ picture. picture . add_buffer ( slice_data) ;
543
556
544
- fn submit_picture ( & mut self , picture : Self :: Picture ) -> StatelessBackendResult < Self :: Handle > {
545
557
self . process_picture :: < H264 > ( picture. picture )
546
558
}
547
559
@@ -559,6 +571,8 @@ impl<M: SurfaceMemoryDescriptor + 'static> StatelessH264DecoderBackend for Vaapi
559
571
560
572
Ok ( VaapiH264Picture {
561
573
picture : VaPicture :: new ( timestamp, Rc :: clone ( & metadata. context ) , surface) ,
574
+ slice_params : libva:: SliceParameterBufferH264 :: new_array ( ) ,
575
+ slice_data : Vec :: new ( ) ,
562
576
} )
563
577
}
564
578
@@ -573,6 +587,8 @@ impl<M: SurfaceMemoryDescriptor + 'static> StatelessH264DecoderBackend for Vaapi
573
587
picture : first_field
574
588
. borrow ( )
575
589
. new_picture_from_same_surface ( timestamp) ,
590
+ slice_params : libva:: SliceParameterBufferH264 :: new_array ( ) ,
591
+ slice_data : Vec :: new ( ) ,
576
592
} )
577
593
}
578
594
}
0 commit comments