Skip to content

Commit 94b46ff

Browse files
committed
fix b frames somewhat
1 parent 100ab36 commit 94b46ff

2 files changed

Lines changed: 66 additions & 58 deletions

File tree

media/h264/src/libva/bitstream.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,7 @@ pub(super) fn write_slice_header(
267267
let is_idr = pic_fields.idr_pic_flag() != 0;
268268
let is_ref = pic_fields.reference_pic_flag() != 0;
269269

270-
let (nal_ref_idc, nal_unit_type) = match dbg!(slice_param.slice_type) {
270+
let (nal_ref_idc, nal_unit_type) = match slice_param.slice_type {
271271
SLICE_TYPE_I => (NAL_REF_IDC_HIGH, if is_idr { NAL_IDR } else { NAL_NON_IDR }),
272272
SLICE_TYPE_P => (NAL_REF_IDC_MEDIUM, NAL_NON_IDR),
273273
SLICE_TYPE_B => (

media/h264/src/libva/mod.rs

Lines changed: 65 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)