| /* |
| * Copyright (c) 2017-2019, 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_jpeg_g12.cpp |
| //! \brief Implements the decode interface extension for JPEG. |
| //! \details Implements all functions and constants required by CodecHal for JPEG decoding. |
| //! |
| |
| #include "codechal_decoder.h" |
| #include "codechal_decode_jpeg_g12.h" |
| #include "mhw_vdbox_mfx_g12_X.h" |
| #include "codechal_mmc_decode_jpeg_g12.h" |
| #include "codechal_decode_sfc_jpeg_g12.h" |
| #include "hal_oca_interface.h" |
| |
| |
| CodechalDecodeJpegG12::~CodechalDecodeJpegG12() |
| { |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| if (m_veState != nullptr) |
| { |
| MOS_FreeMemAndSetNull(m_veState); |
| m_veState = nullptr; |
| } |
| } |
| |
| MOS_STATUS CodechalDecodeJpegG12::InitMmcState() |
| { |
| #ifdef _MMC_SUPPORTED |
| m_mmc = MOS_New(CodechalMmcDecodeJpegG12, m_hwInterface, this); |
| CODECHAL_DECODE_CHK_NULL_RETURN(m_mmc); |
| #endif |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| #ifdef _DECODE_PROCESSING_SUPPORTED |
| MOS_STATUS CodechalDecodeJpegG12::InitSfcState() |
| { |
| m_sfcState = MOS_New(CodechalJpegSfcStateG12); |
| CODECHAL_DECODE_CHK_NULL_RETURN(m_sfcState); |
| return MOS_STATUS_SUCCESS; |
| } |
| #endif |
| |
| MOS_STATUS CodechalDecodeJpegG12::SetGpuCtxCreatOption( |
| CodechalSetting *codecHalSetting) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface)) |
| { |
| CodechalDecode::SetGpuCtxCreatOption(codecHalSetting); |
| } |
| else |
| { |
| m_gpuCtxCreatOpt = MOS_New(MOS_GPUCTX_CREATOPTIONS_ENHANCED); |
| bool sfcInUse = codecHalSetting->sfcInUseHinted && IsSfcInUse(codecHalSetting); |
| CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_ConstructParmsForGpuCtxCreation( |
| m_veState, |
| (PMOS_GPUCTX_CREATOPTIONS_ENHANCED)m_gpuCtxCreatOpt, |
| sfcInUse)); |
| } |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeJpegG12::SetFrameStates() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeJpeg::SetFrameStates()); |
| |
| if (MOS_VE_SUPPORTED(m_osInterface) && !MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface)) |
| { |
| MOS_VIRTUALENGINE_SET_PARAMS vesetParams; |
| |
| MOS_ZeroMemory(&vesetParams, sizeof(vesetParams)); |
| #ifdef _DECODE_PROCESSING_SUPPORTED |
| vesetParams.bSFCInUse = m_sfcState->m_sfcPipeOut; |
| #else |
| vesetParams.bSFCInUse = false; |
| #endif |
| vesetParams.bNeedSyncWithPrevious = true; |
| vesetParams.bSameEngineAsLastSubmission = false; |
| CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_SetHintParams( |
| m_veState, |
| &vesetParams)); |
| } |
| |
| #ifdef _MMC_SUPPORTED |
| // To WA invalid aux data caused HW issue when MMC on |
| if (m_mmc && m_mmc->IsMmcEnabled() && MEDIA_IS_WA(m_waTable, Wa_1408785368) && |
| !Mos_ResourceIsNull(&m_destSurface.OsResource) && |
| m_destSurface.OsResource.bConvertedFromDDIResource) |
| { |
| CODECHAL_DECODE_VERBOSEMESSAGE("Clear CCS by VE resolve before frame %d submission", m_frameNum); |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnDecompResource(m_osInterface, &m_destSurface.OsResource)); |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSetGpuContext(m_osInterface, m_videoContext)); |
| } |
| #endif |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeJpegG12::DecodeStateLevel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| MHW_VDBOX_JPEG_DECODE_PIC_STATE jpegPicState; |
| jpegPicState.dwOutputFormat = m_decodeParams.m_destSurface->Format; |
| |
| #ifdef _DECODE_PROCESSING_SUPPORTED |
| if (m_sfcState->m_sfcPipeOut) |
| { |
| jpegPicState.dwOutputFormat = m_sfcState->m_sfcInSurface.Format; |
| } |
| #endif |
| |
| //Three new formats from HSW C0,HSW ULT can only be supported in specific conditions. |
| if (jpegPicState.dwOutputFormat == Format_NV12 || |
| jpegPicState.dwOutputFormat == Format_YUY2 || |
| jpegPicState.dwOutputFormat == Format_UYVY) |
| { |
| //Only interleaved single scan are supported. |
| if (m_jpegPicParams->m_totalScans != 1 || |
| m_jpegPicParams->m_interleavedData == 0) |
| { |
| return MOS_STATUS_UNKNOWN; |
| } |
| |
| switch (m_jpegPicParams->m_chromaType) |
| { |
| case jpegYUV420: |
| case jpegYUV422H2Y: |
| case jpegYUV422H4Y: |
| break; |
| case jpegYUV422V2Y: |
| case jpegYUV422V4Y: |
| if (GFX_IS_GEN_8_OR_LATER(m_hwInterface->GetPlatform()) && |
| jpegPicState.dwOutputFormat == Format_NV12) |
| { |
| break; |
| } |
| default: |
| return MOS_STATUS_UNKNOWN; |
| } |
| } |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer( |
| m_osInterface, |
| &cmdBuffer, |
| 0)); |
| |
| auto mmioRegisters = m_hwInterface->GetMfxInterface()->GetMmioRegisters(m_vdboxIndex); |
| HalOcaInterface::On1stLevelBBStart(cmdBuffer, *m_osInterface->pOsContext, m_osInterface->CurrentGpuContextHandle, *m_miInterface, *mmioRegisters); |
| |
| MHW_MI_FORCE_WAKEUP_PARAMS forceWakeupParams; |
| MOS_ZeroMemory(&forceWakeupParams, sizeof(MHW_MI_FORCE_WAKEUP_PARAMS)); |
| forceWakeupParams.bMFXPowerWellControl = true; |
| forceWakeupParams.bMFXPowerWellControlMask = true; |
| forceWakeupParams.bHEVCPowerWellControl = false; |
| forceWakeupParams.bHEVCPowerWellControlMask = true; |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiForceWakeupCmd( |
| &cmdBuffer, |
| &forceWakeupParams)); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking( |
| &cmdBuffer, true)); |
| |
| // Set PIPE_MODE_SELECT |
| MHW_VDBOX_PIPE_MODE_SELECT_PARAMS pipeModeSelectParams; |
| pipeModeSelectParams.Mode = CODECHAL_DECODE_MODE_JPEG; |
| pipeModeSelectParams.bStreamOutEnabled = m_streamOutEnabled; |
| pipeModeSelectParams.bDeblockerStreamOutEnable = false; |
| pipeModeSelectParams.bPostDeblockOutEnable = false; |
| pipeModeSelectParams.bPreDeblockOutEnable = true; |
| |
| // Set CMD_MFX_SURFACE_STATE |
| MHW_VDBOX_SURFACE_PARAMS surfaceParams; |
| MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams)); |
| surfaceParams.Mode = CODECHAL_DECODE_MODE_JPEG; |
| surfaceParams.psSurface = &m_destSurface; |
| surfaceParams.ChromaType = m_jpegPicParams->m_chromaType; |
| |
| #ifdef _DECODE_PROCESSING_SUPPORTED |
| if (m_sfcState->m_sfcPipeOut) |
| { |
| surfaceParams.psSurface = &m_sfcState->m_sfcInSurface; |
| } |
| #endif |
| |
| // Set MFX_PIPE_BUF_ADDR_STATE_CMD |
| MHW_VDBOX_PIPE_BUF_ADDR_PARAMS pipeBufAddrParams; |
| pipeBufAddrParams.Mode = CODECHAL_DECODE_MODE_JPEG; |
| // Predeblock surface is the same as destination surface here because there is no deblocking for JPEG |
| pipeBufAddrParams.psPreDeblockSurface = &m_destSurface; |
| |
| #ifdef _MMC_SUPPORTED |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mmc->SetPipeBufAddr(&pipeBufAddrParams)); |
| #endif |
| |
| // Set MFX_IND_OBJ_BASE_ADDR_STATE_CMD |
| MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS indObjBaseAddrParams; |
| MOS_ZeroMemory(&indObjBaseAddrParams, sizeof(indObjBaseAddrParams)); |
| indObjBaseAddrParams.Mode = CODECHAL_DECODE_MODE_JPEG; |
| indObjBaseAddrParams.dwDataSize = m_copiedDataBufferInUse ? m_nextCopiedDataOffset : m_dataSize; |
| indObjBaseAddrParams.presDataBuffer = &m_resDataBuffer; |
| |
| // Set MFX_JPEG_PIC_STATE_CMD |
| jpegPicState.pJpegPicParams = m_jpegPicParams; |
| if ((m_jpegPicParams->m_rotation == jpegRotation90) || (m_jpegPicParams->m_rotation == jpegRotation270)) |
| { |
| jpegPicState.dwWidthInBlocks = (m_destSurface.dwHeight / CODECHAL_DECODE_JPEG_BLOCK_SIZE) - 1; |
| jpegPicState.dwHeightInBlocks = (m_destSurface.dwWidth / CODECHAL_DECODE_JPEG_BLOCK_SIZE) - 1; |
| } |
| else |
| { |
| jpegPicState.dwWidthInBlocks = (m_destSurface.dwWidth / CODECHAL_DECODE_JPEG_BLOCK_SIZE) - 1; |
| jpegPicState.dwHeightInBlocks = (m_destSurface.dwHeight / CODECHAL_DECODE_JPEG_BLOCK_SIZE) - 1; |
| } |
| |
| // Add commands to command buffer |
| // MI_FLUSH_DW command -> must be before to MFX_PIPE_MODE_SELECT |
| MHW_MI_FLUSH_DW_PARAMS flushDwParams; |
| MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams)); |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd( |
| &cmdBuffer, |
| &flushDwParams)); |
| |
| if (m_statusQueryReportingEnabled) |
| { |
| CODECHAL_DECODE_CHK_STATUS_RETURN(StartStatusReport( |
| &cmdBuffer)); |
| } |
| |
| // MFX_PIPE_MODE_SELECT_CMD |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeModeSelectCmd( |
| &cmdBuffer, |
| &pipeModeSelectParams)); |
| |
| #ifdef _DECODE_PROCESSING_SUPPORTED |
| // Output decode result through SFC |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_sfcState->AddSfcCommands(&cmdBuffer)); |
| #endif |
| |
| // CMD_MFX_SURFACE_STATE |
| #ifdef _MMC_SUPPORTED |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mmc->SetSurfaceState(&surfaceParams)); //class CodechalMmcDecodeJpegG12 |
| #endif |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxSurfaceCmd( |
| &cmdBuffer, |
| &surfaceParams)); |
| |
| // MFX_PIPE_BUF_ADDR_STATE_CMD |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeBufAddrCmd( |
| &cmdBuffer, |
| &pipeBufAddrParams)); |
| |
| // MFX_IND_OBJ_BASE_ADDR_STATE_CMD |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxIndObjBaseAddrCmd( |
| &cmdBuffer, |
| &indObjBaseAddrParams)); |
| |
| // MFX_JPEG_PIC_STATE_CMD |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxJpegPicCmd( |
| &cmdBuffer, |
| &jpegPicState)); |
| |
| m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeJpegG12::DecodePrimitiveLevel() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| // if the bitstream is not complete, don't do any decoding work. |
| if (m_incompletePicture) |
| { |
| return MOS_STATUS_SUCCESS; |
| |
| } |
| |
| CODECHAL_DECODE_CHK_NULL_RETURN(m_osInterface); |
| |
| MOS_COMMAND_BUFFER cmdBuffer; |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer( |
| m_osInterface, |
| &cmdBuffer, |
| 0)); |
| |
| // MFX_QM_STATE_CMD |
| MHW_VDBOX_QM_PARAMS qmParams; |
| MOS_ZeroMemory(&qmParams, sizeof(qmParams)); |
| qmParams.Standard = CODECHAL_JPEG; |
| qmParams.pJpegQuantMatrix = (CodecJpegQuantMatrix *)m_jpegQMatrix; |
| |
| // Swapping QM(x,y) to QM(y,x) for 90/270 degree rotation |
| if ((m_jpegPicParams->m_rotation == jpegRotation90) || |
| (m_jpegPicParams->m_rotation == jpegRotation270)) |
| { |
| qmParams.bJpegQMRotation = true; |
| } |
| else |
| { |
| qmParams.bJpegQMRotation = false; |
| } |
| |
| for (uint16_t scanCount = 0; scanCount < m_jpegPicParams->m_numCompInFrame; scanCount++) |
| { |
| // Using scanCount here because the same command is used for JPEG decode and encode |
| uint32_t quantTableSelector = m_jpegPicParams->m_quantTableSelector[scanCount]; |
| qmParams.pJpegQuantMatrix->m_jpegQMTableType[quantTableSelector] = scanCount; |
| qmParams.JpegQMTableSelector = quantTableSelector; |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxQmCmd( |
| &cmdBuffer, |
| &qmParams)); |
| } |
| |
| uint32_t dcCurHuffTblIndex[2] = { 0xff, 0xff }; |
| uint32_t acCurHuffTblIndex[2] = { 0xff, 0xff }; |
| |
| for (uint16_t scanCount = 0; scanCount < m_jpegScanParams->NumScans; scanCount++) |
| { |
| // MFX_JPEG_HUFF_TABLE |
| uint16_t numComponents = m_jpegScanParams->ScanHeader[scanCount].NumComponents; |
| for (uint16_t scanComponent = 0; scanComponent < numComponents; scanComponent++) |
| { |
| // Determine which huffman table we will be writing to |
| // For gray image, componentIdentifier[jpegComponentU] and componentIdentifier[jpegComponentV] are initialized to 0, |
| // and when componentSelector[scanComponent] is equal 0, variable huffTableID is set to 1, and wrong Huffman table is used, |
| // so it is more reasonable to use componentIdentifier[jpegComponentY] to determine which huffman table we will be writing to. |
| uint8_t componentSelector = |
| m_jpegScanParams->ScanHeader[scanCount].ComponentSelector[scanComponent]; |
| uint16_t huffTableID = 0; |
| if (componentSelector == m_jpegPicParams->m_componentIdentifier[jpegComponentY]) |
| { |
| huffTableID = 0; |
| } |
| else |
| { |
| huffTableID = 1; |
| } |
| |
| int32_t acTableSelector = |
| m_jpegScanParams->ScanHeader[scanCount].AcHuffTblSelector[scanComponent]; |
| int32_t dcTableSelector = |
| m_jpegScanParams->ScanHeader[scanCount].DcHuffTblSelector[scanComponent]; |
| |
| // Send the huffman table state command only if the table changed |
| if ((dcTableSelector != dcCurHuffTblIndex[huffTableID]) || |
| (acTableSelector != acCurHuffTblIndex[huffTableID])) |
| { |
| MHW_VDBOX_HUFF_TABLE_PARAMS huffmanTableParams; |
| MOS_ZeroMemory(&huffmanTableParams, sizeof(huffmanTableParams)); |
| |
| huffmanTableParams.HuffTableID = huffTableID; |
| |
| huffmanTableParams.pACBits = &m_jpegHuffmanTable->HuffTable[acTableSelector].AC_BITS[0]; |
| huffmanTableParams.pDCBits = &m_jpegHuffmanTable->HuffTable[dcTableSelector].DC_BITS[0]; |
| huffmanTableParams.pACValues = &m_jpegHuffmanTable->HuffTable[acTableSelector].AC_HUFFVAL[0]; |
| huffmanTableParams.pDCValues = &m_jpegHuffmanTable->HuffTable[dcTableSelector].DC_HUFFVAL[0]; |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxJpegHuffTableCmd( |
| &cmdBuffer, |
| &huffmanTableParams)); |
| |
| // Set the current huffman table indices for the next scan |
| dcCurHuffTblIndex[huffTableID] = dcTableSelector; |
| acCurHuffTblIndex[huffTableID] = acTableSelector; |
| } |
| } |
| |
| MHW_VDBOX_JPEG_BSD_PARAMS jpegBsdObject; |
| MOS_ZeroMemory(&jpegBsdObject, sizeof(jpegBsdObject)); |
| |
| // MFX_JPEG_BSD_OBJECT |
| jpegBsdObject.dwIndirectDataLength = m_jpegScanParams->ScanHeader[scanCount].DataLength; |
| jpegBsdObject.dwDataStartAddress = m_jpegScanParams->ScanHeader[scanCount].DataOffset; |
| jpegBsdObject.dwScanHorizontalPosition = m_jpegScanParams->ScanHeader[scanCount].ScanHoriPosition; |
| jpegBsdObject.dwScanVerticalPosition = m_jpegScanParams->ScanHeader[scanCount].ScanVertPosition; |
| jpegBsdObject.bInterleaved = (numComponents > 1) ? 1 : 0; |
| jpegBsdObject.dwMCUCount = m_jpegScanParams->ScanHeader[scanCount].MCUCount; |
| jpegBsdObject.dwRestartInterval = m_jpegScanParams->ScanHeader[scanCount].RestartInterval; |
| |
| uint16_t scanComponentIndex = 0; |
| |
| for (uint16_t scanComponent = 0; scanComponent < numComponents; scanComponent++) |
| { |
| uint8_t componentSelector = |
| m_jpegScanParams->ScanHeader[scanCount].ComponentSelector[scanComponent]; |
| |
| if (componentSelector == m_jpegPicParams->m_componentIdentifier[jpegComponentY]) |
| { |
| scanComponentIndex = 0; |
| } |
| else if (componentSelector == m_jpegPicParams->m_componentIdentifier[jpegComponentU]) |
| { |
| scanComponentIndex = 1; |
| } |
| else if (componentSelector == m_jpegPicParams->m_componentIdentifier[jpegComponentV]) |
| { |
| scanComponentIndex = 2; |
| } |
| // Add logic for component identifier JPEG_A |
| |
| jpegBsdObject.sScanComponent |= (1 << scanComponentIndex); |
| } |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxJpegBsdObjCmd( |
| &cmdBuffer, |
| &jpegBsdObject)); |
| } |
| |
| // Check if destination surface needs to be synchronized |
| MOS_SYNC_PARAMS 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_codecStatus = CODECHAL_STATUS_UNAVAILABLE; |
| decodeStatusReport.m_currDecodedPicRes = m_destSurface.OsResource; |
| |
| 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_copiedDataBufferInUse) |
| { |
| //Sync up complete frame |
| 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)); |
| } |
| |
| if ( MOS_VE_SUPPORTED(m_osInterface)) |
| { |
| CodecHalDecodeSinglePipeVE_PopulateHintParams(m_veState, &cmdBuffer, false); |
| } |
| |
| if (m_osInterface->osCpInterface->IsHMEnabled()) |
| { |
| HalOcaInterface::DumpCpParam(cmdBuffer, *m_osInterface->pOsContext, m_osInterface->osCpInterface->GetOcaDumper()); |
| } |
| |
| HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface->pOsContext); |
| |
| 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)); |
| } |
| |
| // Set output surface layout |
| SetOutputSurfaceLayout(&m_decodeParams.m_outputSurfLayout); |
| |
| // 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)); |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface( |
| &m_destSurface, |
| CodechalDbgAttr::attrDecodeOutputSurface, |
| "DstSurf"));) |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalDecodeJpegG12::AllocateStandard( |
| CodechalSetting * settings) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| CODECHAL_DECODE_CHK_NULL_RETURN(settings); |
| |
| CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeJpeg::AllocateStandard(settings)); |
| |
| if ( MOS_VE_SUPPORTED(m_osInterface)) |
| { |
| static_cast<MhwVdboxMfxInterfaceG12*>(m_mfxInterface)->DisableScalabilitySupport(); |
| |
| //single pipe VE initialize |
| m_veState = (PCODECHAL_DECODE_SINGLEPIPE_VIRTUALENGINE_STATE)MOS_AllocAndZeroMemory(sizeof(CODECHAL_DECODE_SINGLEPIPE_VIRTUALENGINE_STATE)); |
| CODECHAL_DECODE_CHK_NULL_RETURN(m_veState); |
| CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_InitInterface(m_osInterface, m_veState)); |
| } |
| |
| return eStatus; |
| } |
| |
| CodechalDecodeJpegG12::CodechalDecodeJpegG12( |
| CodechalHwInterface *hwInterface, |
| CodechalDebugInterface* debugInterface, |
| PCODECHAL_STANDARD_INFO standardInfo) : |
| CodechalDecodeJpeg(hwInterface, debugInterface, standardInfo) |
| { |
| CODECHAL_DECODE_FUNCTION_ENTER; |
| |
| CODECHAL_DECODE_CHK_NULL_NO_STATUS_RETURN(m_osInterface); |
| |
| Mos_CheckVirtualEngineSupported(m_osInterface, true, true); |
| } |
| |