bool H264Slice::Reset(H264NalExtension *pNalExt) { int32_t iMBInFrame; int32_t iFieldIndex; m_BitStream.Reset((uint8_t *) m_pSource.GetPointer(), (uint32_t) m_pSource.GetDataSize()); // decode slice header if (m_pSource.GetDataSize() && false == DecodeSliceHeader(pNalExt)) { ZeroedMembers(); return false; } m_iMBWidth = GetSeqParam()->frame_width_in_mbs; m_iMBHeight = GetSeqParam()->frame_height_in_mbs; iMBInFrame = (m_iMBWidth * m_iMBHeight) / ((m_SliceHeader.field_pic_flag) ? (2) : (1)); iFieldIndex = (m_SliceHeader.field_pic_flag && m_SliceHeader.bottom_field_flag) ? (1) : (0); // set slice variables m_iFirstMB = m_SliceHeader.first_mb_in_slice; m_iMaxMB = iMBInFrame; m_iFirstMBFld = m_SliceHeader.first_mb_in_slice + iMBInFrame * iFieldIndex; m_iAvailableMB = iMBInFrame; if (m_iFirstMB >= m_iAvailableMB) return false; // reset all internal variables m_bFirstDebThreadedCall = true; m_bError = false; // set conditional flags m_bDecoded = false; m_bPrevDeblocked = false; m_bDeblocked = (m_SliceHeader.disable_deblocking_filter_idc == DEBLOCK_FILTER_OFF); // frame is not associated yet m_pCurrentFrame = NULL; m_bInited = true; m_pSeqParamSet->IncrementReference(); m_pPicParamSet->IncrementReference(); if (m_pSeqParamSetEx) m_pSeqParamSetEx->IncrementReference(); if (m_pSeqParamSetMvcEx) m_pSeqParamSetMvcEx->IncrementReference(); if (m_pSeqParamSetSvcEx) m_pSeqParamSetSvcEx->IncrementReference(); return true; } // bool H264Slice::Reset(void *pSource, size_t nSourceSize, int32_t iNumber)
mfxStatus AVC_Spl::ProcessNalUnit(mfxI32 nalType, mfxBitstream * nalUnit) { if (!nalUnit) return MFX_ERR_MORE_DATA; switch (nalType) { case NAL_UT_IDR_SLICE: case NAL_UT_SLICE: case NAL_UT_CODED_SLICE_EXTENSION: { AVCSlice * pSlice = DecodeSliceHeader(nalUnit); if (pSlice) { mfxStatus sts = AddSlice(pSlice); if (sts == MFX_ERR_NOT_ENOUGH_BUFFER) { return sts; } if (!m_pLastSlice) { AddSliceNalUnit(nalUnit, pSlice); } else { m_lastNalUnit = nalUnit; } if (sts == MFX_ERR_NONE) { return sts; } } } break; case NAL_UT_SPS: case NAL_UT_PPS: case NAL_UT_SPS_EX: case NAL_UNIT_SUBSET_SPS: case NAL_UNIT_PREFIX: DecodeHeader(nalUnit); AddNalUnit(nalUnit); break; case NAL_UT_SEI: DecodeSEI(nalUnit); AddNalUnit(nalUnit); break; case NAL_UT_AUD: AddNalUnit(nalUnit); break; case NAL_UT_DPA: case NAL_UT_DPB: case NAL_UT_DPC: case NAL_UT_FD: case NAL_UT_UNSPECIFIED: break; case NAL_END_OF_STREAM: case NAL_END_OF_SEQ: { AddNalUnit(nalUnit); } break; default: break; }; return MFX_ERR_MORE_DATA; }
bool H264Slice::Reset(void *pSource, size_t nSourceSize, Ipp32s iConsumerNumber) { Ipp32s iMBInFrame; Ipp32s iFieldIndex; m_BitStream.Reset((Ipp8u *) pSource, (Ipp32u) nSourceSize); // decode slice header if (nSourceSize && false == DecodeSliceHeader()) return false; m_iMBWidth = GetSeqParam()->frame_width_in_mbs; m_iMBHeight = GetSeqParam()->frame_height_in_mbs; iMBInFrame = (m_iMBWidth * m_iMBHeight) / ((m_SliceHeader.field_pic_flag) ? (2) : (1)); iFieldIndex = (m_SliceHeader.field_pic_flag && m_SliceHeader.bottom_field_flag) ? (1) : (0); // set slice variables m_iFirstMB = m_SliceHeader.first_mb_in_slice; m_iMaxMB = iMBInFrame; m_iFirstMBFld = m_SliceHeader.first_mb_in_slice + iMBInFrame * iFieldIndex; m_iAvailableMB = iMBInFrame; if (m_iFirstMB >= m_iAvailableMB) return false; // reset all internal variables m_iCurMBToDec = m_iFirstMB; m_iCurMBToRec = m_iFirstMB; m_iCurMBToDeb = m_iFirstMB; m_bInProcess = false; m_bDecVacant = 1; m_bRecVacant = 1; m_bDebVacant = 1; m_bFirstDebThreadedCall = true; m_bError = false; m_MVsDistortion = 0; // reallocate internal buffer if (false == IsSliceGroups() && iConsumerNumber > 1) { Ipp32s iMBRowSize = GetMBRowWidth(); Ipp32s iMBRowBuffers; Ipp32s bit_depth_luma, bit_depth_chroma; if (m_SliceHeader.is_auxiliary) { bit_depth_luma = GetSeqParamEx()->bit_depth_aux; bit_depth_chroma = 8; } else { bit_depth_luma = GetSeqParam()->bit_depth_luma; bit_depth_chroma = GetSeqParam()->bit_depth_chroma; } Ipp32s isU16Mode = (bit_depth_luma > 8 || bit_depth_chroma > 8) ? 2 : 1; // decide number of buffers iMBRowBuffers = IPP_MAX(MINIMUM_NUMBER_OF_ROWS, MB_BUFFER_SIZE / iMBRowSize); iMBRowBuffers = IPP_MIN(MAXIMUM_NUMBER_OF_ROWS, iMBRowBuffers); m_CoeffsBuffers.Init(iMBRowBuffers, (Ipp32s)sizeof(Ipp16s) * isU16Mode * (iMBRowSize * COEFFICIENTS_BUFFER_SIZE + DEFAULT_ALIGN_VALUE)); } m_CoeffsBuffers.Reset(); // reset through-decoding variables m_nMBSkipCount = 0; m_nQuantPrev = m_pPicParamSet->pic_init_qp + m_SliceHeader.slice_qp_delta; m_prev_dquant = 0; m_field_index = iFieldIndex; if (IsSliceGroups()) m_bNeedToCheckMBSliceEdges = true; else m_bNeedToCheckMBSliceEdges = (0 == m_SliceHeader.first_mb_in_slice) ? (false) : (true); // set conditional flags m_bDecoded = false; m_bPrevDeblocked = false; m_bDeblocked = (m_SliceHeader.disable_deblocking_filter_idc == DEBLOCK_FILTER_OFF); if (m_bDeblocked) { m_bDebVacant = 0; m_iCurMBToDeb = m_iMaxMB; } // frame is not associated yet m_pCurrentFrame = NULL; return true; } // bool H264Slice::Reset(void *pSource, size_t nSourceSize, Ipp32s iNumber)