]> git.nihav.org Git - nihav.git/blobdiff - src/demuxers/realmedia.rs
dsp: implement Kaiser-Bessel derived window generation
[nihav.git] / src / demuxers / realmedia.rs
index 6afc4cf646e70f84db655a6fa728c4e99a6ca35c..571f97bade449578c0d7d04ce67aa3c3e911b4e1 100644 (file)
@@ -130,7 +130,9 @@ impl RMAudioStream {
                         buf = Vec::with_capacity(bsize);
                         buf.resize(bsize, 0u8);
                     },
-                Deinterleaver::VBR      => { unimplemented!("deint"); },
+                Deinterleaver::VBR      => {
+                        buf = Vec::new();
+                    },
             };
         } else {
             deint = Deinterleaver::None;
@@ -188,12 +190,36 @@ impl RMAudioStream {
                     let mut dst = &mut self.buf[fsize * ppos..][..fsize];
                     src.read_buf(&mut dst)?;
                 },
-            _                       => { return src.read_packet(stream, ts, keyframe, payload_size); },
+            Deinterleaver::VBR      => {
+                    validate!(payload_size >= 5);
+                    let hdrsizesize         = src.read_u16be()?;
+                    let num_entries = (hdrsizesize / 16) as usize;
+                    validate!(payload_size >= num_entries * 3 + 2);
+                    let mut sizes: Vec<usize> = Vec::with_capacity(num_entries);
+                    let mut tot_size = 0;
+                    for _ in 0..num_entries {
+                        let sz              = src.read_u16be()? as usize;
+                        tot_size += sz;
+                        sizes.push(sz);
+                    }
+                    validate!(tot_size + num_entries * 2 + 2 == payload_size);
+                    let pkt_ts = NATimeInfo::new(None, None, None, tb_num, tb_den);
+                    let mut first = true;
+                    for size in sizes.iter() {
+                        let cur_ts = if first { ts } else { pkt_ts };
+                        first = false;
+                        let pkt = src.read_packet(stream.clone(), cur_ts, true, *size)?;
+                        queued_packets.push(pkt);
+                    }
+                    queued_packets.reverse();
+                    let pkt0 = queued_packets.pop().unwrap();
+                    return Ok(pkt0);
+                },
         };
 
         let iinfo = self.iinfo.unwrap();
         let factor   = iinfo.factor as usize;
-        let fsize    = iinfo.frame_size as usize;
+        let fsize    = if iinfo.block_size != 0 { iinfo.block_size } else { iinfo.frame_size } as usize;
 
         self.sub_packet += 1;
         if self.sub_packet < factor {
@@ -384,7 +410,7 @@ impl<'a> DemuxCore<'a> for RealMediaDemuxer<'a> {
                                     if packet_num == 1 {
                                         vstr.start_slice(num_pkts, frame_size as usize, self.slice_buf.as_slice());
                                     } else {
-                                        vstr.add_slice(packet_num as usize, self.slice_buf.as_slice()); 
+                                        vstr.add_slice(packet_num as usize, self.slice_buf.as_slice());
                                     }
                                     if (packet_num as usize) < num_pkts {
                                         continue;
@@ -414,7 +440,7 @@ impl<'a> DemuxCore<'a> for RealMediaDemuxer<'a> {
                                     if packet_num == 1 && frame_size == tail_size {
                                         vstr.start_slice(num_pkts, frame_size as usize, self.slice_buf.as_slice());
                                     } else {
-                                        vstr.add_slice(packet_num as usize, self.slice_buf.as_slice()); 
+                                        vstr.add_slice(packet_num as usize, self.slice_buf.as_slice());
                                     }
 
                                     while self.src.tell() < pos + (payload_size as u64) {
@@ -627,7 +653,7 @@ fn parse_aformat5(src: &mut ByteReader) -> DemuxerResult<RealAudioInfo> {
     if has_ileave_pattern != 0 {
 unimplemented!("ra5 interleave pattern");
     }
-    let edata_size          = src.read_u32be()?;
+    let mut edata_size          = src.read_u32be()?;
 
     let end = src.tell();
     validate!(end - start <= (header_size as u64) + 10);
@@ -640,6 +666,11 @@ unimplemented!("ra5 interleave pattern");
         } else {
             None
         };
+    if (fcc == mktag!(b"raac")) || (fcc == mktag!(b"racp")) {
+        validate!(edata_size > 1);
+        edata_size -= 1;
+        src.read_skip(1)?;
+    }
 
     Ok(RealAudioInfo {
         fcc: fcc, flavor: flavor,
@@ -946,27 +977,6 @@ fn parse_rm_stream(io: &mut ByteReader) -> DemuxerResult<NAStream> {
     unimplemented!();
 }
 
-#[allow(dead_code)]
-#[allow(unused_variables)]
-fn read_ra_vbr_stream(io: &mut ByteReader) -> DemuxerResult<NAPacket> {
-    let hdrsizesize = io.read_u16le()?;
-    let num_entries = (hdrsizesize / 16) as usize;
-    let mut sizes: Vec<usize> = Vec::with_capacity(num_entries);
-    for _ in 0..num_entries {
-        let sz      = io.read_u16le()? as usize;
-        sizes.push(sz);
-    }
-    for i in 0..num_entries {
-//read packet of sizes[i]
-    }
-    unimplemented!();
-}
-
-//todo interleavers
-
-//todo opaque data
-
-
 static RM_VIDEO_CODEC_REGISTER: &'static [(&[u8;4], &str)] = &[
     (b"RV10", "realvideo1"),
     (b"RV20", "realvideo2"),