blob: 22371839cd205e7ba73a420a4a689074a49ebab1 [file] [log] [blame]
/*
* Copyright (c) 2017, 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 codechal_encode_wp.h
//! \brief Defines base class for weighted prediction kernel
//!
#ifndef __CODECHAL_ENCODE_WP_H__
#define __CODECHAL_ENCODE_WP_H__
#include "codechal.h"
#include "codechal_hw.h"
#include "codechal_encoder_base.h"
//!
//! \class CodechalEncodeWP
//! \brief Weighted prediction kernel base class
//! \details Entry point to create weighted prediction class instance
//!
//! This class defines the base class for weighted prediction feature, it includes
//! common member fields, functions, interfaces etc shared by all Gens.
//!
//! To create an instance, client needs to call #CodechalEncodeWP::CreateWPState()
//!
class CodechalEncodeWP
{
public:
//!
//! \struct SliceParams
//! \brief Slice parameters
//!
struct SliceParams
{
/*! \brief Specifies the weights and offsets used for explicit mode weighted prediction.
*
* Weigths[i][j][k][m]:
* \n - i: the reference picture list (0 or 1)
* \n - j: reference to entry j in RefPicList (has range [0...31])
* \n - k: the YUV component (0 = luma, 1 = Cb chroma, 2 = Cr chroma)
* \n - m: the weight or offset used in the weighted prediction process (0 = weight, 1 = offset)
*/
uint16_t weights[2][32][3][2] = {};
uint8_t luma_log2_weight_denom = 0; //!< Same as AVC syntax element.
};
//!
//! \struct CurbeParams
//! \brief Curbe params for WP kernel
//!
struct CurbeParams
{
uint8_t refPicListIdx = 0;
uint32_t wpIdx = 0;
SliceParams *slcParams = nullptr;
};
//!
//! \struct SurfaceParams
//! \brief Surface params for WP kernel
//!
struct SurfaceParams
{
uint8_t wpOutListIdx = 0;
PMOS_SURFACE refFrameInput = nullptr;
MOS_SURFACE weightedPredOutputPicList[CODEC_NUM_WP_FRAME] = {};
bool refIsBottomField = false;
};
//!
//! \struct KernelParams
//! \brief Kernel params for WP kernel
//!
struct KernelParams
{
bool useRefPicList1 = false;
uint32_t wpIndex = 0;
SliceParams *slcWPParams = nullptr;
PMOS_SURFACE refFrameInput = nullptr;
bool refIsBottomField = false;
bool *useWeightedSurfaceForL0 = nullptr;
bool *useWeightedSurfaceForL1 = nullptr;
};
//!
//! \enum KernelBTI
//! \brief Weighted prediction kernel binding table
//!
enum KernelBTI
{
wpInputRefSurface = 0,
wpOutputScaledSurface = 1,
wpNumSurfaces = 2,
};
//!
//! \brief Set kernel base
//!
//! \param [in] kernelBase
//! Kernel base
//!
void SetKernelBase(uint8_t *kernelBase) { m_kernelBase = kernelBase; }
//!
//! \brief Get WP output picture list
//!
//! \param [in] index
//! Index
//!
//! \return PMOS_SURFACE
//! Pointer to MOS surface
//!
PMOS_SURFACE GetWPOutputPicList(uint8_t index) { return &m_surfaceParams.weightedPredOutputPicList[index]; }
//!
//! \brief Copy constructor
//!
CodechalEncodeWP(const CodechalEncodeWP&) = delete;
//!
//! \brief Copy assignment operator
//!
CodechalEncodeWP& operator=(const CodechalEncodeWP&) = delete;
//!
//! \brief Destructor
//!
virtual ~CodechalEncodeWP();
//!
//! \brief Get weighted prediction BT count
//!
//! \return Number of BTI
//!
uint8_t GetBTCount();
//!
//! \brief Initialize weighted prediction kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelState();
//!
//! \brief Weighted prediction kernel function
//!
//! \param [in] params
//! Pointer to KernelParams
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Execute(KernelParams *params);
//!
//! \brief Allocate weighted prediction surface
//!
//! \param [in] binary
//! Kernel binary
//!
//! \param [in] operation
//! Encode operation
//!
//! \param [in] krnStateIdx
//! Kernel state index
//!
//! \param [in] krnHeader
//! Kernel header
//!
//! \param [in] krnSize
//! Kernel size
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS(*pfnGetKernelHeaderAndSize) (
void *binary,
EncOperation operation,
uint32_t krnStateIdx,
void *krnHeader,
uint32_t *krnSize) {};
protected:
//!
//! \brief Weighted prediction kernel header struct
//!
struct KernelHeader
{
int kernelCount = 0;
CODECHAL_KERNEL_HEADER header = {};
};
//!
//! \brief Weighted prediction kernel Curbe data
//!
struct CurbeData
{
// DW0
union
{
struct
{
uint32_t defaultWeight : MOS_BITFIELD_RANGE(0, 15);
uint32_t defaultOffset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW0;
// DW1
union
{
struct
{
uint32_t roi0XLeft : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi0YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW1;
// DW2
union
{
struct
{
uint32_t roi0XRight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi0YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW2;
// DW3
union
{
struct
{
uint32_t roi0Weight : MOS_BITFIELD_RANGE(0, 15);
uint32_t roi0Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW3;
// DW4
union
{
struct
{
uint32_t roi1XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi1YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW4;
// DW5
union
{
struct
{
uint32_t roi1XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi1YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW5;
// DW6
union
{
struct
{
uint32_t roi1Weight : MOS_BITFIELD_RANGE (0, 15);
uint32_t roi1Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW6;
// DW7
union
{
struct
{
uint32_t roi2XLeft : MOS_BITFIELD_RANGE (0, 15);
uint32_t roi2YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW7;
// DW8
union
{
struct
{
uint32_t roi2XRight : MOS_BITFIELD_RANGE (0, 15);
uint32_t roi2YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW8;
// DW9
union
{
struct
{
uint32_t roi2Weight : MOS_BITFIELD_RANGE (0, 15);
uint32_t roi2Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW9;
// DW10
union
{
struct
{
uint32_t roi3XLeft : MOS_BITFIELD_RANGE (0, 15);
uint32_t roi3YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW10;
// DW11
union
{
struct
{
uint32_t roi3XRight : MOS_BITFIELD_RANGE (0, 15);
uint32_t roi3YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW11;
// DW12
union
{
struct
{
uint32_t roi3Weight : MOS_BITFIELD_RANGE (0, 15);
uint32_t roi3Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW12;
// DW13
union
{
struct
{
uint32_t roi4XLeft : MOS_BITFIELD_RANGE (0, 15);
uint32_t roi4YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW13;
// DW14
union
{
struct
{
uint32_t roi4XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi4YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW14;
// DW15
union
{
struct
{
uint32_t roi4Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi4Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW15;
// DW16
union
{
struct
{
uint32_t roi5XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi5YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW16;
// DW17
union
{
struct
{
uint32_t roi5XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi5YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW17;
// DW18
union
{
struct
{
uint32_t roi5Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi5Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW18;
// DW19
union
{
struct
{
uint32_t roi6XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi6YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW19;
// DW20
union
{
struct
{
uint32_t roi6XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi6YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW20;
// DW21
union
{
struct
{
uint32_t roi6Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi6Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW21;
// DW22
union
{
struct
{
uint32_t roi7XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi7YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW22;
// DW23
union
{
struct
{
uint32_t roi7XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi7YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW23;
// DW24
union
{
struct
{
uint32_t roi7Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi7Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW24;
// DW25
union
{
struct
{
uint32_t roi8XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi8YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW25;
// DW26
union
{
struct
{
uint32_t roi8XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi8YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW26;
// DW27
union
{
struct
{
uint32_t roi8Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi8Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW27;
// DW28
union
{
struct
{
uint32_t roi9XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi9YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW28;
// DW29
union
{
struct
{
uint32_t roi9XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi9YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW29;
// DW30
union
{
struct
{
uint32_t roi9Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi9Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW30;
// DW31
union
{
struct
{
uint32_t roi10XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi10YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW31;
// DW32
union
{
struct
{
uint32_t roi10XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi10YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW32;
// DW33
union
{
struct
{
uint32_t roi10Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi10Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW33;
// DW34
union
{
struct
{
uint32_t roi11XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi11YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW34;
// DW35
union
{
struct
{
uint32_t roi11XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi11YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW35;
// DW36
union
{
struct
{
uint32_t roi11Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi11Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW36;
// DW37
union
{
struct
{
uint32_t roi12XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi12YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW37;
// DW38
union
{
struct
{
uint32_t roi12XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi12YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW38;
// DW39
union
{
struct
{
uint32_t roi12Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi12Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW39;
// DW40
union
{
struct
{
uint32_t roi13XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi13YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW40;
// DW41
union
{
struct
{
uint32_t roi13XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi13YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW41;
// DW42
union
{
struct
{
uint32_t roi13Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi13Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW42;
// DW43
union
{
struct
{
uint32_t roi14XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi14YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW43;
// DW44
union
{
struct
{
uint32_t roi14XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi14YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW44;
// DW45
union
{
struct
{
uint32_t roi14Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi14Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW45;
// DW46
union
{
struct
{
uint32_t roi15XLeft : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi15YTop : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW46;
// DW47
union
{
struct
{
uint32_t roi15XRight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi15YBottom : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW47;
// DW48
union
{
struct
{
uint32_t roi15Weight : MOS_BITFIELD_RANGE( 0, 15);
uint32_t roi15Offset : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t value;
};
} DW48;
// DW49
union
{
struct
{
uint32_t inputSurface : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW49;
// DW50
union
{
struct
{
uint32_t outputSurface : MOS_BITFIELD_RANGE( 0, 31);
};
struct
{
uint32_t value;
};
} DW50;
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CurbeData)) == 51);
//!
//! \brief Constructor
//!
CodechalEncodeWP(CodechalEncoderState* encoder);
CodechalEncoderState* m_encoder = nullptr; //!< Pointer to ENCODER base class
MOS_INTERFACE *m_osInterface = nullptr; //!< OS interface
CodechalHwInterface *m_hwInterface = nullptr; //!< HW interface
CodechalDebugInterface *m_debugInterface = nullptr; //!< Debug interface
MhwMiInterface *m_miInterface = nullptr; //!< Common Mi Interface
MhwRenderInterface *m_renderInterface = nullptr; //!< Render engine interface
XMHW_STATE_HEAP_INTERFACE *m_stateHeapInterface = nullptr; //!< State heap class interface
MHW_KERNEL_STATE *m_kernelState = nullptr; //!< WP kernel state
uint32_t m_curbeLength = 0; //!< WP kernel Curbe length
uint32_t m_kernelUID = 0; //!< WP kernel UID
uint32_t m_combinedKernelSize = 0; //!< Combined kernel size
uint8_t *m_kernelBase = nullptr; //!< kernel binary base address
CurbeParams m_curbeParams = {}; //!< Curbe parameters
SurfaceParams m_surfaceParams = {}; //!< Surface parameters
//!
//! Reference to data members in Encoder class
//!
bool& m_useHwScoreboard;
bool& m_renderContextUsesNullHw;
bool& m_groupIdSelectSupported;
bool& m_singleTaskPhaseSupported;
bool& m_firstTaskInPhase;
bool& m_lastTaskInPhase;
bool& m_hwWalker;
uint8_t& m_groupId;
uint16_t& m_pictureCodingType;
uint32_t& m_mode;
uint32_t& m_verticalLineStride;
uint32_t& m_maxBtCount;
uint32_t& m_vmeStatesSize;
uint32_t& m_storeData;
uint32_t& m_frameWidth;
uint32_t& m_frameHeight;
uint32_t& m_frameFieldHeight;
CODEC_PICTURE& m_currOriginalPic;
MHW_WALKER_MODE& m_walkerMode;
protected:
//!
//! \brief Allocate weighted prediction surface
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResources();
//!
//! \brief Release weighted prediction surface
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
void ReleaseResources();
//!
//! \brief Setup Curbe for weighted prediction kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetCurbe();
//!
//! \brief Send surface for weighted prediction kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendSurface(PMOS_COMMAND_BUFFER cmdBuffer);
};
#endif // __CODECHAL_ENCODE_WP_H__