Skip to content

Commit 0fb9209

Browse files
jamrialshssoichiro
authored andcommitted
header: Implement frame_size_with_refs()
Signed-off-by: James Almer <[email protected]>
1 parent 39725aa commit 0fb9209

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/encoder.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,14 @@ impl<T: Pixel> FrameInvariants<T> {
821821
fi.error_resilient =
822822
if fi.frame_type == FrameType::SWITCH { true } else { error_resilient };
823823

824+
// force frame_size_with_refs() code path if render size != frame size
825+
if fi.frame_type == FrameType::INTER
826+
&& !fi.error_resilient
827+
&& fi.render_and_frame_size_different
828+
{
829+
fi.frame_size_override_flag = true;
830+
}
831+
824832
if fi.frame_type == FrameType::SWITCH {
825833
fi.frame_size_override_flag = true;
826834
} else if fi.sequence.reduced_still_picture_hdr {

src/header.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,6 +176,9 @@ pub trait UncompressedHeader {
176176
fn write_render_size<T: Pixel>(
177177
&mut self, fi: &FrameInvariants<T>,
178178
) -> io::Result<()>;
179+
fn write_frame_size_with_refs<T: Pixel>(
180+
&mut self, fi: &FrameInvariants<T>,
181+
) -> io::Result<()>;
179182
fn write_deblock_filter_a<T: Pixel>(
180183
&mut self, fi: &FrameInvariants<T>, deblock: &DeblockState,
181184
) -> io::Result<()>;
@@ -629,7 +632,7 @@ impl<W: io::Write> UncompressedHeader for BitWriter<W, BigEndian> {
629632
}
630633

631634
if !fi.error_resilient && fi.frame_size_override_flag {
632-
unimplemented!();
635+
self.write_frame_size_with_refs(fi)?;
633636
} else {
634637
self.write_frame_size(fi)?;
635638
self.write_render_size(fi)?;
@@ -897,6 +900,36 @@ impl<W: io::Write> UncompressedHeader for BitWriter<W, BigEndian> {
897900
Ok(())
898901
}
899902

903+
fn write_frame_size_with_refs<T: Pixel>(
904+
&mut self, fi: &FrameInvariants<T>,
905+
) -> io::Result<()> {
906+
let mut found_ref = false;
907+
for i in 0..INTER_REFS_PER_FRAME {
908+
if let Some(ref rec) = fi.rec_buffer.frames[fi.ref_frames[i] as usize] {
909+
if rec.width == fi.width as u32
910+
&& rec.height == fi.height as u32
911+
&& rec.render_width == fi.render_width
912+
&& rec.render_height == fi.render_height
913+
{
914+
self.write_bit(true)?;
915+
found_ref = true;
916+
break;
917+
} else {
918+
self.write_bit(false)?;
919+
}
920+
} else {
921+
self.write_bit(false)?;
922+
}
923+
}
924+
if !found_ref {
925+
self.write_frame_size(fi)?;
926+
self.write_render_size(fi)?;
927+
} else if fi.sequence.enable_superres {
928+
unimplemented!();
929+
}
930+
Ok(())
931+
}
932+
900933
fn write_deblock_filter_a<T: Pixel>(
901934
&mut self, fi: &FrameInvariants<T>, deblock: &DeblockState,
902935
) -> io::Result<()> {

0 commit comments

Comments
 (0)