static InnerAccessUnit decodePocType0(InnerAccessUnit current, InnerAccessUnit prev) {
    int TopFieldOrderCnt = Integer.MAX_VALUE;
    int BottomFieldOrderCnt = Integer.MAX_VALUE;

    int prevPicOrderCntMsb;
    int prevPicOrderCntLsb;

    if (current.sliceHeaders.get(0).slice_type == SliceType.I
        || current.sliceHeaders.get(0).slice_type == SliceType.SI) {
      prevPicOrderCntMsb = 0;
      prevPicOrderCntLsb = 0;
    } else {
      // if memory management dunno
      if (current.sei != null) {
        for (SEI.SEIMessage message : current.sei.messages) {
          if (message.payloadType == SEI.PIC_TIMING) {
            throw new RuntimeException("That needs to be implemented. 7687526897568234.");
          }
        }
      }
      prevPicOrderCntMsb = prev.picOrderCntMsb;
      prevPicOrderCntLsb = prev.sliceHeaders.get(0).pic_order_cnt_lsb;
    }
    int MaxPicOrderCntLsb =
        1 << (current.sliceHeaders.get(0).sps.log2_max_pic_order_cnt_lsb_minus4 + 4);
    int picOrderCntMsb;

    if ((current.sliceHeaders.get(0).pic_order_cnt_lsb < prevPicOrderCntLsb)
        && ((prevPicOrderCntLsb - current.sliceHeaders.get(0).pic_order_cnt_lsb)
            >= (MaxPicOrderCntLsb / 2))) {
      picOrderCntMsb = prevPicOrderCntMsb + MaxPicOrderCntLsb;
    } else if ((current.sliceHeaders.get(0).pic_order_cnt_lsb > prevPicOrderCntLsb)
        && ((current.sliceHeaders.get(0).pic_order_cnt_lsb - prevPicOrderCntLsb)
            > (MaxPicOrderCntLsb / 2))) {
      picOrderCntMsb = prevPicOrderCntMsb - MaxPicOrderCntLsb;
    } else {
      picOrderCntMsb = prevPicOrderCntMsb;
    }

    if (!current.sliceHeaders.get(0).bottom_field_flag) {
      TopFieldOrderCnt = picOrderCntMsb + current.sliceHeaders.get(0).pic_order_cnt_lsb;
    }

    if (current.sliceHeaders.get(0).bottom_field_flag) {
      if (!current.sliceHeaders.get(0).field_pic_flag) {
        BottomFieldOrderCnt =
            TopFieldOrderCnt + current.sliceHeaders.get(0).delta_pic_order_cnt_bottom;
      } else {
        BottomFieldOrderCnt = picOrderCntMsb + current.sliceHeaders.get(0).pic_order_cnt_lsb;
      }
    }

    if (current.sliceHeaders.get(0).sps.frame_mbs_only_flag
        || !current.sliceHeaders.get(0).field_pic_flag)
      current.poc = Math.min(TopFieldOrderCnt, BottomFieldOrderCnt);
    else if (current.sliceHeaders.get(0).bottom_field_flag) current.poc = BottomFieldOrderCnt;
    else current.poc = TopFieldOrderCnt;

    //    System.err.println("poc     : " + current.poc);
    //    System.err.println("poc-diff: " + (current.poc - prev.poc));
    return current;
  }