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; }