blob: 1b2ba6635cbad8dfbe150b2c43509b44b10c62ad [file] [log] [blame]
/*
* Copyright (c) 2009-2020, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file mos_utilities.h
//! \brief Common OS service across different platform
//! \details Common OS service across different platform
//!
#ifndef __MOS_UTILITIES_H__
#define __MOS_UTILITIES_H__
#include "mos_utilities_common.h"
#include "mos_util_user_feature_keys.h"
#include "mos_resource_defs.h"
#include "mos_util_debug.h"
#include "mos_os_trace_event.h"
#ifdef __cplusplus
#include <fstream>
#include <memory>
#include <string>
#include <vector>
#include <stdint.h>
#include <fstream>
#include <string>
#include <vector>
#include <map>
#include <mutex>
#define MOS_MAX_PERF_FILENAME_LEN 260
class PerfUtility
{
public:
struct Tick
{
double freq;
int64_t start;
int64_t stop;
double time;
};
struct PerfInfo
{
uint32_t count;
double avg;
double max;
double min;
};
public:
static PerfUtility *getInstance();
~PerfUtility();
PerfUtility();
void startTick(std::string tag);
void stopTick(std::string tag);
void savePerfData();
void setupFilePath(char *perfFilePath);
void setupFilePath();
bool bPerfUtilityKey;
char sSummaryFileName[MOS_MAX_PERF_FILENAME_LEN + 1] = {'\0'};
char sDetailsFileName[MOS_MAX_PERF_FILENAME_LEN + 1] = {'\0'};
int32_t dwPerfUtilityIsEnabled;
private:
void printPerfSummary();
void printPerfDetails();
void printHeader(std::ofstream& fout);
void printBody(std::ofstream& fout);
void printFooter(std::ofstream& fout);
std::string formatPerfData(std::string tag, std::vector<Tick>& record);
void getPerfInfo(std::vector<Tick>& record, PerfInfo* info);
std::string getDashString(uint32_t num);
private:
static std::shared_ptr<PerfUtility> instance;
static std::mutex perfMutex;
std::map<std::string, std::vector<Tick>*> records;
};
//!
//! \brief Get Current time
//! \details Get Current time in us
//! \return uint64_t
//! Returns time in us
//!
uint64_t MOS_GetCurTime();
#endif // __cplusplus
class MosUtilities;
//! Helper Macros for MEMNINJA debug messages
#define MOS_MEMNINJA_ALLOC_MESSAGE(ptr, size, functionName, filename, line) \
MOS_OS_MEMNINJAMESSAGE( \
"MemNinjaSysAlloc: Time = %f, MemNinjaCounter = %d, memPtr = %p, size = %d, functionName = \"%s\", " \
"filename = \"%s\", line = %d/", MosUtilities::MosGetTime(), MosUtilities::m_mosMemAllocCounter, ptr, size, functionName, filename, line); \
#define MOS_MEMNINJA_FREE_MESSAGE(ptr, functionName, filename, line) \
MOS_OS_MEMNINJAMESSAGE( \
"MemNinjaSysFree: Time = %f, MemNinjaCounter = %d, memPtr = %p, functionName = \"%s\", " \
"filename = \"%s\", line = %d/", MosUtilities::MosGetTime(), MosUtilities::m_mosMemAllocCounter, ptr, functionName, filename, line); \
#define MOS_MEMNINJA_GFX_ALLOC_MESSAGE(ptr, bufName, component, size, arraySize, functionName, filename, line) \
MOS_OS_MEMNINJAMESSAGE( \
"MemNinjaGfxAlloc: Time = %f, MemNinjaCounterGfx = %d, memPtr = %p, bufName = %s, component = %d, size = %d, " \
"arraySize = %d, functionName = \"%s\", filename = \"%s\", line = %d/", MosUtilities::MosGetTime(), MosUtilities::m_mosMemAllocCounterGfx, ptr, \
bufName, component, size, arraySize, functionName, filename, line); \
#define MOS_MEMNINJA_GFX_FREE_MESSAGE(ptr, functionName, filename, line) \
MOS_OS_MEMNINJAMESSAGE( \
"MemNinjaGfxFree: Time = %f, MemNinjaCounterGfx = %d, memPtr = %p, functionName = \"%s\", " \
"filename = \"%s\", line = %d/", MosUtilities::MosGetTime(), MosUtilities::m_mosMemAllocCounterGfx, ptr, functionName, filename, line); \
#include "mos_utilities_next.h"
#ifdef __cplusplus
extern "C" int32_t MOS_AtomicIncrement(int32_t *pValue); // forward declaration
extern "C" int32_t MOS_AtomicDecrement(int32_t *pValue); // forward declaration
//template<class _Ty, class... _Types> inline
//std::shared_ptr<_Ty> MOS_MakeShared(_Types&&... _Args)
//{
// try
// {
// return std::make_shared<_Ty>(std::forward<_Types>(_Args)...);
// }
// catch (const std::bad_alloc&)
// {
// return nullptr;
// }
//}
//Memory alloc fail simulatiion related defination
#if (_DEBUG || _RELEASE_INTERNAL)
bool MOS_SimulateAllocMemoryFail(
size_t size,
size_t alignment,
const char *functionName,
const char *filename,
int32_t line);
#endif //(_DEBUG || _RELEASE_INTERNAL)
#if MOS_MESSAGES_ENABLED
template<class _Ty, class... _Types>
_Ty* MOS_NewUtil(const char *functionName,
const char *filename,
int32_t line, _Types&&... _Args)
#else
template<class _Ty, class... _Types>
_Ty* MOS_NewUtil(_Types&&... _Args)
#endif
{
#if MOS_MESSAGES_ENABLED
return MosUtilities::MosNewUtil<_Ty, _Types...>(functionName, filename, line, std::forward<_Types>(_Args)...);
#else
return MosUtilities::MosNewUtil<_Ty, _Types...>(std::forward<_Types>(_Args)...);
#endif
}
#if MOS_MESSAGES_ENABLED
template<class _Ty, class... _Types>
_Ty *MOS_NewArrayUtil(const char *functionName,
const char *filename,
int32_t line, int32_t numElements)
#else
template<class _Ty, class... _Types>
_Ty* MOS_NewArrayUtil(int32_t numElements)
#endif
{
#if MOS_MESSAGES_ENABLED
return MosUtilities::MosNewArrayUtil<_Ty>(functionName, filename, line, numElements);
#else
return MosUtilities::MosNewArrayUtil<_Ty>(numElements);
#endif
}
#if MOS_MESSAGES_ENABLED
#define MOS_NewArray(classType, numElements) MOS_NewArrayUtil<classType>(__FUNCTION__, __FILE__, __LINE__, numElements)
#define MOS_New(classType, ...) MOS_NewUtil<classType>(__FUNCTION__, __FILE__, __LINE__, ##__VA_ARGS__)
#else
#define MOS_NewArray(classType, numElements) MOS_NewArrayUtil<classType>(numElements)
#define MOS_New(classType, ...) MOS_NewUtil<classType>(__VA_ARGS__)
#endif
#if MOS_MESSAGES_ENABLED
template<class _Ty> inline
void MOS_DeleteUtil(
const char *functionName,
const char *filename,
int32_t line,
_Ty& ptr)
#else
template<class _Ty> inline
void MOS_DeleteUtil(_Ty& ptr)
#endif
{
#if MOS_MESSAGES_ENABLED
MosUtilities::MosDeleteUtil<_Ty>(functionName, filename, line, ptr);
#else
MosUtilities::MosDeleteUtil<_Ty>(ptr);
#endif
return;
}
#if MOS_MESSAGES_ENABLED
template<class _Ty> inline
void MOS_DeleteArrayUtil(
const char *functionName,
const char *filename,
int32_t line,
_Ty& ptr)
#else
template <class _Ty> inline
void MOS_DeleteArrayUtil(_Ty& ptr)
#endif
{
#if MOS_MESSAGES_ENABLED
MosUtilities::MosDeleteArrayUtil<_Ty>(functionName, filename, line, ptr);
#else
MosUtilities::MosDeleteArrayUtil<_Ty>(ptr);
#endif
return;
}
#if MOS_MESSAGES_ENABLED
#define MOS_DeleteArray(ptr) MOS_DeleteArrayUtil(__FUNCTION__, __FILE__, __LINE__, ptr)
#define MOS_Delete(ptr) MOS_DeleteUtil(__FUNCTION__, __FILE__, __LINE__, ptr)
#else
#define MOS_DeleteArray(ptr) MOS_DeleteArrayUtil(ptr)
#define MOS_Delete(ptr) MOS_DeleteUtil(ptr)
#endif
#endif
#ifdef __cplusplus
extern "C" {
#endif
//!
//! \brief Init Function for MOS OS specific utilities
//! \details Initial MOS OS specific utilities related structures, and only execute once for multiple entries
//! \param [in] mosCtx
//! os device ctx handle
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_OS_Utilities_Init(MOS_CONTEXT_HANDLE mosCtx);
//!
//! \brief Close Function for MOS OS utilities
//! \details close/remove MOS OS utilities related structures, and only execute once for multiple entries
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_OS_Utilities_Close(MOS_CONTEXT_HANDLE mosCtx);
//------------------------------------------------------------------------------
// Allocate, free and set a memory region
//------------------------------------------------------------------------------
//!
//! \brief Allocates aligned memory and performs error checking
//! \details Wrapper for aligned_malloc(). Performs error checking.
//! It increases memory allocation counter variable
//! MosMemAllocCounter for checking memory leaks.
//! \param [in] size
//! Size of memorry to be allocated
//! \param [in] alignment
//! alignment
//! \return void *
//! Pointer to allocated memory
//!
#if MOS_MESSAGES_ENABLED
void *MOS_AlignedAllocMemoryUtils(
size_t size,
size_t alignment,
const char *functionName,
const char *filename,
int32_t line);
#define MOS_AlignedAllocMemory(size, alignment) \
MOS_AlignedAllocMemoryUtils(size, alignment, __FUNCTION__, __FILE__, __LINE__)
#else // !MOS_MESSAGES_ENABLED
void *MOS_AlignedAllocMemory(
size_t size,
size_t alignment);
#endif // MOS_MESSAGES_ENABLED
//!
//! \brief Wrapper for aligned_free(). Performs error checking.
//! \details Wrapper for aligned_free() - Free a block of memory that was allocated by MOS_AlignedAllocMemory.
//! Performs error checking.
//! It decreases memory allocation counter variable
//! MosMemAllocCounter for checking memory leaks.
//! \param [in] ptr
//! Pointer to the memory to be freed
//! \return void
//!
#if MOS_MESSAGES_ENABLED
void MOS_AlignedFreeMemoryUtils(
void *ptr,
const char *functionName,
const char *filename,
int32_t line);
#define MOS_AlignedFreeMemory(ptr) \
MOS_AlignedFreeMemoryUtils(ptr, __FUNCTION__, __FILE__, __LINE__)
#else // !MOS_MESSAGES_ENABLED
void MOS_AlignedFreeMemory(void *ptr);
#endif // MOS_MESSAGES_ENABLED
//!
//! \brief Allocates memory and performs error checking
//! \details Wrapper for malloc(). Performs error checking.
//! It increases memory allocation counter variable
//! MosMemAllocCounter for checking memory leaks.
//! \param [in] size
//! Size of memorry to be allocated
//! \return void *
//! Pointer to allocated memory
//!
#if MOS_MESSAGES_ENABLED
void *MOS_AllocMemoryUtils(
size_t size,
const char *functionName,
const char *filename,
int32_t line);
#define MOS_AllocMemory(size) \
MOS_AllocMemoryUtils(size, __FUNCTION__, __FILE__, __LINE__)
#else // !MOS_MESSAGES_ENABLED
void *MOS_AllocMemory(
size_t size);
#endif // MOS_MESSAGES_ENABLED
//!
//! \brief Allocates and fills memory with 0
//! \details Wrapper for malloc(). Performs error checking,
//! and fills the allocated memory with 0.
//! It increases memory allocation counter variable
//! MosMemAllocCounter for checking memory leaks.
//! \param [in] size
//! Size of memorry to be allocated
//! \return void *
//! Pointer to allocated memory
//!
#if MOS_MESSAGES_ENABLED
void *MOS_AllocAndZeroMemoryUtils(
size_t size,
const char *functionName,
const char *filename,
int32_t line);
#define MOS_AllocAndZeroMemory(size) \
MOS_AllocAndZeroMemoryUtils(size, __FUNCTION__, __FILE__, __LINE__)
#else // !MOS_MESSAGES_ENABLED
void *MOS_AllocAndZeroMemory(
size_t size);
#endif // MOS_MESSAGES_ENABLED
//!
//! \brief Reallocate memory
//! \details Wrapper for realloc(). Performs error checking.
//! It modifies memory allocation counter variable
//! MosMemAllocCounter for checking memory leaks.
//! \param [in] ptr
//! Pointer to be reallocated
//! \param [in] new_size
//! Size of memory to be allocated
//! \return void *
//! Pointer to allocated memory
//!
#if MOS_MESSAGES_ENABLED
void *MOS_ReallocMemoryUtils(
void *ptr,
size_t newSize,
const char *functionName,
const char *filename,
int32_t line);
#define MOS_ReallocMemory(ptr, newSize) \
MOS_ReallocMemoryUtils(ptr, newSize, __FUNCTION__, __FILE__, __LINE__)
#else // !MOS_MESSAGES_ENABLED
void *MOS_ReallocMemory(
void *ptr,
size_t newSize);
#endif // MOS_MESSAGES_ENABLED
//!
//! \brief Wrapper for free(). Performs error checking.
//! \details Wrapper for free(). Performs error checking.
//! It decreases memory allocation counter variable
//! MosMemAllocCounter for checking memory leaks.
//! \param [in] ptr
//! Pointer to the memory to be freed
//! \return void
//!
#if MOS_MESSAGES_ENABLED
void MOS_FreeMemoryUtils(
void *ptr,
const char *functionName,
const char *filename,
int32_t line);
#define MOS_FreeMemory(ptr) \
MOS_FreeMemoryUtils(ptr, __FUNCTION__, __FILE__, __LINE__)
#else // !MOS_MESSAGES_ENABLED
void MOS_FreeMemory(
void *ptr);
#endif // MOS_MESSAGES_ENABLED
//!
//! \brief Wrapper for MOS_FreeMemory().
//! \details Wrapper for MOS_FreeMemory(). Calls MOS_FreeMemory() and then sets ptr to NULL.
//! \param [in] ptr
//! Pointer to the memory to be freed
//! \return void
//!
#define MOS_FreeMemAndSetNull(ptr) \
do{ \
MOS_FreeMemory(ptr); \
ptr = nullptr; \
} while (0)
//!
//! \brief Wrapper for MOS_FreeMemory().
//! \details Wrapper for MOS_FreeMemory(). Calls MOS_FreeMemory() if ptr is not NULL.
//! This wrapper can be called when ptr can be nullptr and therefore we don't want to hit the assert inside MOS_FreeMemory().
//! It should not be used if ptr is expected to be non-NULL. In that case, we want to hit the assert.
//! \param [in] ptr
//! Pointer to the memory to be freed
//! \return void
//!
#define MOS_SafeFreeMemory(ptr) \
if (ptr) MOS_FreeMemory(ptr); \
//!
//! \brief Wrapper to set a block of memory with zeros.
//! \details Wrapper to set a block of memory with zeros.
//! \param [in] pDestination
//! A pointer to the starting address of the memory
//! block to fill with zeros.
//! \param [in] stLength
//! Size of the memory block in bytes to be filled
//! \return void
//!
void MOS_ZeroMemory(
void *pDestination,
size_t stLength);
//!
//! \brief Wrapper to set a block of memory with a specified value.
//! \details Wrapper to set a block of memory with a specified value.
//! \param [in] pDestination
//! A pointer to the starting address of the memory
//! block to fill with specified value bFill
//! \param [in] stLength
//! Size of the memory block in bytes to be filled
//! \param [in] bFill
//! The byte value with which to fill the memory block
//! \return void
//!
void MOS_FillMemory(
void *pDestination,
size_t stLength,
uint8_t bFill);
//------------------------------------------------------------------------------
// File I/O Functions
//------------------------------------------------------------------------------
//!
//! \brief Allocate a buffer and read contents from a file into this buffer
//! \details Allocate a buffer and read contents from a file into this buffer
//! \param [in] PpFilename
//! ointer to the filename from which to read
//! \param [out] lpNumberOfBytesRead,
//! pointer to return the number of bytes read
//! \param [out] ppReadBuffer
//! Pointer to return the buffer pointer where
//! the contents from the file are read to
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_ReadFileToPtr(
const char *pFilename,
uint32_t *lpNumberOfBytesRead,
void **ppReadBuffer);
//!
//! \brief Writes contents of buffer into a file
//! \details Writes contents of buffer into a file
//! \param [in] pFilename
//! Pointer to the filename to write the contents to
//! \param [in] lpBuffer
//! Pointer to the buffer whose contents will be written to the file
//! \param [in] writeSize
//! Number of bytes to write to the file
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_WriteFileFromPtr(
const char *pFilename,
void *lpBuffer,
uint32_t writeSize);
//!
//! \brief Retrieves the size of the specified File.
//! \details Retrieves the size of the specified File.
//! \param [in] hFile
//! Handle to the File.
//! \param [out] lpFileSizeLow
//! Pointer to a variable where filesize is returned
//! \param lpFileSizeHigh
//! Reserved for now. Used to return higher uint32_t for
//! filesizes more than 32 bit
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_GetFileSize(
HANDLE hFile,
uint32_t *lpFileSizeLow,
uint32_t *lpFileSizeHigh);
//!
//! \brief Creates a directory
//! \details Creates a directory
//! \param [in] lpPathName
//! Pointer to the path name
//! \return MOS_STATUS
//! Returns MOS_STATUS_SUCCESS if directory was created or was already exists,
//! else MOS_STATUS_DIR_CREATE_FAILED
//!
MOS_STATUS MOS_CreateDirectory(
char * const lpPathName);
//!
//! \brief Creates or opens a file/object
//! \details Creates or opens a file/object
//! The definitions of the mode flags for iOpenFlag are in OS's fcntl.h
//! \param [out] pHandle
//! Pointer to a variable that recieves the handle
//! of the file or object oepned
//! \param [in] lpFileName
//! Pointer to the file name
//! \param [in] iOpenFlag
//! Flag specifying mode and other options for Creating
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_CreateFile(
PHANDLE pHandle,
char * const lpFileName,
uint32_t iOpenFlag);
//!
//! \brief Read data from a file
//! \details Read data from a file
//! \param [in] hFile
//! Handle to the file to be read
//! \param [out] lpBuffer
//! Pointer to the buffer where the data read is placed
//! \param [in] bytesToRead
//! The maximum number of bytes to be read
//! \param [out] pbytesRead
//! Pointer to a variable that receives the number of bytes read
//! \param [in/out] lpOverlapped
//! Not used currently, can be nullptr
//! When the hFile parameter was opened with FILE_FLAG_OVERLAPPED
//! It should point to a valid OVERLAPPED structure
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_ReadFile(
HANDLE hFile,
void *lpBuffer,
uint32_t bytesToRead,
uint32_t *pbytesRead,
void *lpOverlapped);
//!
//! \brief Write data to a file
//! \details Write data to a file
//! \param [in] hFile
//! Handle to the file to which data will be written
//! \param [in] lpBuffer
//! Pointer to the buffer from where the data is read
//! \param [in] bytesToWrite
//! The maximum number of bytes to be written
//! \param [out] pbytesWritten
//! Pointer to a variable that receives the number of bytes written
//! \param [in/out] lpOverlapped
//! Not used currently, can be nullptr
//! When the hFile parameter was opened with FILE_FLAG_OVERLAPPED
//! It should point to a valid OVERLAPPED structure
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_WriteFile(
HANDLE hFile,
void *lpBuffer,
uint32_t bytesToWrite,
uint32_t *pbytesWritten,
void *lpOverlapped);
//!
//! \brief Moves the File pointer to the specified position
//! \details Moves the File pointer to the specified position
//! Specify dwMoveMethod as the same as fseek()
//! \param [in] hFile
//! Handle to the file
//! \param [in] lDistanceToMove
//! Specifies no. of bytes to move the pointer
//! \param [in] lpDistanceToMoveHigh
//! Pointer to the high order 32-bits of
//! the signed 64-bit distance to move.
//! \param [in] dwMoveMethod
//! Starting point for the file pointer move
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_SetFilePointer(
HANDLE hFile,
int32_t lDistanceToMove,
int32_t *lpDistanceToMoveHigh,
int32_t dwMoveMethod);
//!
//! \brief Closes an open object handle
//! \details Closes an open object handle.
//! \param [in] hObject
//! A valid handle to an open object.
//! \return int32_t
//! true if success else false
//!
int32_t MOS_CloseHandle(
HANDLE hObject);
//!
//! \brief Appends at the end of File
//! \details Appends at the end of File
//! \param [in] pFilename
//! Pointer to the filename to append the contents to
//! \param [in] pData
//! Pointer to the buffer whose contents will be appeneded to the file
//! \param [in] dwSize
//! Number of bytes to append to the file
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_AppendFileFromPtr(
const char *pFilename,
void *pData,
uint32_t dwSize);
//------------------------------------------------------------------------------
// User Feature Functions
//------------------------------------------------------------------------------
//!
//! \brief Read Single Value from User Feature
//! \details This is a unified funtion to read user feature key for all components.
//! (Codec/VP/CP/CM)
//! It is required to prepare all memories for buffers before calling this function.
//! User can choose to use array variable or allocated memory for the buffer.
//! If the buffer is allocated dynamically, it must be freed by user to avoid memory leak.
//! ------------------------------------------------------------------------------------
//! Usage example:
//! a) Initiation:
//! MOS_ZeroMemory(&UserFeatureValue, sizeof(UserFeatureValue));
//! UserFeature.Type = MOS_USER_FEATURE_TYPE_USER;
//! UserFeature.pPath = __MEDIA_USER_FEATURE_SUBKEY_INTERNAL;
//! UserFeature.pValues = &UserFeatureValue;
//! UserFeature.uiNumValues = 1;
//! b.1) For uint32_t type:
//! UserFeatureValue.u32Data = 1; //set the default value, must be initiated with one valid value.
//! b.2) For String/Binary type:
//! char cStringData[MOS_USER_CONTROL_MAX_DATA_SIZE];
//! UserFeatureValue.StringData.pStringData = cStringData; // make sure the pointer is valid
//! UserFeatureValue.StringData.uMaxSize = MOS_USER_CONTROL_MAX_DATA_SIZE;
//! UserFeatureValue.StringData.uSize = 0; //set the default value. 0 is empty buffer.
//! b.3) For MultiString type:
//! char cStringData[MOS_USER_CONTROL_MAX_DATA_SIZE];
//! MOS_USER_FEATURE_VALUE_STRING strings[MAX_STRING_COUNT];
//! UserFeatureValue.MultiStringData.pMultStringData = cStringData; // make sure the pointer is valid
//! UserFeatureValue.MultiStringData.uMaxSize = MOS_USER_CONTROL_MAX_DATA_SIZE;
//! UserFeatureValue.MultiStringData.uSize = 0; //set the default value. 0 is empty buffer.
//! UserFeatureValue.MultiStringData.pStrings = strings; // make sure the pointer is valid
//! UserFeatureValue.MultiStringData.uCount = MAX_STRING_COUNT;
//! c) Read user feature key:
//! MOS_UserFeature_ReadValue();
//! -------------------------------------------------------------------------------------
//! Important note: The pointer pStringData/pMultStringData may be modified if the
//! previous MOS_UserFeature_ReadValue() doesn't read a same user feature key type. So it's
//! suggested to set the union members in UserFeatureValue every time before
//! MOS_UserFeature_ReadValue() if you are not familiar with the details of this function.
//! \param PMOS_USER_FEATURE_INTERFACE pOsUserFeatureInterface
//! [in] Pointer to OS User Interface structure
//! \param PMOS_USER_FEATURE pUserFeature
//! [in/out] Pointer to User Feature Interface
//! \param char *pValueName
//! [in] Pointer to the name of the user feature key value
//! \param MOS_USER_FEATURE_VALUE_TYPE ValueType
//! [in] User Feature Value type
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
#if (_DEBUG || _RELEASE_INTERNAL)
//!
//! \brief Generate a User Feature Keys XML file according to user feature keys table in MOS
//! \details Generate a User Feature Keys XML files according to MOSUserFeatureDescFields
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_FUNC_EXPORT MOS_STATUS MOS_EXPORT_DECL DumpUserFeatureKeyDefinitionsMedia();
#endif
//!
//! \brief Generate a User Feature Keys XML file according to user feature keys table in MOS
//! \details Generate a User Feature Keys XML files according to MOSUserFeatureDescFields
//! \param [in] mosCtx
//! os device ctx handle
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_GenerateUserFeatureKeyXML(MOS_CONTEXT_HANDLE mosCtx);
//!
//! \brief Get the User Feature Value from Table
//! \details Get the related User Feature Value item according to Filter rules , and pass the item
//! into return callback function
//! \param [in] descTable
//! The user feature key description table
//! \param [in] numOfItems
//! Number of user feature keys described in the table
//! \param [in] maxId
//! Max value ID in the table
//! \param [out] keyValueMap
//! Optional pointer to the value map where the table items will be linked to, could be nullptr
//! \param [in] CallbackFunc
//! Pointer to the Callback function, and pass the User Feature Value item as its parameter
//! \param [in] pUserFeatureKeyFilter
//! use the filter rule to select some User Feature Value item
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_GetItemFromMOSUserFeatureDescField(
MOS_USER_FEATURE_VALUE *descTable,
uint32_t numOfItems,
uint32_t maxId,
MOS_USER_FEATURE_VALUE_MAP *keyValueMap,
MOS_STATUS (*CallbackFunc)(MOS_USER_FEATURE_VALUE_MAP *, PMOS_USER_FEATURE_VALUE),
PMOS_USER_FEATURE_VALUE pUserFeatureKeyFilter);
//!
//! \brief Set the User Feature Default Value
//! \details Set the User Feature Default Value in the user feature key map
//! \param [in] pOsUserFeatureInterface
//! Pointer to OS User Interface structure
//! \param [in] pWriteValues
//! Pointer to User Feature Write Data
//! \param [in] uiNumOfValues
//! Number of User Feature Write Data
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_UserFeature_SetDefaultValues(
PMOS_USER_FEATURE_INTERFACE pOsUserFeatureInterface,
PMOS_USER_FEATURE_VALUE_WRITE_DATA pWriteValues,
uint32_t uiNumOfValues);
//!
//! \brief Link user feature key description table items to specified UserFeatureKeyTable
//! \details Link user feature key description table items to specified UserFeatureKeyTable
//! according to ID sequence and do some post processing such as malloc related memory
//! \param [in] userValueDescTable
//! The user feature key description table
//! \param [in] numOfValues
//! Number of user feature keys described in the table
//! \param [in] maxId
//! Max value ID in the table
//! \param [out] keyValueMap
//! optional pointer to the value map where the table items will be linked to, could be nullptr
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_DeclareUserFeatureKeysFromDescFields(
MOS_USER_FEATURE_VALUE *userValueDescTable,
uint32_t numOfValues,
uint32_t maxId,
MOS_USER_FEATURE_VALUE_MAP *keyValueMap);
//!
//! \brief Link the MOSUserFeatureDescFields table items to gc_UserFeatureKeysMap
//! \details Link the MOSUserFeatureDescFields table items to gc_UserFeatureKeysMap
//! according to ID sequence and do some post processing such as malloc related memory
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_DeclareUserFeatureKeysForAllDescFields();
//!
//!
//! \brief Destroy the User Feature Value pointer according to the DescField Table
//! \details Destroy the User Feature Value pointer according to the DescField Table
//! destroy the user feature key value Map according to Declare Count
//! \param [in] descTable
//! The user feature key description table
//! \param [in] numOfItems
//! Number of user feature keys described in the table
//! \param [in] maxId
//! Max value ID in the table
//! \param [out] keyValueMap
//! optional pointer to the value map where the table items will be destroyed, could be nullptr
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_DestroyUserFeatureKeysFromDescFields(
MOS_USER_FEATURE_VALUE *descTable,
uint32_t numOfItems,
uint32_t maxId,
MOS_USER_FEATURE_VALUE_MAP *keyValueMap);
//!
//!
//! \brief Destroy the User Feature Value pointer according to the Global DescField Table
//! \details Destroy the User Feature Value pointer according to the Global DescField Table
//! destroy the gc_UserFeatureKeysMap according to Declare Count
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_DestroyUserFeatureKeysForAllDescFields();
//!
//! \brief Copy the VALUE_DATA from source to destination pointer
//! \details Copy the VALUE_DATA from source to destination pointer
//! \param [in] pSrcData
//! Pointer to the Source Value Data
//! \param [in] pDstData
//! Pointer to the Destination Value Data
//! \param [in] ValueType
//! Value Type for the copy data
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_CopyUserFeatureValueData(
PMOS_USER_FEATURE_VALUE_DATA pSrcData,
PMOS_USER_FEATURE_VALUE_DATA pDstData,
MOS_USER_FEATURE_VALUE_TYPE ValueType
);
//!
//! \brief Free the allocated memory for the related Value type
//! \details Free the allocated memory for the related Value type
//! \param [in] pData
//! Pointer to the User Feature Value Data
//! \param [in] ValueType
//! related Value Type needed to be deallocated.
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_DestroyUserFeatureData(
PMOS_USER_FEATURE_VALUE_DATA pData,
MOS_USER_FEATURE_VALUE_TYPE ValueType);
//!
//! \brief Read Single Value from User Feature based on value of enum type in MOS_USER_FEATURE_VALUE_TYPE
//! \details This is a unified funtion to read user feature key for all components.
//! (Codec/VP/CP/CM)
//! It is required to prepare all memories for buffers before calling this function.
//! User can choose to use array variable or allocated memory for the buffer.
//! If the buffer is allocated dynamically, it must be freed by user to avoid memory leak.
//! ------------------------------------------------------------------------------------
//! Usage example:
//! a) Initiation:
//! MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData));
//! b.0) Don't need to input a default value if the default value in user feature key Desc Fields table item is good
//! for your case
//! b.1) For uint32_t type:
//! UserFeatureData.u32Data = 1; // overwrite a custom default value
//! UserFeatureData.i32DataFlag = MOS_USER_FEATURE_VALUE_DATA_FLAG_CUSTOM_DEFAULT_VALUE_TYPE;
//! // raise a flag to use this custom default value instead of
//! default value in user feature key Desc Fields table item
//! b.2) For String/Binary type:
//! char cStringData[MOS_USER_CONTROL_MAX_DATA_SIZE];
//! UserFeatureData.StringData.pStringData = cStringData; // make sure the pointer is valid
//! b.3) For MultiString type:
//! char cStringData[MOS_USER_CONTROL_MAX_DATA_SIZE];
//! MOS_USER_FEATURE_VALUE_STRING Strings[__MAX_MULTI_STRING_COUNT];
//! UserFeatureData.MultiStringData.pMultStringData = cStringData; // make sure the pointer is valid
//! for (ui = 0; ui < VPHAL_3P_MAX_LIB_PATH_COUNT; ui++)
//! {
//! Strings[ui].pStringData = (char *)MOS_AllocAndZeroMemory(MOS_USER_CONTROL_MAX_DATA_SIZE);
//! }
//! UserFeatureData.MultiStringData.pStrings = Strings;
//! c) Read user feature key:
//! MOS_UserFeature_ReadValue_ID();
//! -------------------------------------------------------------------------------------
//! Important note: The pointer pStringData/pMultStringData may be modified if the
//! previous MOS_UserFeature_ReadValue() doesn't read a same user feature key type. So it's
//! suggested to set the union members in UserFeatureValue every time before
//! MOS_UserFeature_ReadValue() if you are not familiar with the details of this function.
//! If a new key is added, please make sure to declare a definition in corresponding
//! user feature key Desc Fields tableby MOS_DECLARE_UF_KEY
//! \param [in] pOsUserFeatureInterface
//! Pointer to OS User Interface structure
//! \param [in] ValueID
//! value of enum type in MOS_USER_FEATURE_VALUE_TYPE. declares the user feature key to be readed
//! \param [in,out] pValueData
//! Pointer to User Feature Data
//! \param [in] mosCtx
//! Pointer to ddi device ctx
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//! For pValueData return value:
//! MOS_STATUS_SUCCESS: pValueData is from User Feature Key
//! MOS_STATUS_USER_FEATURE_KEY_OPEN_FAILED: pValueData is from default value
//! MOS_STATUS_UNKNOWN: pValueData is from default value
//! MOS_STATUS_USER_FEATURE_KEY_READ_FAILED: pValueData is from default value
//! MOS_STATUS_NULL_POINTER: NO USER FEATURE KEY DEFINITION in corresponding user feature key Desc Field table,
//! No default value or User Feature Key value return
//!
//!
MOS_STATUS MOS_UserFeature_ReadValue_ID(
PMOS_USER_FEATURE_INTERFACE pOsUserFeatureInterface,
uint32_t ValueID,
PMOS_USER_FEATURE_VALUE_DATA pValueData,
MOS_CONTEXT_HANDLE mosCtx);
//!
//! \brief Write Values to User Feature with specified ID
//! \details Write Values to User Feature with specified ID
//! The caller is responsible to allocate values / names
//! and free them later if necessary
//! \param [in] pOsUserFeatureInterface
//! Pointer to OS User Interface structure
//! \param [in] pWriteValues
//! Pointer to User Feature Data, and related User Feature Key ID (enum type in MOS_USER_FEATURE_VALUE_TYPE)
//! \param [in] uiNumOfValues
//! number of user feature keys to be written.
//! \param [in] mosCtx
//! Pointer to ddi device ctx
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_UserFeature_WriteValues_ID(
PMOS_USER_FEATURE_INTERFACE pOsUserFeatureInterface,
PMOS_USER_FEATURE_VALUE_WRITE_DATA pWriteValues,
uint32_t uiNumOfValues,
MOS_CONTEXT_HANDLE mosCtx);
// User Feature Report Writeout
#define WriteUserFeature64(key, value, mosCtx) \
{ \
MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__; \
UserFeatureWriteData.Value.i64Data = (value); \
UserFeatureWriteData.ValueID = (key); \
MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, mosCtx); \
}
#define WriteUserFeature(key, value, mosCtx) \
{ \
MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__; \
UserFeatureWriteData.Value.i32Data = (value); \
UserFeatureWriteData.ValueID = (key); \
MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, mosCtx); \
}
#define WriteUserFeatureString(key, value, len, mosCtx) \
{ \
MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__; \
UserFeatureWriteData.Value.StringData.pStringData = (value); \
UserFeatureWriteData.Value.StringData.uSize = (len + 1); \
UserFeatureWriteData.ValueID = (key); \
MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, mosCtx); \
}
//!
//! \brief Lookup the user feature value name associated with the ID
//! \details Lookup the user feature value name associated with the ID
//! \param [in] ValueId
//! The user feature value ID to be looked up
//! \return const char*
//! pointer to the char array holding the user feature value name
//!
const char* MOS_UserFeature_LookupValueName(
uint32_t ValueID);
//!
//! \brief Lookup the read path associated with the ID
//! \details Lookup the read path associated with the ID
//! \param [in] ValueId
//! The user feature value ID to be looked up
//! \return const char*
//! pointer to the char array holding the read path
//!
const char* MOS_UserFeature_LookupReadPath(
uint32_t ValueID);
//!
//! \brief Lookup the write path associated with the ID
//! \details Lookup the write path associated with the ID
//! \param [in] ValueId
//! The user feature value ID to be looked up
//! \return const char*
//! pointer to the char array holding the write path
//!
const char* MOS_UserFeature_LookupWritePath(
uint32_t ValueID);
//!
//! \brief Enable user feature change notification
//! \details Enable user feature change notification
//! Create notification data and register the wait event
//! \param [in] pOsUserFeatureInterface
//! Pointer to OS User Interface structure
//! \param [in/out] pNotification
//! Pointer to User Feature Notification Data
//! \param [in] mosCtx
//! Pointer to DDI device handle
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_UserFeature_EnableNotification(
PMOS_USER_FEATURE_INTERFACE pOsUserFeatureInterface,
PMOS_USER_FEATURE_NOTIFY_DATA pNotification,
MOS_CONTEXT_HANDLE mosCtx);
//!
//! \brief Disable user feature change notification
//! \details Disable user feature change notification
//! Unregister the wait event and frees notification data
//! \param [in] pOsUserFeatureInterface
//! Pointer to OS User Interface structure
//! \param [in/out] pNotification
//! Pointer to User Feature Notification Data
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_UserFeature_DisableNotification(
PMOS_USER_FEATURE_INTERFACE pOsUserFeatureInterface,
PMOS_USER_FEATURE_NOTIFY_DATA pNotification);
//!
//! \brief Parses the user feature path and gets type and sub path
//! \details Parses the user feature path and gets type and sub path
//! It verifies if the user feature path is valid,
//! and check if it belongs to UFEXT or UFINT UFKEY.
//! The identified type and subpath are set accordingly.
//! \param [in] pOsUserFeatureInterface,
//! Pointer to OS User Interface structure
//! \param [in] pInputPath
//! The input user feature path
//! \param [out] pUserFeatureType
//! Pointer to the variable to receive user feature type
//! \param [out] ppSubPath
//! Pointer to a variable that accepts the pointer to the subpath
//! \return MOS_STATUS
//! Returns MOS_STATUS_INVALID_PARAMETER if failed, else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_UserFeature_ParsePath(
PMOS_USER_FEATURE_INTERFACE pOsUserFeatureInterface,
char * const pInputPath,
PMOS_USER_FEATURE_TYPE pUserFeatureType,
char **ppSubPath);
//!
//! \brief String concatenation with security checks.
//! \details String concatenation with security checks.
//! Append strSource to strDestination, with buffer size checking
//! \param [in/out] strDestination
//! Pointer to destination string
//! \param [in] numberOfElements
//! Size of the destination buffer
//! \param [in] strSource
//! Pointer to the source string
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_SecureStrcat(
char *strDestination,
size_t numberOfElements,
const char * const strSource);
//!
//! \brief Find string token with security checks.
//! \details Find string token with security checks.
//! Subsequent calls with nullptr in strToken and same contex to get
//! remaining tokens
//! \param [in/out] strToken
//! String containing token or tokens
//! Pass nullptr for this parameter in subsequent calls
//! to MOS_SecureStrtok to find the remaining tokens
//! \param [in] strDelimit
//! Set of delimiter characters
//! \param [in/out] contex
//! Used to store position information between calls to MOS_SecureStrtok
//! \return char *
//! Returns tokens else nullptr
//!
char *MOS_SecureStrtok(
char *strToken,
const char *strDelimit,
char **contex);
//!
//! \brief String copy with security checks.
//! \details String copy with security checks.
//! Copy strSource to strDestination, with buffer size checking
//! \param [out] strDestination
//! Pointer to destination string
//! \param [in] numberOfElements
//! Size of the destination buffer
//! \param [in] strSource
//! Pointer to the source string
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_SecureStrcpy(
char *strDestination,
size_t numberOfElements,
const char * const strSource);
//!
//! \brief Memory copy with security checks.
//! \details Memory copy with security checks.
//! Copy pSource to pDestination, with buffer size checking
//! \param [out] pDestination
//! Pointer to destination buffer
//! \param [in] dstLength
//! Size of the destination buffer
//! \param [in] pSource
//! Pointer to the source buffer
//! \param [in] srcLength
//! Number of bytes to copy from source to destination
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_SecureMemcpy(
void *pDestination,
size_t dstLength,
const void *pSource,
size_t srcLength);
//!
//! \brief Open a file with security checks.
//! \details Open a file with security checks.
//! \param [out] ppFile
//! Pointer to a variable that receives the file pointer.
//! \param [in] filename
//! Pointer to the file name string
//! \param [in] mode
//! Specifies open mode such as read, write etc
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_SecureFileOpen(
FILE **ppFile,
const char *filename,
const char *mode);
//!
//! \brief Write formatted data to a string with security checks.
//! \details Write formatted data to a string with security checks.
//! Optional arguments are passed in individually
//! Buffer must have space for null character after copying length
//! \param [out] buffer
//! Pointer to a string to which formatted data is printed
//! \param [in] bufSize
//! Size of the buffer where the data is printed
//! \param [in] length
//! Number of characters to be printed
//! \param [in] format
//! Format string to be printed
//! \return int32_t
//! Returns the number of characters printed or -1 if an error occurs
//!
int32_t MOS_SecureStringPrint(
char *buffer,
size_t bufSize,
size_t length,
const char * const format,
...);
//!
//! \brief Write formatted data to a string with security checks, va_list version
//! \details Write formatted data to a string with security checks.
//! Pointer to an optional arguments list is passed in
//! Buffer must have space for null character after copying length
//! \param [out] buffer
//! Pointer to a string to which formatted data is printed
//! \param [in] bufSize
//! Size of the buffer where the data is printed
//! \param [in] length
//! Number of characters to be printed
//! \param [in] format
//! Format string to be printed
//! \param [in] var_args
//! Optional argument list
//! \return int32_t
//! Returns the number of characters printed or -1 if an error occurs
//!
MOS_STATUS MOS_SecureVStringPrint(
char *buffer,
size_t bufSize,
size_t length,
const char * const format,
va_list var_args);
//------------------------------------------------------------------------------
// Library, process and OS related functions
//------------------------------------------------------------------------------
//!
//! \brief Maps the specified executable module into the address space of
//! the calling process.
//! \details Maps the specified executable module into the address space of
//! the calling process.
//! \param [in] lpLibFileName
//! A valid handle to an open object.
//! \param [out] phModule
//! Pointer variable that accepts the module handle
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_LoadLibrary(
const char * const lpLibFileName,
PHMODULE phModule);
//!
//! \brief Free the loaded dynamic-link library
//! \details Free the loaded dynamic-link library
//! \param [in] hLibModule
//! A handle to the loaded DLL module
//! \return int32_t
//! true if success else false
//!
int32_t MOS_FreeLibrary(HMODULE hLibModule);
//!
//! \brief Retrieves the address of an exported function or variable from
//! the specified dynamic-link library
//! \details Retrieves the address of an exported function or variable from
//! the specified dynamic-link library
//! \param [in] hLibModule
//! A handle to the loaded DLL module.
//! The LoadLibrary function returns this handle.
//! \param [in] lpProcName
//! The function or variable name, or the function's ordinal value.
//! \return void *
//! If succeeds, the return value is the address of the exported
//! function or variable. If fails, the return value is NULL.
//! To get extended error information, call GetLastError.
//!
void *MOS_GetProcAddress(
HMODULE hModule,
const char *lpProcName);
//!
//! \brief Retrieves the current process id
//! \details Retrieves the current process id
//! \return int32_t
//! Return the current process id
//!
int32_t MOS_GetPid();
//!
//! \brief Retrieves the frequency of the high-resolution performance
//! counter, if one exists.
//! \details Retrieves the frequency of the high-resolution performance
//! counter, if one exists.
//! \param [out] pFrequency
//! Pointer to a variable that receives the current
//! performance-counter frequency, in counts per second.
//! \return int32_t
//! If the installed hardware supports a high-resolution performance
//! counter, the return value is nonzero. If the function fails, the
//! return value is zero.
//!
int32_t MOS_QueryPerformanceFrequency(
uint64_t *pFrequency);
//!
//! \brief Retrieves the current value of the high-resolution performance
//! counter
//! \details Retrieves the current value of the high-resolution performance
//! counter
//! \param [out] pPerformanceCount
//! Pointer to a variable that receives the current
//! performance-counter value, in counts.
//! \return int32_t
//! If the installed hardware supports a high-resolution performance
//! counter, the return value is nonzero. If the function fails, the
//! return value is zero. To get extended error information, call GetLastError.
//!
int32_t MOS_QueryPerformanceCounter(
uint64_t *pPerformanceCount);
//!
//! \brief Sleep for given duration in ms
//! \details Sleep for given duration ms
//! \param [in] mSec
//! Sleep duration in ms
//! \return void
//!
void MOS_Sleep(
uint32_t mSec);
//------------------------------------------------------------------------------
// Wrappers for OS Specific User Feature Functions Implementations
//------------------------------------------------------------------------------
//!
//! \brief Opens the specified user feature key
//! \details Opens the specified user feature key
//! \param [in] UFKey
//! A handle to an open user feature key.
//! \param [in] lpSubKey
//! The name of the user feature subkey to be opened.
//! \param [in] lOptions
//! This parameter is reserved and must be zero.
//! \param [in] samDesired
//! Reserved, could be any REGSAM type value
//! \param [out] phkResult
//! A pointer to a variable that receives a handle to the opened key.
//! \return MOS_STATUS
//! If the function succeeds, the return value is MOS_STATUS_SUCCESS.
//! If the function fails, the return value is a error code defined
//! in mos_utilities.h.
//!
MOS_STATUS MOS_UserFeatureOpenKey(
void *UFKey,
const char *lpSubKey,
uint32_t ulOptions,
uint32_t samDesired,
void **phkResult,
MOS_USER_FEATURE_KEY_PATH_INFO *ufInfo = nullptr);
//!
//! \brief Closes a handle to the specified user feature key
//! \details Closes a handle to the specified user feature key
//! \param [in] UFKey
//! A handle to an open user feature key.
//! \return MOS_STATUS
//! If the function succeeds, the return value is MOS_STATUS_SUCCESS.
//! If the function fails, the return value is a error code defined
//! in mos_utilities.h.
//!
MOS_STATUS MOS_UserFeatureCloseKey(
void *UFKey);
//!
//! \brief Retrieves the type and data for the specified user feature value
//! \details Retrieves the type and data for the specified user feature value
//! \param [in] UFKey
//! A handle to an open user feature key.
//! \param [in] lpSubKey
//! The name of the user feature key. This key must be a
//! subkey of the key specified by the hkey parameter
//! \param [in] lpValue
//! The name of the user feature value
//! \param [in] dwFlags
//! The flags that restrict the data type of value to be queried
//! \param [out] pdwType
//! A pointer to a variable that receives a code indicating the type
//! of data stored in the specified value.
//! \param [out] pvData
//! A pointer to a buffer that receives the value's data.
//! \param [in/out] pcbData
//! A pointer to a variable that specifies the size of the buffer
//! pointed to by the pvData parameter, in bytes. When the function
//! returns, this variable contains the size of the data copied to lpData.
//! \return MOS_STATUS
//! If the function succeeds, the return value is MOS_STATUS_SUCCESS.
//! If the function fails, the return value is a error code defined
//! in mos_utilities.h.
//!
MOS_STATUS MOS_UserFeatureGetValue(
void *UFKey,
const char *lpSubKey,
const char *lpValue,
uint32_t dwFlags,
uint32_t *pdwType,
void *pvData,
uint32_t *pcbData);
//!
//! \brief Retrieves the type and data for the specified value name
//! associated with an open user feature key.
//! \details Retrieves the type and data for the specified value name
//! associated with an open user feature key.
//! \param [in] UFKey
//! A handle to an open user feature key
//! \param [in] lpValueName
//! The name of the user feature value
//! \param [in] lpReserved
//! This parameter is reserved and must be NULL.
//! \param [out] lpType
//! A pointer to a variable that receives a code indicating
//! the type of data stored in the specified value.
//! \param [out] lpData
//! A pointer to a buffer that receives the value's data.
//! \param [in/out] lpcbData
//! A pointer to a variable that specifies the size
//! of the buffer pointed to by the pvData parameter,
//! in bytes. When the function returns, this variable
//! contains the size of the data copied to lpData.
//! \return MOS_STATUS
//! If the function succeeds, the return value is MOS_STATUS_SUCCESS.
//! If the function fails, the return value is a error code defined
//! in mos_utilities.h.
//!
MOS_STATUS MOS_UserFeatureQueryValueEx(
void *UFKey,
char *lpValueName,
uint32_t *lpReserved,
uint32_t *lpType,
char *lpData,
uint32_t *lpcbData);
//!
//! \brief Sets the data and type of a specified value under a user feature key
//! \details Sets the data and type of a specified value under a user feature key
//! \param [in] UFKey
//! A handle to an open user feature key
//! \param [in] lpValueName
//! The name of the user feature value
//! \param [in] Reserved
//! This parameter is reserved and must be nullptr
//! \param [in] dwType
//! The type of data pointed to by the lpData parameter
//! \param [in] lpData
//! The data to be stored.
//! \param [in] cbData
//! The size of the information pointed to by the lpData parameter, in bytes.
//! \return MOS_STATUS
//! If the function succeeds, the return value is MOS_STATUS_SUCCESS.
//! If the function fails, the return value is a error code defined
//! in mos_utilities.h.
//!
MOS_STATUS MOS_UserFeatureSetValueEx(
void *UFKey,
const char *lpValueName,
uint32_t Reserved,
uint32_t dwType,
uint8_t *lpData,
uint32_t cbData);
//!
//! \brief Notifies the caller about changes to the attributes or contents
//! of a specified user feature key
//! \details Notifies the caller about changes to the attributes or contents
//! of a specified user feature key
//! Used internally by MOS_UserFeature_EnableNotification()
//! \param [in] UFKey
//! A handle to an open user feature key.
//! The key must have been opened with the KEY_NOTIFY access right.
//! \param [in] bWatchSubtree
//! true including subkey changes; false for the key itself
//! \param [in] hEvent
//! A handle to an event to be signaled when key changes if is true
//! \param [in] fAsynchronous
//! true: Return immediately and signal the hEvent when key change
//! false: Does not return until a change has occured
//! \return MOS_STATUS
//! If the function succeeds, the return value is MOS_STATUS_SUCCESS.
//! If the function fails, the return value is a error code defined
//! in mos_utilities.h.
//!
MOS_STATUS MOS_UserFeatureNotifyChangeKeyValue(
void *UFKey,
int32_t bWatchSubtree,
HANDLE hEvent,
int32_t fAsynchronous);
//!
//! \brief Creates or opens a event object and returns a handle to the object
//! \details Creates or opens a event object and returns a handle to the object
//! \param [in] lpEventAttributes
//! A pointer to a SECURITY_ATTRIBUTES structure.
//! If lpEventAttributes is nullptr, the event handle cannot be inherited
//! by child processes.
//! \param [in] lpName
//! The name of the event object.If lpName is nullptr, the event object is
//! created without a name.
//! \param [in] dwFlags
//! Combines the following flags
//! CREATE_EVENT_INITIAL_SET: Singal initial state or not
//! CREATE_EVENT_MANUAL_RESET: Must be manually reset or not
//! \return HANDLE
//! If the function succeeds, the return value is a handle to the
//! event object. If failed, returns NULL. To get extended error
//! information, call GetLastError.
//!
HANDLE MOS_CreateEventEx(
void *lpEventAttributes,
char *lpName,
uint32_t dwFlags);
//!
//! \brief Create a wait thread to wait on the object
//! \details Create a wait thread to wait on the object
//! Add this function to capatible WDK-9200 on vs2012.
//! \param [out] phNewWaitObject
//! A pointer to a variable that receives a wait handle on return.
//! \param [in] hObject
//! A handle to the object
//! \param [in] Callback
//! A pointer to the application-defined function of type
//! WAITORTIMERCALLBACK to be executed when wait ends.
//! \param [in] Context
//! A single value that is passed to the callback function
//! \return int32_t
//! The return value is int32_t type. If the function succeeds,
//! the return value is nonzero. If the function fails, the
//! return value is zero.
//!
int32_t MOS_UserFeatureWaitForSingleObject(
PTP_WAIT *phNewWaitObject,
HANDLE hObject,
void *Callback,
void *Context);
//!
//! \brief Cancels a registered wait operation issued by the
//! RegisterWaitForSingleObject function
//! \details Cancels a registered wait operation issued by the
//! RegisterWaitForSingleObject function
//! \param [in] hWaitHandle
//! The wait handle. This handle is returned by the
//! RegisterWaitForSingleObject function
//! \return int32_t
//! The return value is int32_t type. If the function succeeds,
//! the return value is nonzero. If the function fails, the
//! return value is zero.
//!
int32_t MOS_UnregisterWaitEx(
PTP_WAIT hWaitHandle);
//!
//! \brief Get logical core number of current CPU
//! \details Get logical core number of current CPU
//! \return uint32_t
//! If the function succeeds, the return value is the number of
//! current CPU.
//!
uint32_t MOS_GetLogicalCoreNumber();
//!
//! \brief Creates or opens a thread object and returns a handle to the object
//! \details Creates or opens a thread object and returns a handle to the object
//! \param [in] ThreadFunction
//! A pointer to a thread function.
//! \param [in] ThreadData
//! A pointer to thread data.
//! \return MOS_THREADHANDLE
//! If the function succeeds, the return value is a handle to the
//! thread object. If failed, returns NULL.
//!
MOS_THREADHANDLE MOS_CreateThread(
void *ThreadFunction,
void *ThreadData);
//!
//! \brief Get thread id
//! \details Get thread id
//! \param [in] hThread
//! A handle of thread object.
//! \return uint32_t
//! Return the current thread id
//!
uint32_t MOS_GetThreadId(
MOS_THREADHANDLE hThread);
//!
//! \brief Retrieves the current thread id
//! \details Retrieves the current thread id
//! \return uint32_t
//! Return the current thread id
//!
uint32_t MOS_GetCurrentThreadId();
//!
//! \brief Wait for thread to terminate
//! \details Wait for thread to terminate
//! \param [in] hThread
//! A handle of thread object.
//! \return MOS_STATUS
//!
MOS_STATUS MOS_WaitThread(
MOS_THREADHANDLE hThread);
//!
//! \brief Create mutex for context protection across threads
//! \details Create mutex for context protection across threads
//! Used for multi-threading of Hybrid Decoder
//! \param NONE
//! \return PMOS_MUTEX
//! Pointer of mutex
//!
PMOS_MUTEX MOS_CreateMutex();
//!
//! \brief Destroy mutex for context protection across threads
//! \details Destroy mutex for context protection across threads
//! Used for multi-threading of Hybrid Decoder
//! \param [in] pMutex
//! Pointer of mutex
//! \return MOS_STATUS
//!
MOS_STATUS MOS_DestroyMutex(PMOS_MUTEX pMutex);
//!
//! \brief Lock mutex for context protection across threads
//! \details Lock mutex for context protection across threads
//! Used for multi-threading of Hybrid Decoder
//! \param [in] pMutex
//! Pointer of mutex
//! \return MOS_STATUS
//!
MOS_STATUS MOS_LockMutex(PMOS_MUTEX pMutex);
//!
//! \brief Unlock mutex for context protection across threads
//! \details Unlock mutex for context protection across threads
//! Used for multi-threading of Hybrid Decoder
//! \param [in] pMutex
//! Pointer of mutex
//! \return MOS_STATUS
//!
MOS_STATUS MOS_UnlockMutex(PMOS_MUTEX pMutex);
//!
//! \brief Creates or opens a semaphore object and returns a handle to the object
//! \details Creates or opens a semaphore object and returns a handle to the object
//! \param [in] uiInitialCount
//! Initial count of semaphore usage.
//! \param [in] uiMaximumCount
//! Maximum count of semaphore usage.
//! \return PMOS_SEMAPHORE
//! If the function succeeds, the return value is a handle to the
//! semaphore object. If failed, returns NULL. To get extended error
//! information, call GetLastError.
//!
PMOS_SEMAPHORE MOS_CreateSemaphore(
uint32_t uiInitialCount,
uint32_t uiMaximumCount);
//!
//! \brief Destroy a semaphore object
//! \details Destroy a semaphore object
//! \param [in] pSemaphore
//! A handle of semaphore object.
//! \return MOS_STATUS
//!
MOS_STATUS MOS_DestroySemaphore(
PMOS_SEMAPHORE pSemaphore);
//!
//! \brief Wait a semaphore object
//! \details Wait a semaphore object
//! \param [in] pSemaphore
//! A handle of semaphore object.
//! \param [in] uiMilliseconds
//! Wait time.
//! \return MOS_STATUS
//!
MOS_STATUS MOS_WaitSemaphore(
PMOS_SEMAPHORE pSemaphore,
uint32_t uiMilliseconds);
//!
//! \brief Post a semaphore object
//! \details Post a semaphore object
//! \param [in] pSemaphore
//! A handle of semaphore object.
//! \param [in] uiPostCount
//! semaphore post count.
//! \return MOS_STATUS
//!
MOS_STATUS MOS_PostSemaphore(
PMOS_SEMAPHORE pSemaphore,
uint32_t uiPostCount);
//!
//! \brief Wait for single object of semaphore/mutex/thread and returns the result
//! \details Wait for single object of semaphore/mutex/thread and returns the result
//! \param [in] pObject
//! Object handle.
//! \param [in] uiMilliseconds
//! Wait time.
//! \return uint32_t
//! If the function succeeds, the return value is the wait result of the
//! semaphore/mutex/thread object.
//!
uint32_t MOS_WaitForSingleObject(
void *pObject,
uint32_t uiMilliseconds);
//!
//! \brief Wait for multiple objects of semaphore/mutex/thread and returns the result
//! \details Wait for multiple objects of semaphore/mutex/thread and returns the result
//! \param [in] uiThreadCount
//! The number of object handles in the array pointed to by ppObjects.
//! \param [in] ppObjects
//! An array of object handles.
//! \param [in] bWaitAll
//! If true, the function returns when the state of all objects in the ppObjects array is signaled.
//! If false, the function returns when the state of any one of the objects is set to signaled.
//! \param [in] uiMilliseconds
//! The time-out interval, in milliseconds.
//! \return uint32_t
//! Return the wait result
//!
uint32_t MOS_WaitForMultipleObjects(
uint32_t uiThreadCount,
void **ppObjects,
uint32_t bWaitAll,
uint32_t uiMilliseconds);
//!
//! \brief Increments (increases by one) the value of the specified int32_t variable as an atomic operation.
//! \param [in] pValue
//! A pointer to the variable to be incremented.
//! \return int32_t
//! The function returns the resulting incremented value.
//!
int32_t MOS_AtomicIncrement(
int32_t *pValue);
//!
//! \brief Decrements (decreases by one) the value of the specified int32_t variable as an atomic operation.
//! \param [in] pValue
//! A pointer to the variable to be decremented.
//! \return int32_t
//! The function returns the resulting decremented value.
//!
int32_t MOS_AtomicDecrement(
int32_t *pValue);
//!
//! \brief Convert MOS_STATUS to OS dependent RESULT/Status
//! \param [in] eStatus
//! MOS_STATUS that will be converted
//! \return MOS_OSRESULT
//! Corresponding return code on different OSes
//!
MOS_OSRESULT MOS_StatusToOsResult(
MOS_STATUS eStatus);
//!
//! \brief Convert OS dependent RESULT/Status to MOS_STATUS
//! \param [in] eResult
//! OS dependent result that will be converted
//! \return MOS_STATUS
//! Corresponding MOS_STATUS
//!
MOS_STATUS OsResultToMOS_Status(
MOS_OSRESULT eResult);
//!
//! \brief sinc
//! \details Calculate sinc(x)
//! \param [in] x
//! float
//! \return float
//! sinc(x)
//!
float MOS_Sinc(
float x);
//!
//! \brief Lanczos
//! \details Calculate lanczos(x)
//! Basic formula is: lanczos(x)= MOS_Sinc(x) * MOS_Sinc(x / fLanczosT)
//! \param [in] x
//! float
//! \param [in] dwNumEntries
//! dword
//! \param [in] fLanczosT
//!
//! \return float
//! lanczos(x)
//!
float MOS_Lanczos(
float x,
uint32_t dwNumEntries,
float fLanczosT);
//!
//! \brief General Lanczos
//! \details Calculate lanczos(x) with odd entry num support
//! Basic formula is: lanczos(x)= MOS_Sinc(x) * MOS_Sinc(x / fLanczosT)
//! \param [in] x
//! float
//! \param [in] dwNumEntries
//! dword
//! \param [in]fLanczosT
//!
//! \return float
//! lanczos(x)
//!
float MOS_Lanczos_g(
float x,
uint32_t dwNumEntries,
float fLanczosT);
//!
//! \brief GCD
//! \details Recursive GCD calculation of two numbers
//! \param [in] a
//! uint32_t
//! \param [in] b
//! uint32_t
//! \return uint32_t
//! MOS_GCD(a, b)
//!
uint32_t MOS_GCD(
uint32_t a,
uint32_t b);
//!
//! \brief Get local time
//! \details Get local time
//! \param [out] tm
//! tm struct
//! \return MOS_STATUS
//!
MOS_STATUS MOS_GetLocalTime(
struct tm* tm);
//!
//! \brief Swizzles the given linear offset via the specified tiling params.
//! \details Swizzles the given linear offset via the specified tiling parameters.
//! Used to provide linear access to raw, tiled data.
//! \param [in] OffsetX
//! Horizontal byte offset from left edge of tiled surface.
//! \param [in] OffsetY
//! Vertical offset from top of tiled surface.
//! \param [in] Pitch
//! Row-to-row byte stride.
//! \param [in] TileFormat
//! Either 'x' or 'y'--for X-Major or Y-Major tiling, respectively.
//! \param [in] CsxSwizzle
//! (Boolean) Additionally perform Channel Select XOR swizzling.
//! \param [in] flags
//! More flags to indicate different tileY.
//! \return int32_t
//! Return SwizzleOffset
//!
int32_t __Mos_SwizzleOffset(
int32_t OffsetX,
int32_t OffsetY,
int32_t Pitch,
MOS_TILE_TYPE TileFormat,
int32_t CsxSwizzle,
int32_t flags);
//!
//! \brief Wrapper function for SwizzleOffset
//! \details Wrapper function for SwizzleOffset in Mos
//! \param [in] pSrc
//! Pointer to source data.
//! \param [out] pDst
//! Pointer to destiny data.
//! \param [in] SrcTiling
//! Source Tile Type
//! \param [in] DstTiling
//! Destiny Tile Type
//! \param [in] iHeight
//! Height
//! \param [in] iPitch
//! Pitch
//! \param [in] extended flags
//! Pitch
//! \return void
//!
void Mos_SwizzleData(
uint8_t *pSrc,
uint8_t *pDst,
MOS_TILE_TYPE SrcTiling,
MOS_TILE_TYPE DstTiling,
int32_t iHeight,
int32_t iPitch,
int32_t extFlags);
//!
//! \brief MOS trace event initialize
//! \details register provide Global ID to the system.
//! \param void
//! \return void
//!
void MOS_TraceEventInit();
//!
//! \brief MOS trace event close
//! \details un-register provider Global ID.
//! \param void
//! \return void
//!
void MOS_TraceEventClose();
//!
//! \brief setup static platform info for trace events
//! \details send static platform info to trace struct, which itself determine when to send them.
//! static platform info should only send 1 time per trace capture, no more no less.
//! \param [in] driver version
//! \param [in] platform family
//! \param [in] render family
//! \param [in] device id
//! \return void
//!
void MOS_TraceSetupInfo(
uint32_t DrvVer,
uint32_t PlatFamily,
uint32_t RenderFamily,
uint32_t DeviceID);
//!
//! \brief MOS log trace event
//! \details log trace event by id and event type, arg1 and arg2 are optional arguments
//! arguments are in raw data format, need match data structure in manifest.
//! \param [in] usId
//! Indicates event id
//! \param [in] ucType
//! Indicates event type
//! \param [in] pArg1
//! event data address
//! \param [in] dwSize1
//! event data size
//! \param [in] pArg2
//! event data address
//! \param [in] dwSize2
//! event data size
//! \return void
//!
void MOS_TraceEvent(
uint16_t usId,
uint8_t ucType,
const void *pArg1,
uint32_t dwSize1,
const void *pArg2,
uint32_t dwSize2);
//!
//! \brief MOS log trace dump
//! \details dump driver data in raw format, data could be driver internal state or surface.
//! \param [in] name
//! Indicates dump name
//! \param [in] flags
//! additional buffer info flags
//! \param [in] pBuf
//! Indicates buffer address
//! \param [in] size
//! Indicates buffer size
//! \return void
//!
void MOS_TraceDataDump(
const char *pcName,
uint32_t flags,
const void *pBuf,
uint32_t dwSize);
//!
//! \brief MOS log data dictionary item
//! \details Dictionary is name:value pair
//! \param [in] name
//! Indicates item name
//! \param [in] pBuf
//! Indicates value address
//! \param [in] size
//! Indicates value size
//! \return void
//!
void MOS_TraceDataDictionary(
const char* pcName,
const void* pBuf,
uint32_t dwSize);
//!
//! \brief MOS log trace event Msg
//! \details log trace event msg w/ level/compID/functionname/lineNum arguments
//! arguments are in raw data format, need match data structure in manifest.
//! \param [in] level
//! Indicates msg level
//! \param [in] compID
//! Indicates compID
//! \param [in] message
//! event msg
//! \param [in] functionName
//! func name
//! \param [in] lineNum
//! event line number
//! \return void
//!
void MOS_TraceEventMsg(
uint8_t level,
uint8_t compID,
void* message,
void* functionName,
uint32_t lineNum);
//!
//! \brief MOS gfx info initialize
//! \details Load igdinfoXX.dll library and get gfx info function pointer
//! \param void
//! \return MOS_STATUS
//! Returns one of the MOS_STATUS error codes if failed,
//! else MOS_STATUS_SUCCESS
//!
MOS_STATUS MOS_GfxInfoInit();
//!
//! \brief MOS gfx info close
//! \details Release igdinfoXX.dll library
//! \param void
//! \return void
//!
void MOS_GfxInfoClose();
//!
//! \brief MOS_GfxInfo_RTErr
//! \details Custom gfx info trace to report runtime errors detected by each component.
//! \param [in] ver
//! Version
//! \param [in] compId
//! Component ID defined in GFXINFO_COMP_ID
//! \param [in] FtrId
//! Feature ID, an unique identifier for each component.
//! \param [in] ErrorCode
//! Error code that will be recorded.
//! \param [in] num_of_triples
//! Number of triples (name, type, value) to be compose as an <I N='name'>value</I> XML element
//! \param [in] ...
//! Triples (name, type, value), for example
//! int8_t i = 3;
//! "Name1", GFXINFO_PTYPE_UINT8, &i
//! "Name2", GFXINFO_PTYPE_ANSISTRING, "string value"
//! \return void
//!
void MOS_GfxInfo_RTErr(uint8_t ver,
uint16_t compId,
uint16_t FtrId,
uint32_t ErrorCode,
uint8_t num_of_triples,
...);
//!
//! \brief MOS_GfxInfo
//! \details A helper function to help to compose gfx info xml string
//! \param [in] ver
//! Version
//! \param [in] compId
//! Component ID defined in GFXINFO_COMP_ID
//! \param [in] tmtryID
//! Gfx info ID, an unique identifier for each component.
//! \param [in] num_of_triples
//! Number of triples (name, type, value) to be compose as an <I N='name'>value</I> XML element
//! \param [in] ...
//! Triples (name, type, value), for example
//! int8_t i = 3;
//! "Name1", GFXINFO_PTYPE_UINT8, &i
//! "Name2", GFXINFO_PTYPE_ANSISTRING, "string value"
//! \return void
//!
void MOS_GfxInfo(
uint8_t ver,
uint16_t compId,
uint32_t tmtryID,
uint8_t num_of_triples,
...);
class MosMutex
{
public:
MosMutex(void)
{
m_lock = MOS_CreateMutex();
}
~MosMutex()
{
MOS_DestroyMutex(m_lock);
}
void Lock()
{
MOS_LockMutex(m_lock);
}
void Unlock()
{
MOS_UnlockMutex(m_lock);
}
private:
PMOS_MUTEX m_lock = nullptr;
};
#ifdef __cplusplus
}
#endif
#endif // __MOS_UTILITIES_H__