- if self.cur_slice < self.nslices {
- let first = self.cur_slice == 0;
- let hdr_size = self.nslices * 8 + 1;
- let cur_off = (read_u32be(&self.buf[self.cur_slice * 8 + 5..]).unwrap_or(0) as usize) + hdr_size;
- let next_off = if self.cur_slice + 1 < self.nslices {
- (read_u32be(&self.buf[self.cur_slice * 8 + 13..]).unwrap_or(0) as usize) + hdr_size
- } else {
- self.buf.len()
- };
- let next_off = next_off.max(cur_off);
- let src = &self.buf[cur_off..next_off];
- let ret = if self.nslices == 1 {
- let mut dst = vec![0; src.len() + 2];
- dst[0] = 0x40;
- dst[1] = self.seq_no;
- dst[2..].copy_from_slice(src);
- dst
- } else {
- let mut dst = Vec::with_capacity(src.len() + 11);
- let mut gw = GrowableMemoryWriter::new_write(&mut dst);
- let mut bw = ByteWriter::new(&mut gw);
-
- let hdr = ((self.nslices as u16) << 7) | ((self.cur_slice + 1) as u16);
- bw.write_u16be(hdr).unwrap();
-
- let full_size = self.buf.len() - hdr_size;
- if full_size < (1 << 14) {
- bw.write_u16be(0xC000 | (full_size as u16)).unwrap();
- } else {
- bw.write_u32be(0x80000000 | (full_size as u32)).unwrap();
+ if self.queue.is_empty() {
+ return None;
+ }
+ let tot_size = self.queue.iter().fold(0usize, |acc, q| acc + q.get_pkt_len());
+ if tot_size < self.pkt_size && !self.flush {
+ return None;
+ }
+ let mut pkt_buf = Vec::new();
+
+ let first = self.queue.pop_front().unwrap();
+ let is_first = match first.vtype {
+ VideoDataType::Frame => true,
+ VideoDataType::Slice{pkt_no, npkt: _, full_size: _, offset: _} => pkt_no == 1,
+ };
+ if self.queue.is_empty() || (first.get_pkt_len() + self.queue[0].get_pkt_len() + 4 > self.pkt_size) {
+ match first.vtype {
+ VideoDataType::Frame => {
+ pkt_buf.push(0x40); // 0x1 = whole frame
+ pkt_buf.push(first.seq_no);
+ pkt_buf.extend_from_slice(&first.data);
+ },
+ VideoDataType::Slice{pkt_no, npkt, full_size: _, offset: _} => {
+ let id = if pkt_no == npkt { 2 } else { 0 };
+ write_slice(&mut pkt_buf, id, &first);
+ },
+ };
+ } else {
+ let second = &self.queue[0];
+ match (first.vtype.is_frame(), second.vtype.is_frame()) {
+ (true, true) => {
+ write_multiple_frame(&mut pkt_buf, &first);
+ while !self.queue.is_empty() && self.queue[0].vtype.is_frame() && (pkt_buf.len() + self.queue[0].get_pkt_len() < self.pkt_size) {
+ let frm = self.queue.pop_front().unwrap();
+ write_multiple_frame(&mut pkt_buf, &frm);
+ }
+ },
+ (true, false) => {
+ pkt_buf.push(0x40); // 0x1 = whole frame
+ pkt_buf.push(first.seq_no);
+ pkt_buf.extend_from_slice(&first.data);
+ },
+ (false, true) => {
+ write_slice(&mut pkt_buf, 2, &first);
+ while !self.queue.is_empty() && self.queue[0].vtype.is_frame() && (pkt_buf.len() + self.queue[0].get_pkt_len() < self.pkt_size) {
+ let frm = self.queue.pop_front().unwrap();
+ write_multiple_frame(&mut pkt_buf, &frm);