X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-commonfmt%2Fsrc%2Fmuxers%2Favi.rs;h=d8e1f739bf735d14445e81c3ad8ff8134efc2416;hb=04fafc56d5f430ae289eaeabec24e2831e92d191;hp=fad358cf2356604b0cdff092185d17647a3e3562;hpb=405cec9eed5d7f58440ec8495f5cbc1f5c6fee40;p=nihav.git diff --git a/nihav-commonfmt/src/muxers/avi.rs b/nihav-commonfmt/src/muxers/avi.rs index fad358c..d8e1f73 100644 --- a/nihav-commonfmt/src/muxers/avi.rs +++ b/nihav-commonfmt/src/muxers/avi.rs @@ -16,6 +16,7 @@ struct AVIStream { nframes: u32, is_video: bool, max_size: u32, + pal_change: bool, } struct AVIMuxer<'a> { @@ -144,6 +145,7 @@ impl<'a> MuxCore<'a> for AVIMuxer<'a> { is_video: strm.get_media_type() == StreamType::Video, nframes: 0, max_size: 0, + pal_change: false, }); self.bw.write_u32le(0)?; // flags @@ -256,7 +258,12 @@ impl<'a> MuxCore<'a> for AVIMuxer<'a> { if let NASideData::Palette(_, ref pal) = sdata { let cur_pos = self.bw.tell(); self.bw.seek(SeekFrom::Start(u64::from(self.pal_pos[str_num])))?; - self.bw.write_buf(pal.as_ref())?; + for quad in pal.chunks(4) { + self.bw.write_byte(quad[2])?; + self.bw.write_byte(quad[1])?; + self.bw.write_byte(quad[0])?; + self.bw.write_byte(0)?; + } self.bw.seek(SeekFrom::Start(cur_pos))?; self.pal_pos[str_num] = 0; break; @@ -278,6 +285,7 @@ impl<'a> MuxCore<'a> for AVIMuxer<'a> { self.bw.write_byte((end_clr - start_clr) as u8)?; self.bw.write_u16le(0)?; //flags self.bw.write_buf(&pal[start_clr * 4..end_clr * 4])?; + self.stream_info[str_num].pal_change = true; } } } @@ -320,6 +328,10 @@ impl<'a> MuxCore<'a> for AVIMuxer<'a> { for stri in self.stream_info.iter() { max_frames = max_frames.max(stri.nframes); max_size = max_size.max(stri.max_size); + if stri.pal_change { + self.bw.seek(SeekFrom::Start(stri.strh_pos))?; + self.bw.write_u32le(0x00010000)?; + } self.bw.seek(SeekFrom::Start(stri.strh_pos + 0x18))?; self.bw.write_u32le(if stri.is_video { stri.nframes } else { 0 })?; self.bw.write_u32le(stri.max_size)?;