text: /*  
      This file is provided under a dual BSD/GPLv2 license.  When using or 
      redistributing this file, you may do so under either license.
      
      GPL LICENSE SUMMARY
      
      Copyright(c) 2007-2009 Intel Corporation. All rights reserved.
      
      This program is free software; you can redistribute it and/or modify 
      it under the terms of version 2 of the GNU General Public License as
      published by the Free Software Foundation.
  
      This program is distributed in the hope that it will be useful, but 
      WITHOUT ANY WARRANTY; without even the implied warranty of 
      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
      General Public License for more details.
  
      You should have received a copy of the GNU General Public License 
      along with this program; if not, write to the Free Software 
      Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
      The full GNU General Public License is included in this distribution 
      in the file called LICENSE.GPL.
  
      Contact Information:
  
      BSD LICENSE 
  
      Copyright(c) 2007-2009 Intel Corporation. All rights reserved.
      All rights reserved.
  
      Redistribution and use in source and binary forms, with or without 
      modification, are permitted provided that the following conditions 
      are met:
  
      * Redistributions of source code must retain the above copyright 
      notice, this list of conditions and the following disclaimer.
      * Redistributions in binary form must reproduce the above copyright 
      notice, this list of conditions and the following disclaimer in 
      the documentation and/or other materials provided with the 
      distribution.
      * Neither the name of Intel Corporation nor the names of its 
      contributors may be used to endorse or promote products derived 
      from this software without specific prior written permission.
  
      THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
      "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
      LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
      A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
      OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
      SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
      LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 
      DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 
      THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
      (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
      OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  
  */
  #ifndef VIDDEC_FW_FRAME_ATTR_H
  #define VIDDEC_FW_FRAME_ATTR_H
  
  #define VIDDEC_PANSCAN_MAX_OFFSETS 4
  #define VIDDEC_MAX_CPB_CNT 32
  
  /**
  This enumeration lists all the frame types defined by the MPEG, VC1 and H264 specifications.
  Frame types applicable to a single codec are specified in the comments.
  */
  typedef enum 
  {
      VIDDEC_FRAME_TYPE_INVALID=0,   /** Unknown type - default value */
      VIDDEC_FRAME_TYPE_IDR=0x1,       /** IDR frame - h264 only */
      VIDDEC_FRAME_TYPE_I=0x2,         /** I frame */
      VIDDEC_FRAME_TYPE_P=0x3,         /** P frame */
      VIDDEC_FRAME_TYPE_B=0x4,         /** B frame */
      VIDDEC_FRAME_TYPE_BI=0x5,        /** BI frame - Intracoded B frame - vc1 only */
      VIDDEC_FRAME_TYPE_SKIP=0x6,      /** Skipped frame - vc1 only */
      VIDDEC_FRAME_TYPE_D=0x7,         /** D frame - mpeg1 only */
      VIDDEC_FRAME_TYPE_S=0x8,         /** SVOP frame - mpeg4 only - sprite encoded frame - treat as P */
      VIDDEC_FRAME_TYPE_MAX,
  } viddec_frame_type_t;
  
  /**
  This structure contains the content size info extracted from the stream.
  */
  typedef struct viddec_rect_size
  {
      unsigned int width;
      unsigned int height;
  }viddec_rect_size_t;
  
  /**
  This structure contains MPEG2 specific pan scan offsets extracted from the stream.
  */
  typedef struct viddec_mpeg2_frame_center_offset
  {
      int horz;
      int vert;
  }viddec_mpeg2_frame_center_offset_t;
  
  /**
  This structure contains the MPEG2 specific frame attributes.
  */
  typedef struct viddec_mpeg2_frame_attributes
  {
      /**
      10 bit unsigned integer corresponding to the display order of each coded picture
      in the stream (or gop if gop header is present).
      Refer to "temporal_reference" of the picture header in ITU-T H.262 Specification.
      */
      unsigned int temporal_ref;
  
      /**
      Pan/Scan rectangle info
      Refer to the picture display extension in ITU-T H.262 Specification.
      */
      viddec_mpeg2_frame_center_offset_t frame_center_offset[VIDDEC_PANSCAN_MAX_OFFSETS];
      unsigned int number_of_frame_center_offsets;
  
      /**
      Top-Field first flag
      Refer to "top_field_first" of the picture coding extension in ITU-T H.262 Specification.
      */
      unsigned int top_field_first;
  
      /**
      Progressive frame flag - Indicates if current frame is progressive or not.
      Refer to "progressive_frame" of the picture coding extension in ITU-T H.262 Specification.
      */
      unsigned int progressive_frame;
  
      /**
      Frame/field polarity for each coded picture.
      Refer to Table 6-14 in ITU-T H.262 Specification.
      */
      unsigned int picture_struct;
  
      /**
      Repeat field/frame flag.
      Refer to "repeat_first_field" of the picture coding extension in ITU-T H.262 Specification.
      */
      unsigned int repeat_first_field;
  
  }viddec_mpeg2_frame_attributes_t;
  
  /**
  This structure contains MPEG2 specific pan scan offsets extracted from the stream.
  */
  typedef struct viddec_vc1_pan_scan_window
  {
      unsigned int hoffset;
      unsigned int voffset;
      unsigned int width;
      unsigned int height;
  }viddec_vc1_pan_scan_window_t;
  
  /**
  This structure contains the VC1 specific frame attributes.
  */
  typedef struct viddec_vc1_frame_attributes
  {
      /**
      Temporal Reference of frame/field.
      Refer to "TFCNTR" in the picture layer of the SMPTE VC1 Specification.
      */
      unsigned int tfcntr;
  
      /**
      Frame/field repeat information in the bitstream.
      Refer to "RPTFRM", "TFF", "BFF" in the picture layer 
      of the SMPTE VC1 Specification.
      */
      unsigned int rptfrm;
      unsigned int tff;
      unsigned int rff;
  
      /**
      Pan-scan information in the bitstream.
      Refer to "PANSCAN_FLAG" in the entrypoint layer, "PS_PRESENT", "PS_HOFFSET", "PS_VOFFSET", 
      "PS_WIDTH" and "PS_HEIGHT" in the picture layer of the SMPTE VC1 Specification.
      */
      unsigned int panscan_flag;
      unsigned int ps_present;
      unsigned int num_of_pan_scan_windows;
      viddec_vc1_pan_scan_window_t pan_scan_window[VIDDEC_PANSCAN_MAX_OFFSETS];
  
  }viddec_vc1_frame_attributes_t;
  
  /**
  This structure contains the H264 specific frame attributes.
  */
  typedef struct viddec_h264_frame_attributes
  {
  	/**
  	used_for_reference : 1 means this frame is used as ref frame of others. 0 means no any frame ref to this frame
  	*/	 
  	///// This flag hasn't been enable so far
  	unsigned int used_for_reference;
  
  
  	/** -   
  	Picture Order Count for the current frame/field.-    
  	This value is computed using information from the bitstream.-    
  	Refer to Section 8.2.1, function 8-1 of the ITU-T H.264 Specification.-   
  	*/
  	// These fileds will be supported in future
  	int top_field_poc;	
  	int bottom_field_poc;	
  
  	/**
  	Display size, which is cropped from content size. 
  	Currently, the cont_size is cropped, so this paramter is redundant, but in future, cont_size may be changed
  	*/	 
  	viddec_rect_size_t cropped_size;
  
  	/**
  	top_field_first: 0 means bottom_field_POC is smaller than top_field_POC, else 1
  	*/	 
  	unsigned int top_field_first;
  	
  	/**
  	field_frame_flag: 0 means all slice of this frame are frame-base encoded, else 1
  	*/	 
  	unsigned int field_pic_flag;
  
  }viddec_h264_frame_attributes_t;
  
  /**
  This structure contains the MPEG4 specific frame attributes.
  */
  typedef struct viddec_mpeg4_frame_attributes
  {
      /**
      Top-Field first flag
      Refer to "top_field_first" of the Video Object Plane of the MPEG4 Spec.
      */
      unsigned int top_field_first;
  
  }viddec_mpeg4_frame_attributes_t;
  
  /**
  This structure groups all the frame attributes that are exported by the firmware.
  The frame attributes are split into attributes that are common to all codecs and
  that are specific to codec type.
  As of this release, it is populated only for mpeg2 only.
  */
  typedef struct viddec_frame_attributes
  {
      /**
      Content size specified in the stream.
      For MPEG2, refer to "horizontal_size_value, vertical_size_value" of the sequence header and
      "horizontal_size_extension, vertical_size_extension" of the sequence extension in ITU-T H.262 Specification.
      For H264, refer to "pic_width_in_mbs_minus1" and "pic_height_in_map_units_minus1" of the 
      sequence parameter set in ITU-T H.264 Specification.
      For VC1, refer to "MAX_CODED_WIDTH" and "MAX_CODED_HEIGHT" in the sequence layer, 
      "CODED_SIZE_FLAG", "CODED_WIDTH" and "CODED_HEIGHT" in the entrypoint layer of the SMPTE VC1 Specification.
      */
      viddec_rect_size_t cont_size;
  
      /**
      Type of frame populated in the workload.
      frame_type contains the frame type for progressive frame and the field type for the top field for interlaced frames.
      bottom_field_type contains the field type for the bottom field for interlaced frames.
      For MPEG2, refer to "picture_coding_type" in picture header (Table 6-12) in ITU-T H.262 Specification.
      For H264, refer to "slice_type" in slice header (Table 7-6) in ITU-T H.264 Specification.
      For VC1, refer to "PTYPE" and FPTYPE in the picture layer (Tables 33, 34, 35, 105) in SMPTE VC1 Specification.
      */
      viddec_frame_type_t frame_type;
      viddec_frame_type_t bottom_field_type;
  
      /** Codec specific attributes */
      union
      {
          viddec_mpeg2_frame_attributes_t  mpeg2;
          viddec_vc1_frame_attributes_t    vc1;
          viddec_h264_frame_attributes_t   h264;
          viddec_mpeg4_frame_attributes_t  mpeg4;
      };
  
  }viddec_frame_attributes_t;
  
  #endif /* VIDDEC_FRAME_ATTR_H */
  