aac: clear M/S flags
[nihav.git] / nihav-game / src / demuxers / q.rs
index 473507adbb8eabdaec825afe22305b8f3aa54b5f..ebd93b2137b567fc934a9abcb32a40da812f328f 100644 (file)
@@ -24,7 +24,7 @@ impl<'a> DemuxCore<'a> for QDemuxer<'a> {
         validate!(hdr[0] == 0x39);
         validate!(hdr[1] == 0x68);
         let version = hdr[2];
-        validate!(version >= 3 && version <= 5);
+        validate!(version >= 3 && version <= 7);
         let mut width  = read_u16le(&hdr[4..])? as usize;
         let mut height = read_u16le(&hdr[6..])? as usize;
         if version > 3 {
@@ -55,14 +55,16 @@ impl<'a> DemuxCore<'a> for QDemuxer<'a> {
                 let mut buf = vec![0; size];
                                           self.src.read_buf(&mut buf)?;
                 let arate = read_u32le(&buf[24..])?;
-                let channels = buf[22];
-                let abits    = buf[34] as usize;
-                validate!(abits == 8 || abits == 16);
-                self.bps = (channels as usize) * abits / 8;
-                let bsize    = read_u16le(&buf[32..])? as usize;
-                let ahdr = NAAudioInfo::new(arate, channels as u8, if abits == 16 { SND_S16_FORMAT } else { SND_U8_FORMAT }, bsize);
-                let ainfo = NACodecInfo::new("pcm", NACodecTypeInfo::Audio(ahdr), None);
-                self.a_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, arate, 2));
+                if arate > 0 {
+                    let channels = buf[22];
+                    let abits    = buf[34] as usize;
+                    validate!(abits == 8 || abits == 16);
+                    self.bps = (channels as usize) * abits / 8;
+                    let bsize    = read_u16le(&buf[32..])? as usize;
+                    let ahdr = NAAudioInfo::new(arate, channels, if abits == 16 { SND_S16_FORMAT } else { SND_U8_FORMAT }, bsize);
+                    let ainfo = NACodecInfo::new("pcm", NACodecTypeInfo::Audio(ahdr), None);
+                    self.a_id = strmgr.add_stream(NAStream::new(StreamType::Audio, 1, ainfo, 1, arate, 2));
+                }
             }
         }
         self.apts = 0;
@@ -79,13 +81,12 @@ impl<'a> DemuxCore<'a> for QDemuxer<'a> {
                 0xFFFF => return Err(DemuxerError::EOF),
                 0 => {
                     if let Some(a_id) = self.a_id {
-                        let str = strmgr.get_stream(a_id).unwrap();
-                        let (tb_num, tb_den) = str.get_timebase();
-                        let ts = NATimeInfo::new(Some(self.apts), None, None, tb_num, tb_den);
+                        let stream = strmgr.get_stream(a_id).unwrap();
+                        let ts = stream.make_ts(Some(self.apts), None, None);
                         self.apts += (size / self.bps) as u64;
-                        return self.src.read_packet(str, ts, true, size);
+                        return self.src.read_packet(stream, ts, true, size);
                     } else {
-                        return Err(DemuxerError::InvalidData);
+                                          self.src.read_skip(size)?;
                     }
                 },
                 1 => {
@@ -98,9 +99,8 @@ impl<'a> DemuxCore<'a> for QDemuxer<'a> {
                 },
                 2 | 3 | 4 | 11 => {
                     validate!(self.v_id.is_some());
-                    let str = strmgr.get_stream(self.v_id.unwrap_or(0)).unwrap();
-                    let (tb_num, tb_den) = str.get_timebase();
-                    let ts = NATimeInfo::new(Some(self.vpts), None, None, tb_num, tb_den);
+                    let stream = strmgr.get_stream(self.v_id.unwrap_or(0)).unwrap();
+                    let ts = stream.make_ts(Some(self.vpts), None, None);
                     self.vpts += 1;
 
                     let cur_len = self.side_data.len();
@@ -114,7 +114,7 @@ impl<'a> DemuxCore<'a> for QDemuxer<'a> {
                     }
                     let mut buf = Vec::new();
                     std::mem::swap(&mut buf, &mut self.side_data);
-                    return Ok(NAPacket::new(str, ts, self.vpts == 1, buf));
+                    return Ok(NAPacket::new(stream, ts, self.vpts == 1, buf));
                 },
                 5 => {
                     validate!(size <= 256);