blob: 049ff1034caa12ad1205f3666afaad898ad1084e [file] [log] [blame]
/*
* Copyright (c) 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 decode_filmgrain_gennoise_grv_packet_g12.h
//! \brief Defines the implementation of av1 decode film grain get random values kernel packet
//!
#ifndef __DECODE_FILMGRAIN_GENNOISE_GRV_PACKET_G12_H__
#define __DECODE_FILMGRAIN_GENNOISE_GRV_PACKET_G12_H__
#include "media_render_cmd_packet.h"
#include "decode_av1_pipeline.h"
#include "decode_av1_filmgrain_feature_g12.h"
namespace decode
{
//Curbe definitions
struct FilmGrainGetRandomValuesCurbe
{
// uint32_t 0
union
{
struct
{
uint32_t GaussianSeqSurfaceIndex : MOS_BITFIELD_RANGE(0, 31);
};
struct
{
uint32_t Value;
};
} DW0;
// uint32_t 1
union
{
struct
{
uint32_t YRandomValuesSurfaceIndex : MOS_BITFIELD_RANGE(0, 31);
};
struct
{
uint32_t Value;
};
} DW1;
// uint32_t 2
union
{
struct
{
uint32_t URandomValuesSurfaceIndex : MOS_BITFIELD_RANGE(0, 31);
};
struct
{
uint32_t Value;
};
} DW2;
// uint32_t 3
union
{
struct
{
uint32_t VRandomValuesSurfaceIndex : MOS_BITFIELD_RANGE(0, 31);
};
struct
{
uint32_t Value;
};
} DW3;
// uint32_t 4
union
{
struct
{
uint32_t CoordinatesSurfaceIndex : MOS_BITFIELD_RANGE(0, 31); //Random values for coordinates surface index
};
struct
{
uint32_t Value;
};
} DW4;
// uint32_t 5
union
{
struct
{
uint32_t NoiseShiftAmount : MOS_BITFIELD_RANGE(0, 15);
uint32_t Reserved : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t Value;
};
} DW5;
// uint32_t 6
union
{
struct
{
uint32_t GrainSeed : MOS_BITFIELD_RANGE(0, 31); //Random number generation initializer
};
struct
{
uint32_t Value;
};
} DW6;
// uint32_t 7
union
{
struct
{
uint32_t CoordinatesWidth : MOS_BITFIELD_RANGE(0, 15); //RoundUp(ImageHeight/64)
uint32_t CoordinatesHeight : MOS_BITFIELD_RANGE(16, 31); //RoundUp(ImageWidth/64)
};
struct
{
uint32_t Value;
};
} DW7;
static const size_t m_size = 8;
static const size_t m_byteSize = 32;
};
C_ASSERT(sizeof(FilmGrainGetRandomValuesCurbe) == 32);
// Binding Table Definitions
//!
//! \enum FilmGrainGetRandomValuesBindingTableOffset
//! \brief Binding table offset for GetRandomValues kernel
//!
enum FilmGrainGetRandomValuesBindingTableOffset
{
grvInputGaussianSeq = 0,
grvOutputYRandomValue,
grvOutputURandomValue,
grvOutputVRandomValue,
grvOutputCoordinates,
grvNumSurfaces
};
enum FilmGrainKernelStateIdx;
class FilmGrainGrvPacket : public RenderCmdPacket
{
public:
FilmGrainGrvPacket(MediaPipeline *pipeline, MediaTask *task, CodechalHwInterface *hwInterface);
virtual ~FilmGrainGrvPacket(){};
MOS_STATUS Prepare() override;
MOS_STATUS Submit(MOS_COMMAND_BUFFER *commandBuffer, uint8_t packetPhase) override;
MOS_STATUS Initilize();
virtual MOS_STATUS Init() override;
virtual std::string GetPacketName() override
{
return "AV1_DECODE_FilmGrainGrv";
}
//!
//! \brief Calculate Command Size
//!
//! \param [in, out] commandBufferSize
//! requested size
//! \param [in, out] requestedPatchListSize
//! requested size
//! \return MOS_STATUS
//! status
//!
MOS_STATUS CalculateCommandSize(uint32_t &commandBufferSize, uint32_t &requestedPatchListSize) override;
MOS_STATUS SetCurbeGetRandomValues();
protected:
MOS_STATUS KernelStateSetup();
MOS_STATUS SetUpSurfaceState();
virtual MOS_STATUS SetupMediaWalker() override;
protected:
int32_t m_kernelIndex = getRandomValues;
Kdll_FilterEntry* m_filter = nullptr; // Kernel Filter (points to base of filter array)
MediaFeatureManager *m_featureManager = nullptr;
Av1Pipeline *m_av1Pipeline = nullptr;
DecodeAllocator *m_allocator = nullptr;
PMOS_INTERFACE m_osInterface = nullptr;
Av1BasicFeature *m_av1BasicFeature = nullptr;
Av1DecodeFilmGrainG12 *m_filmGrainFeature = nullptr;
MhwVdboxVdencInterface *m_vdencInterface = nullptr;
CodechalHwInterface *m_hwInterface = nullptr;
DecodeMemComp *m_mmcState = nullptr;
const CodecAv1PicParams *m_picParams = nullptr; //!< Pointer to picture parameter
uint32_t m_bindingTableIndex[grvNumSurfaces] = {
grvInputGaussianSeq,
grvOutputYRandomValue,
grvOutputURandomValue,
grvOutputVRandomValue,
grvOutputCoordinates
};
};
}
#endif