dirac_encoder.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:17k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: dirac_encoder.h,v 1.1 2005/01/30 05:11:41 gabest Exp $ $Name:  $
  4. *
  5. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS" basis,
  13. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  14. * the specific language governing rights and limitations under the License.
  15. *
  16. * The Original Code is BBC Research and Development code.
  17. *
  18. * The Initial Developer of the Original Code is the British Broadcasting
  19. * Corporation.
  20. * Portions created by the Initial Developer are Copyright (C) 2004.
  21. * All Rights Reserved.
  22. *
  23. * Contributor(s): Anuradha Suraparaju (Original Author)
  24. *
  25. * Alternatively, the contents of this file may be used under the terms of
  26. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  27. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  28. * the GPL or the LGPL are applicable instead of those above. If you wish to
  29. * allow use of your version of this file only under the terms of the either
  30. * the GPL or LGPL and not to allow others to use your version of this file
  31. * under the MPL, indicate your decision by deleting the provisions above
  32. * and replace them with the notice and other provisions required by the GPL
  33. * or LGPL. If you do not delete the provisions above, a recipient may use
  34. * your version of this file under the terms of any one of the MPL, the GPL
  35. * or the LGPL.
  36. * ***** END LICENSE BLOCK ***** */
  37. #ifndef DIRAC_ENCODER_H
  38. #define DIRAC_ENCODER_H
  39. #include <libdirac_common/dirac_types.h>
  40. /*! file
  41. brief C interface to Dirac Encoder.
  42.  
  43.  A set of 'C' functions that define the public interface to the Dirac encoder.
  44.  Refer to the the reference encoder source code, encoder/encmain.cpp for
  45.  an example of how to use the "C" interface. The pseudocode below gives
  46.  a brief description of the "C" interface usage.
  47. verbatim
  48.  #include <libdirac_decoder/dirac_encoder.h>
  49.  #define ENCBUF_SIZE 1024*1024;
  50.  unsigned char *buffer, enc_buf[ENC_BUFSIZE];
  51.  int buffer_size;
  52.  dirac_encoder_t *encoder;
  53.  dirac_encoder_context_t enc_ctx;
  54.  // Initialse the encoder context with the presets for SD576 - Standard
  55.  // Definition Digital
  56.  dirac_encoder_context_init (&enc_ctx, SD576);
  57.  // Override parameters if required
  58.  // interlace : 1 - interlaced; 0 - progressive
  59.  enc_ctx.seq_params.interlace = 0;
  60.  enc_ctx.seq_params.topfieldfirst = 0;
  61.  enc_ctx.enc_params.qf = 7.5;
  62.  // disable instrumentation flag
  63.  enc_ctx.instr_flag = 0;
  64.  // return locally decoded output
  65.  enc_ctx.decode_flag = 1;
  66.  // Initialise the encoder with the encoder context. 
  67.  // Setting verbose output to false
  68.  encoder= dirac_encoder_init(&enc_ctx, false);
  69.  // Set the buffer size. For SD576 4:2:0 chroma
  70.  buffer_size = (720*576*3)/2;
  71.  buffer = (unsigned char *)malloc (buffer_size);
  72.  // Output buffer
  73.  dirac_encoder_state_t state;
  74.  while (read uncompressed frame data into buffer)
  75.  {
  76.     // load one frame of data into encoder
  77.      if (dirac_encoder_load(encoder, buffer, buffer_size) == 0)
  78.     {
  79.         // Retrieve encoded frames from encoder
  80.         do
  81.         {
  82.             encoder->enc_buf.buffer = enc_buf;
  83.             encoder->enc_buf.size = ENCBUF_SIZE;
  84.             state = dirac_encoder_output (encoder);
  85.             switch (state)
  86.             {
  87.             case ENC_STATE_AVAIL:
  88.                  // Encoded frame available in encoder->enc_buf
  89.                  // Encoded frame params available in enccoder->enc_fparams
  90.                  // Encoded frame stats available in enccoder->enc_fstats
  91.                  break;
  92.             case ENC_STATE_BUFFER:
  93.                 break;
  94.             case ENC_STATE_INVALID:
  95.             default:
  96.                 // Unrecoverable error encountered. Exit;
  97.                 exit (exit code);
  98.             }
  99.             if (encoder->decoded_frame_avail)
  100.             {
  101.                 //locally decoded frame is available in 
  102.                 //encoder->dec_buf
  103.                 //locally decoded frame parameters available
  104.                 //in encoder->dec_fparams
  105.             }
  106.             if (encoder->instr_data_avail)
  107.             {
  108.                 //Instrumentation data (motion vectors etc.)
  109.                 //available in encoder->instr
  110.             }
  111.         } while (state == ENC_STATE_AVAIL)
  112.     }
  113.  }
  114.  // Retrieve end of sequence info
  115.  encoder->enc_buf.buffer = video_buf;
  116.  encoder->enc_buf.size = VIDEO_BUFFER_SIZE;
  117.  dirac_encoder_end_sequence( encoder );
  118.  // End of sequence info is availale in encoder->enc_buf
  119.  // Sequence statistics available in encoder->enc_seqstats;
  120.  // Free the encoder resources
  121.  dirac_encoder_close(encoder)
  122.  // Free the uncompressed data buffer
  123.  free (buffer);
  124.  endverbatim
  125. */
  126. #ifdef __cplusplus
  127. extern "C" {
  128. #endif
  129. /*! Enumerated type that defines encoder state */
  130. typedef enum
  131.     ENC_STATE_INVALID = -1, 
  132.     ENC_STATE_BUFFER, 
  133.     ENC_STATE_AVAIL
  134. } dirac_encoder_state_t ;
  135. /*! Enumerated type that defines encoder presets that set the encoder and
  136.     sequence paramters.  More presets may be added in future*/
  137. typedef enum
  138. {
  139.     CIF, 
  140.     SD576, 
  141.     HD720, 
  142.     HD1080
  143. } dirac_encoder_presets_t;
  144. /*! Structure that holds the encoder specific parameters */
  145. typedef struct 
  146. {
  147.     /*! Quality factor 0.0 to 10.0 */
  148.     float qf;
  149.     /*! The separation between L1 frames */
  150.     int L1_sep;
  151.     /*! The number of L1 frames before the next intra frame. Together
  152.         with L1_sep determines the GOP structure.
  153.     */
  154.     int num_L1;
  155.     /*! Normalised viewing distance parameter, in cycles per degree */
  156.     float cpd;
  157.     /*! The width of blocks used for motion compensation */
  158.     int xblen;
  159.     /*! The height of blocks used for motion compensation */
  160.     int yblen;
  161.     /*! The horizontal separation between blocks. Always <xblen */
  162.     int xbsep;
  163.     /*! The vertical separation between blocks. Always <yblen */
  164.     int ybsep;
  165. } dirac_encparams_t;
  166. /*! Structure that holds the parameters that set up the encoder context */
  167. typedef struct
  168. {
  169.     /*! Sequence parameters */
  170.     dirac_seqparams_t seq_params;
  171.     /*! Encoder parameters */
  172.     dirac_encparams_t enc_params;
  173.     /*! Return diagnostics info 1-return mv data, 0-no diagnostics returned */
  174.     int instr_flag;
  175.     /*! Return locally decoded frames  1-return locally decoded frames, 
  176.                                        0-no decoded frames returned */
  177.     int decode_flag;
  178. } dirac_encoder_context_t;
  179. /*! Function that creates an encoder context based on a preset value. The
  180.     values can then be overridden by the user by setting each field separately
  181.     param   enc_ctx    pointer to Encoder context tp be initialised.
  182.     param   preset     Preset to be used to initialise the encoder context
  183.     verbatim
  184.      The sequence parameters and encoder parameters are initialised as follows
  185.      Sequence Parameters:
  186.      Preset           Field          Value
  187.      CIF              width          352
  188.                       height         288
  189.                       chroma         Planar YUV 4:2:0
  190.                       chroma_width   calculated from width and chroma
  191.                       chroma_height  calculated from height and chroma
  192.                       frame_rate     13/1
  193.                       interlace      0 (progressive)
  194.                       topfieldfirst  0 
  195.      SD576            width          720
  196.                       height         576
  197.                       chroma         Planar YUV 4:2:0
  198.                       chroma_width   calculated from width and chroma
  199.                       chroma_height  calculated from height and chroma
  200.                       frame_rate     25/1
  201.                       interlace      1 (interlaced)
  202.                       topfieldfirst  1 
  203.      HD720            width          1280
  204.                       height         720
  205.                       chroma         Planar YUV 4:2:0
  206.                       chroma_width   calculated from width and chroma
  207.                       chroma_height  calculated from height and chroma
  208.                       frame_rate     50/1
  209.                       interlace      0 (progressive)
  210.                       topfieldfirst  0 
  211.      HD1080           width          1920
  212.                       height         1080
  213.                       chroma         Planar YUV 4:2:0
  214.                       chroma_width   calculated from width and chroma
  215.                       chroma_height  calculated from height and chroma
  216.                       frame_rate     25/1
  217.                       interlace      1 (interlaced)
  218.                       topfieldfirst  1 
  219.      Encoder params:
  220.      Preset           Field          Value
  221.      CIF              qf             7
  222.                       L1_sep         3
  223.                       num_L1         11
  224.                       cpd            20.0
  225.                       xblen          12
  226.                       yblen          12
  227.                       xbsep          8
  228.                       ybsep          8
  229.      SD576            qf             7
  230.                       L1_sep         3
  231.                       num_L1         3
  232.                       cpd            32.0
  233.                       xblen          12
  234.                       yblen          12
  235.                       xbsep          8
  236.                       ybsep          8
  237.      HD720            qf             7
  238.                       L1_sep         3
  239.                       num_L1         7
  240.                       cpd            20.0
  241.                       xblen          16
  242.                       yblen          16
  243.                       xbsep          10
  244.                       ybsep          12
  245.      HD1080           qf             7
  246.                       L1_sep         3
  247.                       num_L1         3
  248.                       cpd            32.0
  249.                       xblen          20
  250.                       yblen          20
  251.                       xbsep          16
  252.                       ybsep          16
  253.     endverbatim
  254. */
  255. extern DllExport void dirac_encoder_context_init (dirac_encoder_context_t *enc_ctx, dirac_encoder_presets_t preset);
  256. /*! Structure that holds the encoded data*/
  257. typedef struct
  258. {
  259.     /*! Buffer to hold encoded.  Allocated and managed by library user. */
  260.     unsigned char *buffer;
  261.     /*! Buffer size */
  262.     int size;
  263. } dirac_enc_data_t;
  264. /*! Structure that holds the statistics about the encoded frame */
  265. typedef struct
  266. {
  267.     /*! Number of motion vector bits */
  268.     unsigned int mv_bits;
  269.     /*! Number of motion vector header bits */
  270.     unsigned int mv_hdr_bits;
  271.     /*! Number of  used to encode y component */
  272.     unsigned int ycomp_bits;
  273.     /*! y component header bits*/
  274.     unsigned int ycomp_hdr_bits;
  275.     /*! Number of  used to encode u component */
  276.     unsigned int ucomp_bits;
  277.     /*! v component header bits*/
  278.     unsigned int ucomp_hdr_bits;
  279.     /*! Number of  used to encode v component */
  280.     unsigned int vcomp_bits;
  281.     /*! v component header bits*/
  282.     unsigned int vcomp_hdr_bits;
  283.     /*! Total number of bits used to encode frame */
  284.     unsigned int frame_bits;
  285.     /*! Number of frame header bits */
  286.     unsigned int frame_hdr_bits;
  287. } dirac_enc_framestats_t;
  288. /*! Structure that holds the statistics about the encoded sequence */
  289. typedef struct
  290. {
  291.     /*! Number of motion vector bits */
  292.     unsigned int mv_bits;
  293.     /*! Total number of bits used to encode sequence */
  294.     unsigned int seq_bits;
  295.     /*! Number of sequence header bits */
  296.     unsigned int seq_hdr_bits;
  297.     /*! Number of  used to encode y component */
  298.     unsigned int ycomp_bits;
  299.     /*! Number of  used to encode u component */
  300.     unsigned int ucomp_bits;
  301.     /*! Number of  used to encode v component */
  302.     unsigned int vcomp_bits;
  303.     /*! Average bit rate for the sequence */
  304.     unsigned int bit_rate;
  305. } dirac_enc_seqstats_t;
  306. /*! Structure that holds the motion vector information */
  307. typedef struct
  308. {
  309.     /*! X component */
  310.     int x;
  311.     /*! Y component */
  312.     int y;
  313. } dirac_mv_t;
  314. /*! Structure that holds the motion vector cost information*/
  315. typedef struct
  316. {
  317.     /*! The Sum of Absolute Differences */
  318.     float SAD;
  319.     /*! The (Lagrangian-weighted) motion vector cost */
  320.     float mvcost;
  321. } dirac_mv_cost_t;
  322. /*! Structure that diagnostics data returned by the encoder */
  323. typedef struct
  324. {
  325.     /*! Frame type */
  326.     dirac_frame_type_t ftype;
  327.     /*! Frame number */
  328.     int fnum;
  329.     /*! Number of reference frames */
  330.     int num_refs;
  331.     /*! Array of Reference frame numbers */
  332.     int refs[2];
  333.     /*! Block separation in X direction */
  334.     int xbsep;
  335.     /*! Block separation in Y direction */
  336.     int ybsep;
  337.     /*! MacroBlock length in X direction */
  338.     int mb_xlen;
  339.     /*! MacroBlock length in Y direction */
  340.     int mb_ylen;
  341.     /*! Motion Vector array length in X direction */
  342.     int mv_xlen;
  343.     /*! Motion Vector array length in Y direction */
  344.     int mv_ylen;
  345.     /*! Macro-block split mode array - mb_ylen*mb_xlen*/
  346.     int *mb_split_mode;
  347.     /*! Macro-block common mode array - mb_ylen*mb_xlen*/
  348.     int *mb_common_mode;
  349.     /*! Macro-block costs array - mb_ylen*mb_xlen*/
  350.     float *mb_costs;
  351.     /*! Block prediction mode - mv_xlen*mv_ylen */
  352.     int *pred_mode;
  353.     /*! Block intrac costs - mv_xlen*mv_ylen */
  354.     float *intra_costs;
  355.     /*! Bi prediction costs - mv_xlen*mv_ylen*2 */
  356.     dirac_mv_cost_t *bipred_costs;
  357.     /*! DC values of y_comp */
  358.     short *dc_ycomp;
  359.     /*! DC values of u_comp */
  360.     short *dc_ucomp;
  361.     /*! DC values of v_comp */
  362.     short *dc_vcomp;
  363.     /*! Motion vectors for Reference frames mv_ylen*mv_xlen */
  364.     dirac_mv_t *mv[2];
  365.     /*! Predictions costs for Reference frames mv_ylen*mv_xlen */
  366.     dirac_mv_cost_t *pred_costs[2];
  367. } dirac_instr_t;
  368. /*! Structure that holds the information returned by the encoder */
  369. typedef struct
  370. {
  371.     /*! Encoder context */
  372.     dirac_encoder_context_t enc_ctx;
  373.     /*! encoded frame avail flag */
  374.     int encoded_frame_avail;
  375.     /*! 
  376.         encoded output. This buffer must be initialised by the user of the
  377.         library
  378.     */
  379.     dirac_enc_data_t enc_buf;
  380.     /*! encoded frame params */
  381.     dirac_frameparams_t enc_fparams;
  382.     /*! encoded frame stats */
  383.     dirac_enc_framestats_t enc_fstats;
  384.     /*! encoded frame stats */
  385.     dirac_enc_seqstats_t enc_seqstats;
  386.     /*! end of sequence */
  387.     int end_of_sequence;
  388.     /* locally decoded frame available flag. 
  389.        1 - locally decoded frame available in dec_buf. 
  390.        0 - locally decoded frame not available.
  391.     */
  392.     int decoded_frame_avail;
  393.     /*! 
  394.        locally decoded output buffer. This buffer is allocated and managed by 
  395.        the encoder library
  396.     */
  397.     dirac_framebuf_t dec_buf;
  398.     /*! locally decoded frame params */
  399.     dirac_frameparams_t dec_fparams;
  400.     /*! 
  401.        instrumentation data buffer. This buffer is allocated and managed by 
  402.        the encoder library. */
  403.     dirac_instr_t instr;
  404.     /*! instrumentation data available flag
  405.        1 - instrumentation data available in instr
  406.        0 - linstrumentation data not available.
  407.     */
  408.     int instr_data_avail;
  409.     /*! void pointer to internal sequence compressor */
  410.     const void *compressor;
  411. } dirac_encoder_t;
  412. /*!
  413.     Initialise encoder. Makes a copy of the enc_ctx passed to it.
  414.     param   enc_ctx    Parameters to initialise encoder context
  415.     param   verbose    boolean flag to set verbose output
  416.     return  encoder    Handle to encoder if successful or NULL on failure
  417. */
  418. extern DllExport dirac_encoder_t *dirac_encoder_init (const dirac_encoder_context_t *enc_ctx, int verbose);
  419. /*!
  420.     Load uncompressed data into the encoder. Expects one full frame of data
  421.     param   encoder         Encoder Handle
  422.     param   uncdata         Uncompressed data buffer
  423.     param   uncdata_size    boolean flag to set verbose output
  424.     return                  return status. >0 - successful; -1 failed
  425.                              Failure may be due to input data size not matching
  426.                              the required frame size.
  427. */
  428. extern DllExport int dirac_encoder_load (dirac_encoder_t *encoder, unsigned char *uncdata, int uncdata_size);
  429. /*!
  430.     Retrieve an encoded frame from the encoder. Returns the state of the
  431.     encoder. The encoder buffer enc_buf in the encodermust be
  432.     set up with the buffer and buffer_size that will hold the encoded frame
  433.     param   encoder         Encoder Handle
  434.     return                  ENC_STATE_INVALID - unrecoverable error
  435.                              ENC_STATE_BUFFER - load data into encoder
  436.                              ENC_STATE_AVAIL - Encoded frame available
  437. */
  438. extern DllExport dirac_encoder_state_t dirac_encoder_output (dirac_encoder_t *encoder);
  439. /*!
  440.     Retrieve end of sequence information from the encoder. The encoder buffer,
  441.     enc_buf, in the encodermust be set up with the buffer and 
  442.     buffer_size that will hold the end of sequence information.
  443.     param   encoder         Encoder Handle
  444.     return                  return status. >=0 - successful; -1 failed
  445. */
  446. extern DllExport int dirac_encoder_end_sequence (dirac_encoder_t *encoder);
  447. /*!
  448.     Free resources held by encoder
  449.     param   encoder         Encoder Handle
  450. */
  451. extern DllExport void dirac_encoder_close (dirac_encoder_t *encoder);
  452. #endif
  453. #ifdef __cplusplus
  454. }
  455. #endif