1 /*
2 * Copyright (c) 2017, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file     codec_def_encode_mpeg2.h
24 //! \brief    Defines encode MPEG2 types and macros shared by CodecHal, MHW, and DDI layer
25 //! \details  Applies to MPEG2 encode only. Should not contain any DDI specific code.
26 //!
27 
28 #ifndef __CODEC_DEF_ENCODE_MPEG2_H__
29 #define __CODEC_DEF_ENCODE_MPEG2_H__
30 
31 #include "codec_def_common_encode.h"
32 #include "codec_def_common_mpeg2.h"
33 
34 #define CODEC_ENCODE_MPEG2_BRC_PIC_HEADER_SURFACE_SIZE       1024
35 #define CODEC_ENCODE_MPEG2_VBV_BUFFER_SIZE_UNITS             (16 * 1024) //!< 16 K bits
36 #define CODEC_ENCODE_MPEG2_MAX_NAL_TYPE                      0x1f
37 
38 //!
39 //! \enum     CodecEncodeMpeg2ExtensionStartCode
40 //! \brief    Codec encode MPEG2 extension start code
41 //!
42 enum CodecEncodeMpeg2ExtensionStartCode
43 {
44     // 0x00 - Reserved
45     Mpeg2sequenceExtension                   = 0x01,
46     Mpeg2sequenceDisplayExtension            = 0x02,
47     Mpeg2quantMatrixExtension                = 0x03,
48     Mpeg2copyrightExtension                  = 0x04,
49     Mpeg2sequnceScalableExtension            = 0x05,
50     // 0x06 - Reserved
51     Mpeg2pictureDisplayExtension             = 0x07,
52     Mpeg2pictureCodingExtension              = 0x08,
53     Mpeg2pictureSpatialScalableExtension     = 0x09,
54     Mpeg2pictureTemporalScalableExtension    = 0x0A
55     // 0x0B .. 0x0F - Reserved
56 } ;
57 
58 //!
59 //! \struct CodecEncodeMpeg2SequenceParams
60 //! \brief  MPEG2 Sequence Parameter Set
61 //!
62 struct CodecEncodeMpeg2SequenceParams
63 {
64     uint16_t  m_frameWidth;                     //!< Width of picture in unit of pixels
65     uint16_t  m_frameHeight;                    //!< Height of picture in unit pixels
66     uint8_t   m_profile;                        //!< Profile
67     uint8_t   m_level;                          //!< Level
68     uint8_t   m_chromaFormat;                   //!< Color sampling formats
69     uint8_t   m_targetUsage;                    //!< Target usage number, indicates trade-offs between quality and speed
70 
71     // ENC + PAK related parameters
72     union
73     {
74         uint16_t  m_aratioFrate;                    //!< Aspect ratio and frame rate
75         struct
76         {
77             uint16_t  m_aspectRatio           : 4;  //!< Aspect ratio
78             uint16_t  m_frameRateCode         : 4;  //!< Frame rate Code
79             uint16_t  m_frameRateExtN         : 3;  //!< Frame rate extend numerator
80             uint16_t  m_frameRateExtD         : 5;  //!< Frame rate extend denominator
81         };
82     };
83 
84     uint32_t    m_bitrate;                          //!<  Bit rate bits per second
85     uint32_t    m_vbvBufferSize;                    //!<  VBV buffer size in bits
86 
87     uint8_t   m_progressiveSequence           : 1;  //!< Indicate progressive sequence
88     uint8_t   m_lowDelay                      : 1;  //!< Indicate low delay
89     uint8_t   m_resetBRC                      : 1;  //!< Indicate if a BRC reset is desired to set a new bit rate or frame rate
90     uint8_t   m_noAcceleratorSPSInsertion     : 1;  //!< Indicates if current SPS is just a BRC parameter update, not a SPS change to be inserted into the bitstream.
91     uint8_t   m_forcePanicModeControl         : 1;  // Force to control the panic mode through DDI.
92     uint8_t   m_panicModeDisable              : 1;  // Disable the panic mode
93     uint8_t   m_reserved0                     : 2;  //!<  Reserved
94     uint8_t   m_rateControlMethod;                  //!< rate control method, CBR = 1, VBR = 2, AVBR = 4, CQP = 3
95     uint16_t  m_reserved1;                          //!< Reserved
96     uint32_t  m_maxBitRate;                         //!< Maximum bit rate, bits/sec
97     uint32_t  m_minBitRate;                         //!< Minimum bit rate, bits/sec
98     uint32_t  m_userMaxFrameSize;                   //!< Maximum frame size by user
99     uint32_t  m_initVBVBufferFullnessInBit;         //!< Initial VBV buffer fullness size in bits
100     uint16_t  m_reserved2;                          //!< Reserved
101     uint16_t  m_reserved3;                          //!< Reserved
102 } ;
103 
104 //!
105 //! \struct CodecEncodeMpeg2PictureParams
106 //! \brief  MPEG2 Picture Parameter Set
107 //!
108 struct CodecEncodeMpeg2PictureParams
109 {
110     CODEC_PICTURE       m_currOriginalPic;               //!< The current uncompressed original frame surface for encoding
111     CODEC_PICTURE       m_currReconstructedPic;          //!< The uncompressed frame surface for the current reconstructed picture.
112     uint8_t             m_pictureCodingType;             //!< Coding Type
113     uint8_t             m_fieldCodingFlag           : 1; //!< Indication of field mode coding when set to 1.
114     uint8_t             m_fieldFrameCodingFlag      : 1; //!< Indication interlaced frame coding
115     uint8_t             m_reserved0                 : 2; //!< Reserved
116     uint8_t             m_interleavedFieldBFF       : 1; //!< Indication of input picture layout has top field and bottom field interleaved together
117                                                          //!< with bottom field first when set to 1; otherwise (when set to 0) it is
118                                                          //!< interleaved with top field first.
119     uint8_t             m_progressiveField          : 1; //!< Indication of input picture layout has only one field picture (half of a frame) stored progressively
120     uint8_t             m_reserved1                 : 2; //!< Reserved
121 
122     uint8_t             m_numSlice;                      //!< Number of slices per frame; number of slices per field in field coding
123     uint8_t             m_picBackwardPrediction;         //!< Indicates whether any macroblocks of the current picture might include backward prediction
124     uint8_t             m_bidirectionalAveragingMode;    //!< Indicates the rounding method for combining prediction planes in bidirectional motion compensation
125     uint8_t             m_pic4MVallowed;                 //!< Picture 4 MV allowed
126     CODEC_PICTURE       m_refFrameList[2];               //!< List of reference frame buffers
127     bool                m_useRawPicForRef;               //!< Setting to 1 may improve performance at the cost of image quality
128     uint32_t            m_statusReportFeedbackNumber;    //!< The status report feedback data
129 
130     uint32_t            m_alternateScan             : 1; //!< Indicate the Inverse Scan method
131     uint32_t            m_intraVlcFormat            : 1; //!< Intra VLC format
132     uint32_t            m_qscaleType                : 1; //!< Quantizer Scale Type
133     uint32_t            m_concealmentMotionVectors  : 1; //!< Indicates if the concealment motion vectors are coded in intra macroblocks
134     uint32_t            m_framePredFrameDCT         : 1; //!< Frame Prediction Frame DCT
135     uint32_t            m_disableMismatchControl    : 1; //!< Disable mismatch control
136     uint32_t            m_intraDCprecision          : 2; //!< Intra DC Precision
137     uint32_t            m_fcode00                   : 4; //!< Used for forward horizontal motion vector prediction
138     uint32_t            m_fcode01                   : 4; //!< Used for forward vertical motion vector prediction
139     uint32_t            m_fcode10                   : 4; //!< Used for backward horizontal motion vector prediction
140     uint32_t            m_fcode11                   : 4; //!< Used for backward vertical motion vector prediction
141     uint32_t            m_reserved2                 : 8; //!< Reserved
142 
143     // ENC + PAK related parameters
144     bool                m_lastPicInStream;               //!< Indicate the last picture of the stream
145     bool                m_newGop;                        //!< Indicates that a new GOP will start with this picture
146 
147     uint16_t            m_gopPicSize;                    //!< Number of pictures within the current GOP
148     uint8_t             m_gopRefDist;                    //!< Distance between I- or P (or GPB) - key frames
149     uint8_t             m_gopOptFlag                : 2; //!< Indicate the additional flags for the GOP specification
150     uint8_t             m_reserved3                 : 6; //!< Reserved
151 
152     uint32_t            m_timeCode                  : 25;//!< Time code
153     uint32_t            m_reserved4                 : 7; //!< Reserved
154 
155     uint16_t            m_temporalReference         : 10;//!< Temporal reference
156     uint16_t            m_reserved5                 : 6; //!< Reserved
157 
158     uint16_t            m_vbvDelay;
159 
160     uint32_t            m_repeatFirstField          : 1; //!< Repeat first field
161     uint32_t            m_compositeDisplayFlag      : 1; //!< Composite display flag
162     uint32_t            m_vaxis                     : 1; //!< Vaxis
163     uint32_t            m_fieldSequence             : 3; //!< Field sequence
164     uint32_t            m_subCarrier                : 1; //!< Sub carrier
165     uint32_t            m_burstAmplitude            : 7; //!< Burst Amplitude
166     uint32_t            m_subCarrierPhase           : 8; //!< Sub carrier phase
167     uint32_t            m_reserved6                 : 10;//!< Reserved
168 
169     // Parameters for Skip Frames
170     uint8_t             m_skipFrameFlag;                 //!< Skip frame flag
171     uint8_t             m_numSkipFrames;                 //!< only reserved for BRC case
172     uint32_t            m_sizeSkipFrames;                //!< only reserved for BRC case
173 };
174 
175 //!
176 //! \struct CodecEncodeMpeg2SliceParmas
177 //! \brief  MPEG2 Slice Parameters
178 //!
179 struct CodecEncodeMpeg2SliceParmas
180 {
181     uint16_t      m_numMbsForSlice;                 //!< Number of macroblocks per slice
182     uint16_t      m_firstMbX;                       //!< Specifies the horizontal position of the first macroblock of the slice expressed in units of macroblocks
183     uint16_t      m_firstMbY;                       //!< Specifies the vertical position of the first macroblock of the slice expressed in units of macroblocks
184     uint16_t      m_intraSlice;                     //!< Indicates slices coded as Intra Slice
185     uint8_t       m_quantiserScaleCode;             //!< Quantier scale code
186 };
187 
188 //!
189 //! \struct CodecEncodeMpeg2VuiParams
190 //! \brief  MPEG2 VUI Parameters
191 //!
192 struct CodecEncodeMpeg2VuiParams
193 {
194     uint32_t    m_videoFormat               : 3; //!< Indicate the representation of the pictures
195     uint32_t    m_reserved0                 : 4; //!< Reserved
196     uint32_t    m_colourDescription         : 1; //!< Indicate the colour description is presented
197     uint32_t    m_colourPrimaries           : 8; //!< The chromaticity coordinates of the source primaries
198     uint32_t    m_transferCharacteristics   : 8; //!< The opto-electronic transfer characteristic of the source picture
199     uint32_t    m_matrixCoefficients        : 8; //!< The matrix coefficients used in deriving luminance and chrominance signals
200 
201     uint32_t    m_displayHorizontalSize     : 14;//!< The horizontal size of the display active region
202     uint32_t    m_reserved1                 : 2; //!< Reserved
203     uint32_t    m_displayVerticalSize       : 14;//!< The vertical size of the display active region
204     uint32_t    m_reserved2                 : 2; //!< Reserved
205 };
206 
207 //!
208 //! \struct CodecEncodeMpeg2QmatixParams
209 //! \brief  MPEG2 QMATRIX Parameters
210 //!
211 struct CodecEncodeMpeg2QmatixParams
212 {
213     uint8_t   m_newQmatrix[4];          //!< 0 - intra Y, 1 - inter Y, 2 - intra chroma, 3 - inter chroma
214     uint16_t  m_qmatrix[4][64];         //!< Quantiser matrix
215 };
216 
217 //!
218 //! \struct CodecEncodeMpeg2UserDataList
219 //! \brief  Linked List for MPEG-2 User Data
220 //!         User data may be provided in several pieces.
221 //!         So a linked list is implemented to keep track of them.
222 //!
223 struct CodecEncodeMpeg2UserDataList
224 {
225     void                            *m_userData;
226     uint32_t                        m_userDataSize;
227     CodecEncodeMpeg2UserDataList    *m_nextItem;
228 };
229 
230 #endif  // __CODEC_DEF_ENCODE_MPEG2_H__
231