xref: /aosp_15_r20/external/intel-media-driver/media_softlet/linux/common/ddi/ddi_media_functions.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2021, 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     ddi_media_functions.cpp
24 //! \brief    ddi media functions implementaion.
25 //!
26 #include "ddi_media_functions.h"
27 #include "media_libva_util_next.h"
28 #include "media_libva_interface_next.h"
29 #include "media_libva_caps_next.h"
30 
31 const VAProcColorStandardType DdiMediaFunctions::m_vpInputColorStd[DDI_VP_NUM_INPUT_COLOR_STD] = {
32     VAProcColorStandardBT601,
33     VAProcColorStandardBT709,
34     VAProcColorStandardSRGB,
35     VAProcColorStandardSTRGB,
36     VAProcColorStandardBT2020,
37     VAProcColorStandardExplicit
38 };
39 
40 const VAProcColorStandardType DdiMediaFunctions::m_vpOutputColorStd[DDI_VP_NUM_OUT_COLOR_STD] = {
41     VAProcColorStandardBT601,
42     VAProcColorStandardBT709,
43     VAProcColorStandardSRGB,
44     VAProcColorStandardSTRGB,
45     VAProcColorStandardBT2020,
46     VAProcColorStandardExplicit
47 };
48 
CreateContext(VADriverContextP ctx,VAConfigID configId,int32_t pictureWidth,int32_t pictureHeight,int32_t flag,VASurfaceID * renderTargets,int32_t renderTargetsNum,VAContextID * context)49 VAStatus DdiMediaFunctions::CreateContext (
50     VADriverContextP  ctx,
51     VAConfigID        configId,
52     int32_t           pictureWidth,
53     int32_t           pictureHeight,
54     int32_t           flag,
55     VASurfaceID       *renderTargets,
56     int32_t           renderTargetsNum,
57     VAContextID       *context)
58 {
59     DDI_ASSERTMESSAGE("Unsupported function call.");
60     return VA_STATUS_ERROR_UNIMPLEMENTED;
61 }
62 
DestroyContext(VADriverContextP ctx,VAContextID context)63 VAStatus DdiMediaFunctions::DestroyContext (
64     VADriverContextP  ctx,
65     VAContextID       context)
66 {
67     DDI_ASSERTMESSAGE("Unsupported function call.");
68     return VA_STATUS_ERROR_UNIMPLEMENTED;
69 }
70 
CreateBuffer(VADriverContextP ctx,VAContextID context,VABufferType type,uint32_t size,uint32_t elementsNum,void * data,VABufferID * bufId)71 VAStatus DdiMediaFunctions::CreateBuffer (
72     VADriverContextP  ctx,
73     VAContextID       context,
74     VABufferType      type,
75     uint32_t          size,
76     uint32_t          elementsNum,
77     void              *data,
78     VABufferID        *bufId)
79 {
80     DDI_ASSERTMESSAGE("Unsupported function call.");
81     return VA_STATUS_ERROR_UNIMPLEMENTED;
82 }
83 
MapBufferInternal(DDI_MEDIA_CONTEXT * mediaCtx,VABufferID bufId,void ** buf,uint32_t flag)84 VAStatus DdiMediaFunctions::MapBufferInternal(
85     DDI_MEDIA_CONTEXT   *mediaCtx,
86     VABufferID          bufId,
87     void                **buf,
88     uint32_t            flag)
89 {
90     VAStatus         vaStatus  = VA_STATUS_SUCCESS;
91     DDI_MEDIA_BUFFER *mediaBuf = nullptr;
92 
93     DDI_FUNC_ENTER;
94 
95     mediaBuf = MediaLibvaCommonNext::GetBufferFromVABufferID(mediaCtx, bufId);
96     DDI_CHK_NULL(mediaBuf, "nullptr mediaBuf", VA_STATUS_ERROR_INVALID_BUFFER);
97 
98     switch((int32_t)mediaBuf->uiType)
99     {
100         case VAImageBufferType:
101         default:
102             if((mediaBuf->format != Media_Format_CPU) && (MediaLibvaInterfaceNext::MediaFormatToOsFormat(mediaBuf->format) != VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT))
103             {
104                 MosUtilities::MosLockMutex(&mediaCtx->BufferMutex);
105                 // A critical section starts.
106                 // Make sure not to bailout with a return until the section ends.
107                 if (nullptr != mediaBuf->pSurface && Media_Format_CPU != mediaBuf->format)
108                 {
109                     vaStatus = MediaLibvaInterfaceNext::MediaMemoryDecompress(mediaCtx, mediaBuf->pSurface);
110                 }
111 
112                 if (VA_STATUS_SUCCESS == vaStatus)
113                 {
114                     *buf = MediaLibvaUtilNext::LockBuffer(mediaBuf, flag);
115                     if (nullptr == *buf)
116                     {
117                         vaStatus = VA_STATUS_ERROR_OPERATION_FAILED;
118                     }
119                 }
120 
121                 // The critical section ends.
122                 MosUtilities::MosUnlockMutex(&mediaCtx->BufferMutex);
123             }
124             else
125             {
126                 *buf = (void *)(mediaBuf->pData + mediaBuf->uiOffset);
127             }
128             break;
129     }
130     return vaStatus;
131 }
132 
UnmapBuffer(DDI_MEDIA_CONTEXT * mediaCtx,VABufferID bufId)133 VAStatus DdiMediaFunctions::UnmapBuffer (
134     DDI_MEDIA_CONTEXT  *mediaCtx,
135     VABufferID         bufId)
136 {
137     DDI_MEDIA_BUFFER   *mediaBuf = nullptr;
138     DDI_FUNC_ENTER;
139     DDI_CHK_NULL(mediaCtx, "nullptr mediaCtx", VA_STATUS_ERROR_INVALID_CONTEXT);
140 
141     mediaBuf = MediaLibvaCommonNext::GetBufferFromVABufferID(mediaCtx,  bufId);
142     DDI_CHK_NULL(mediaBuf, "nullptr mediaBuf", VA_STATUS_ERROR_INVALID_BUFFER);
143 
144     switch ((int32_t)mediaBuf->uiType)
145     {
146         case VAImageBufferType:
147         default:
148             if((mediaBuf->format != Media_Format_CPU) && (MediaLibvaInterfaceNext::MediaFormatToOsFormat(mediaBuf->format) != VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT))
149             {
150                 MosUtilities::MosLockMutex(&mediaCtx->BufferMutex);
151                 MediaLibvaUtilNext::UnlockBuffer(mediaBuf);
152                 MosUtilities::MosUnlockMutex(&mediaCtx->BufferMutex);
153             }
154         break;
155     }
156     return VA_STATUS_SUCCESS;
157 }
158 
DestroyBuffer(DDI_MEDIA_CONTEXT * mediaCtx,VABufferID bufId)159 VAStatus DdiMediaFunctions::DestroyBuffer(
160     DDI_MEDIA_CONTEXT  *mediaCtx,
161     VABufferID         bufId)
162 {
163     DDI_MEDIA_BUFFER   *buf = nullptr;
164     DDI_FUNC_ENTER;
165 
166     buf = MediaLibvaCommonNext::GetBufferFromVABufferID(mediaCtx, bufId);
167     DDI_CHK_NULL(buf, "nullptr buf", VA_STATUS_ERROR_INVALID_BUFFER);
168 
169     switch((int32_t)buf->uiType)
170     {
171         case VAImageBufferType:
172             if(buf->format == Media_Format_CPU)
173             {
174                 MOS_DeleteArray(buf->pData);
175             }
176             else
177             {
178                 MediaLibvaUtilNext::UnRefBufObjInMediaBuffer(buf);
179 
180                 if (buf->uiExportcount)
181                 {
182                     buf->bPostponedBufFree = true;
183                     MOS_TraceEventExt(EVENT_VA_FREE_BUFFER, EVENT_TYPE_END, nullptr, 0, nullptr, 0);
184                     return VA_STATUS_SUCCESS;
185                 }
186             }
187             break;
188         case VAStatsStatisticsParameterBufferType:
189         default: // do not handle any un-listed buffer type
190             MOS_DeleteArray(buf->pData);
191             break;
192     }
193     MOS_Delete(buf);
194     MediaLibvaInterfaceNext::DestroyBufFromVABufferID(mediaCtx, bufId);
195 
196     return VA_STATUS_SUCCESS;
197 }
198 
BeginPicture(VADriverContextP ctx,VAContextID context,VASurfaceID renderTarget)199 VAStatus DdiMediaFunctions::BeginPicture (
200     VADriverContextP  ctx,
201     VAContextID       context,
202     VASurfaceID       renderTarget)
203 {
204     DDI_ASSERTMESSAGE("Unsupported function call.");
205     return VA_STATUS_ERROR_UNIMPLEMENTED;
206 }
207 
RenderPicture(VADriverContextP ctx,VAContextID context,VABufferID * buffers,int32_t buffersNum)208 VAStatus DdiMediaFunctions::RenderPicture (
209     VADriverContextP  ctx,
210     VAContextID       context,
211     VABufferID        *buffers,
212     int32_t           buffersNum)
213 {
214     DDI_ASSERTMESSAGE("Unsupported function call.");
215     return VA_STATUS_ERROR_UNIMPLEMENTED;
216 }
217 
EndPicture(VADriverContextP ctx,VAContextID context)218 VAStatus DdiMediaFunctions::EndPicture (
219     VADriverContextP  ctx,
220     VAContextID       context)
221 {
222     DDI_ASSERTMESSAGE("Unsupported function call.");
223     return VA_STATUS_ERROR_UNIMPLEMENTED;
224 }
225 
CreateConfig(VADriverContextP ctx,VAProfile profile,VAEntrypoint entrypoint,VAConfigAttrib * attribList,int32_t attribsNum,VAConfigID * configId)226 VAStatus DdiMediaFunctions::CreateConfig (
227     VADriverContextP  ctx,
228     VAProfile         profile,
229     VAEntrypoint      entrypoint,
230     VAConfigAttrib    *attribList,
231     int32_t           attribsNum,
232     VAConfigID        *configId)
233 {
234     DDI_ASSERTMESSAGE("Unsupported function call.");
235     DDI_CODEC_FUNC_ENTER;
236 
237     VAStatus status = VA_STATUS_SUCCESS;
238     DDI_CODEC_CHK_NULL(configId,   "nullptr configId",   VA_STATUS_ERROR_INVALID_PARAMETER);
239     if(attribsNum)
240     {
241         DDI_CODEC_CHK_NULL(attribList, "nullptr attribList", VA_STATUS_ERROR_INVALID_PARAMETER);
242     }
243 
244     PDDI_MEDIA_CONTEXT mediaCtx = GetMediaContext(ctx);
245     DDI_CODEC_CHK_NULL(mediaCtx, "nullptr mediaCtx", VA_STATUS_ERROR_INVALID_CONTEXT);
246     DDI_CODEC_CHK_NULL(mediaCtx->m_capsNext, "nullptr m_caps", VA_STATUS_ERROR_INVALID_PARAMETER);
247     DDI_CODEC_CHK_NULL(mediaCtx->m_capsNext->m_capsTable, "nullptr m_capsTable", VA_STATUS_ERROR_INVALID_PARAMETER);
248 
249     status = mediaCtx->m_capsNext->CreateConfig(profile, entrypoint, attribList, attribsNum, configId);
250     DDI_CODEC_CHK_RET(status, "Create common config failed");
251 
252     return status;
253 }
254 
QueryVideoProcFilters(VADriverContextP ctx,VAContextID context,VAProcFilterType * filters,uint32_t * filtersNum)255 VAStatus DdiMediaFunctions::QueryVideoProcFilters(
256     VADriverContextP  ctx,
257     VAContextID       context,
258     VAProcFilterType  *filters,
259     uint32_t          *filtersNum)
260 {
261     DDI_ASSERTMESSAGE("Unsupported function call.");
262     return VA_STATUS_ERROR_UNIMPLEMENTED;
263 }
264 
QueryVideoProcFilterCaps(VADriverContextP ctx,VAContextID context,VAProcFilterType type,void * filterCaps,uint32_t * filterCapsNum)265 VAStatus DdiMediaFunctions::QueryVideoProcFilterCaps(
266     VADriverContextP  ctx,
267     VAContextID       context,
268     VAProcFilterType  type,
269     void              *filterCaps,
270     uint32_t          *filterCapsNum)
271 {
272     DDI_ASSERTMESSAGE("Unsupported function call.");
273     return VA_STATUS_ERROR_UNIMPLEMENTED;
274 }
275 
QueryVideoProcPipelineCaps(VADriverContextP ctx,VAContextID context,VABufferID * filters,uint32_t filtersNum,VAProcPipelineCaps * pipelineCaps)276 VAStatus DdiMediaFunctions::QueryVideoProcPipelineCaps(
277     VADriverContextP    ctx,
278     VAContextID         context,
279     VABufferID          *filters,
280     uint32_t            filtersNum,
281     VAProcPipelineCaps  *pipelineCaps)
282 {
283     DDI_ASSERTMESSAGE("Unsupported function call.");
284     return VA_STATUS_ERROR_UNIMPLEMENTED;
285 }
286 
287 #if VA_CHECK_VERSION(1,11,0)
CreateProtectedSession(VADriverContextP ctx,VAConfigID configId,VAProtectedSessionID * protectedSession)288 VAStatus DdiMediaFunctions::CreateProtectedSession(
289     VADriverContextP      ctx,
290     VAConfigID            configId,
291     VAProtectedSessionID  *protectedSession)
292 {
293     DDI_ASSERTMESSAGE("Unsupported function call.");
294     return VA_STATUS_ERROR_UNIMPLEMENTED;
295 }
296 
DestroyProtectedSession(VADriverContextP ctx,VAProtectedSessionID protectedSession)297 VAStatus DdiMediaFunctions::DestroyProtectedSession(
298     VADriverContextP      ctx,
299     VAProtectedSessionID  protectedSession)
300 {
301     DDI_ASSERTMESSAGE("Unsupported function call.");
302     return VA_STATUS_ERROR_UNIMPLEMENTED;
303 }
304 
AttachProtectedSession(VADriverContextP ctx,VAContextID context,VAProtectedSessionID protectedSession)305 VAStatus DdiMediaFunctions::AttachProtectedSession(
306     VADriverContextP      ctx,
307     VAContextID           context,
308     VAProtectedSessionID  protectedSession)
309 {
310     DDI_ASSERTMESSAGE("Unsupported function call.");
311     return VA_STATUS_ERROR_UNIMPLEMENTED;
312 }
313 
DetachProtectedSession(VADriverContextP ctx,VAContextID context)314 VAStatus DdiMediaFunctions::DetachProtectedSession(
315     VADriverContextP  ctx,
316     VAContextID       context)
317 {
318     DDI_ASSERTMESSAGE("Unsupported function call.");
319     return VA_STATUS_ERROR_UNIMPLEMENTED;
320 }
321 
ProtectedSessionExecute(VADriverContextP ctx,VAProtectedSessionID protectedSession,VABufferID data)322 VAStatus DdiMediaFunctions::ProtectedSessionExecute(
323     VADriverContextP      ctx,
324     VAProtectedSessionID  protectedSession,
325     VABufferID            data)
326 {
327     DDI_ASSERTMESSAGE("Unsupported function call.");
328     return VA_STATUS_ERROR_UNIMPLEMENTED;
329 }
330 #endif
331 
StatusCheck(PDDI_MEDIA_CONTEXT mediaCtx,DDI_MEDIA_SURFACE * surface,VASurfaceID surfaceId)332 VAStatus DdiMediaFunctions::StatusCheck(
333     PDDI_MEDIA_CONTEXT mediaCtx,
334     DDI_MEDIA_SURFACE  *surface,
335     VASurfaceID        surfaceId)
336 {
337     return VA_STATUS_SUCCESS;
338 }
339 
QuerySurfaceError(VADriverContextP ctx,VASurfaceID renderTarget,VAStatus errorStatus,void ** errorInfo)340 VAStatus DdiMediaFunctions::QuerySurfaceError(
341     VADriverContextP ctx,
342     VASurfaceID      renderTarget,
343     VAStatus         errorStatus,
344     void             **errorInfo)
345 {
346     DDI_ASSERTMESSAGE("Unsupported function call.");
347     return VA_STATUS_ERROR_UNIMPLEMENTED;
348 }
349 
PutSurface(VADriverContextP ctx,VASurfaceID surface,void * draw,int16_t srcx,int16_t srcy,uint16_t srcw,uint16_t srch,int16_t destx,int16_t desty,uint16_t destw,uint16_t desth,VARectangle * cliprects,uint32_t numberCliprects,uint32_t flags)350 VAStatus DdiMediaFunctions::PutSurface(
351     VADriverContextP ctx,
352     VASurfaceID      surface,
353     void             *draw,
354     int16_t          srcx,
355     int16_t          srcy,
356     uint16_t         srcw,
357     uint16_t         srch,
358     int16_t          destx,
359     int16_t          desty,
360     uint16_t         destw,
361     uint16_t         desth,
362     VARectangle      *cliprects,
363     uint32_t         numberCliprects,
364     uint32_t         flags)
365 {
366     DDI_ASSERTMESSAGE("Unsupported function call.");
367     return VA_STATUS_ERROR_UNIMPLEMENTED;
368 }
369 
ProcessPipeline(VADriverContextP vaDrvCtx,VAContextID ctxID,VASurfaceID srcSurface,VARectangle * srcRect,VASurfaceID dstSurface,VARectangle * dstRect)370 VAStatus DdiMediaFunctions::ProcessPipeline(
371     VADriverContextP    vaDrvCtx,
372     VAContextID         ctxID,
373     VASurfaceID         srcSurface,
374     VARectangle         *srcRect,
375     VASurfaceID         dstSurface,
376     VARectangle         *dstRect
377 )
378 {
379     DDI_ASSERTMESSAGE("Unsupported function call.");
380     return VA_STATUS_ERROR_UNIMPLEMENTED;
381 }