1 /*
2 * Copyright (c) 2011-2020, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file     codechal_decode_jpeg_g11.cpp
24 //! \brief    Implements the decode interface extension for JPEG.
25 //! \details  Implements all functions and constants required by CodecHal for JPEG decoding.
26 //!
27 
28 #include "codechal_decoder.h"
29 #include "codechal_decode_jpeg_g11.h"
30 #include "mhw_vdbox_mfx_g11_X.h"
31 #include "hal_oca_interface.h"
32 
~CodechalDecodeJpegG11()33 CodechalDecodeJpegG11::~CodechalDecodeJpegG11()
34 {
35     CODECHAL_DECODE_FUNCTION_ENTER;
36 
37     if (m_veState != nullptr)
38     {
39         MOS_FreeMemAndSetNull(m_veState);
40         m_veState = nullptr;
41     }
42 }
43 
SetGpuCtxCreatOption(CodechalSetting * codecHalSetting)44 MOS_STATUS CodechalDecodeJpegG11::SetGpuCtxCreatOption(
45     CodechalSetting *          codecHalSetting)
46 {
47     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
48 
49     CODECHAL_DECODE_FUNCTION_ENTER;
50 
51     if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
52     {
53         CodechalDecode::SetGpuCtxCreatOption(codecHalSetting);
54     }
55     else
56     {
57         m_gpuCtxCreatOpt = MOS_New(MOS_GPUCTX_CREATOPTIONS_ENHANCED);
58 
59         bool sfcInUse = IsSfcInUse(codecHalSetting);
60 
61         CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_ConstructParmsForGpuCtxCreation(
62             m_veState,
63             (PMOS_GPUCTX_CREATOPTIONS_ENHANCED)m_gpuCtxCreatOpt,
64             sfcInUse));
65 
66         if (sfcInUse)
67         {
68             m_videoContext = MOS_GPU_CONTEXT_VIDEO4;
69 
70             CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateGpuContext(
71                 m_osInterface,
72                 m_videoContext,
73                 MOS_GPU_NODE_VIDEO,
74                 m_gpuCtxCreatOpt));
75 
76             m_videoContext = MOS_GPU_CONTEXT_VIDEO;
77         }
78         else
79         {
80             m_videoContext = MOS_GPU_CONTEXT_VIDEO;
81         }
82     }
83 
84     return eStatus;
85 }
86 
SetFrameStates()87 MOS_STATUS CodechalDecodeJpegG11::SetFrameStates()
88 {
89     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
90 
91     CODECHAL_DECODE_FUNCTION_ENTER;
92 
93     CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeJpeg::SetFrameStates());
94 
95     if ( MOS_VE_SUPPORTED(m_osInterface))
96     {
97         if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
98         {
99             MOS_VIRTUALENGINE_SET_PARAMS  vesetParams;
100 
101             MOS_ZeroMemory(&vesetParams, sizeof(vesetParams));
102 #ifdef _DECODE_PROCESSING_SUPPORTED
103             vesetParams.bSFCInUse = m_sfcState->m_sfcPipeOut;
104 #else
105             vesetParams.bSFCInUse                   = false;
106 #endif
107             vesetParams.bNeedSyncWithPrevious       = true;
108             vesetParams.bSameEngineAsLastSubmission = false;
109             CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_SetHintParams(
110                 m_veState,
111                 &vesetParams));
112         }
113     }
114 
115     return eStatus;
116 }
117 
DecodeStateLevel()118 MOS_STATUS CodechalDecodeJpegG11::DecodeStateLevel()
119 {
120     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
121 
122     CODECHAL_DECODE_FUNCTION_ENTER;
123 
124     MHW_VDBOX_JPEG_DECODE_PIC_STATE jpegPicState;
125     jpegPicState.dwOutputFormat = m_decodeParams.m_destSurface->Format;
126 
127 #ifdef _DECODE_PROCESSING_SUPPORTED
128     if (m_sfcState->m_sfcPipeOut)
129     {
130         jpegPicState.dwOutputFormat = m_sfcState->m_sfcInSurface.Format;
131     }
132 #endif
133 
134     //Three new formats from HSW C0,HSW ULT can only be supported in specific conditions.
135     if (jpegPicState.dwOutputFormat == Format_NV12 ||
136         jpegPicState.dwOutputFormat == Format_YUY2 ||
137         jpegPicState.dwOutputFormat == Format_UYVY)
138     {
139         //Only interleaved single scan are supported.
140         if (m_jpegPicParams->m_totalScans != 1 ||
141             m_jpegPicParams->m_interleavedData == 0)
142         {
143             return MOS_STATUS_UNKNOWN;
144         }
145 
146         switch (m_jpegPicParams->m_chromaType)
147         {
148         case jpegYUV420:
149         case jpegYUV422H2Y:
150         case jpegYUV422H4Y:
151             break;
152         case jpegYUV422V2Y:
153         case jpegYUV422V4Y:
154             if (GFX_IS_GEN_8_OR_LATER(m_hwInterface->GetPlatform()) &&
155                 jpegPicState.dwOutputFormat == Format_NV12)
156             {
157                 break;
158             }
159         default:
160             return MOS_STATUS_UNKNOWN;
161         }
162     }
163 
164     if (m_decodeParams.m_destSurface->Format == Format_A8R8G8B8)
165     {
166         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSetGpuContext(
167             m_osInterface,
168             MOS_GPU_CONTEXT_VIDEO4));
169         m_videoContext = MOS_GPU_CONTEXT_VIDEO4;
170     }
171     else
172     {
173         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSetGpuContext(
174             m_osInterface,
175             MOS_GPU_CONTEXT_VIDEO));
176         m_videoContext = MOS_GPU_CONTEXT_VIDEO;
177     }
178 
179     MOS_COMMAND_BUFFER cmdBuffer;
180     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(
181         m_osInterface,
182         &cmdBuffer,
183         0));
184 
185     auto mmioRegisters = m_hwInterface->GetMfxInterface()->GetMmioRegisters(m_vdboxIndex);
186     HalOcaInterface::On1stLevelBBStart(cmdBuffer, *m_osInterface->pOsContext, m_osInterface->CurrentGpuContextHandle, *m_miInterface, *mmioRegisters);
187 
188     CODECHAL_DECODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(
189         &cmdBuffer, true));
190 
191     // Set PIPE_MODE_SELECT
192     MHW_VDBOX_PIPE_MODE_SELECT_PARAMS pipeModeSelectParams;
193     pipeModeSelectParams.Mode = CODECHAL_DECODE_MODE_JPEG;
194     pipeModeSelectParams.bStreamOutEnabled = m_streamOutEnabled;
195     pipeModeSelectParams.bDeblockerStreamOutEnable = false;
196     pipeModeSelectParams.bPostDeblockOutEnable = false;
197     pipeModeSelectParams.bPreDeblockOutEnable = true;
198 
199     // Set CMD_MFX_SURFACE_STATE
200     MHW_VDBOX_SURFACE_PARAMS surfaceParams;
201     MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
202     surfaceParams.Mode = CODECHAL_DECODE_MODE_JPEG;
203     surfaceParams.psSurface  = &m_destSurface;
204     surfaceParams.ChromaType = m_jpegPicParams->m_chromaType;
205 
206 #ifdef _DECODE_PROCESSING_SUPPORTED
207     if (m_sfcState->m_sfcPipeOut)
208     {
209         surfaceParams.psSurface = &m_sfcState->m_sfcInSurface;
210     }
211 #endif
212 
213     // Set MFX_PIPE_BUF_ADDR_STATE_CMD
214     MHW_VDBOX_PIPE_BUF_ADDR_PARAMS pipeBufAddrParams;
215     pipeBufAddrParams.Mode = CODECHAL_DECODE_MODE_JPEG;
216     // Predeblock surface is the same as destination surface here because there is no deblocking for JPEG
217     pipeBufAddrParams.psPreDeblockSurface = &m_destSurface;
218 
219     pipeBufAddrParams.pDecodedReconParam = &surfaceParams;
220     pipeBufAddrParams.psRawSurface = nullptr;
221 
222 #ifdef _MMC_SUPPORTED
223     CODECHAL_DECODE_CHK_STATUS_RETURN(m_mmc->SetPipeBufAddr(&pipeBufAddrParams, &cmdBuffer));
224 #endif
225 
226     pipeBufAddrParams.pDecodedReconParam = nullptr;
227 
228     // Set MFX_IND_OBJ_BASE_ADDR_STATE_CMD
229     MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS indObjBaseAddrParams;
230     MOS_ZeroMemory(&indObjBaseAddrParams, sizeof(indObjBaseAddrParams));
231     indObjBaseAddrParams.Mode = CODECHAL_DECODE_MODE_JPEG;
232     indObjBaseAddrParams.dwDataSize     = m_copiedDataBufferInUse ? m_nextCopiedDataOffset : m_dataSize;
233     indObjBaseAddrParams.presDataBuffer = &m_resDataBuffer;
234 
235     // Set MFX_JPEG_PIC_STATE_CMD
236     jpegPicState.pJpegPicParams = m_jpegPicParams;
237     if ((m_jpegPicParams->m_rotation == jpegRotation90) || (m_jpegPicParams->m_rotation == jpegRotation270))
238     {
239         jpegPicState.dwWidthInBlocks  = (m_destSurface.dwHeight / CODECHAL_DECODE_JPEG_BLOCK_SIZE) - 1;
240         jpegPicState.dwHeightInBlocks = (m_destSurface.dwWidth / CODECHAL_DECODE_JPEG_BLOCK_SIZE) - 1;
241     }
242     else
243     {
244         jpegPicState.dwWidthInBlocks  = (m_destSurface.dwWidth / CODECHAL_DECODE_JPEG_BLOCK_SIZE) - 1;
245         jpegPicState.dwHeightInBlocks = (m_destSurface.dwHeight / CODECHAL_DECODE_JPEG_BLOCK_SIZE) - 1;
246     }
247 
248     // Add commands to command buffer
249     // MI_FLUSH_DW command -> must be before to MFX_PIPE_MODE_SELECT
250     MHW_MI_FLUSH_DW_PARAMS flushDwParams;
251     MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
252     CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(
253         &cmdBuffer,
254         &flushDwParams));
255 
256     if (m_statusQueryReportingEnabled)
257     {
258         CODECHAL_DECODE_CHK_STATUS_RETURN(StartStatusReport(
259             &cmdBuffer));
260     }
261 
262     // MFX_PIPE_MODE_SELECT_CMD
263     CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeModeSelectCmd(
264         &cmdBuffer,
265         &pipeModeSelectParams));
266 
267 #ifdef _DECODE_PROCESSING_SUPPORTED
268     // Output decode result through SFC
269     CODECHAL_DECODE_CHK_STATUS_RETURN(m_sfcState->AddSfcCommands(&cmdBuffer));
270 #endif
271 
272     // CMD_MFX_SURFACE_STATE
273     CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxSurfaceCmd(
274         &cmdBuffer,
275         &surfaceParams));
276 
277     // MFX_PIPE_BUF_ADDR_STATE_CMD
278     CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxPipeBufAddrCmd(
279         &cmdBuffer,
280         &pipeBufAddrParams));
281 
282     // MFX_IND_OBJ_BASE_ADDR_STATE_CMD
283     CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxIndObjBaseAddrCmd(
284         &cmdBuffer,
285         &indObjBaseAddrParams));
286 
287     // MFX_JPEG_PIC_STATE_CMD
288     CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxJpegPicCmd(
289         &cmdBuffer,
290         &jpegPicState));
291 
292     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
293 
294     return eStatus;
295 }
296 
DecodePrimitiveLevel()297 MOS_STATUS CodechalDecodeJpegG11::DecodePrimitiveLevel()
298 {
299     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
300 
301     CODECHAL_DECODE_FUNCTION_ENTER;
302 
303     // if the bitstream is not complete, don't do any decoding work.
304     if (m_incompletePicture)
305     {
306         return MOS_STATUS_SUCCESS;
307 
308     }
309 
310     CODECHAL_DECODE_CHK_NULL_RETURN(m_osInterface);
311 
312     MOS_COMMAND_BUFFER cmdBuffer;
313     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(
314         m_osInterface,
315         &cmdBuffer,
316         0));
317 
318     // MFX_QM_STATE_CMD
319     MHW_VDBOX_QM_PARAMS qmParams;
320     MOS_ZeroMemory(&qmParams, sizeof(qmParams));
321     qmParams.Standard = CODECHAL_JPEG;
322     qmParams.pJpegQuantMatrix = m_jpegQMatrix;
323 
324     // Swapping QM(x,y) to QM(y,x) for 90/270 degree rotation
325     if ((m_jpegPicParams->m_rotation == jpegRotation90) ||
326         (m_jpegPicParams->m_rotation == jpegRotation270))
327     {
328         qmParams.bJpegQMRotation = true;
329     }
330     else
331     {
332         qmParams.bJpegQMRotation = false;
333     }
334 
335     for (uint16_t scanCount = 0; scanCount < m_jpegPicParams->m_numCompInFrame; scanCount++)
336     {
337         // Using scanCount here because the same command is used for JPEG decode and encode
338         uint32_t quantTableSelector                                      = m_jpegPicParams->m_quantTableSelector[scanCount];
339         qmParams.pJpegQuantMatrix->m_jpegQMTableType[quantTableSelector] = scanCount;
340         qmParams.JpegQMTableSelector = quantTableSelector;
341         CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxQmCmd(
342             &cmdBuffer,
343             &qmParams));
344     }
345 
346     uint32_t dcCurHuffTblIndex[2] = { 0xff, 0xff };
347     uint32_t acCurHuffTblIndex[2] = { 0xff, 0xff };
348 
349     for (uint16_t scanCount = 0; scanCount < m_jpegScanParams->NumScans; scanCount++)
350     {
351         // MFX_JPEG_HUFF_TABLE
352         uint16_t numComponents = m_jpegScanParams->ScanHeader[scanCount].NumComponents;
353         for (uint16_t scanComponent = 0; scanComponent < numComponents; scanComponent++)
354         {
355             // Determine which huffman table we will be writing to
356             // For gray image, componentIdentifier[jpegComponentU] and componentIdentifier[jpegComponentV] are initialized to 0,
357             // and when componentSelector[scanComponent] is equal 0, variable huffTableID is set to 1, and wrong Huffman table is used,
358             // so it is more reasonable to use componentIdentifier[jpegComponentY] to determine which huffman table we will be writing to.
359             uint8_t componentSelector =
360                 m_jpegScanParams->ScanHeader[scanCount].ComponentSelector[scanComponent];
361             uint16_t huffTableID = 0;
362             if (componentSelector == m_jpegPicParams->m_componentIdentifier[jpegComponentY])
363             {
364                 huffTableID = 0;
365             }
366             else
367             {
368                 huffTableID = 1;
369             }
370 
371             int32_t acTableSelector =
372                 m_jpegScanParams->ScanHeader[scanCount].AcHuffTblSelector[scanComponent];
373             int32_t dcTableSelector =
374                 m_jpegScanParams->ScanHeader[scanCount].DcHuffTblSelector[scanComponent];
375 
376             // Send the huffman table state command only if the table changed
377             if ((dcTableSelector != dcCurHuffTblIndex[huffTableID]) ||
378                 (acTableSelector != acCurHuffTblIndex[huffTableID]))
379             {
380                 MHW_VDBOX_HUFF_TABLE_PARAMS huffmanTableParams;
381                 MOS_ZeroMemory(&huffmanTableParams, sizeof(huffmanTableParams));
382 
383                 huffmanTableParams.HuffTableID = huffTableID;
384 
385                 huffmanTableParams.pACBits   = &m_jpegHuffmanTable->HuffTable[acTableSelector].AC_BITS[0];
386                 huffmanTableParams.pDCBits   = &m_jpegHuffmanTable->HuffTable[dcTableSelector].DC_BITS[0];
387                 huffmanTableParams.pACValues = &m_jpegHuffmanTable->HuffTable[acTableSelector].AC_HUFFVAL[0];
388                 huffmanTableParams.pDCValues = &m_jpegHuffmanTable->HuffTable[dcTableSelector].DC_HUFFVAL[0];
389 
390                 CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxJpegHuffTableCmd(
391                     &cmdBuffer,
392                     &huffmanTableParams));
393 
394                 // Set the current huffman table indices for the next scan
395                 dcCurHuffTblIndex[huffTableID] = dcTableSelector;
396                 acCurHuffTblIndex[huffTableID] = acTableSelector;
397             }
398         }
399 
400         MHW_VDBOX_JPEG_BSD_PARAMS jpegBsdObject;
401         MOS_ZeroMemory(&jpegBsdObject, sizeof(jpegBsdObject));
402 
403         // MFX_JPEG_BSD_OBJECT
404         jpegBsdObject.dwIndirectDataLength     = m_jpegScanParams->ScanHeader[scanCount].DataLength;
405         jpegBsdObject.dwDataStartAddress       = m_jpegScanParams->ScanHeader[scanCount].DataOffset;
406         jpegBsdObject.dwScanHorizontalPosition = m_jpegScanParams->ScanHeader[scanCount].ScanHoriPosition;
407         jpegBsdObject.dwScanVerticalPosition   = m_jpegScanParams->ScanHeader[scanCount].ScanVertPosition;
408         jpegBsdObject.bInterleaved = (numComponents > 1) ? 1 : 0;
409         jpegBsdObject.dwMCUCount               = m_jpegScanParams->ScanHeader[scanCount].MCUCount;
410         jpegBsdObject.dwRestartInterval        = m_jpegScanParams->ScanHeader[scanCount].RestartInterval;
411 
412         uint16_t scanComponentIndex = 0;
413 
414         for (uint16_t scanComponent = 0; scanComponent < numComponents; scanComponent++)
415         {
416             uint8_t componentSelector =
417                 m_jpegScanParams->ScanHeader[scanCount].ComponentSelector[scanComponent];
418 
419             if (componentSelector == m_jpegPicParams->m_componentIdentifier[jpegComponentY])
420             {
421                 scanComponentIndex = 0;
422             }
423             else if (componentSelector == m_jpegPicParams->m_componentIdentifier[jpegComponentU])
424             {
425                 scanComponentIndex = 1;
426             }
427             else if (componentSelector == m_jpegPicParams->m_componentIdentifier[jpegComponentV])
428             {
429                 scanComponentIndex = 2;
430             }
431             // Add logic for component identifier JPEG_A
432 
433             jpegBsdObject.sScanComponent |= (1 << scanComponentIndex);
434         }
435 
436         CODECHAL_DECODE_CHK_STATUS_RETURN(m_mfxInterface->AddMfxJpegBsdObjCmd(
437             &cmdBuffer,
438             &jpegBsdObject));
439     }
440 
441     // Check if destination surface needs to be synchronized
442     MOS_SYNC_PARAMS syncParams = g_cInitSyncParams;
443     syncParams.GpuContext = m_videoContext;
444     syncParams.presSyncResource         = &m_destSurface.OsResource;
445     syncParams.bReadOnly = false;
446     syncParams.bDisableDecodeSyncLock = m_disableDecodeSyncLock;
447     syncParams.bDisableLockForTranscode = m_disableLockForTranscode;
448 
449     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnPerformOverlaySync(
450         m_osInterface,
451         &syncParams));
452     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceWait(
453         m_osInterface,
454         &syncParams));
455 
456     // Update the resource tag (s/w tag) for On-Demand Sync
457     m_osInterface->pfnSetResourceSyncTag(m_osInterface, &syncParams);
458 
459     MHW_MI_FLUSH_DW_PARAMS flushDwParams;
460     MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
461     CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(
462         &cmdBuffer,
463         &flushDwParams));
464 
465     // Update the tag in GPU Sync eStatus buffer (H/W Tag) to match the current S/W tag
466     if (m_osInterface->bTagResourceSync)
467     {
468         CODECHAL_DECODE_CHK_STATUS_RETURN(m_hwInterface->WriteSyncTagToResource(
469             &cmdBuffer,
470             &syncParams));
471     }
472 
473     if (m_statusQueryReportingEnabled)
474     {
475         CodechalDecodeStatusReport decodeStatusReport;
476         decodeStatusReport.m_statusReportNumber = m_statusReportFeedbackNumber;
477         decodeStatusReport.m_codecStatus = CODECHAL_STATUS_UNAVAILABLE;
478         decodeStatusReport.m_currDecodedPicRes  = m_destSurface.OsResource;
479 
480         CODECHAL_DECODE_CHK_STATUS_RETURN(EndStatusReport(
481             decodeStatusReport,
482             &cmdBuffer));
483     }
484 
485     CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(
486         &cmdBuffer,
487         nullptr));
488 
489     m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
490 
491     CODECHAL_DEBUG_TOOL(
492         CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
493             &cmdBuffer,
494             CODECHAL_NUM_MEDIA_STATES,
495             "_DEC"));
496     )
497 
498     if (m_copiedDataBufferInUse)
499     {
500         //Sync up complete frame
501         syncParams                  = g_cInitSyncParams;
502         syncParams.GpuContext       = m_videoContextForWa;
503         syncParams.presSyncResource = &m_resSyncObjectWaContextInUse;
504 
505         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(
506             m_osInterface,
507             &syncParams));
508 
509         syncParams                  = g_cInitSyncParams;
510         syncParams.GpuContext       = m_videoContext;
511         syncParams.presSyncResource = &m_resSyncObjectWaContextInUse;
512 
513         CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(
514             m_osInterface,
515             &syncParams));
516         }
517 
518     if ( MOS_VE_SUPPORTED(m_osInterface))
519     {
520         CodecHalDecodeSinglePipeVE_PopulateHintParams(m_veState, &cmdBuffer, true);
521     }
522 
523     HalOcaInterface::On1stLevelBBEnd(cmdBuffer, *m_osInterface);
524 
525     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(
526         m_osInterface,
527         &cmdBuffer,
528         m_videoContextUsesNullHw));
529 
530     CODECHAL_DEBUG_TOOL(
531         m_mmc->UpdateUserFeatureKey(&m_destSurface);)
532 
533     if (m_statusQueryReportingEnabled)
534     {
535         CODECHAL_DECODE_CHK_STATUS_RETURN(ResetStatusReport(
536             m_videoContextUsesNullHw));
537         }
538 
539     // Set output surface layout
540     SetOutputSurfaceLayout(&m_decodeParams.m_outputSurfLayout);
541 
542     // Send the signal to indicate decode completion, in case On-Demand Sync is not present
543     CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceSignal(
544         m_osInterface,
545         &syncParams));
546 
547     CODECHAL_DEBUG_TOOL(
548         CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
549             &m_destSurface,
550             CodechalDbgAttr::attrDecodeOutputSurface,
551             "DstSurf"));)
552     return eStatus;
553 
554 }
555 
AllocateStandard(CodechalSetting * settings)556 MOS_STATUS CodechalDecodeJpegG11::AllocateStandard(
557     CodechalSetting *          settings)
558 {
559     MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
560 
561     CODECHAL_DECODE_FUNCTION_ENTER;
562 
563     CODECHAL_DECODE_CHK_NULL_RETURN(settings);
564 
565     CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeJpeg::AllocateStandard(settings));
566 
567     if ( MOS_VE_SUPPORTED(m_osInterface))
568     {
569         static_cast<MhwVdboxMfxInterfaceG11*>(m_mfxInterface)->DisableScalabilitySupport();
570 
571         //single pipe VE initialize
572         m_veState = (PCODECHAL_DECODE_SINGLEPIPE_VIRTUALENGINE_STATE)MOS_AllocAndZeroMemory(sizeof(CODECHAL_DECODE_SINGLEPIPE_VIRTUALENGINE_STATE));
573         CODECHAL_DECODE_CHK_NULL_RETURN(m_veState);
574         CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_InitInterface(m_osInterface, m_veState));
575     }
576 
577     return eStatus;
578 }
579 
CodechalDecodeJpegG11(CodechalHwInterface * hwInterface,CodechalDebugInterface * debugInterface,PCODECHAL_STANDARD_INFO standardInfo)580 CodechalDecodeJpegG11::CodechalDecodeJpegG11(
581     CodechalHwInterface   *hwInterface,
582     CodechalDebugInterface* debugInterface,
583     PCODECHAL_STANDARD_INFO standardInfo) :
584     CodechalDecodeJpeg(hwInterface, debugInterface, standardInfo)
585 {
586     CODECHAL_DECODE_FUNCTION_ENTER;
587 
588     CODECHAL_DECODE_CHK_NULL_NO_STATUS_RETURN(m_osInterface);
589 
590     m_osInterface->pfnVirtualEngineSupported(m_osInterface, true, true);
591 }
592 
593