Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright (c) 2007-2012 Intel Corporation. All Rights Reserved.
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the
  6.  * "Software"), to deal in the Software without restriction, including
  7.  * without limitation the rights to use, copy, modify, merge, publish,
  8.  * distribute, sub license, and/or sell copies of the Software, and to
  9.  * permit persons to whom the Software is furnished to do so, subject to
  10.  * the following conditions:
  11.  *
  12.  * The above copyright notice and this permission notice (including the
  13.  * next paragraph) shall be included in all copies or substantial portions
  14.  * of the Software.
  15.  *
  16.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  17.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  18.  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  19.  * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
  20.  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  21.  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  22.  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  23.  */
  24.  
  25. /**
  26.  * \file va_enc_vp8.h
  27.  * \brief VP8 encoding API
  28.  *
  29.  * This file contains the \ref api_enc_vp8 "VP8 encoding API".
  30.  */
  31.  
  32. #ifndef VA_ENC_VP8_H
  33. #define VA_ENC_VP8_H
  34.  
  35. #ifdef __cplusplus
  36. extern "C" {
  37. #endif
  38.  
  39. /**
  40.  * \defgroup api_enc_vp8 VP8 encoding API
  41.  *
  42.  * @{
  43.  */
  44.  
  45. /**
  46.  * \brief VP8 Encoding Sequence Parameter Buffer Structure
  47.  *
  48.  * This structure conveys sequence level parameters.
  49.  *
  50.  */
  51. typedef struct  _VAEncSequenceParameterBufferVP8
  52. {
  53.     /* frame width in pixels */
  54.     unsigned int frame_width;
  55.     /* frame height in pixels */
  56.     unsigned int frame_height;
  57.     /* horizontal scale */
  58.     unsigned int frame_width_scale;
  59.     /* vertical scale */
  60.     unsigned int frame_height_scale;
  61.  
  62.     /* whether to enable error resilience features */
  63.     unsigned int error_resilient;
  64.     /* auto keyframe placement, non-zero means enable auto keyframe placement */
  65.     unsigned int kf_auto;
  66.     /* keyframe minimum interval */
  67.     unsigned int kf_min_dist;
  68.     /* keyframe maximum interval */
  69.     unsigned int kf_max_dist;
  70.  
  71.  
  72.     /* RC related fields. RC modes are set with VAConfigAttribRateControl */
  73.     /* For VP8, CBR implies HRD conformance and VBR implies no HRD conformance */
  74.  
  75.     /**
  76.      * Initial bitrate set for this sequence in CBR or VBR modes.
  77.      *
  78.      * This field represents the initial bitrate value for this
  79.      * sequence if CBR or VBR mode is used, i.e. if the encoder
  80.      * pipeline was created with a #VAConfigAttribRateControl
  81.      * attribute set to either \ref VA_RC_CBR or \ref VA_RC_VBR.
  82.      *
  83.      * The bitrate can be modified later on through
  84.      * #VAEncMiscParameterRateControl buffers.
  85.      */
  86.     unsigned int bits_per_second;
  87.     /* Period between I frames. */
  88.     unsigned int intra_period;
  89.  
  90.     /* reference and reconstructed frame buffers
  91.      * Used for driver auto reference management when configured through
  92.      * VAConfigAttribEncAutoReference.
  93.      */
  94.     VASurfaceID reference_frames[4];
  95.  
  96. } VAEncSequenceParameterBufferVP8;
  97.  
  98.  
  99. /**
  100.  * \brief VP8 Encoding Picture Parameter Buffer Structure
  101.  *
  102.  * This structure conveys picture level parameters.
  103.  *
  104.  */
  105. typedef struct  _VAEncPictureParameterBufferVP8
  106. {
  107.     /* surface to store reconstructed frame  */
  108.     VASurfaceID reconstructed_frame;
  109.  
  110.     /*
  111.      * surfaces to store reference frames in non auto reference mode
  112.      * VA_INVALID_SURFACE can be used to denote an invalid reference frame.
  113.      */
  114.     VASurfaceID ref_last_frame;
  115.     VASurfaceID ref_gf_frame;
  116.     VASurfaceID ref_arf_frame;
  117.  
  118.     /* buffer to store coded data */
  119.     VABufferID coded_buf;
  120.  
  121.     union {
  122.         struct {
  123.             /* force this frame to be a keyframe */
  124.             unsigned int force_kf                       : 1;
  125.             /* don't reference the last frame */
  126.             unsigned int no_ref_last                    : 1;
  127.             /* don't reference the golden frame */
  128.             unsigned int no_ref_gf                      : 1;
  129.             /* don't reference the alternate reference frame */
  130.             unsigned int no_ref_arf                     : 1;
  131.             unsigned int reserved                       : 28;
  132.         } bits;
  133.         unsigned int value;
  134.     } ref_flags;
  135.  
  136.     union {
  137.         struct {
  138.             /* version */
  139.             unsigned int frame_type                     : 1;
  140.             unsigned int version                        : 3;
  141.             /* show_frame */
  142.             unsigned int show_frame                     : 1;
  143.             /* color_space */                                              
  144.             unsigned int color_space                    : 1;
  145.             /*  0: bicubic, 1: bilinear, other: none */
  146.             unsigned int recon_filter_type              : 2;
  147.             /*  0: no loop fitler, 1: simple loop filter */
  148.             unsigned int loop_filter_type               : 2;
  149.             /* 0: disabled, 1: normal, 2: simple */
  150.             unsigned int auto_partitions                : 1;
  151.             /* number of token partitions */
  152.             unsigned int num_token_partitions           : 2;
  153.  
  154.             /**
  155.              * The following fields correspond to the same VP8 syntax elements
  156.              * in the frame header.
  157.              */
  158.             /**
  159.              * 0: clamping of reconstruction pixels is disabled,
  160.              * 1: clamping enabled.
  161.              */
  162.             unsigned int clamping_type                  : 1;
  163.             /* indicate segmentation is enabled for the current frame. */
  164.             unsigned int segmentation_enabled           : 1;
  165.             /**
  166.              * Determines if the MB segmentation map is updated in the current
  167.              * frame.
  168.              */
  169.             unsigned int update_mb_segmentation_map     : 1;
  170.             /**
  171.              * Indicates if the segment feature data is updated in the current
  172.              * frame.
  173.              */
  174.             unsigned int update_segment_feature_data    : 1;
  175.             /**
  176.              * indicates if the MB level loop filter adjustment is enabled for
  177.              * the current frame (0 off, 1 on).  
  178.              */
  179.             unsigned int loop_filter_adj_enable         : 1;
  180.             /**
  181.              * Determines whether updated token probabilities are used only for
  182.              * this frame or until further update.
  183.              * It may be used by application to enable error resilient mode.
  184.              * In this mode probability updates are allowed only at Key Frames.
  185.              */
  186.             unsigned int refresh_entropy_probs          : 1;
  187.             /**
  188.              * Determines if the current decoded frame refreshes the golden frame.
  189.              */
  190.             unsigned int refresh_golden_frame           : 1;
  191.             /**
  192.              * Determines if the current decoded frame refreshes the alternate
  193.              * reference frame.
  194.              */
  195.             unsigned int refresh_alternate_frame        : 1;
  196.             /**
  197.              * Determines if the current decoded frame refreshes the last frame
  198.              * reference buffer.
  199.              */
  200.             unsigned int refresh_last                   : 1;
  201.             /**
  202.              * Determines if the golden reference is replaced by another reference.
  203.              */
  204.             unsigned int copy_buffer_to_golden          : 2;
  205.             /**
  206.              * Determines if the alternate reference is replaced by another reference.
  207.              */
  208.             unsigned int copy_buffer_to_alternate       : 2;
  209.             /**
  210.              * Controls the sign of motion vectors when the golden frame is referenced.  
  211.              */
  212.             unsigned int sign_bias_golden               : 1;
  213.             /**
  214.              * Controls the sign of motion vectors when the alternate frame is
  215.              * referenced.
  216.              */
  217.             unsigned int sign_bias_alternate            : 1;
  218.             /**
  219.              * Enables or disables the skipping of macroblocks containing no
  220.              * non-zero coefficients.
  221.              */
  222.             unsigned int mb_no_coeff_skip               : 1;
  223.             /**
  224.              * Enforces unconditional per-MB loop filter delta update setting frame
  225.              * header flags mode_ref_lf_delta_update, all mb_mode_delta_update_flag[4],
  226.              * and all ref_frame_delta_update_flag[4] to 1.
  227.              * Since loop filter deltas are not automatically refreshed to default
  228.              * values at key frames, dropped frame with delta update may prevent
  229.              * correct decoding from the next key frame.
  230.              * Encoder application is advised to set this flag to 1 at key frames.
  231.              */
  232.             unsigned int forced_lf_adjustment           : 1;
  233.             unsigned int reserved                       : 2;
  234.         } bits;
  235.         unsigned int value;
  236.     } pic_flags;
  237.  
  238.     /**
  239.      * Contains a list of 4 loop filter level values (updated value if applicable)
  240.      * controlling the deblocking filter strength. Each entry represents a segment.
  241.      * When segmentation is disabled, use entry 0.
  242.      * When loop_filter_level is 0, loop filter shall be disabled.
  243.      */
  244.     char loop_filter_level[4];
  245.  
  246.     /**
  247.      * Contains a list of 4 delta values for reference frame based MB-level
  248.      * loop filter adjustment.  
  249.      * If no update, then set to 0.
  250.      */
  251.     char ref_lf_delta[4];
  252.  
  253.     /**
  254.      * Contains a list of 4 delta values for coding mode based MB-level loop
  255.      * filter adjustment.  
  256.      * If no update, then set to 0.
  257.      */
  258.     char mode_lf_delta[4];
  259.        
  260.     /**
  261.      * Controls the deblocking filter sensitivity.
  262.      * Corresponds to the same VP8 syntax element in frame header.
  263.      */
  264.     unsigned char sharpness_level;
  265.        
  266.     /**
  267.      * Application supplied maximum clamp value for Qindex used in quantization.  
  268.      * Qindex will not be allowed to exceed this value.  
  269.      * It has a valid range [0..127] inclusive.  
  270.      */
  271.     unsigned char clamp_qindex_high;
  272.        
  273.     /**
  274.      * Application supplied minimum clamp value for Qindex used in quantization.  
  275.      * Qindex will not be allowed to be lower than this value.  
  276.      * It has a valid range [0..127] inclusive.  
  277.      * Condition clamp_qindex_low <= clamp_qindex_high must be guaranteed,
  278.      * otherwise they are ignored.
  279.      */
  280.     unsigned char clamp_qindex_low;
  281.        
  282. } VAEncPictureParameterBufferVP8;
  283.  
  284.  
  285. /**
  286.  * \brief VP8 MB Segmentation ID Buffer
  287.  *
  288.  * application provides buffer containing the initial segmentation id for each
  289.  * MB, in raster scan order. Rate control may reassign it.
  290.  * For an 640x480 video, the buffer has 1200 entries.
  291.  * the value of each entry should be in the range [0..3], inclusive.
  292.  * If segmentation is not enabled, application does not need to provide it.
  293.  */
  294. typedef struct _VAEncMBMapBufferVP8
  295. {
  296.     /**
  297.      * number of MBs in the frame.
  298.      * It is also the number of entries of mb_segment_id[];
  299.      */
  300.     unsigned int num_mbs;
  301.     /**
  302.      * per MB Segmentation ID Buffer
  303.      */
  304.     unsigned char *mb_segment_id;
  305. } VAEncMBMapBufferVP8;
  306.  
  307.  
  308. /**
  309.  * \brief VP8 Quantization Matrix Buffer Structure
  310.  *
  311.  * Contains quantization index for yac(0-3) for each segment and quantization
  312.  * index deltas, ydc(0), y2dc(1), y2ac(2), uvdc(3), uvac(4) that are applied
  313.  * to all segments.  When segmentation is disabled, only quantization_index[0]
  314.  * will be used. This structure is sent once per frame.
  315.  */
  316. typedef struct _VAQMatrixBufferVP8
  317. {
  318.     unsigned short quantization_index[4];
  319.     short quantization_index_delta[5];
  320. } VAQMatrixBufferVP8;
  321.  
  322.  
  323.  
  324. /**@}*/
  325.  
  326. #ifdef __cplusplus
  327. }
  328. #endif
  329.  
  330. #endif /* VA_ENC_VP8_H */
  331.