| 493 | |
| 494 | |
| 495 | bool CheckAccessUnitBoundary (PWelsDecoderContext pCtx, const PNalUnit kpCurNal, const PNalUnit kpLastNal, |
| 496 | const PSps kpSps) { |
| 497 | const PNalUnitHeaderExt kpLastNalHeaderExt = &kpLastNal->sNalHeaderExt; |
| 498 | const PNalUnitHeaderExt kpCurNalHeaderExt = &kpCurNal->sNalHeaderExt; |
| 499 | const SSliceHeader* kpLastSliceHeader = &kpLastNal->sNalData.sVclNal.sSliceHeaderExt.sSliceHeader; |
| 500 | const SSliceHeader* kpCurSliceHeader = &kpCurNal->sNalData.sVclNal.sSliceHeaderExt.sSliceHeader; |
| 501 | if (pCtx->sSpsPpsCtx.pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != NULL |
| 502 | && pCtx->sSpsPpsCtx.pActiveLayerSps[kpCurNalHeaderExt->uiDependencyId] != kpSps) { |
| 503 | return true; // the active sps changed, new sequence begins, so the current au is ready |
| 504 | } |
| 505 | |
| 506 | //Sub-clause 7.1.4.1.1 temporal_id |
| 507 | if (kpLastNalHeaderExt->uiTemporalId != kpCurNalHeaderExt->uiTemporalId) { |
| 508 | return true; |
| 509 | } |
| 510 | if (kpLastSliceHeader->iFrameNum != kpCurSliceHeader->iFrameNum) |
| 511 | return true; |
| 512 | // Subclause 7.4.1.2.5 |
| 513 | if (kpLastSliceHeader->iRedundantPicCnt > kpCurSliceHeader->iRedundantPicCnt) |
| 514 | return true; |
| 515 | |
| 516 | // Subclause G7.4.1.2.4 |
| 517 | if (kpLastNalHeaderExt->uiDependencyId > kpCurNalHeaderExt->uiDependencyId) |
| 518 | return true; |
| 519 | // Subclause 7.4.1.2.4 |
| 520 | if (kpLastNalHeaderExt->uiDependencyId == kpCurNalHeaderExt->uiDependencyId |
| 521 | && kpLastSliceHeader->iPpsId != kpCurSliceHeader->iPpsId) |
| 522 | return true; |
| 523 | if (kpLastSliceHeader->bFieldPicFlag != kpCurSliceHeader->bFieldPicFlag) |
| 524 | return true; |
| 525 | if (kpLastSliceHeader->bBottomFiledFlag != kpCurSliceHeader->bBottomFiledFlag) |
| 526 | return true; |
| 527 | if ((kpLastNalHeaderExt->sNalUnitHeader.uiNalRefIdc != NRI_PRI_LOWEST) != (kpCurNalHeaderExt->sNalUnitHeader.uiNalRefIdc |
| 528 | != NRI_PRI_LOWEST)) |
| 529 | return true; |
| 530 | if (kpLastNalHeaderExt->bIdrFlag != kpCurNalHeaderExt->bIdrFlag) |
| 531 | return true; |
| 532 | if (kpCurNalHeaderExt->bIdrFlag) { |
| 533 | if (kpLastSliceHeader->uiIdrPicId != kpCurSliceHeader->uiIdrPicId) |
| 534 | return true; |
| 535 | } |
| 536 | if (kpSps->uiPocType == 0) { |
| 537 | if (kpLastSliceHeader->iPicOrderCntLsb != kpCurSliceHeader->iPicOrderCntLsb) |
| 538 | return true; |
| 539 | if (kpLastSliceHeader->iDeltaPicOrderCntBottom != kpCurSliceHeader->iDeltaPicOrderCntBottom) |
| 540 | return true; |
| 541 | } else if (kpSps->uiPocType == 1) { |
| 542 | if (kpLastSliceHeader->iDeltaPicOrderCnt[0] != kpCurSliceHeader->iDeltaPicOrderCnt[0]) |
| 543 | return true; |
| 544 | if (kpLastSliceHeader->iDeltaPicOrderCnt[1] != kpCurSliceHeader->iDeltaPicOrderCnt[1]) |
| 545 | return true; |
| 546 | } |
| 547 | |
| 548 | return false; |
| 549 | } |
| 550 | |
| 551 | bool CheckNextAuNewSeq (PWelsDecoderContext pCtx, const PNalUnit kpCurNal, const PSps kpSps) { |
| 552 | const PNalUnitHeaderExt kpCurNalHeaderExt = &kpCurNal->sNalHeaderExt; |