blob: ee452151abaae50a0275c395841c04b14e3aec0b [file] [log] [blame]
/*
* Copyright (c) 2011-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_decode_jpeg.h
//! \brief Defines the decode interface extension for JPEG.
//! \details Defines all types, macros, and functions required by CodecHal for JPEG decoding.
//! Definitions are not externally facing.
//!
#ifndef __CODECHAL_DECODER_JPEG_H__
#define __CODECHAL_DECODER_JPEG_H__
#include "codechal_decoder.h"
#include "codechal_decode_sfc_jpeg.h"
//!
//! \def CODECHAL_DECODE_JPEG_BLOCK_SIZE
//! Jpeg block size
//!
#define CODECHAL_DECODE_JPEG_BLOCK_SIZE 8
//!
//! \struct _CODECHAL_DECODE_JPEG_HUFFMAN_TABLE
//! \brief typedef of struct Huffman Table used by JPEG
//! Note: Some DDIs have no HuffTable selector and are based on Component type
//!
typedef struct _CODECHAL_DECODE_JPEG_HUFFMAN_TABLE
{
struct
{
uint8_t DC_BITS[JPEG_NUM_HUFF_TABLE_DC_BITS]; //!< DC number of Huffman codes length
uint8_t DC_HUFFVAL[JPEG_NUM_HUFF_TABLE_DC_HUFFVAL]; //!< DC value of Huffman codes
uint8_t AC_BITS[JPEG_NUM_HUFF_TABLE_AC_BITS]; //!< AC number of Huffman codes length
uint8_t AC_HUFFVAL[JPEG_NUM_HUFF_TABLE_AC_HUFFVAL]; //!< AC value of Huffman codes
} HuffTable[JPEG_MAX_NUM_HUFF_TABLE_INDEX];
} CODECHAL_DECODE_JPEG_HUFFMAN_TABLE, *PCODECHAL_DECODE_JPEG_HUFFMAN_TABLE;
typedef class CodechalDecodeJpeg *PCODECHAL_DECODE_JPEG_STATE;
//!
//! \class CodechalDecodeJpeg
//! \brief This class defines the member fields, functions etc used by JPEG decoder.
//!
class CodechalDecodeJpeg: public CodechalDecode
{
public:
//!
//! \brief Constructor
//! \param [in] hwInterface
//! Hardware interface
//! \param [in] debugInterface
//! Debug interface
//! \param [in] standardInfo
//! The information of decode standard for this instance
//!
CodechalDecodeJpeg(
CodechalHwInterface *hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Copy constructor
//!
CodechalDecodeJpeg(const CodechalDecodeJpeg&) = delete;
//!
//! \brief Copy assignment operator
//!
CodechalDecodeJpeg& operator=(const CodechalDecodeJpeg&) = delete;
//!
//! \brief Destructor
//!
~CodechalDecodeJpeg();
//!
//! \brief Allocate and Initialize JPEG decoder standard
//! \param [in] settings
//! Pointer to CodechalSetting
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateStandard (
CodechalSetting *settings) override;
//!
//! \brief Set states for each frame to prepare for JPEG decode
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetFrameStates () override;
//!
//! \brief JPEG decoder state level function
//! \details State level function for JPEG decoder
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DecodeStateLevel () override;
//!
//! \brief JPEG decoder primitive level function
//! \details Primitive level function for GEN specific JPEG decoder
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DecodePrimitiveLevel () override;
//!
//! \brief Indicates whether or not the jpeg scan is incomplete
//! \return If jpeg scan is incomplete \see m_incompleteJpegScan
//!
bool IsIncompleteJpegScan() override { return m_incompleteJpegScan; }
MOS_STATUS InitMmcState() override;
#ifdef _DECODE_PROCESSING_SUPPORTED
virtual MOS_STATUS InitSfcState();
#endif
MOS_SURFACE m_destSurface; //!< Pointer to MOS_SURFACE of render surface
CodecDecodeJpegPicParams *m_jpegPicParams = nullptr; //!< Picture parameter for JPEG
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS DumpIQParams(
CodecJpegQuantMatrix *matrixData);
MOS_STATUS DumpPicParams(
CodecDecodeJpegPicParams *picParams);
MOS_STATUS DumpScanParams(
CodecDecodeJpegScanParameter *scanParams);
MOS_STATUS DumpHuffmanTable(
PCODECHAL_DECODE_JPEG_HUFFMAN_TABLE huffmanTable);
#endif
protected:
//!
//! \brief Initialize during begin frame
//! \details Initialize during begin frame in JPEG decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS InitializeBeginFrame();
//!
//! \brief Copy data surface
//! \details Copy data surface in JPEG decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CopyDataSurface();
//!
//! \brief Check supported format
//! \details Check supported format in JPEG decode driver
//! \param [in,out] format
//! MOS_Format to check
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CheckSupportedFormat(PMOS_FORMAT format);
//!
//! \brief Check and copy incomplete bit stream
//! \details Check and copy incomplete bit stream in JPEG decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CheckAndCopyIncompleteBitStream();
//!
//! \brief Allocate resources
//! \details Allocate resources for JPEG decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResources ();
//!
//! \brief Set output surface layout
//! \details Set output surface layout for JPEG decode driver
//! \param [out] outputSurfLayout
//! Pointer to CodecDecodeJpegImageLayout
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
void SetOutputSurfaceLayout(
CodecDecodeJpegImageLayout *outputSurfLayout);
protected:
//!
//! \brief Indicates whether or not the SFC is inuse
//! JPEG may not use SFC even when FtrSFCPipe == True, but it can't be known when creating device.
//! \return If SFC is inuse
//!
bool IsSfcInUse(CodechalSetting * codecHalSettings) override
{
return (codecHalSettings->sfcEnablingHinted && MEDIA_IS_SKU(m_skuTable, FtrSFCPipe));
}
protected:
uint32_t m_dataSize; //!< Data size of the bitstream
uint32_t m_dataOffset; //!< Data offset of the bitstream
CodecDecodeJpegScanParameter * m_jpegScanParams = nullptr; //!< Scan parameter for JPEG
CodecJpegQuantMatrix * m_jpegQMatrix = nullptr; //!< QMatrix for JPEG
PCODECHAL_DECODE_JPEG_HUFFMAN_TABLE m_jpegHuffmanTable; //!< Huffman table for JPEG
MOS_RESOURCE m_resDataBuffer; //!< Handle of bitstream buffer
MOS_RESOURCE m_resCopiedDataBuffer; //!< The internal buffer to store copied data
uint32_t m_copiedDataBufferSize; //!< The max size of the internal copied buffer
uint32_t m_nextCopiedDataOffset; //!< The offset of the next bitstream data used for copying
uint32_t m_totalDataLength; //!< The total data length
uint32_t m_preNumScans; //!< Record the previous scan number before the new scan comes
bool m_copiedDataBufferInUse; //!< Flag to indicate whether the copy data buffer is used
//! \brief Indicates if current input scan for Jpeg is incomplete
bool m_incompleteJpegScan = false;
MOS_RESOURCE m_resSyncObjectWaContextInUse; //!< Signals on the video WA context
MOS_RESOURCE m_resSyncObjectVideoContextInUse; //!< Signals on the video context
#ifdef _DECODE_PROCESSING_SUPPORTED
CodechalJpegSfcState *m_sfcState = nullptr; //!< SFC state
#endif
};
#endif