From 98192bee3447e2da234991ee899ce63e814f355e Mon Sep 17 00:00:00 2001 From: pengxin99 Date: Thu, 6 Jul 2023 10:44:58 +0800 Subject: [PATCH] [Decode] Add RESET status for media reset * [Decode] Add RESET status for media reset --- .../common/codec/shared/codec_def_common.h | 5 +- .../common/codec/hal/codechal_decoder.cpp | 4 +- .../common/codec/ddi/media_libva_decoder.cpp | 85 ++++++++------ media_driver/linux/common/ddi/media_libva.cpp | 11 +- .../statusreport/decode_status_report.cpp | 4 +- .../codec/ddi/dec/ddi_decode_functions.cpp | 108 +++++++++++------- 6 files changed, 132 insertions(+), 85 deletions(-) diff --git a/media_common/agnostic/common/codec/shared/codec_def_common.h b/media_common/agnostic/common/codec/shared/codec_def_common.h index 5953491483..62c08b6ce1 100644 --- a/media_common/agnostic/common/codec/shared/codec_def_common.h +++ b/media_common/agnostic/common/codec/shared/codec_def_common.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2017-2022, Intel Corporation +* Copyright (c) 2017-2023, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -408,7 +408,8 @@ typedef enum _CODECHAL_STATUS * Only error reporting parameters in the status reporting structure will be valid. This status will be returned if the workload(s) for the picture in question resulted in a HW hang or HW status indicators indicate a failure. */ CODECHAL_STATUS_ERROR = 2, - CODECHAL_STATUS_UNAVAILABLE = 3 //!< Indicates that the entry in the status reporting array was not used + CODECHAL_STATUS_UNAVAILABLE = 3, //!< Indicates that the entry in the status reporting array was not used + CODECHAL_STATUS_RESET = 4 //!< Indicates that Media Reset happend } CODECHAL_STATUS, *PCODECHAL_STATUS; typedef enum _CODECHAL_CHROMA_SITING_TYPE diff --git a/media_driver/agnostic/common/codec/hal/codechal_decoder.cpp b/media_driver/agnostic/common/codec/hal/codechal_decoder.cpp index 35b1e182a8..df890ab1ad 100644 --- a/media_driver/agnostic/common/codec/hal/codechal_decoder.cpp +++ b/media_driver/agnostic/common/codec/hal/codechal_decoder.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2011-2021, Intel Corporation +* Copyright (c) 2011-2023, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -1909,7 +1909,7 @@ MOS_STATUS CodechalDecode::GetStatusReport( { // BB_END data not written. Media reset might have occurred. CODECHAL_DECODE_NORMALMESSAGE("Media reset may have occured."); - codecStatus[j].m_codecStatus = CODECHAL_STATUS_ERROR; + codecStatus[j].m_codecStatus = CODECHAL_STATUS_RESET; } if (m_standard == CODECHAL_HEVC) diff --git a/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp b/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp index 1569323f9c..edeb718968 100755 --- a/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp +++ b/media_driver/linux/common/codec/ddi/media_libva_decoder.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009-2021, Intel Corporation +* Copyright (c) 2009-2023, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -403,7 +403,10 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, CodechalDecode *dec bo = (tempNewReport.m_deblockedPicResOlp.bo) ? tempNewReport.m_deblockedPicResOlp.bo : bo; } - if ((tempNewReport.m_codecStatus == CODECHAL_STATUS_SUCCESSFUL) || (tempNewReport.m_codecStatus == CODECHAL_STATUS_ERROR) || (tempNewReport.m_codecStatus == CODECHAL_STATUS_INCOMPLETE)) + if ((tempNewReport.m_codecStatus == CODECHAL_STATUS_SUCCESSFUL) || + (tempNewReport.m_codecStatus == CODECHAL_STATUS_ERROR) || + (tempNewReport.m_codecStatus == CODECHAL_STATUS_INCOMPLETE) || + (tempNewReport.m_codecStatus == CODECHAL_STATUS_RESET)) { PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; @@ -451,7 +454,9 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, CodechalDecode *dec { return VA_STATUS_ERROR_DECODING_ERROR; } - else if (surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE || surface->curStatusReport.decode.status == CODECHAL_STATUS_UNAVAILABLE) + else if (surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE || + surface->curStatusReport.decode.status == CODECHAL_STATUS_RESET || + surface->curStatusReport.decode.status == CODECHAL_STATUS_UNAVAILABLE) { return mediaCtx->bMediaResetEnable ? VA_STATUS_SUCCESS : VA_STATUS_ERROR_HW_BUSY; } @@ -474,47 +479,57 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, DecodePipelineAdapt if (surface->curStatusReportQueryState == DDI_MEDIA_STATUS_REPORT_QUERY_STATE_PENDING) { uint32_t uNumCompletedReport = decoder->GetCompletedReport(); - DDI_CHK_CONDITION((uNumCompletedReport == 0), - "No report available at all", VA_STATUS_ERROR_OPERATION_FAILED); - - for (uint32_t i = 0; i < uNumCompletedReport; i++) + if (uNumCompletedReport != 0) { - decode::DecodeStatusReportData tempNewReport; - MOS_ZeroMemory(&tempNewReport, sizeof(CodechalDecodeStatusReport)); - MOS_STATUS eStatus = decoder->GetStatusReport(&tempNewReport, 1); - DDI_CHK_CONDITION(MOS_STATUS_SUCCESS != eStatus, "Get status report fail", VA_STATUS_ERROR_OPERATION_FAILED); - - MOS_LINUX_BO *bo = tempNewReport.currDecodedPicRes.bo; - - if ((tempNewReport.codecStatus == CODECHAL_STATUS_SUCCESSFUL) || (tempNewReport.codecStatus == CODECHAL_STATUS_ERROR) || (tempNewReport.codecStatus == CODECHAL_STATUS_INCOMPLETE)) + for (uint32_t i = 0; i < uNumCompletedReport; i++) { - PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; + decode::DecodeStatusReportData tempNewReport; + MOS_ZeroMemory(&tempNewReport, sizeof(CodechalDecodeStatusReport)); + MOS_STATUS eStatus = decoder->GetStatusReport(&tempNewReport, 1); + DDI_CHK_CONDITION(MOS_STATUS_SUCCESS != eStatus, "Get status report fail", VA_STATUS_ERROR_OPERATION_FAILED); - uint32_t j = 0; - for (j = 0; j < mediaCtx->pSurfaceHeap->uiAllocatedHeapElements; j++, mediaSurfaceHeapElmt++) + MOS_LINUX_BO *bo = tempNewReport.currDecodedPicRes.bo; + + if ((tempNewReport.codecStatus == CODECHAL_STATUS_SUCCESSFUL) || + (tempNewReport.codecStatus == CODECHAL_STATUS_ERROR) || + (tempNewReport.codecStatus == CODECHAL_STATUS_INCOMPLETE) || + (tempNewReport.codecStatus == CODECHAL_STATUS_RESET)) { - if (mediaSurfaceHeapElmt != nullptr && - mediaSurfaceHeapElmt->pSurface != nullptr && - bo == mediaSurfaceHeapElmt->pSurface->bo) + PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; + + uint32_t j = 0; + for (j = 0; j < mediaCtx->pSurfaceHeap->uiAllocatedHeapElements; j++, mediaSurfaceHeapElmt++) { - mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.status = (uint32_t)tempNewReport.codecStatus; - mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.errMbNum = (uint32_t)tempNewReport.numMbsAffected; - mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.crcValue = (uint32_t)tempNewReport.frameCrc; - mediaSurfaceHeapElmt->pSurface->curStatusReportQueryState = DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED; - break; + if (mediaSurfaceHeapElmt != nullptr && + mediaSurfaceHeapElmt->pSurface != nullptr && + bo == mediaSurfaceHeapElmt->pSurface->bo) + { + mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.status = (uint32_t)tempNewReport.codecStatus; + mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.errMbNum = (uint32_t)tempNewReport.numMbsAffected; + mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.crcValue = (uint32_t)tempNewReport.frameCrc; + mediaSurfaceHeapElmt->pSurface->curStatusReportQueryState = DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED; + break; + } } - } - if (j == mediaCtx->pSurfaceHeap->uiAllocatedHeapElements) + if (j == mediaCtx->pSurfaceHeap->uiAllocatedHeapElements) + { + return VA_STATUS_ERROR_OPERATION_FAILED; + } + } + else { + // return failed if queried INCOMPLETE or UNAVAILABLE report. return VA_STATUS_ERROR_OPERATION_FAILED; } } - else - { - // return failed if queried INCOMPLETE or UNAVAILABLE report. - return VA_STATUS_ERROR_OPERATION_FAILED; - } + } + // The surface is not busy in HW, but uNumCompletedReport is 0, treat as engine reset + else + { + surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE; + surface->curStatusReportQueryState = DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED; + DDI_ASSERTMESSAGE("No report available at all! Engine reset may have occured."); } } @@ -534,7 +549,9 @@ VAStatus DdiDecode_StatusReport(PDDI_MEDIA_CONTEXT mediaCtx, DecodePipelineAdapt { return VA_STATUS_ERROR_DECODING_ERROR; } - else if (surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE || surface->curStatusReport.decode.status == CODECHAL_STATUS_UNAVAILABLE) + else if (surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE || + surface->curStatusReport.decode.status == CODECHAL_STATUS_RESET || + surface->curStatusReport.decode.status == CODECHAL_STATUS_UNAVAILABLE) { return mediaCtx->bMediaResetEnable ? VA_STATUS_SUCCESS : VA_STATUS_ERROR_HW_BUSY; } diff --git a/media_driver/linux/common/ddi/media_libva.cpp b/media_driver/linux/common/ddi/media_libva.cpp index af35be841c..a10626e8c9 100755 --- a/media_driver/linux/common/ddi/media_libva.cpp +++ b/media_driver/linux/common/ddi/media_libva.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2009-2022, Intel Corporation +* Copyright (c) 2009-2023, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -4426,10 +4426,11 @@ VAStatus DdiMedia_QuerySurfaceError( { if (error_status != -1 && surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_DECODER) { - if (surface->curStatusReport.decode.status == CODECHAL_STATUS_ERROR) + if (surface->curStatusReport.decode.status == CODECHAL_STATUS_ERROR || + surface->curStatusReport.decode.status == CODECHAL_STATUS_RESET) { surfaceErrors[1].status = -1; - surfaceErrors[0].status = 2; + surfaceErrors[0].status = (surface->curStatusReport.decode.status == CODECHAL_STATUS_RESET) ? VA_STATUS_ERROR_HW_BUSY : 2; surfaceErrors[0].start_mb = 0; surfaceErrors[0].end_mb = 0; surfaceErrors[0].num_mb = surface->curStatusReport.decode.errMbNum; @@ -4438,8 +4439,8 @@ VAStatus DdiMedia_QuerySurfaceError( DdiMediaUtil_UnLockMutex(&mediaCtx->SurfaceMutex); return VA_STATUS_SUCCESS; } - else if (surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE || - surface->curStatusReport.decode.status == CODECHAL_STATUS_UNAVAILABLE) + else if (surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE || + surface->curStatusReport.decode.status == CODECHAL_STATUS_UNAVAILABLE) { MOS_ZeroMemory(&surfaceErrors[0], sizeof(VASurfaceDecodeMBErrors)); surfaceErrors[1].status = -1; diff --git a/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.cpp b/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.cpp index a483f5d3a9..039f5eefbf 100644 --- a/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.cpp +++ b/media_softlet/agnostic/common/codec/hal/dec/shared/statusreport/decode_status_report.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2019-2021, Intel Corporation +* Copyright (c) 2019-2023, Intel Corporation * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), @@ -242,7 +242,7 @@ namespace decode { } else if (!completed) { - statusReportData->codecStatus = CODECHAL_STATUS_ERROR; + statusReportData->codecStatus = CODECHAL_STATUS_RESET; DECODE_ASSERTMESSAGE("Media reset may have occured."); } else diff --git a/media_softlet/linux/common/codec/ddi/dec/ddi_decode_functions.cpp b/media_softlet/linux/common/codec/ddi/dec/ddi_decode_functions.cpp index ff5c854241..ea98fc3440 100644 --- a/media_softlet/linux/common/codec/ddi/dec/ddi_decode_functions.cpp +++ b/media_softlet/linux/common/codec/ddi/dec/ddi_decode_functions.cpp @@ -1046,46 +1046,59 @@ VAStatus DdiDecodeFunctions::StatusReport( if (surface->curStatusReportQueryState == DDI_MEDIA_STATUS_REPORT_QUERY_STATE_PENDING) // TODO: Use soltlet class { uint32_t uNumCompletedReport = decoder->GetCompletedReport(); - DDI_CODEC_CHK_CONDITION((uNumCompletedReport == 0), "No report available at all", VA_STATUS_ERROR_OPERATION_FAILED); - - for (uint32_t i = 0; i < uNumCompletedReport; i++) + if (uNumCompletedReport != 0) { - DecodeStatusReportData tempNewReport; - MOS_ZeroMemory(&tempNewReport, sizeof(CodechalDecodeStatusReport)); - MOS_STATUS eStatus = decoder->GetStatusReport(&tempNewReport, 1); - DDI_CODEC_CHK_CONDITION(MOS_STATUS_SUCCESS != eStatus, "Get status report fail", VA_STATUS_ERROR_OPERATION_FAILED); - - MOS_LINUX_BO *bo = tempNewReport.currDecodedPicRes.bo; + DDI_CODEC_CHK_CONDITION((uNumCompletedReport == 0), "No report available at all", VA_STATUS_ERROR_OPERATION_FAILED); - if ((tempNewReport.codecStatus == CODECHAL_STATUS_SUCCESSFUL) || (tempNewReport.codecStatus == CODECHAL_STATUS_ERROR) || (tempNewReport.codecStatus == CODECHAL_STATUS_INCOMPLETE)) + for (uint32_t i = 0; i < uNumCompletedReport; i++) { - PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; + DecodeStatusReportData tempNewReport; + MOS_ZeroMemory(&tempNewReport, sizeof(CodechalDecodeStatusReport)); + MOS_STATUS eStatus = decoder->GetStatusReport(&tempNewReport, 1); + DDI_CODEC_CHK_CONDITION(MOS_STATUS_SUCCESS != eStatus, "Get status report fail", VA_STATUS_ERROR_OPERATION_FAILED); + + MOS_LINUX_BO *bo = tempNewReport.currDecodedPicRes.bo; - uint32_t j = 0; - for (j = 0; j < mediaCtx->pSurfaceHeap->uiAllocatedHeapElements; j++, mediaSurfaceHeapElmt++) + if ((tempNewReport.codecStatus == CODECHAL_STATUS_SUCCESSFUL) || + (tempNewReport.codecStatus == CODECHAL_STATUS_ERROR) || + (tempNewReport.codecStatus == CODECHAL_STATUS_RESET) || + (tempNewReport.codecStatus == CODECHAL_STATUS_INCOMPLETE)) { - if (mediaSurfaceHeapElmt != nullptr && - mediaSurfaceHeapElmt->pSurface != nullptr && - bo == mediaSurfaceHeapElmt->pSurface->bo) + PDDI_MEDIA_SURFACE_HEAP_ELEMENT mediaSurfaceHeapElmt = (PDDI_MEDIA_SURFACE_HEAP_ELEMENT)mediaCtx->pSurfaceHeap->pHeapBase; + + uint32_t j = 0; + for (j = 0; j < mediaCtx->pSurfaceHeap->uiAllocatedHeapElements; j++, mediaSurfaceHeapElmt++) { - mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.status = (uint32_t)tempNewReport.codecStatus; - mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.errMbNum = (uint32_t)tempNewReport.numMbsAffected; - mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.crcValue = (uint32_t)tempNewReport.frameCrc; - mediaSurfaceHeapElmt->pSurface->curStatusReportQueryState = DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED; - break; + if (mediaSurfaceHeapElmt != nullptr && + mediaSurfaceHeapElmt->pSurface != nullptr && + bo == mediaSurfaceHeapElmt->pSurface->bo) + { + mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.status = (uint32_t)tempNewReport.codecStatus; + mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.errMbNum = (uint32_t)tempNewReport.numMbsAffected; + mediaSurfaceHeapElmt->pSurface->curStatusReport.decode.crcValue = (uint32_t)tempNewReport.frameCrc; + mediaSurfaceHeapElmt->pSurface->curStatusReportQueryState = DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED; + break; + } } - } - if (j == mediaCtx->pSurfaceHeap->uiAllocatedHeapElements) + if (j == mediaCtx->pSurfaceHeap->uiAllocatedHeapElements) + { + return VA_STATUS_ERROR_OPERATION_FAILED; + } + } + else { + // return failed if queried INCOMPLETE or UNAVAILABLE report. return VA_STATUS_ERROR_OPERATION_FAILED; } } - else - { - // return failed if queried INCOMPLETE or UNAVAILABLE report. - return VA_STATUS_ERROR_OPERATION_FAILED; - } + } + // The surface is not busy in HW, but uNumCompletedReport is 0, treat as engine reset + else + { + surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE; + surface->curStatusReportQueryState = DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED; + DDI_ASSERTMESSAGE("No report available at all! Engine reset may have occured."); } } @@ -1106,7 +1119,9 @@ VAStatus DdiDecodeFunctions::StatusReport( { return VA_STATUS_ERROR_DECODING_ERROR; } - else if (surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE || surface->curStatusReport.decode.status == CODECHAL_STATUS_UNAVAILABLE) + else if (surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE || + surface->curStatusReport.decode.status == CODECHAL_STATUS_RESET || + surface->curStatusReport.decode.status == CODECHAL_STATUS_UNAVAILABLE) { return mediaCtx->bMediaResetEnable ? VA_STATUS_SUCCESS : VA_STATUS_ERROR_HW_BUSY; } @@ -1148,18 +1163,31 @@ VAStatus DdiDecodeFunctions::QuerySurfaceError( MosUtilities::MosLockMutex(&mediaCtx->SurfaceMutex); if (surface->curStatusReportQueryState == DDI_MEDIA_STATUS_REPORT_QUERY_STATE_COMPLETED) { - if (errorStatus != -1 && surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_DECODER && - surface->curStatusReport.decode.status == CODECHAL_STATUS_ERROR) + if (errorStatus != -1 && surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_DECODER) { - surfaceErrors[1].status = -1; - surfaceErrors[0].status = 2; - surfaceErrors[0].start_mb = 0; - surfaceErrors[0].end_mb = 0; - surfaceErrors[0].num_mb = surface->curStatusReport.decode.errMbNum; - surfaceErrors[0].decode_error_type = VADecodeMBError; - *errorInfo = surfaceErrors; - MosUtilities::MosUnlockMutex(&mediaCtx->SurfaceMutex); - return VA_STATUS_SUCCESS; + if(surface->curStatusReport.decode.status == CODECHAL_STATUS_ERROR || + surface->curStatusReport.decode.status == CODECHAL_STATUS_RESET) + { + surfaceErrors[1].status = -1; + surfaceErrors[0].status = (surface->curStatusReport.decode.status == CODECHAL_STATUS_RESET) ? VA_STATUS_ERROR_HW_BUSY : 2; + surfaceErrors[0].start_mb = 0; + surfaceErrors[0].end_mb = 0; + surfaceErrors[0].num_mb = surface->curStatusReport.decode.errMbNum; + surfaceErrors[0].decode_error_type = VADecodeMBError; + *errorInfo = surfaceErrors; + MosUtilities::MosUnlockMutex(&mediaCtx->SurfaceMutex); + return VA_STATUS_SUCCESS; + } + else if (surface->curStatusReport.decode.status == CODECHAL_STATUS_INCOMPLETE || + surface->curStatusReport.decode.status == CODECHAL_STATUS_UNAVAILABLE) + { + MOS_ZeroMemory(&surfaceErrors[0], sizeof(VASurfaceDecodeMBErrors)); + surfaceErrors[1].status = -1; + surfaceErrors[0].status = VA_STATUS_ERROR_HW_BUSY; + *errorInfo = surfaceErrors; + MosUtilities::MosUnlockMutex(&mediaCtx->SurfaceMutex); + return VA_STATUS_SUCCESS; + } } if (errorStatus == -1 && surface->curCtxType == DDI_MEDIA_CONTEXT_TYPE_DECODER)