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