self.bw.write_u32le(0)?; // reserved
self.bw.write_u32le(0)?; // reserved
- self.pal_pos.truncate(0);
+ self.pal_pos.clear();
self.pal_pos.resize(strmgr.get_num_streams(), 0);
for (strno, str) in strmgr.iter().enumerate() {
let strl_pos = self.bw.tell() + 8;
self.bw.write_u32le(0)?;
self.bw.write_u32le(vinfo.width as u32)?;
self.bw.write_u32le(vinfo.height as u32)?;
- self.bw.write_u16le(vinfo.format.components as u16)?;
- self.bw.write_u16le(vinfo.format.get_total_depth() as u16)?;
+ if !vinfo.format.palette {
+ self.bw.write_u16le(vinfo.format.components as u16)?;
+ self.bw.write_u16le(vinfo.format.get_total_depth() as u16)?;
+ } else {
+ self.bw.write_u16le(1)?;
+ self.bw.write_u16le(8)?;
+ }
let fcc = find_avi_fourcc(str.get_info().get_name());
if fcc.is_none() {
return Err(MuxerError::UnsupportedFormat);
},
_ => unreachable!(),
};
- patch_size(&mut self.bw, strf_pos)?;
- patch_size(&mut self.bw, strl_pos)?;
+ patch_size(self.bw, strf_pos)?;
+ patch_size(self.bw, strl_pos)?;
}
- patch_size(&mut self.bw, hdrl_pos)?;
+ patch_size(self.bw, hdrl_pos)?;
self.data_pos = self.bw.tell() + 8;
self.bw.write_buf(b"LIST\0\0\0\0movi")?;
if self.data_pos == 0 {
return Err(MuxerError::NotCreated);
}
- let str = pkt.get_stream();
- let str_num = str.get_num();
+ let stream = pkt.get_stream();
+ let str_num = stream.get_num();
if str_num > 99 || str_num >= self.stream_info.len() {
return Err(MuxerError::UnsupportedFormat);
}
self.stream_info[str_num].max_size = self.stream_info[str_num].max_size.max(chunk_len);
self.index.push(IdxEntry {
stream: str_num as u32,
- stype: str.get_media_type(),
+ stype: stream.get_media_type(),
key: pkt.keyframe,
pos: self.bw.tell() as u32,
len: chunk_len });
- write_chunk_hdr(&mut self.bw, str.get_media_type(), str_num as u32)?;
+ write_chunk_hdr(self.bw, stream.get_media_type(), str_num as u32)?;
self.bw.write_u32le(chunk_len)?;
self.bw.write_buf(pkt.get_buffer().as_slice())?;
if (self.bw.tell() & 1) != 0 {
Ok(())
}
fn end(&mut self) -> MuxerResult<()> {
- patch_size(&mut self.bw, self.data_pos)?;
+ patch_size(self.bw, self.data_pos)?;
if !self.index.is_empty() {
self.bw.write_buf(b"idx1")?;
self.bw.write_u32le((self.index.len() * 16) as u32)?;
for item in self.index.iter() {
- write_chunk_hdr(&mut self.bw, item.stype, item.stream)?;
+ write_chunk_hdr(self.bw, item.stype, item.stream)?;
self.bw.write_u32le(if item.key { 0x10 } else { 0 })?;
self.bw.write_u32le(item.pos)?;
self.bw.write_u32le(item.len)?;
}
}
- patch_size(&mut self.bw, 8)?;
+ patch_size(self.bw, 8)?;
let mut max_frames = 0;
let mut max_size = 0;
for stri in self.stream_info.iter() {
fn test_avi_muxer() {
let mut dmx_reg = RegisteredDemuxers::new();
generic_register_all_demuxers(&mut dmx_reg);
+ //test sample: https://samples.mplayerhq.hu/V-codecs/RT21/320x240/laser05.avi
let dec_config = DecoderTestParams {
demuxer: "avi",
in_name: "assets/Indeo/laser05.avi",