@@ -197,9 +197,11 @@ impl VaH264Encoder {
197197 if packed_headers_attr_supported {
198198 config_attributes. push ( ffi:: VAConfigAttrib {
199199 type_ : ffi:: VAConfigAttribType_VAConfigAttribEncPackedHeaders ,
200- value : packed_headers_attr. value & ( ffi:: VA_ENC_PACKED_HEADER_SEQUENCE ) , // | ffi::VA_ENC_PACKED_HEADER_PICTURE
201- // | ffi::VA_ENC_PACKED_HEADER_SLICE
202- // | ffi::VA_ENC_PACKED_HEADER_MISC),
200+ value : packed_headers_attr. value
201+ & ( ffi:: VA_ENC_PACKED_HEADER_SEQUENCE
202+ | ffi:: VA_ENC_PACKED_HEADER_PICTURE
203+ | ffi:: VA_ENC_PACKED_HEADER_SLICE
204+ | ffi:: VA_ENC_PACKED_HEADER_MISC ) ,
203205 } ) ;
204206 }
205207
@@ -245,7 +247,7 @@ impl VaH264Encoder {
245247 frame_type_pattern : FrameTypePattern {
246248 idr_period,
247249 i_period : None ,
248- p_period : None ,
250+ p_period : Some ( 2 ) ,
249251 } ,
250252 num_submitted_frames : 0 ,
251253 num_encoded_frames : 0 ,
@@ -593,12 +595,12 @@ impl VaH264Encoder {
593595 let mut pic_param = zeroed :: < ffi:: VAEncPictureParameterBufferH264 > ( ) ;
594596
595597 pic_param. CurrPic . picture_id = ref_surface. id ( ) ;
596- pic_param. CurrPic . frame_idx = dbg ! ( display_index - self . current_idr_display) ;
597- pic_param. CurrPic . TopFieldOrderCnt = dbg ! ( self . calc_top_field_order_cnt(
598+ pic_param. CurrPic . frame_idx = display_index - self . current_idr_display ;
599+ pic_param. CurrPic . TopFieldOrderCnt = self . calc_top_field_order_cnt (
598600 frame_type,
599601 ( display_index as i32 - self . current_idr_display as i32 )
600602 % self . max_pic_order_cnt_lsb ,
601- ) ) ;
603+ ) ;
602604 pic_param. CurrPic . BottomFieldOrderCnt = pic_param. CurrPic . TopFieldOrderCnt ;
603605
604606 if matches ! ( frame_type, FrameType :: IDR | FrameType :: I | FrameType :: P ) {
@@ -612,13 +614,33 @@ impl VaH264Encoder {
612614 pic_param. ReferenceFrames [ 0 ] = self . reference_frames . last ( ) . unwrap ( ) . 1 ;
613615
614616 for pic in & mut pic_param. ReferenceFrames [ 1 ..] {
615- // if let Some((ref_surface, ref_frame_idx)) = reference_frames.next() {
616- // pic.picture_id = ref_surface.id();
617- // pic.frame_idx = *ref_frame_idx;
618- // } else {
619617 pic. picture_id = ffi:: VA_INVALID_SURFACE ;
620618 pic. flags = ffi:: VA_PICTURE_H264_INVALID ;
621- // }
619+ }
620+ }
621+
622+ if frame_type == FrameType :: B {
623+ let curr_frame_idx = display_index - self . current_idr_display ;
624+
625+ let a = self
626+ . reference_frames
627+ . iter ( )
628+ . rev ( )
629+ . find ( |( _, p) | p. frame_idx < curr_frame_idx)
630+ . unwrap ( ) ;
631+
632+ let b = self
633+ . reference_frames
634+ . iter ( )
635+ . find ( |( _, p) | p. frame_idx > curr_frame_idx)
636+ . unwrap ( ) ;
637+
638+ pic_param. ReferenceFrames [ 0 ] = a. 1 ;
639+ pic_param. ReferenceFrames [ 1 ] = b. 1 ;
640+
641+ for pic in & mut pic_param. ReferenceFrames [ 2 ..] {
642+ pic. picture_id = ffi:: VA_INVALID_SURFACE ;
643+ pic. flags = ffi:: VA_PICTURE_H264_INVALID ;
622644 }
623645 }
624646
@@ -679,64 +701,50 @@ impl VaH264Encoder {
679701 FrameType :: P => {
680702 slice_params. RefPicList0 [ 0 ] = self . reference_frames . last ( ) . unwrap ( ) . 1 ;
681703
682- // let mut reference_frames = self.reference_frames.iter();
683-
684704 for pic in & mut slice_params. RefPicList0 [ 1 ..] {
685- // if let Some((ref_surface, ref_frame_idx)) = reference_frames.next() {
686- // pic.picture_id = ref_surface.id();
687- // pic.frame_idx = *ref_frame_idx;
688- // } else {
689705 pic. picture_id = ffi:: VA_INVALID_SURFACE ;
690706 pic. flags = ffi:: VA_PICTURE_H264_INVALID ;
691- // }
692707 }
693-
694- // for pic in &mut slice_params.RefPicList1 {
695- // pic.picture_id = ffi::VA_INVALID_SURFACE;
696- // pic.flags = ffi::VA_PICTURE_H264_INVALID;
697- // }
698708 }
699709 FrameType :: B => {
700- todo ! ( )
701- // let mut past_reference_frames = self
702- // .reference_frames
703- // .iter()
704- // .filter(|(_, frame_num)| *frame_num < encoding_index);
705- //
706- // for pic in &mut slice_params.RefPicList0 {
707- // if let Some((ref_surface, ref_frame_idx)) = past_reference_frames.next() {
708- // pic.picture_id = ref_surface.id();
709- // pic.frame_idx = *ref_frame_idx;
710- // } else {
711- // pic.picture_id = ffi::VA_INVALID_SURFACE;
712- // pic.flags = ffi::VA_PICTURE_H264_INVALID;
713- // }
714- // }
715- //
716- // let mut future_reference_frames = self
717- // .reference_frames
718- // .iter()
719- // .filter(|(_, frame_num)| *frame_num > encoding_index);
720- //
721- // for pic in &mut slice_params.RefPicList1 {
722- // if let Some((ref_surface, ref_frame_idx)) = future_reference_frames.next() {
723- // pic.picture_id = ref_surface.id();
724- // pic.frame_idx = *ref_frame_idx;
725- // } else {
726- // pic.picture_id = ffi::VA_INVALID_SURFACE;
727- // pic.flags = ffi::VA_PICTURE_H264_INVALID;
728- // }
729- // }
710+ let curr_frame_idx = display_index - self . current_idr_display ;
711+
712+ let a = self
713+ . reference_frames
714+ . iter ( )
715+ . rev ( )
716+ . find ( |( _, p) | p. frame_idx < curr_frame_idx)
717+ . unwrap ( ) ;
718+
719+ let b = self
720+ . reference_frames
721+ . iter ( )
722+ . find ( |( _, p) | p. frame_idx > curr_frame_idx)
723+ . unwrap ( ) ;
724+
725+ slice_params. RefPicList0 [ 0 ] = a. 1 ;
726+ slice_params. RefPicList1 [ 0 ] = b. 1 ;
727+
728+ for pic in & mut slice_params. RefPicList0 [ 1 ..] {
729+ pic. picture_id = ffi:: VA_INVALID_SURFACE ;
730+ pic. flags = ffi:: VA_PICTURE_H264_INVALID ;
731+ }
732+
733+ for pic in & mut slice_params. RefPicList1 [ 1 ..] {
734+ pic. picture_id = ffi:: VA_INVALID_SURFACE ;
735+ pic. flags = ffi:: VA_PICTURE_H264_INVALID ;
736+ }
730737 }
731738 FrameType :: I => { }
732739 FrameType :: IDR => {
733- slice_params. idr_pic_id = self . current_idr_display as u16 ; // TODO: maintain idr counter and put value here
740+ // TODO: avoid overflow here, idr_pic_id just needs to be unique
741+ slice_params. idr_pic_id = self . current_idr_display as u16 ;
734742 }
735743 }
736744
737745 slice_params. direct_spatial_mv_pred_flag = 1 ;
738- slice_params. pic_order_cnt_lsb =
739- display_index as u16 % self . max_pic_order_cnt_lsb as u16 ;
746+ slice_params. pic_order_cnt_lsb = ( display_index - self . current_idr_display ) as u16
747+ % self . max_pic_order_cnt_lsb as u16 ;
740748
741749 slice_params
742750 }
0 commit comments