void CDXVADecoderMpeg2::UpdatePictureParams(int nSurfaceIndex) { DXVA2_ConfigPictureDecode* cpd = GetDXVA2Config(); // Ok for DXVA1 too (parameters have been copied) m_PictureParams.wDecodedPictureIndex = nSurfaceIndex; // Manage reference picture list if (!m_PictureParams.bPicBackwardPrediction) { if (m_wRefPictureIndex[0] != NO_REF_FRAME) { RemoveRefFrame(m_wRefPictureIndex[0]); } m_wRefPictureIndex[0] = m_wRefPictureIndex[1]; m_wRefPictureIndex[1] = nSurfaceIndex; } m_PictureParams.wForwardRefPictureIndex = (m_PictureParams.bPicIntra == 0) ? m_wRefPictureIndex[0] : NO_REF_FRAME; m_PictureParams.wBackwardRefPictureIndex = (m_PictureParams.bPicBackwardPrediction == 1) ? m_wRefPictureIndex[1] : NO_REF_FRAME; // Shall be 0 if bConfigResidDiffHost is 0 or if BPP > 8 if (cpd->ConfigResidDiffHost == 0 || m_PictureParams.bBPPminus1 > 7) { m_PictureParams.bPicSpatialResid8 = 0; } else { if (m_PictureParams.bBPPminus1 == 7 && m_PictureParams.bPicIntra && cpd->ConfigResidDiffHost) // Shall be 1 if BPP is 8 and bPicIntra is 1 and bConfigResidDiffHost is 1 { m_PictureParams.bPicSpatialResid8 = 1; } else // Shall be 1 if bConfigSpatialResid8 is 1 { m_PictureParams.bPicSpatialResid8 = cpd->ConfigSpatialResid8; } } // Shall be 0 if bConfigResidDiffHost is 0 or if bConfigSpatialResid8 is 0 or if BPP > 8 if (cpd->ConfigResidDiffHost == 0 || cpd->ConfigSpatialResid8 == 0 || m_PictureParams.bBPPminus1 > 7) { m_PictureParams.bPicOverflowBlocks = 0; } // Shall be 1 if bConfigHostInverseScan is 1 or if bConfigResidDiffAccelerator is 0. if (cpd->ConfigHostInverseScan == 1 || cpd->ConfigResidDiffAccelerator == 0) { m_PictureParams.bPicScanFixed = 1; if (cpd->ConfigHostInverseScan != 0) { m_PictureParams.bPicScanMethod = 3; // 11 = Arbitrary scan with absolute coefficient address. } else if (FFGetAlternateScan(m_pFilter->GetAVCtx())) { m_PictureParams.bPicScanMethod = 1; // 00 = Zig-zag scan (MPEG-2 Figure 7-2) } else { m_PictureParams.bPicScanMethod = 0; // 01 = Alternate-vertical (MPEG-2 Figure 7-3), } } }
void CDXVADecoderMpeg2::UpdatePictureParams() { DXVA2_ConfigPictureDecode* cpd = GetDXVA2Config(); // Ok for DXVA1 too (parameters have been copied) DXVA_PictureParameters* DXVAPicParams = &m_DXVA_Context.DXVA_MPEG2Context[m_nFieldNum].DXVAPicParams; // Shall be 0 if bConfigResidDiffHost is 0 or if BPP > 8 if (cpd->ConfigResidDiffHost == 0 || DXVAPicParams->bBPPminus1 > 7) { DXVAPicParams->bPicSpatialResid8 = 0; } else { if (DXVAPicParams->bBPPminus1 == 7 && DXVAPicParams->bPicIntra && cpd->ConfigResidDiffHost) { // Shall be 1 if BPP is 8 and bPicIntra is 1 and bConfigResidDiffHost is 1 DXVAPicParams->bPicSpatialResid8 = 1; } else { // Shall be 1 if bConfigSpatialResid8 is 1 DXVAPicParams->bPicSpatialResid8 = cpd->ConfigSpatialResid8; } } // Shall be 0 if bConfigResidDiffHost is 0 or if bConfigSpatialResid8 is 0 or if BPP > 8 if (cpd->ConfigResidDiffHost == 0 || cpd->ConfigSpatialResid8 == 0 || DXVAPicParams->bBPPminus1 > 7) { DXVAPicParams->bPicOverflowBlocks = 0; } // Shall be 1 if bConfigHostInverseScan is 1 or if bConfigResidDiffAccelerator is 0. if (cpd->ConfigHostInverseScan == 1 || cpd->ConfigResidDiffAccelerator == 0) { DXVAPicParams->bPicScanFixed = 1; if (cpd->ConfigHostInverseScan != 0) { DXVAPicParams->bPicScanMethod = 3; // 11 = Arbitrary scan with absolute coefficient address. } else if (FFGetAlternateScan(m_pFilter->GetAVCtx())) { DXVAPicParams->bPicScanMethod = 1; // 00 = Zig-zag scan (MPEG-2 Figure 7-2) } else { DXVAPicParams->bPicScanMethod = 0; // 01 = Alternate-vertical (MPEG-2 Figure 7-3), } } }
CDXVADecoderH264::CDXVADecoderH264(CMPCVideoDecFilter* pFilter, IDirectXVideoDecoder* pDirectXVideoDec, const GUID* guidDecoder, DXVAMode nMode, int nPicEntryNumber, DXVA2_ConfigPictureDecode* pDXVA2Config) : CDXVADecoder(pFilter, pDirectXVideoDec, guidDecoder, nMode, nPicEntryNumber, pDXVA2Config) { m_bUseLongSlice = (GetDXVA2Config()->ConfigBitstreamRaw != 2); Init(); }