/*
 * Copyright (c) 2018 Intel Corporation. All Rights Reserved.
 *
 * 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, sub license, 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 (including the
 * next paragraph) 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 NON-INFRINGEMENT.
 * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS 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 avcstreamoutdemo.h
 *
 * This file contains the decode streamout layout.
 */
 
#ifndef _AVC_STREAMOUT_DEMO_H_
#define _AVC_STREAMOUT_DEMO_H_

typedef signed dw;

/*
 * avc streamout layout
*/
typedef struct {
    // dw 0
    union
    {
        struct
        {
            dw   InterMbMode             : 2;    // Valid only if IntraMbFlag is inter.
            dw   MbSkipFlag              : 1;    // Cuurently always set to 0
            dw                           : 1;    // MBZ
            dw   IntraMbMode             : 2;    // Valid for Inter MB, Used in conjunction with MbType
            dw                           : 1;    // MBZ
            dw   MbPolarity              : 1;    // FieldMB polarity
            dw   MbType5Bits             : 5;    // Matches best MB mode. In H.264 spec: Table 7-11 for Intra; Table 7-14 for Inter.
            dw   IntraMbFlag             : 1;    // Set if MB is intra, unset if MB is inter
            dw   MbFieldFlag             : 1;    // Set if field MB, unset if frame MB
            dw   Transform8x8Flag        : 1;    // Set if current MB uses 8x8 transforms
            dw                           : 1;    // MBZ
            dw   CodedPatternDC          : 3;    // AVC Only. Indicates whether DC coeffs are sent. Y is most significant bit.
            dw   EdgeFilterFlag          : 3;    // AVC.
            dw                           : 1;    // MBZ
            dw   PackedMvNum             : 8;    // Debug only. Specifies number of MVs in packed motion vector form
        };
        struct
        {
            dw   Value;
        };
    } DW0;

    // dw 1
    union
    {
        struct
        {
            dw   MbXCnt                  : 16;   // Horizontal Origin of MB in dest piture in units of MBs
            dw   MbYCnt                  : 16;   // Vertical Origin of MB in dest piture in units of MBs
        };
        struct
        {
            dw   Value;
        };
    } DW1;

    // dw 2
    union
    {
        struct
        {
            dw   CbpAcY                  : 16;   // Coded block pattern for Y.
            dw   CbpAcU                  : 4;    // Coded block pattern for U
            dw   CbpAcV                  : 4;    // Coded block pattern for V
            dw                           : 6;    // Reserved
            dw   LastMBOfSliceFlag       : 1;    // Indicates current MB is last in slice. Data not right
            dw   ConcealMBFlag           : 1;    // Specifies in MB is a conceal MB.
        };
        struct
        {
            dw   Value;
        };
    } DW2;

    // dw 3
    union
    {
        struct
        {
            dw   QpPrimeY                : 7;    // AVC: Per-MB QP for luma.
            dw   QScaleType              : 1;    // MPEG2 only
            dw   MbClock16               : 8;    // MB compute clocks in 16-clock units
            dw   NzCoefCountMB           : 9;    // All coded coefficients in MB
            dw                           : 3;    // Reserved
            dw   Skip8x8Pattern          : 4;    // AVC Only. Indicates which of the 8x8 sub-blocks uses predicted MVs
        };
        struct
        {
            dw   Value;
        };
    } DW3;


    // dw 4
    union
    {
        struct
        {
            dw   LumaIntraPredModes0     : 16;   // AVC only
            dw   LumaIntraPredModes1     : 16;   // AVC only
        } Intra;
        struct
        {
            dw   SubMbShape              : 8;    // Indicates sub-block partitioning for each 8x8 sub-block
            dw   SubMbPredModes          : 8;    // Indicates prediction mode for each 8x8 sub-block
            dw                           : 16;   // Reserved
        } Inter;
        struct
        {
            dw   Value;
        };
    } DW4;

    // dw 5
    union
    {
        struct
        {
            dw   LumaIntraPredModes2     : 16;   // AVC only
            dw   LumaIntraPredModes3     : 16;   // AVC only
        } Intra;
        struct
        {
            dw   FrameStorIDL0_0     : 8;
            dw   FrameStorIDL0_1     : 8;
            dw   FrameStorIDL0_2     : 8;
            dw   FrameStorIDL0_3     : 8;
        } Inter;
        struct
        {
            dw   Value;
        };
    } DW5;

    // dw 6
    union
    {
        struct
        {
            dw   MbIntraStruct           : 8;    // Indicates which neighbours can be used for intra-prediction
            dw                           : 24;   // Reserved
        } Intra;
        struct
        {
            dw   FrameStorIDL1_0     : 8;
            dw   FrameStorIDL1_1     : 8;
            dw   FrameStorIDL1_2     : 8;
            dw   FrameStorIDL1_3     : 8;
        } Inter;
        struct
        {
            dw   Value;
        };
    } DW6;

    // dw 7
    union
    {
        struct
        {
            dw   SubBlockCodeTypeY0      : 2;    // VC-1. Specifies if 8x8, 8x4, 4x8, 4x4
            dw   SubBlockCodeTypeY1      : 2;    // VC-1. Specifies if 8x8, 8x4, 4x8, 4x4
            dw   SubBlockCodeTypeY2      : 2;    // VC-1. Specifies if 8x8, 8x4, 4x8, 4x4
            dw   SubBlockCodeTypeY3      : 2;    // VC-1. Specifies if 8x8, 8x4, 4x8, 4x4
            dw   SubBlockCodeTypeU       : 2;    // VC-1. Specifies if 8x8, 8x4, 4x8, 4x4
            dw   SubBlockCodeTypeV       : 2;    // VC-1. Specifies if 8x8, 8x4, 4x8, 4x4
            dw                           : 8;
            dw   MvFieldSelect           : 4;    // Field polatity for VC-1 and MPEG2
            dw                           : 8;
        };
        struct
        {
            dw   Value;
        };
    } DW7;

    // dw 8-15 for inter MBs only
    union
    {
        struct
        {
            dw   MvFwd_x                : 16;   // x-component of fwd MV for 8x8 or 4x4 sub-block
            dw   MvFwd_y                : 16;   // y-component of fwd MV for 8x8 or 4x4 sub-block
            dw   MvBwd_x                : 16;   // x-component of bwd MV for 8x8 or 4x4 sub-block
            dw   MvBwd_y                : 16;   // y-component of bwd MV for 8x8 or 4x4 sub-block
        };
        struct
        {
            dw   Value[2];
        };
    } QW8[4];

} VADecStreamOutData;
#endif /*_AVC_STREAMOUT_DEMO_H_*/
