// ogg_packet.mbt
//
// OGG packet 重组。OGG 通过 lacing 规则把若干 segment 组成逻辑 packet:
//   * 每个 segment 长度 0~255;
//   * 长度 < 255 表示它是当前 packet 的最后一个 segment;
//   * 长度 == 255 表示 packet 尚未结束,下一个 segment 仍属于同一 packet;
//   * 若页结束时 packet 仍未结束(该页最后一个 segment 长度为 255),
//     则下一个页必须带 CONTINUED 标志,其第一个 segment 延续该 packet。

///|
/// packet 重组器:跨页累积未完成的 packet。
struct PacketAssembler {
  buf : @buffer.Buffer
  mut active : Bool
}

///|
/// 新建一个空的 packet 重组器。
pub fn PacketAssembler::new() -> PacketAssembler {
  { buf: @buffer.Buffer(), active: false, }
}

///|
/// 处理一个页,返回该页内完成的所有 packet。
///
/// 跨页未完成的 packet 会累积在内部缓冲中,直到遇到长度 < 255 的 segment 才输出。
/// 调用方应保证页按顺序传入,且页的 CONTINUED 标志与上一个页的未完成状态一致。
pub fn PacketAssembler::push_page(
  self : PacketAssembler,
  page : OggPage,
) -> Array[Bytes] {
  let packets : Array[Bytes] = []
  let body_start = page.offset + OGG_HEADER_SIZE + page.n_segments
  let mut cursor = body_start
  for i in 0.. Bool {
  self.active
}