| /* |
| * Copyright (c) 2017, Intel Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| //! |
| //! \file codechal_decode_vp8.cpp |
| //! \brief Implements the decode interface extension for VP8. |
| //! \details Implements all functions required by CodecHal for VP8 decoding. |
| //! |
| |
| #include "codechal_decoder.h" |
| #include "codechal_decode_vp8.h" |
| #include "codec_def_vp8_probs.h" |
| #include "codechal_mmc_decode_vp8.h" |
| #if USE_CODECHAL_DEBUG_TOOL |
| #include <sstream> |
| #include <fstream> |
| #include "codechal_debug.h" |
| #endif |
| |
| void Vp8EntropyState::DecodeFill() |
| { |
| int32_t shift = m_bdValueSize - 8 - (m_count + 8); |
| uint32_t bytesLeft = (uint32_t)(m_bufferEnd - m_buffer); |
| uint32_t bitsLeft = bytesLeft * CHAR_BIT; |
| int32_t num = (int32_t)(shift + CHAR_BIT - bitsLeft); |
| int32_t loopEnd = 0; |
| |
| if (num >= 0) |
| { |
| m_count += m_lotsOfBits; |
| loopEnd = num; |
| } |
| |
| if (num < 0 || bitsLeft) |
| { |
| while (shift >= loopEnd) |
| { |
| m_count += CHAR_BIT; |
| m_value |= (uint32_t)*m_buffer << shift; |
| ++m_buffer; |
| shift -= CHAR_BIT; |
| } |
| } |
| } |
| |
| uint32_t Vp8EntropyState::DecodeBool(int32_t probability) |
| { |
| uint32_t split = 1 + (((m_range - 1) * probability) >> 8); |
| uint32_t bigSplit = (uint32_t)split << (m_bdValueSize - 8); |
| uint32_t origRange = m_range; |
| m_range = split; |
| |
| uint32_t bit = 0; |
| if (m_value >= bigSplit) |
| { |
| m_range = origRange - split; |
| m_value = m_value - bigSplit; |
| bit = 1; |
| } |
| |
| int32_t shift = Norm[m_range]; |
| m_range <<= shift; |
| m_value <<= shift; |
| m_count -= shift; |
| |
| if (m_count < 0) |
| { |
| DecodeFill(); |
| } |
| |
| return bit; |
| } |
| |
| int32_t Vp8EntropyState::DecodeValue(int32_t bits) |
| { |
| int32_t retValue = 0; |
| |
| for (int32_t iBit = bits - 1; iBit >= 0; iBit--) |
| { |
| retValue |= (DecodeBool(0x80) << iBit); |
| } |
| |
| return retValue; |
| } |
| |
| void Vp8EntropyState::ParseFrameHeadInit() |
| { |
| if (m_frameHead->iFrameType == m_keyFrame) |
| { |
| MOS_SecureMemcpy(m_frameHead->FrameContext.MvContext, sizeof(DefaultMvContext), DefaultMvContext, sizeof(DefaultMvContext)); |
| MOS_SecureMemcpy(m_frameHead->FrameContext.YModeProb, sizeof(KfYModeProb), KfYModeProb, sizeof(KfYModeProb)); |
| MOS_SecureMemcpy(m_frameHead->FrameContext.UVModeProb, sizeof(KfUVModeProb), KfUVModeProb, sizeof(KfUVModeProb)); |
| MOS_SecureMemcpy(m_frameHead->FrameContext.CoefProbs, sizeof(DefaultCoefProbs), DefaultCoefProbs, sizeof(DefaultCoefProbs)); |
| |
| MOS_SecureMemcpy(m_frameHead->YModeProbs, sizeof(KfYModeProb), KfYModeProb, sizeof(KfYModeProb)); |
| MOS_SecureMemcpy(m_frameHead->UVModeProbs, sizeof(KfUVModeProb), KfUVModeProb, sizeof(KfUVModeProb)); |
| MOS_SecureMemcpy(m_frameHead->YModeProbs, sizeof(YModeProb), YModeProb, sizeof(YModeProb)); |
| MOS_SecureMemcpy(m_frameHead->UVModeProbs, sizeof(UVModeProb), UVModeProb, sizeof(UVModeProb)); |
| |
| memset(m_frameHead->SegmentFeatureData, 0, sizeof(m_frameHead->SegmentFeatureData)); |
| m_frameHead->u8MbSegementAbsDelta = 0; |
| |
| memset(m_frameHead->RefLFDeltas, 0, sizeof(m_frameHead->RefLFDeltas)); |
| memset(m_frameHead->ModeLFDeltas, 0, sizeof(m_frameHead->ModeLFDeltas)); |
| |
| m_frameHead->iRefreshGoldenFrame = 1; |
| m_frameHead->iRefreshAltFrame = 1; |
| m_frameHead->iCopyBufferToGolden = 0; |
| m_frameHead->iCopyBufferToAlt = 0; |
| |
| m_frameHead->iLastFrameBufferCurrIdx = m_frameHead->iNewFrameBufferIdx; |
| m_frameHead->iGoldenFrameBufferCurrIdx = m_frameHead->iNewFrameBufferIdx; |
| m_frameHead->iAltFrameBufferCurrIdx = m_frameHead->iNewFrameBufferIdx; |
| |
| m_frameHead->RefFrameSignBias[VP8_GOLDEN_FRAME] = 0; |
| m_frameHead->RefFrameSignBias[VP8_ALTREF_FRAME] = 0; |
| } |
| } |
| |
| int32_t Vp8EntropyState::StartEntropyDecode() |
| { |
| m_bufferEnd = m_dataBufferEnd; |
| m_buffer = m_dataBuffer; |
| m_value = 0; |
| m_count = -8; |
| m_range = 255; |
| |
| if ((m_bufferEnd - m_buffer) > 0 && m_buffer == nullptr) |
| { |
| return 1; |
| } |
| |
| DecodeFill(); |
| |
| return 0; |
| } |
| |
| void Vp8EntropyState::SegmentationEnabled() |
| { |
| m_frameHead->u8SegmentationEnabled = (uint8_t)DecodeBool(m_probHalf); |
| |
| if (m_frameHead->u8SegmentationEnabled) |
| { |
| m_frameHead->u8UpdateMbSegmentationMap = (uint8_t)DecodeBool(m_probHalf); |
| m_frameHead->u8UpdateMbSegmentationData = (uint8_t)DecodeBool(m_probHalf); |
| |
| if (m_frameHead->u8UpdateMbSegmentationData) |
| { |
| m_frameHead->u8MbSegementAbsDelta = (uint8_t)DecodeBool(m_probHalf); |
| |
| memset(m_frameHead->SegmentFeatureData, 0, sizeof(m_frameHead->SegmentFeatureData)); |
| |
| for (int32_t i = 0; i < VP8_MB_LVL_MAX; i++) |
| { |
| for (int32_t j = 0; j < VP8_MAX_MB_SEGMENTS; j++) |
| { |
| if (DecodeBool(m_probHalf)) |
| { |
| m_frameHead->SegmentFeatureData[i][j] = (int8_t)DecodeValue(MbFeatureDataBits[i]); |
| |
| if (DecodeBool(m_probHalf)) |
| { |
| m_frameHead->SegmentFeatureData[i][j] = -m_frameHead->SegmentFeatureData[i][j]; |
| } |
| } |
| else |
| { |
| m_frameHead->SegmentFeatureData[i][j] = 0; |
| } |
| } |
| } |
| } |
| |
| if (m_frameHead->u8UpdateMbSegmentationMap) |
| { |
| memset(m_frameHead->MbSegmentTreeProbs, 255, sizeof(m_frameHead->MbSegmentTreeProbs)); |
| |
| for (int32_t i = 0; i < VP8_MB_SEGMENT_TREE_PROBS; i++) |
| { |
| if (DecodeBool(m_probHalf)) |
| { |
| m_frameHead->MbSegmentTreeProbs[i] = (uint8_t)DecodeValue(8); |
| } |
| } |
| } |
| } |
| else |
| { |
| m_frameHead->u8UpdateMbSegmentationMap = 0; |
| m_frameHead->u8UpdateMbSegmentationData = 0; |
| } |
| } |
| |
| void Vp8EntropyState::LoopFilterInit(int32_t defaultFilterLvl) |
| { |
| for (int32_t segmentNum = 0; segmentNum < VP8_MAX_MB_SEGMENTS; segmentNum++) |
| { |
| int32_t segmentLvl = defaultFilterLvl; |
| |
| if (m_frameHead->u8SegmentationEnabled) |
| { |
| if (m_frameHead->u8MbSegementAbsDelta == 1) |
| { |
| m_frameHead->LoopFilterLevel[segmentNum] = segmentLvl = m_frameHead->SegmentFeatureData[VP8_MB_LVL_ALT_LF][segmentNum]; |
| } |
| else |
| { |
| segmentLvl += m_frameHead->SegmentFeatureData[VP8_MB_LVL_ALT_LF][segmentNum]; |
| m_frameHead->LoopFilterLevel[segmentNum] = segmentLvl = (segmentLvl > 0) ? ((segmentLvl > 63) ? 63 : segmentLvl) : 0; |
| } |
| } |
| } |
| } |
| |
| void Vp8EntropyState::LoopFilterEnabled() |
| { |
| m_frameHead->FilterType = (VP8_LF_TYPE)DecodeBool(m_probHalf); |
| m_frameHead->iFilterLevel = DecodeValue(6); |
| m_frameHead->iSharpnessLevel = DecodeValue(3); |
| |
| m_frameHead->u8ModeRefLfDeltaUpdate = 0; |
| m_frameHead->u8ModeRefLfDeltaEnabled = (uint8_t)DecodeBool(m_probHalf); |
| |
| if (m_frameHead->u8ModeRefLfDeltaEnabled) |
| { |
| m_frameHead->u8ModeRefLfDeltaUpdate = (uint8_t)DecodeBool(m_probHalf); |
| |
| if (m_frameHead->u8ModeRefLfDeltaUpdate) |
| { |
| for (int32_t i = 0; i < VP8_MAX_REF_LF_DELTAS; i++) |
| { |
| if (DecodeBool(m_probHalf)) |
| { |
| m_frameHead->RefLFDeltas[i] = (int8_t)DecodeValue(6); |
| |
| if (DecodeBool(m_probHalf)) |
| { |
| m_frameHead->RefLFDeltas[i] = m_frameHead->RefLFDeltas[i] * (-1); |
| } |
| } |
| } |
| |
| for (int32_t i = 0; i < VP8_MAX_MODE_LF_DELTAS; i++) |
| { |
| if (DecodeBool(m_probHalf)) |
| { |
| m_frameHead->ModeLFDeltas[i] = (int8_t)DecodeValue(6); |
| |
| if (DecodeBool(m_probHalf)) |
| { |
| m_frameHead->ModeLFDeltas[i] = m_frameHead->ModeLFDeltas[i] * (-1); |
| } |
| } |
| } |
| } |
| } |
| |
| if (m_frameHead->iFilterLevel) |
| { |
| LoopFilterInit(m_frameHead->iFilterLevel); |
| } |
| } |
| |
| int32_t Vp8EntropyState::GetDeltaQ(int32_t prevVal, int32_t *qupdate) |
| { |
| int32_t retVal = 0; |
| |
| if (DecodeBool(m_probHalf)) |
| { |
| retVal = DecodeValue(4); |
| |
| if (DecodeBool(m_probHalf)) |
| { |
| retVal = -retVal; |
| } |
| } |
| |
| if (retVal != prevVal) |
| { |
| *qupdate = 1; |
| } |
| |
| return retVal; |
| } |
| |
| int32_t Vp8EntropyState::DcQuant(int32_t qindex, int32_t delta) |
| { |
| int32_t retVal; |
| |
| qindex = qindex + delta; |
| |
| if (qindex > 127) |
| { |
| qindex = 127; |
| } |
| else if (qindex < 0) |
| { |
| qindex = 0; |
| } |
| |
| retVal = DcQLookup[qindex]; |
| return retVal; |
| } |
| |
| int32_t Vp8EntropyState::Dc2Quant(int32_t qindex, int32_t delta) |
| { |
| int32_t retVal; |
| |
| qindex = qindex + delta; |
| |
| if (qindex > 127) |
| { |
| qindex = 127; |
| } |
| else if (qindex < 0) |
| { |
| qindex = 0; |
| } |
| |
| retVal = DcQLookup[qindex] * 2; |
| return retVal; |
| } |
| |
| int32_t Vp8EntropyState::DcUVQuant(int32_t qindex, int32_t delta) |
| { |
| int32_t retVal; |
| |
| qindex = qindex + delta; |
| |
| if (qindex > 127) |
| { |
| qindex = 127; |
| } |
| else if (qindex < 0) |
| { |
| qindex = 0; |
| } |
| |
| retVal = DcQLookup[qindex]; |
| |
| if (retVal > 132) |
| { |
| retVal = 132; |
| } |
| |
| return retVal; |
| } |
| |
| int32_t Vp8EntropyState::AcYQuant(int32_t qindex) |
| { |
| int32_t retVal; |
| |
| if (qindex > 127) |
| { |
| qindex = 127; |
| } |
| else if (qindex < 0) |
| { |
| qindex = 0; |
| } |
| |
| retVal = AcQLookup[qindex]; |
| return retVal; |
| } |
| |
| int32_t Vp8EntropyState::Ac2Quant(int32_t qindex, int32_t delta) |
| { |
| int32_t retVal; |
| |
| qindex = qindex + delta; |
| |
| if (qindex > 127) |
| { |
| qindex = 127; |
| } |
| else if (qindex < 0) |
| { |
| qindex = 0; |
| } |
| |
| retVal = (AcQLookup[qindex] * 101581) >> 16; |
| |
| if (retVal < 8) |
| { |
| retVal = 8; |
| } |
| |
| return retVal; |
| } |
| int32_t Vp8EntropyState::AcUVQuant(int32_t qindex, int32_t delta) |
| { |
| int32_t retVal; |
| |
| qindex = qindex + delta; |
| |
| if (qindex > 127) |
| { |
| qindex = 127; |
| } |
| else if (qindex < 0) |
| { |
| qindex = 0; |
| } |
| |
| retVal = AcQLookup[qindex]; |
| return retVal; |
| } |
| |
| void Vp8EntropyState::QuantInit() |
| { |
| for (int32_t i = 0; i < VP8_Q_INDEX_RANGE; i++) |
| { |
| m_frameHead->Y1DeQuant[i][0] = (int16_t)DcQuant(i, m_frameHead->iY1DcDeltaQ); |
| m_frameHead->Y2DeQuant[i][0] = (int16_t)Dc2Quant(i, m_frameHead->iY2DcDeltaQ); |
| m_frameHead->UVDeQuant[i][0] = (int16_t)DcUVQuant(i, m_frameHead->iUVDcDeltaQ); |
| |
| m_frameHead->Y1DeQuant[i][1] = (int16_t)AcYQuant(i); |
| m_frameHead->Y2DeQuant[i][1] = (int16_t)Ac2Quant(i, m_frameHead->iY2AcDeltaQ); |
| m_frameHead->UVDeQuant[i][1] = (int16_t)AcUVQuant(i, m_frameHead->iUVAcDeltaQ); |
| } |
| } |
| |
| void Vp8EntropyState::QuantSetup() |
| { |
| int32_t qupdate = 0; |
| |
| m_frameHead->iBaseQIndex = DecodeValue(7); |
| m_frameHead->iY1DcDeltaQ = GetDeltaQ(m_frameHead->iY1DcDeltaQ, &qupdate); |
| m_frameHead->iY2DcDeltaQ = GetDeltaQ(m_frameHead->iY2DcDeltaQ, &qupdate); |
| m_frameHead->iY2AcDeltaQ = GetDeltaQ(m_frameHead->iY2AcDeltaQ, &qupdate); |
| m_frameHead->iUVDcDeltaQ = GetDeltaQ(m_frameHead->iUVDcDeltaQ, &qupdate); |
| m_frameHead->iUVAcDeltaQ = GetDeltaQ(m_frameHead->iUVAcDeltaQ, &qupdate); |
| |
| if (qupdate) |
| { |
| QuantInit(); |
| } |
| } |
| |
| void Vp8EntropyState::ReadMvContexts(MV_CONTEXT *mvContext) |
| { |
| int32_t i = 0; |
| |
| do |
| { |
| const uint8_t *upProb = MvUpdateProbs[i].MvProb; |
| uint8_t *prob = (uint8_t *)(mvContext + i); |
| uint8_t *const stopProb = prob + 19; |
| |
| do |
| { |
| if (DecodeBool(*upProb++)) |
| { |
| const uint8_t x = (uint8_t)DecodeValue(7); |
| |
| *prob = x ? x << 1 : 1; |
| } |
| } while (++prob < stopProb); |
| |
| } while (++i < 2); |
| } |
| |
| MOS_STATUS Vp8EntropyState::ParseFrameHead(PCODEC_VP8_PIC_PARAMS vp8PicParams) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| ParseFrameHeadInit(); |
| |
| StartEntropyDecode(); |
| |
| if (m_frameHead->iFrameType == m_keyFrame) |
| { |
| DecodeBool(m_probHalf); // Color Space |
| DecodeBool(m_probHalf); // Clamp Type |
| } |
| |
| SegmentationEnabled(); |
| |
| LoopFilterEnabled(); |
| |
| m_frameHead->MultiTokenPartition = (VP8_TOKEN_PARTITION)DecodeValue(2); |
| |
| if (!m_frameHead->bNotFirstCall) |
| { |
| QuantInit(); |
| } |
| |
| QuantSetup(); |
| |
| if (m_frameHead->iFrameType != m_keyFrame) |
| { |
| m_frameHead->iRefreshGoldenFrame = DecodeBool(m_probHalf); |
| |
| m_frameHead->iRefreshAltFrame = DecodeBool(m_probHalf); |
| |
| m_frameHead->iCopyBufferToGolden = 0; |
| |
| if (!m_frameHead->iRefreshGoldenFrame) |
| { |
| m_frameHead->iCopyBufferToGolden = DecodeValue(2); |
| } |
| |
| m_frameHead->iCopyBufferToAlt = 0; |
| |
| if (!m_frameHead->iRefreshAltFrame) |
| { |
| m_frameHead->iCopyBufferToAlt = DecodeValue(2); |
| } |
| |
| m_frameHead->RefFrameSignBias[VP8_GOLDEN_FRAME] = DecodeBool(m_probHalf); |
| m_frameHead->RefFrameSignBias[VP8_ALTREF_FRAME] = DecodeBool(m_probHalf); |
| } |
| |
| if (m_frameHead->bNotFirstCall && m_frameHead->iRefreshEntropyProbs == 0) |
| { |
| MOS_SecureMemcpy(&m_frameHead->FrameContext, sizeof(m_frameHead->FrameContext), &m_frameHead->LastFrameContext, sizeof(m_frameHead->LastFrameContext)); |
| } |
| |
| m_frameHead->iRefreshEntropyProbs = DecodeBool(m_probHalf); |
| |
| if (m_frameHead->iRefreshEntropyProbs == 0) |
| { |
| MOS_SecureMemcpy(&m_frameHead->LastFrameContext, sizeof(m_frameHead->LastFrameContext), &m_frameHead->FrameContext, sizeof(m_frameHead->FrameContext)); |
| } |
| |
| if (m_frameHead->iFrameType == m_keyFrame || DecodeBool(m_probHalf)) |
| { |
| m_frameHead->iRefreshLastFrame = true; |
| } |
| else |
| { |
| m_frameHead->iRefreshLastFrame = false; |
| } |
| |
| for (int32_t i = 0; i < VP8_BLOCK_TYPES; i++) |
| for (int32_t j = 0; j < VP8_COEF_BANDS; j++) |
| for (int32_t k = 0; k < VP8_PREV_COEF_CONTEXTS; k++) |
| for (int32_t l = 0; l < VP8_ENTROPY_NODES; l++) |
| { |
| uint8_t *const p = m_frameHead->FrameContext.CoefProbs[i][j][k] + l; |
| |
| if (DecodeBool(CoefUpdateProbs[i][j][k][l])) |
| { |
| *p = (uint8_t)DecodeValue(8); |
| } |
| } |
| |
| m_frameHead->iMbNoCoeffSkip = (int32_t)DecodeBool(m_probHalf); |
| m_frameHead->iProbSkipFalse = 0; |
| if (m_frameHead->iMbNoCoeffSkip) |
| { |
| m_frameHead->iProbSkipFalse = (uint8_t)DecodeValue(8); |
| } |
| |
| if (m_frameHead->iFrameType != m_keyFrame) |
| { |
| m_frameHead->ProbIntra = (uint8_t)DecodeValue(8); |
| m_frameHead->ProbLast = (uint8_t)DecodeValue(8); |
| m_frameHead->ProbGf = (uint8_t)DecodeValue(8); |
| |
| if (DecodeBool(m_probHalf)) |
| { |
| int32_t i = 0; |
| |
| do |
| { |
| m_frameHead->YModeProbs[i] = m_frameHead->FrameContext.YModeProb[i] = |
| (uint8_t)DecodeValue(8); |
| } while (++i < 4); |
| } |
| |
| if (DecodeBool(m_probHalf)) |
| { |
| int32_t i = 0; |
| |
| do |
| { |
| m_frameHead->UVModeProbs[i] = m_frameHead->FrameContext.UVModeProb[i] = |
| (uint8_t)DecodeValue(8); |
| } while (++i < 3); |
| } |
| |
| MV_CONTEXT MVContext[2]; |
| for (int32_t i = 0; i < 2; i++) |
| { |
| for (int32_t j = 0; j < 19; j++) |
| { |
| MVContext[i].MvProb[j] = vp8PicParams->ucMvUpdateProb[i][j]; |
| } |
| } |
| |
| ReadMvContexts(MVContext); |
| } |
| |
| vp8PicParams->ucP0EntropyCount = 8 - (m_count & 0x07); |
| vp8PicParams->ucP0EntropyValue = (uint8_t)(m_value >> 24); |
| vp8PicParams->uiP0EntropyRange = m_range; |
| |
| uint32_t firstPartitionAndUncompSize; |
| if (m_frameHead->iFrameType == m_keyFrame) |
| { |
| firstPartitionAndUncompSize = vp8PicParams->uiFirstPartitionSize + 10; |
| } |
| else |
| { |
| firstPartitionAndUncompSize = vp8PicParams->uiFirstPartitionSize + 3; |
| } |
| |
| // Partition Size |
| uint32_t partitionNum = 1 << m_frameHead->MultiTokenPartition; |
| uint32_t partitionSizeSum = 0; |
| m_dataBuffer = m_bitstreamBuffer + firstPartitionAndUncompSize; |
| if (partitionNum > 1) |
| { |
| for (int32_t i = 1; i < (int32_t)partitionNum; i++) |
| { |
| vp8PicParams->uiPartitionSize[i] = m_dataBuffer[0] + (m_dataBuffer[1] << 8) + (m_dataBuffer[2] << 16); |
| m_dataBuffer += 3; |
| partitionSizeSum += vp8PicParams->uiPartitionSize[i]; |
| } |
| } |
| |
| uint32_t offsetCounter = ((m_count & 0x18) >> 3) + (((m_count & 0x07) != 0) ? 1 : 0); |
| vp8PicParams->uiFirstMbByteOffset = (uint32_t)(m_buffer - m_bitstreamBuffer) - offsetCounter; |
| vp8PicParams->uiPartitionSize[0] = firstPartitionAndUncompSize - (uint32_t)(m_buffer - m_bitstreamBuffer) + offsetCounter; |
| vp8PicParams->uiPartitionSize[partitionNum] = m_bitstreamBufferSize - firstPartitionAndUncompSize - (partitionNum - 1) * 3 - partitionSizeSum; |
| |
| return eStatus; |
| } |
| |
| void Vp8EntropyState::FrameHeadQuantUpdate( |
| PCODEC_VP8_PIC_PARAMS vp8PicParams) |
| { |
| for (int32_t i = 0; i < VP8_Q_INDEX_RANGE; i++) |
| { |
| m_frameHead->Y1DeQuant[i][0] = (int16_t)DcQuant(i, vp8PicParams->cY1DcDeltaQ); |
| m_frameHead->Y2DeQuant[i][0] = (int16_t)Dc2Quant(i, vp8PicParams->cY2DcDeltaQ); |
| m_frameHead->UVDeQuant[i][0] = (int16_t)DcUVQuant(i, vp8PicParams->cUVDcDeltaQ); |
| |
| m_frameHead->Y1DeQuant[i][1] = (int16_t)AcYQuant(i); |
| m_frameHead->Y2DeQuant[i][1] = (int16_t)Ac2Quant(i, vp8PicParams->cY2AcDeltaQ); |
| m_frameHead->UVDeQuant[i][1] = (int16_t)AcUVQuant(i, vp8PicParams->cUVAcDeltaQ); |
| } |
| } |
| |
| void Vp8EntropyState::Initialize( |
| PCODECHAL_DECODE_VP8_FRAME_HEAD vp8FrameHeadIn, |
| uint8_t* bitstreamBufferIn, |
| uint32_t bitstreamBufferSizeIn) |
| { |
| m_frameHead = vp8FrameHeadIn; |
| m_dataBuffer = bitstreamBufferIn; |
| m_dataBufferEnd = bitstreamBufferIn + bitstreamBufferSizeIn; |
| m_bitstreamBuffer = bitstreamBufferIn; |
| m_bitstreamBufferSize = bitstreamBufferSizeIn; |
| |
| m_frameHead->iFrameType = m_dataBuffer[0] & 1; |
| m_frameHead->iVersion = (m_dataBuffer[0] >> 1) & 7; |
| m_frameHead->iShowframe = (m_dataBuffer[0] >> 4) & 1; |
| m_frameHead->uiFirstPartitionLengthInBytes = (m_dataBuffer[0] | (m_dataBuffer[1] << 8) | (m_dataBuffer[2] << 16)) >> 5; |
| |
| m_dataBuffer += 3; |
| |
| if (m_frameHead->iFrameType == m_keyFrame) |
| { |
| m_dataBuffer += 7; |
| } |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::ParseFrameHead(uint8_t* bitstreamBuffer, uint32_t bitstreamBufferSize) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| CODECHAL_DECODE_CHK_NULL_RETURN(bitstreamBuffer); |
| |
| m_vp8EntropyState.Initialize(&m_vp8FrameHead, bitstreamBuffer, bitstreamBufferSize); |
| |
| eStatus = m_vp8EntropyState.ParseFrameHead(m_vp8PicParams); |
| |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_DECODE_ASSERTMESSAGE("Fail to parse VP8 Frame Head"); |
| return eStatus; |
| } |
| |
| //------------------------------------------------------Temporary Separator |
| |
| // Loop Filter |
| for (int32_t i = 0; i < VP8_MAX_MB_SEGMENTS; i++) |
| { |
| int32_t segmentLvl = m_vp8PicParams->ucFilterLevel; |
| |
| if (m_vp8PicParams->segmentation_enabled) |
| { |
| if (m_vp8PicParams->mb_segement_abs_delta == 1) |
| { |
| m_vp8PicParams->ucLoopFilterLevel[i] = segmentLvl = m_vp8PicParams->cSegmentFeatureData[VP8_MB_LVL_ALT_LF][i]; |
| } |
| else |
| { |
| segmentLvl += m_vp8PicParams->cSegmentFeatureData[VP8_MB_LVL_ALT_LF][i]; |
| m_vp8PicParams->ucLoopFilterLevel[i] = segmentLvl = (segmentLvl > 0) ? ((segmentLvl > 63) ? 63 : segmentLvl) : 0; |
| } |
| } |
| else |
| { |
| m_vp8PicParams->ucLoopFilterLevel[i] = m_vp8PicParams->ucFilterLevel; |
| } |
| } |
| |
| // Quant Matrix |
| int32_t vp8QIndex[VP8_MAX_MB_SEGMENTS]; |
| if (m_vp8PicParams->segmentation_enabled) |
| { |
| for (int32_t i = 0; i < 4; i++) |
| { |
| if (m_vp8PicParams->mb_segement_abs_delta == 1) |
| { |
| vp8QIndex[i] = (int32_t)m_vp8PicParams->cSegmentFeatureData[VP8_MB_LVL_ALT_Q][i]; |
| } |
| else |
| { |
| vp8QIndex[i] = (int32_t)m_vp8PicParams->ucBaseQIndex + (int32_t)m_vp8PicParams->cSegmentFeatureData[VP8_MB_LVL_ALT_Q][i]; |
| vp8QIndex[i] = (vp8QIndex[i] >= 0) ? ((vp8QIndex[i] <= VP8_MAX_Q) ? vp8QIndex[i] : VP8_MAX_Q) : 0; // Clamp to valid range |
| } |
| } |
| } |
| else |
| { |
| vp8QIndex[0] = (int32_t)m_vp8PicParams->ucBaseQIndex; |
| vp8QIndex[1] = 0; |
| vp8QIndex[2] = 0; |
| vp8QIndex[3] = 0; |
| } |
| |
| m_vp8EntropyState.FrameHeadQuantUpdate(m_vp8PicParams); |
| |
| m_vp8IqMatrixParams->quantization_values[0][0] = m_vp8FrameHead.Y1DeQuant[vp8QIndex[0]][0]; |
| m_vp8IqMatrixParams->quantization_values[0][1] = m_vp8FrameHead.Y1DeQuant[vp8QIndex[0]][1]; |
| m_vp8IqMatrixParams->quantization_values[0][2] = m_vp8FrameHead.UVDeQuant[vp8QIndex[0]][0]; |
| m_vp8IqMatrixParams->quantization_values[0][3] = m_vp8FrameHead.UVDeQuant[vp8QIndex[0]][1]; |
| m_vp8IqMatrixParams->quantization_values[0][4] = m_vp8FrameHead.Y2DeQuant[vp8QIndex[0]][0]; |
| m_vp8IqMatrixParams->quantization_values[0][5] = m_vp8FrameHead.Y2DeQuant[vp8QIndex[0]][1]; |
| |
| if (m_vp8FrameHead.u8SegmentationEnabled) |
| { |
| for (int32_t i = 1; i < 4; i++) |
| { |
| m_vp8IqMatrixParams->quantization_values[i][0] = m_vp8FrameHead.Y1DeQuant[vp8QIndex[i]][0]; |
| m_vp8IqMatrixParams->quantization_values[i][1] = m_vp8FrameHead.Y1DeQuant[vp8QIndex[i]][1]; |
| m_vp8IqMatrixParams->quantization_values[i][2] = m_vp8FrameHead.UVDeQuant[vp8QIndex[i]][0]; |
| m_vp8IqMatrixParams->quantization_values[i][3] = m_vp8FrameHead.UVDeQuant[vp8QIndex[i]][1]; |
| m_vp8IqMatrixParams->quantization_values[i][4] = m_vp8FrameHead.Y2DeQuant[vp8QIndex[i]][0]; |
| m_vp8IqMatrixParams->quantization_values[i][5] = m_vp8FrameHead.Y2DeQuant[vp8QIndex[i]][1]; |
| } |
| } |
| else |
| { |
| for (int32_t i = 1; i < 4; i++) |
| { |
| for (int32_t j = 0; j < 6; j++) |
| { |
| m_vp8IqMatrixParams->quantization_values[i][j] = 0; |
| } |
| } |
| } |
| |
| // Coef Prob |
| if (!Mos_ResourceIsNull(&m_resCoefProbBuffer)) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resCoefProbBuffer); |
| } |
| |
| CODECHAL_DECODE_CHK_STATUS_MESSAGE_RETURN(AllocateBuffer( |
| &m_resCoefProbBuffer, |
| sizeof(m_vp8FrameHead.FrameContext.CoefProbs), |
| "VP8_Coef_Prob"), |
| "Failed to allocate VP8 CoefProb Buffer."); |
| |
| CodechalResLock ResourceLock(m_osInterface, &m_resCoefProbBuffer); |
| auto data = (uint8_t*)ResourceLock.Lock(CodechalResLock::writeOnly); |
| |
| CODECHAL_DECODE_CHK_NULL_RETURN(data); |
| |
| MOS_SecureMemcpy( |
| data, |
| sizeof(m_vp8FrameHead.FrameContext.CoefProbs), |
| (void *)&(m_vp8FrameHead.FrameContext.CoefProbs), |
| sizeof(m_vp8FrameHead.FrameContext.CoefProbs)); |
| |
| m_vp8FrameHead.bNotFirstCall = true; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::CopyBitstreamBuffer( |
| MOS_RESOURCE srcBitstreamBuffer, |
| PMOS_RESOURCE dstBitstreamBuffer, |
| uint32_t size) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSetGpuContext( |
| m_osInterface, |
| m_videoContextForWa)); |
| m_osInterface->pfnResetOsStates(m_osInterface); |
| |
| m_osInterface->pfnSetPerfTag( |
| m_osInterface, |
| (uint16_t)(((m_mode << 4) & 0xF0) | COPY_TYPE)); |
| m_osInterface->pfnResetPerfBufferID(m_osInterface); |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| // Send command buffer header at the beginning (OS dependent) |
| CODECHAL_DECODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(&cmdBuffer, false)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(HucCopy( |
| &cmdBuffer, // pCmdBuffer |
| &srcBitstreamBuffer, // presSrc |
| dstBitstreamBuffer, // presDst |
| MOS_ALIGN_CEIL(size, 16), // u32CopyLength |
| 0, // u32CopyInputOffset |
| 0)); // u32CopyOutputOffset |
| |
| MHW_MI_FLUSH_DW_PARAMS flushDwParams; |
| MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams)); |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd( |
| &cmdBuffer, |
| &flushDwParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd( |
| &cmdBuffer, |
| nullptr)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| m_huCCopyInUse = true; |
| |
| MOS_SYNC_PARAMS syncParams; |
| |
| syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_videoContext; |
| syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams)); |
| |
| syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_videoContextForWa; |
| syncParams.presSyncResource = &m_resSyncObjectVideoContextInUse; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer( |
| m_osInterface, |
| &cmdBuffer, |
| m_videoContextUsesNullHw)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSetGpuContext(m_osInterface, m_videoContext)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::AllocateResourcesFixedSizes() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateSyncResource(m_osInterface, &m_resSyncObject)); |
| |
| CodecHalAllocateDataList( |
| m_vp8RefList, |
| CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP8); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateSyncResource( |
| m_osInterface, |
| &m_resSyncObjectWaContextInUse)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateSyncResource( |
| m_osInterface, |
| &m_resSyncObjectVideoContextInUse)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::AllocateResourcesVariableSizes() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| if (m_decodeParams.m_bitstreamLockingInUse && (!m_decodeParams.m_bitstreamLockable)) |
| { |
| if (!Mos_ResourceIsNull(&m_resTmpBitstreamBuffer)) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resTmpBitstreamBuffer); |
| } |
| |
| CODECHAL_DECODE_CHK_STATUS_MESSAGE_RETURN(AllocateBuffer( |
| &m_resTmpBitstreamBuffer, |
| m_dataSize, |
| "VP8_BitStream"), |
| "Failed to allocate Bitstream Buffer."); |
| } |
| |
| uint16_t picWidthInMB = MOS_MAX(m_picWidthInMbLastMaxAlloced, (m_vp8PicParams->wFrameWidthInMbsMinus1 + 1)); |
| uint16_t picHeightInMB = MOS_MAX(m_picHeightInMbLastMaxAlloced, (m_vp8PicParams->wFrameHeightInMbsMinus1 + 1)); |
| uint32_t maxWidth = picWidthInMB * CODECHAL_MACROBLOCK_WIDTH; |
| uint32_t maxHeight = picHeightInMB * CODECHAL_MACROBLOCK_HEIGHT; |
| uint32_t numMacroblocks = picWidthInMB * picHeightInMB; |
| |
| if (m_mfxInterface->IsDeblockingFilterRowstoreCacheEnabled() == false) |
| { |
| uint16_t maxMfdDFRowStoreScratchBufferPicWidthInMB; |
| maxMfdDFRowStoreScratchBufferPicWidthInMB = MOS_MAX(m_mfdDeblockingFilterRowStoreScratchBufferPicWidthInMb, |
| (m_vp8PicParams->wFrameWidthInMbsMinus1 + 1)); |
| |
| if ((maxMfdDFRowStoreScratchBufferPicWidthInMB > m_mfdDeblockingFilterRowStoreScratchBufferPicWidthInMb) || |
| Mos_ResourceIsNull(&m_resMfdDeblockingFilterRowStoreScratchBuffer)) |
| { |
| if (!Mos_ResourceIsNull(&m_resMfdDeblockingFilterRowStoreScratchBuffer)) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resMfdDeblockingFilterRowStoreScratchBuffer); |
| } |
| // Deblocking Filter Row Store Scratch buffer |
| //(Num MacroBlock Width) * (Num Cachlines) * (Cachline size) |
| CODECHAL_DECODE_CHK_STATUS_MESSAGE_RETURN(AllocateBuffer( |
| &m_resMfdDeblockingFilterRowStoreScratchBuffer, |
| maxMfdDFRowStoreScratchBufferPicWidthInMB * 2 * CODECHAL_CACHELINE_SIZE, |
| "DeblockingScratchBuffer"), |
| "Failed to allocate Deblocking Filter Row Store Scratch Buffer."); |
| } |
| |
| //record the width and height used for allocation internal resources. |
| m_mfdDeblockingFilterRowStoreScratchBufferPicWidthInMb = maxMfdDFRowStoreScratchBufferPicWidthInMB; |
| } |
| |
| if (m_mfxInterface->IsIntraRowstoreCacheEnabled() == false) |
| { |
| uint16_t maxMfdIntraRowStoreScratchBufferPicWidthInMB; |
| maxMfdIntraRowStoreScratchBufferPicWidthInMB = MOS_MAX(m_mfdIntraRowStoreScratchBufferPicWidthInMb, (m_vp8PicParams->wFrameWidthInMbsMinus1 + 1)); |
| |
| if ((maxMfdIntraRowStoreScratchBufferPicWidthInMB > m_mfdIntraRowStoreScratchBufferPicWidthInMb) || |
| Mos_ResourceIsNull(&m_resMfdIntraRowStoreScratchBuffer)) |
| { |
| if (!Mos_ResourceIsNull(&m_resMfdIntraRowStoreScratchBuffer)) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resMfdIntraRowStoreScratchBuffer); |
| } |
| |
| // Intra Row Store Scratch buffer |
| // (FrameWidth in MB) * (CacheLine size per MB) |
| CODECHAL_DECODE_CHK_STATUS_MESSAGE_RETURN(AllocateBuffer( |
| &m_resMfdIntraRowStoreScratchBuffer, |
| maxMfdIntraRowStoreScratchBufferPicWidthInMB * CODECHAL_CACHELINE_SIZE, |
| "IntraScratchBuffer"), |
| "Failed to allocate VP8 BSD Intra Row Store Scratch Buffer."); |
| } |
| |
| //record the width and height used for allocation internal resources. |
| m_mfdIntraRowStoreScratchBufferPicWidthInMb = maxMfdIntraRowStoreScratchBufferPicWidthInMB; |
| } |
| |
| if (m_mfxInterface->IsBsdMpcRowstoreCacheEnabled() == false) |
| { |
| uint16_t maxBsdMpcRowStoreScratchBufferPicWidthInMB; |
| maxBsdMpcRowStoreScratchBufferPicWidthInMB = MOS_MAX(m_bsdMpcRowStoreScratchBufferPicWidthInMb, (m_vp8PicParams->wFrameWidthInMbsMinus1 + 1)); |
| |
| if ((maxBsdMpcRowStoreScratchBufferPicWidthInMB > m_bsdMpcRowStoreScratchBufferPicWidthInMb) || |
| Mos_ResourceIsNull(&m_resBsdMpcRowStoreScratchBuffer)) |
| { |
| if (!Mos_ResourceIsNull(&m_resBsdMpcRowStoreScratchBuffer)) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resBsdMpcRowStoreScratchBuffer); |
| } |
| // BSD/MPC Row Store Scratch buffer |
| // (FrameWidth in MB) * (2) * (CacheLine size per MB) |
| CODECHAL_DECODE_CHK_STATUS_MESSAGE_RETURN(AllocateBuffer( |
| &m_resBsdMpcRowStoreScratchBuffer, |
| maxBsdMpcRowStoreScratchBufferPicWidthInMB * CODECHAL_CACHELINE_SIZE * 2, |
| "MpcScratchBuffer"), |
| "Failed to allocate BSD/MPC Row Store Scratch Buffer."); |
| } |
| |
| //record the width and height used for allocation internal resources. |
| m_bsdMpcRowStoreScratchBufferPicWidthInMb = maxBsdMpcRowStoreScratchBufferPicWidthInMB; |
| } |
| |
| if ((picWidthInMB > m_picWidthInMbLastMaxAlloced) || |
| Mos_ResourceIsNull(&m_resMprRowStoreScratchBuffer)) |
| { |
| if (!Mos_ResourceIsNull(&m_resMprRowStoreScratchBuffer)) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resMprRowStoreScratchBuffer); |
| } |
| // MPR Row Store Scratch buffer |
| // (FrameWidth in MB) * (2) * (CacheLine size per MB) |
| CODECHAL_DECODE_CHK_STATUS_MESSAGE_RETURN(AllocateBuffer( |
| &m_resMprRowStoreScratchBuffer, |
| picWidthInMB * CODECHAL_CACHELINE_SIZE * 22, |
| "MprScratchBuffer"), |
| "Failed to allocate MPR Row Store Scratch Buffer."); |
| } |
| |
| if ((numMacroblocks > (uint32_t)m_picWidthInMbLastMaxAlloced * m_picHeightInMbLastMaxAlloced) || |
| Mos_ResourceIsNull(&m_resSegmentationIdStreamBuffer)) |
| { |
| if (!Mos_ResourceIsNull(&m_resSegmentationIdStreamBuffer)) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resSegmentationIdStreamBuffer); |
| } |
| // Segmentation ID Stream buffer |
| //(Num MacroBlocks) * (Cachline size) * (2 bit) |
| CODECHAL_DECODE_CHK_STATUS_MESSAGE_RETURN(AllocateBuffer( |
| &m_resSegmentationIdStreamBuffer, |
| MOS_MAX(numMacroblocks * CODECHAL_CACHELINE_SIZE * 2 / 8, 64), |
| "SegmentationIdStreamBuffer"), |
| "Failed to allocate Segmentation ID Stream Buffer."); |
| } |
| |
| m_picWidthInMbLastMaxAlloced = picWidthInMB; |
| m_picHeightInMbLastMaxAlloced = picHeightInMB; |
| |
| return eStatus; |
| } |
| |
| CodechalDecodeVp8::~CodechalDecodeVp8() |
| { |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| m_osInterface->pfnDestroySyncResource(m_osInterface, &m_resSyncObject); |
| |
| CodecHalFreeDataList(m_vp8RefList, CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP8); |
| |
| // indicate resCoefProbBuffer is allocated internal, not from m_decodeParams.m_coefProbBuffer |
| if (m_vp8FrameHead.bNotFirstCall == true) |
| { |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resCoefProbBuffer); |
| } |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resTmpBitstreamBuffer); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resMfdDeblockingFilterRowStoreScratchBuffer); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resMfdIntraRowStoreScratchBuffer); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resBsdMpcRowStoreScratchBuffer); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resMprRowStoreScratchBuffer); |
| |
| m_osInterface->pfnFreeResource( |
| m_osInterface, |
| &m_resSegmentationIdStreamBuffer); |
| |
| m_osInterface->pfnDestroySyncResource( |
| m_osInterface, |
| &m_resSyncObjectWaContextInUse); |
| |
| m_osInterface->pfnDestroySyncResource( |
| m_osInterface, |
| &m_resSyncObjectVideoContextInUse); |
| |
| return; |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::SetFrameStates() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| CODECHAL_DECODE_CHK_NULL_RETURN(m_decodeParams.m_destSurface); |
| CODECHAL_DECODE_CHK_NULL_RETURN(m_decodeParams.m_dataBuffer); |
| |
| m_dataSize = m_decodeParams.m_dataSize; |
| m_dataOffset = m_decodeParams.m_dataOffset; |
| m_destSurface = *(m_decodeParams.m_destSurface); |
| m_resDataBuffer = *(m_decodeParams.m_dataBuffer); |
| m_vp8PicParams = (PCODEC_VP8_PIC_PARAMS)m_decodeParams.m_picParams; |
| m_vp8IqMatrixParams = (PCODEC_VP8_IQ_MATRIX_PARAMS)m_decodeParams.m_iqMatrixBuffer; |
| |
| CODECHAL_DECODE_CHK_NULL_RETURN(m_vp8PicParams); |
| |
| PCODEC_REF_LIST destEntry = m_vp8RefList[m_vp8PicParams->CurrPic.FrameIdx]; |
| CODEC_PICTURE currPic = m_vp8PicParams->CurrPic; |
| |
| MOS_ZeroMemory(destEntry, sizeof(CODEC_REF_LIST)); |
| destEntry->RefPic = currPic; |
| destEntry->resRefPic = m_destSurface.OsResource; |
| |
| m_statusReportFeedbackNumber = m_vp8PicParams->uiStatusReportFeedbackNumber; |
| |
| m_deblockingEnabled = !m_vp8PicParams->LoopFilterDisable ? true : false; |
| |
| if (m_mfxInterface->IsRowStoreCachingSupported()) |
| { |
| MHW_VDBOX_ROWSTORE_PARAMS rowstoreParams; |
| MOS_ZeroMemory(&rowstoreParams, sizeof(rowstoreParams)); |
| rowstoreParams.dwPicWidth = m_width; |
| rowstoreParams.bMbaff = false; |
| rowstoreParams.Mode = CODECHAL_DECODE_MODE_VP8VLD; |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_hwInterface->SetRowstoreCachingOffsets(&rowstoreParams)); |
| } |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(AllocateResourcesVariableSizes()); |
| |
| if (m_decodeParams.m_bitstreamLockingInUse) |
| { |
| if (m_decodeParams.m_bitstreamLockable) |
| { |
| CodechalResLock ResourceLock(m_osInterface, &m_resDataBuffer); |
| auto bitstreamBuffer = (uint8_t*)ResourceLock.Lock(CodechalResLock::readOnly); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(ParseFrameHead(bitstreamBuffer + m_dataOffset, m_dataSize)); |
| } |
| else |
| { |
| CODECHAL_DECODE_CHK_STATUS_RETURN(CopyBitstreamBuffer(m_resDataBuffer, &m_resTmpBitstreamBuffer, m_dataSize)); |
| |
| CodechalResLock ResourceLock(m_osInterface, &m_resTmpBitstreamBuffer); |
| auto bitstreamBuffer = (uint8_t*)ResourceLock.Lock(CodechalResLock::readOnly); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(ParseFrameHead(bitstreamBuffer, m_dataSize)); |
| } |
| |
| m_decodeParams.m_coefProbSize = sizeof(m_vp8FrameHead.FrameContext.CoefProbs); |
| } |
| else |
| { |
| m_resCoefProbBuffer = *(m_decodeParams.m_coefProbBuffer); |
| } |
| |
| m_width = (m_vp8PicParams->wFrameWidthInMbsMinus1 + 1) * CODECHAL_MACROBLOCK_WIDTH; |
| m_height = (m_vp8PicParams->wFrameHeightInMbsMinus1 + 1) * CODECHAL_MACROBLOCK_HEIGHT; |
| |
| // Overwrite the actual surface height with the coded height and width of the frame |
| // for VP8 since it's possible for a VP8 frame to change size during playback |
| m_destSurface.dwWidth = m_width; |
| m_destSurface.dwHeight = m_height; |
| |
| m_perfType = m_vp8PicParams->key_frame ? I_TYPE : P_TYPE; |
| |
| m_crrPic = m_vp8PicParams->CurrPic; |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_DECODE_CHK_NULL_RETURN(m_debugInterface); |
| m_vp8PicParams->CurrPic.PicFlags = PICTURE_FRAME; |
| m_debugInterface->m_currPic = m_crrPic; |
| m_debugInterface->m_frameType = m_perfType; |
| |
| if (m_vp8PicParams) { |
| CODECHAL_DECODE_CHK_STATUS_RETURN(DumpPicParams( |
| m_vp8PicParams)); |
| } |
| |
| if (m_vp8IqMatrixParams) { |
| CODECHAL_DECODE_CHK_STATUS_RETURN(DumpIQParams( |
| m_vp8IqMatrixParams)); |
| } |
| |
| // Dump Vp8CoefProb |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer( |
| &(m_resCoefProbBuffer), |
| CodechalDbgAttr::attrCoeffProb, |
| "_DEC", |
| m_decodeParams.m_coefProbSize));) |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::DecodeStateLevel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| if (m_vp8PicParams->key_frame) // reference surface should be nullptr when key_frame == true |
| { |
| m_presLastRefSurface = nullptr; |
| m_presGoldenRefSurface = nullptr; |
| m_presAltRefSurface = nullptr; |
| } |
| else |
| { |
| m_presLastRefSurface = &(m_vp8RefList[m_vp8PicParams->ucLastRefPicIndex]->resRefPic); |
| m_presGoldenRefSurface = &(m_vp8RefList[m_vp8PicParams->ucGoldenRefPicIndex]->resRefPic); |
| m_presAltRefSurface = &(m_vp8RefList[m_vp8PicParams->ucAltRefPicIndex]->resRefPic); |
| } |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| MHW_VDBOX_PIPE_MODE_SELECT_PARAMS pipeModeSelectParams; |
| MOS_ZeroMemory(&pipeModeSelectParams, sizeof(pipeModeSelectParams)); |
| pipeModeSelectParams.Mode = m_mode; |
| pipeModeSelectParams.bStreamOutEnabled = m_streamOutEnabled; |
| pipeModeSelectParams.bPostDeblockOutEnable = m_deblockingEnabled; |
| pipeModeSelectParams.bPreDeblockOutEnable = !m_deblockingEnabled; |
| pipeModeSelectParams.bShortFormatInUse = m_shortFormatInUse; |
| |
| MHW_VDBOX_SURFACE_PARAMS surfaceParams; |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.Mode = m_mode; |
| surfaceParams.psSurface = &m_destSurface; |
| |
| MHW_VDBOX_PIPE_BUF_ADDR_PARAMS pipeBufAddrParams; |
| MOS_ZeroMemory(&pipeBufAddrParams, sizeof(pipeBufAddrParams)); |
| pipeBufAddrParams.Mode = m_mode; |
| |
| if (m_deblockingEnabled) |
| { |
| pipeBufAddrParams.psPostDeblockSurface = &m_destSurface; |
| } |
| else |
| { |
| pipeBufAddrParams.psPreDeblockSurface = &m_destSurface; |
| } |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mmc->SetPipeBufAddr(&pipeBufAddrParams)); |
| |
| // when there is no last, golden and alternate reference, |
| // the index is set to the destination frame index |
| pipeBufAddrParams.presReferences[CodechalDecodeLastRef] = m_presLastRefSurface; |
| pipeBufAddrParams.presReferences[CodechalDecodeGoldenRef] = m_presGoldenRefSurface; |
| pipeBufAddrParams.presReferences[CodechalDecodeAlternateRef] = m_presAltRefSurface; |
| |
| pipeBufAddrParams.presMfdIntraRowStoreScratchBuffer = &m_resMfdIntraRowStoreScratchBuffer; |
| pipeBufAddrParams.presMfdDeblockingFilterRowStoreScratchBuffer = &m_resMfdDeblockingFilterRowStoreScratchBuffer; |
| if (m_streamOutEnabled) |
| { |
| pipeBufAddrParams.presStreamOutBuffer = |
| &(m_streamOutBuffer[m_streamOutCurrBufIdx]); |
| } |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mmc->CheckReferenceList(&pipeBufAddrParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mmc->SetRefrenceSync(m_disableDecodeSyncLock, m_disableLockForTranscode)); |
| |
| MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS indObjBaseAddrParams; |
| MOS_ZeroMemory(&indObjBaseAddrParams, sizeof(indObjBaseAddrParams)); |
| indObjBaseAddrParams.Mode = m_mode; |
| |
| indObjBaseAddrParams.dwDataSize = m_dataSize; |
| indObjBaseAddrParams.dwDataOffset = m_dataOffset; |
| indObjBaseAddrParams.presDataBuffer = &m_resDataBuffer; |
| |
| MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS bspBufBaseAddrParams; |
| MOS_ZeroMemory(&bspBufBaseAddrParams, sizeof(bspBufBaseAddrParams)); |
| bspBufBaseAddrParams.presBsdMpcRowStoreScratchBuffer = &m_resBsdMpcRowStoreScratchBuffer; |
| bspBufBaseAddrParams.presMprRowStoreScratchBuffer = &m_resMprRowStoreScratchBuffer; |
| |
| MHW_VDBOX_VP8_PIC_STATE vp8PicState; |
| vp8PicState.pVp8PicParams = m_vp8PicParams; |
| vp8PicState.pVp8IqMatrixParams = m_vp8IqMatrixParams; |
| vp8PicState.presSegmentationIdStreamBuffer = &m_resSegmentationIdStreamBuffer; |
| vp8PicState.dwCoefProbTableOffset = 0; |
| vp8PicState.presCoefProbBuffer = &m_resCoefProbBuffer; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking( |
| &cmdBuffer, true)); |
| |
| if (m_statusQueryReportingEnabled) |
| { |
| CODECHAL_DECODE_CHK_STATUS_RETURN(StartStatusReport(&cmdBuffer)); |
| } |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeModeSelectCmd(&cmdBuffer, &pipeModeSelectParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxSurfaceCmd(&cmdBuffer, &surfaceParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeBufAddrCmd(&cmdBuffer, &pipeBufAddrParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxIndObjBaseAddrCmd(&cmdBuffer, &indObjBaseAddrParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxBspBufBaseAddrCmd(&cmdBuffer, &bspBufBaseAddrParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxVp8PicCmd(&cmdBuffer, &vp8PicState)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::DecodePrimitiveLevel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0)); |
| |
| // Fill BSD Object Commands |
| MHW_VDBOX_VP8_BSD_PARAMS vp8BsdParams; |
| vp8BsdParams.pVp8PicParams = m_vp8PicParams; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfdVp8BsdObjectCmd(&cmdBuffer, &vp8BsdParams)); |
| |
| // Check if destination surface needs to be synchronized |
| MOS_SYNC_PARAMS syncParams; |
| syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_videoContext; |
| syncParams.presSyncResource = &m_destSurface.OsResource; |
| syncParams.bReadOnly = false; |
| syncParams.bDisableDecodeSyncLock = m_disableDecodeSyncLock; |
| syncParams.bDisableLockForTranscode = m_disableLockForTranscode; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnPerformOverlaySync(m_osInterface, &syncParams)); |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceWait(m_osInterface, &syncParams)); |
| |
| // Update the resource tag (s/w tag) for On-Demand Sync |
| m_osInterface->pfnSetResourceSyncTag(m_osInterface, &syncParams); |
| |
| MHW_MI_FLUSH_DW_PARAMS flushDwParams; |
| MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(&cmdBuffer, &flushDwParams)); |
| |
| // Update the tag in GPU Sync eStatus buffer (H/W Tag) to match the current S/W tag |
| if (m_osInterface->bTagResourceSync) |
| { |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_hwInterface->WriteSyncTagToResource(&cmdBuffer, &syncParams)); |
| } |
| |
| if (m_statusQueryReportingEnabled) |
| { |
| CodechalDecodeStatusReport decodeStatusReport; |
| |
| decodeStatusReport.m_statusReportNumber = m_statusReportFeedbackNumber; |
| decodeStatusReport.m_currDecodedPic = m_vp8PicParams->CurrPic; |
| decodeStatusReport.m_currDeblockedPic = m_vp8PicParams->CurrPic; |
| decodeStatusReport.m_codecStatus = CODECHAL_STATUS_UNAVAILABLE; |
| decodeStatusReport.m_currDecodedPicRes = m_vp8RefList[m_vp8PicParams->CurrPic.FrameIdx]->resRefPic; |
| CODECHAL_DEBUG_TOOL( |
| decodeStatusReport.m_secondField = CodecHal_PictureIsBottomField(m_vp8PicParams->CurrPic); |
| decodeStatusReport.m_frameType = m_perfType;) |
| CODECHAL_DECODE_CHK_STATUS_RETURN(EndStatusReport(decodeStatusReport, &cmdBuffer)); |
| } |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(&cmdBuffer, nullptr)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer( |
| &cmdBuffer, |
| CODECHAL_NUM_MEDIA_STATES, |
| "_DEC")); |
| ) |
| |
| if (m_huCCopyInUse) |
| { |
| syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_videoContextForWa; |
| syncParams.presSyncResource = &m_resSyncObjectWaContextInUse; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &syncParams)); |
| |
| syncParams = g_cInitSyncParams; |
| syncParams.GpuContext = m_videoContext; |
| syncParams.presSyncResource = &m_resSyncObjectWaContextInUse; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &syncParams)); |
| |
| m_huCCopyInUse = false; |
| } |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, m_videoContextUsesNullHw)); |
| |
| CODECHAL_DEBUG_TOOL( |
| m_mmc->UpdateUserFeatureKey(&m_destSurface);) |
| |
| if (m_statusQueryReportingEnabled) |
| { |
| CODECHAL_DECODE_CHK_STATUS_RETURN(ResetStatusReport(m_videoContextUsesNullHw)); |
| } |
| |
| // Needs to be re-set for Linux buffer re-use scenarios |
| m_vp8RefList[m_vp8PicParams->ucCurrPicIndex]->resRefPic = |
| m_destSurface.OsResource; |
| |
| // Send the signal to indicate decode completion, in case On-Demand Sync is not present |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceSignal(m_osInterface, &syncParams)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::InitMmcState() |
| { |
| #ifdef _MMC_SUPPORTED |
| m_mmc = MOS_New(CodechalMmcDecodeVp8, m_hwInterface, this); |
| CODECHAL_DECODE_CHK_NULL_RETURN(m_mmc); |
| #endif |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::AllocateStandard( |
| CodechalSetting *settings) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| CODECHAL_DECODE_CHK_NULL_RETURN(settings); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(InitMmcState()); |
| |
| m_width = settings->width; |
| m_height = settings->height; |
| m_shortFormatInUse = settings->shortFormatInUse ? true : false; |
| m_huCCopyInUse = false; |
| |
| // Picture Level Commands |
| m_hwInterface->GetMfxStateCommandsDataSize( |
| m_mode, |
| &m_commandBufferSizeNeeded, |
| &m_commandPatchListSizeNeeded, |
| m_shortFormatInUse); |
| |
| // Primitive Level Commands |
| m_hwInterface->GetMfxPrimitiveCommandsDataSize( |
| m_mode, |
| &m_standardDecodeSizeNeeded, |
| &m_standardDecodePatchListSizeNeeded, |
| m_shortFormatInUse); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(AllocateResourcesFixedSizes()); |
| |
| return eStatus; |
| } |
| |
| CodechalDecodeVp8::CodechalDecodeVp8( |
| CodechalHwInterface * hwInterface, |
| CodechalDebugInterface *debugInterface, |
| PCODECHAL_STANDARD_INFO standardInfo) : CodechalDecode(hwInterface, debugInterface, standardInfo), |
| m_picWidthInMbLastMaxAlloced(0), |
| m_picHeightInMbLastMaxAlloced(0), |
| m_shortFormatInUse(false), |
| m_dataSize(0), |
| m_vp8PicParams(nullptr), |
| m_vp8IqMatrixParams(nullptr), |
| m_presLastRefSurface(nullptr), |
| m_presGoldenRefSurface(nullptr), |
| m_presAltRefSurface(nullptr), |
| m_mfdDeblockingFilterRowStoreScratchBufferPicWidthInMb(0), |
| m_mfdIntraRowStoreScratchBufferPicWidthInMb(0), |
| m_bsdMpcRowStoreScratchBufferPicWidthInMb(0), |
| m_privateInputBufferSize(0), |
| m_coeffProbTableOffset(0), |
| m_deblockingEnabled(false), |
| m_huCCopyInUse(false) |
| { |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| MOS_ZeroMemory(&m_destSurface, sizeof(m_destSurface)); |
| MOS_ZeroMemory(&m_resDataBuffer, sizeof(m_resDataBuffer)); |
| MOS_ZeroMemory(&m_resCoefProbBuffer, sizeof(m_resCoefProbBuffer)); |
| MOS_ZeroMemory(&m_resTmpBitstreamBuffer, sizeof(m_resTmpBitstreamBuffer)); |
| MOS_ZeroMemory(&m_resMfdIntraRowStoreScratchBuffer, sizeof(m_resMfdIntraRowStoreScratchBuffer)); |
| MOS_ZeroMemory(&m_resMfdDeblockingFilterRowStoreScratchBuffer, sizeof(m_resMfdDeblockingFilterRowStoreScratchBuffer)); |
| MOS_ZeroMemory(&m_resBsdMpcRowStoreScratchBuffer, sizeof(m_resBsdMpcRowStoreScratchBuffer)); |
| MOS_ZeroMemory(&m_resMprRowStoreScratchBuffer, sizeof(m_resMprRowStoreScratchBuffer)); |
| MOS_ZeroMemory(&m_resSegmentationIdStreamBuffer, sizeof(m_resSegmentationIdStreamBuffer)); |
| MOS_ZeroMemory(&m_resSyncObject, sizeof(m_resSyncObject)); |
| MOS_ZeroMemory(&m_resPrivateInputBuffer, sizeof(m_resPrivateInputBuffer)); |
| MOS_ZeroMemory(&m_resSyncObjectWaContextInUse, sizeof(m_resSyncObjectWaContextInUse)); |
| MOS_ZeroMemory(&m_resSyncObjectVideoContextInUse, sizeof(m_resSyncObjectVideoContextInUse)); |
| MOS_ZeroMemory(&m_vp8FrameHead, sizeof(m_vp8FrameHead)); |
| } |
| |
| #if USE_CODECHAL_DEBUG_TOOL |
| MOS_STATUS CodechalDecodeVp8::DumpPicParams( |
| PCODEC_VP8_PIC_PARAMS picParams) |
| { |
| CODECHAL_DEBUG_FUNCTION_ENTER; |
| |
| if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrPicParams)) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| CODECHAL_DEBUG_CHK_NULL(picParams); |
| |
| std::ostringstream oss; |
| oss.setf(std::ios::showbase | std::ios::uppercase); |
| |
| oss<< "CurrPic FrameIdx: "<<std::hex<< +picParams->CurrPic.FrameIdx<<std::endl; |
| oss<< "CurrPic PicFlags: "<<std::hex<< +picParams->CurrPic.PicFlags<<std::endl; |
| oss<< "wFrameWidthInMbsMinus1: "<<std::hex<< +picParams->wFrameWidthInMbsMinus1<<std::endl; |
| oss<< "wFrameHeightInMbsMinus1: "<<std::hex<< +picParams->wFrameHeightInMbsMinus1<<std::endl; |
| oss<< "ucCurrPicIndex: "<<std::hex<< +picParams->ucCurrPicIndex<<std::endl; |
| oss<< "ucLastRefPicIndex: "<<std::hex<< +picParams->ucLastRefPicIndex<<std::endl; |
| oss<< "ucGoldenRefPicIndex: "<<std::hex<< +picParams->ucGoldenRefPicIndex<<std::endl; |
| oss<< "ucAltRefPicIndex: "<<std::hex<< +picParams->ucAltRefPicIndex<<std::endl; |
| oss<< "ucDeblockedPicIndex: "<<std::hex<< +picParams->ucDeblockedPicIndex<<std::endl; |
| oss<< "ucReserved8Bits: "<<std::hex<< +picParams->ucReserved8Bits<<std::endl; |
| oss<< "wPicFlags: "<<std::hex<< +picParams->wPicFlags<<std::endl; |
| oss<< "key_frame: "<<std::hex<< +picParams->key_frame<<std::endl; |
| oss<< "version: "<<std::hex<< +picParams->version<<std::endl; |
| oss<< "segmentation_enabled: "<<std::hex<< +picParams->segmentation_enabled<<std::endl; |
| oss<< "update_mb_segmentation_map: "<<std::hex<< +picParams->update_mb_segmentation_map<<std::endl; |
| oss<< "update_segment_feature_data: "<<std::hex<< +picParams->update_segment_feature_data<<std::endl; |
| oss<< "filter_type: "<<std::hex<< +picParams->filter_type<<std::endl; |
| oss<< "sign_bias_golden: "<<std::hex<< +picParams->sign_bias_golden<<std::endl; |
| oss<< "sign_bias_alternate: "<<std::hex<< +picParams->sign_bias_alternate<<std::endl; |
| oss<< "mb_no_coeff_skip: "<<std::hex<< +picParams->mb_no_coeff_skip<<std::endl; |
| oss<< "mode_ref_lf_delta_update: "<<std::hex<< +picParams->mode_ref_lf_delta_update<<std::endl; |
| oss<< "CodedCoeffTokenPartition: "<<std::hex<< +picParams->CodedCoeffTokenPartition<<std::endl; |
| oss<< "LoopFilterDisable: "<<std::hex<< +picParams->LoopFilterDisable<<std::endl; |
| oss<< "loop_filter_adj_enable: "<<std::hex<< +picParams->loop_filter_adj_enable<<std::endl; |
| |
| for(uint8_t i=0;i<4;++i) |
| { |
| oss<< "ucLoopFilterLevel[" <<std::dec<<+i<<"]: "<<std::hex<< +picParams->ucLoopFilterLevel[i]<<std::endl; |
| } |
| |
| for(uint8_t i=0;i<4;++i) |
| { |
| oss<< "cRefLfDelta["<<std::dec<<+i<<"]: "<<std::hex<< +picParams->cRefLfDelta[i]<<std::endl; |
| } |
| |
| for(uint8_t i=0;i<4;++i) |
| { |
| oss<< "cModeLfDelta[" <<std::dec<<+i<<"]: "<<std::hex<< +picParams->cModeLfDelta[i]<<std::endl; |
| } |
| oss<< "ucSharpnessLevel: " <<std::dec<<std::hex<< +picParams->ucSharpnessLevel<<std::endl; |
| |
| for(uint8_t i=0;i<3;++i) |
| { |
| oss<< "cMbSegmentTreeProbs[" <<std::dec<<+i<<"]: "<<std::hex<< +picParams->cMbSegmentTreeProbs[i]<<std::endl; |
| } |
| oss<< "ucProbSkipFalse: "<<std::hex<< +picParams->ucProbSkipFalse<<std::endl; |
| oss<< "ucProbIntra: "<<std::hex<< +picParams->ucProbIntra<<std::endl; |
| oss<< "ucProbLast: "<<std::hex<< +picParams->ucProbLast<<std::endl; |
| oss<< "ucProbGolden: "<<std::hex<< +picParams->ucProbGolden<<std::endl; |
| |
| for(uint8_t i=0;i<4;++i) |
| { |
| oss<< "ucYModeProbs[" <<std::dec<<+i<<"]: "<<std::hex<< +picParams->ucYModeProbs[i]<<std::endl; |
| } |
| |
| for(uint8_t i=0;i<3;++i) |
| { |
| oss<< "ucUvModeProbs[" <<std::dec<<+i<<"]: "<<std::hex<< +picParams->ucUvModeProbs[i]<<std::endl; |
| } |
| oss<< "ucReserved8Bits1: "<<std::hex<< +picParams->ucReserved8Bits1<<std::endl; |
| oss<< "ucP0EntropyCount: "<<std::hex<< +picParams->ucP0EntropyCount<<std::endl; |
| oss<< "ucP0EntropyValue: "<<std::hex<< +picParams->ucP0EntropyValue<<std::endl; |
| oss<< "uiP0EntropyRange: "<<std::hex<< +picParams->uiP0EntropyRange<<std::endl; |
| oss<< "uiFirstMbByteOffset: "<<std::hex<< +picParams->uiFirstMbByteOffset<<std::endl; |
| |
| for(uint8_t i=0;i<2;++i) |
| { |
| for(uint8_t j=0;j<CODEC_VP8_MVP_COUNT;++j) |
| { |
| oss<< "ucMvUpdateProb["<<std::dec<<+i<<"]["<<std::dec<<+j<<"]: "<<std::hex<< +picParams->ucMvUpdateProb[i][j]<<std::endl; |
| } |
| } |
| for(uint8_t i=0;i<CODEC_VP8_MAX_PARTITION_NUMBER;++i) |
| { |
| oss<< "uiPartitionSize["<<std::dec<<+i<<"]: "<<std::hex<< +picParams->uiPartitionSize[i]<<std::endl; |
| } |
| oss<< "uiStatusReportFeedbackNumber: "<<std::hex<< +picParams->uiStatusReportFeedbackNumber<<std::endl; |
| |
| const char* fileName = m_debugInterface->CreateFileName( |
| "_DEC", |
| CodechalDbgBufferType::bufPicParams, |
| CodechalDbgExtType::txt); |
| |
| std::ofstream ofs(fileName, std::ios::out); |
| ofs << oss.str(); |
| ofs.close(); |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS CodechalDecodeVp8::DumpIQParams( |
| PCODEC_VP8_IQ_MATRIX_PARAMS matrixData) |
| { |
| CODECHAL_DEBUG_FUNCTION_ENTER; |
| |
| if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrIqParams)) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| CODECHAL_DEBUG_CHK_NULL(matrixData); |
| |
| std::ostringstream oss; |
| oss.setf(std::ios::showbase | std::ios::uppercase); |
| |
| for(uint8_t i=0;i<4;++i) |
| { |
| for(uint8_t j=0;j<6;++j) |
| { |
| oss<< "quantization_values["<< std::dec<< +i <<"]["<<+j<<"]: "<<std::hex<< +matrixData->quantization_values[i][j]<<std::endl; |
| } |
| } |
| |
| const char* fileName = m_debugInterface->CreateFileName( |
| "_DEC", |
| CodechalDbgBufferType::bufIqParams, |
| CodechalDbgExtType::txt); |
| |
| std::ofstream ofs(fileName, std::ios::out); |
| ofs << oss.str(); |
| ofs.close(); |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| #endif |