WebM VP8 Codec SDK
vpx/vpx_encoder.h
Go to the documentation of this file.
00001 /*
00002  *  Copyright (c) 2010 The WebM project authors. All Rights Reserved.
00003  *
00004  *  Use of this source code is governed by a BSD-style license
00005  *  that can be found in the LICENSE file in the root of the source
00006  *  tree. An additional intellectual property rights grant can be found
00007  *  in the file PATENTS.  All contributing project authors may
00008  *  be found in the AUTHORS file in the root of the source tree.
00009  */
00010 
00011 
00027 #ifdef __cplusplus
00028 extern "C" {
00029 #endif
00030 
00031 #ifndef VPX_ENCODER_H
00032 #define VPX_ENCODER_H
00033 #include "vpx_codec.h"
00034 
00035 
00044 #define VPX_ENCODER_ABI_VERSION (2 + VPX_CODEC_ABI_VERSION) 
00056 #define VPX_CODEC_CAP_PSNR  0x10000 
00066 #define VPX_CODEC_USE_PSNR  0x10000 
00073     typedef struct vpx_fixed_buf
00074     {
00075         void          *buf; 
00076         size_t         sz;  
00077     } vpx_fixed_buf_t; 
00085     typedef int64_t vpx_codec_pts_t;
00086 
00087 
00095     typedef uint32_t vpx_codec_frame_flags_t;
00096 #define VPX_FRAME_IS_KEY       0x1 
00097 #define VPX_FRAME_IS_DROPPABLE 0x2 
00100 #define VPX_FRAME_IS_INVISIBLE 0x4 
00110     enum vpx_codec_cx_pkt_kind
00111     {
00112         VPX_CODEC_CX_FRAME_PKT,    
00113         VPX_CODEC_STATS_PKT,       
00114         VPX_CODEC_PSNR_PKT,        
00115         VPX_CODEC_CUSTOM_PKT = 256 
00116     };
00117 
00118 
00124     typedef struct vpx_codec_cx_pkt
00125     {
00126         enum vpx_codec_cx_pkt_kind  kind; 
00127         union
00128         {
00129             struct
00130             {
00131                 void                    *buf;      
00132                 size_t                   sz;       
00133                 vpx_codec_pts_t          pts;      
00135                 unsigned long            duration; 
00137                 vpx_codec_frame_flags_t  flags;    
00138             } frame;  
00139             struct vpx_fixed_buf twopass_stats;  
00140             struct vpx_psnr_pkt
00141             {
00142                 unsigned int samples[4];  
00143                 uint64_t     sse[4];      
00144                 double       psnr[4];     
00145             } psnr;                       
00146             struct vpx_fixed_buf raw;     
00148             /* This packet size is fixed to allow codecs to extend this
00149              * interface without having to manage storage for raw packets,
00150              * i.e., if it's smaller than 128 bytes, you can store in the
00151              * packet list directly.
00152              */
00153             char pad[128 - sizeof(enum vpx_codec_cx_pkt_kind)]; 
00154         } data; 
00155     } vpx_codec_cx_pkt_t; 
00162     typedef struct vpx_rational
00163     {
00164         int num; 
00165         int den; 
00166     } vpx_rational_t; 
00170     enum vpx_enc_pass
00171     {
00172         VPX_RC_ONE_PASS,   
00173         VPX_RC_FIRST_PASS, 
00174         VPX_RC_LAST_PASS   
00175     };
00176 
00177 
00179     enum vpx_rc_mode
00180     {
00181         VPX_VBR, 
00182         VPX_CBR,  
00183         VPX_CQ   
00184     };
00185 
00186 
00195     enum vpx_kf_mode
00196     {
00197         VPX_KF_FIXED, 
00198         VPX_KF_AUTO,  
00199         VPX_KF_DISABLED = 0 
00200     };
00201 
00202 
00210     typedef long vpx_enc_frame_flags_t;
00211 #define VPX_EFLAG_FORCE_KF (1<<0)  
00220     typedef struct vpx_codec_enc_cfg
00221     {
00222         /*
00223          * generic settings (g)
00224          */
00225 
00233         unsigned int           g_usage;
00234 
00235 
00242         unsigned int           g_threads;
00243 
00244 
00253         unsigned int           g_profile;  
00264         unsigned int           g_w;
00265 
00266 
00274         unsigned int           g_h;
00275 
00276 
00289         struct vpx_rational    g_timebase;
00290 
00291 
00298         unsigned int           g_error_resilient;
00299 
00300 
00306         enum vpx_enc_pass      g_pass;
00307 
00308 
00321         unsigned int           g_lag_in_frames;
00322 
00323 
00324         /*
00325          * rate control settings (rc)
00326          */
00327 
00344         unsigned int           rc_dropframe_thresh;
00345 
00346 
00354         unsigned int           rc_resize_allowed;
00355 
00356 
00363         unsigned int           rc_resize_up_thresh;
00364 
00365 
00372         unsigned int           rc_resize_down_thresh;
00373 
00374 
00383         enum vpx_rc_mode       rc_end_usage;
00384 
00385 
00391         struct vpx_fixed_buf   rc_twopass_stats_in;
00392 
00393 
00398         unsigned int           rc_target_bitrate;
00399 
00400 
00401         /*
00402          * quantizer settings
00403          */
00404 
00405 
00414         unsigned int           rc_min_quantizer;
00415 
00416 
00425         unsigned int           rc_max_quantizer;
00426 
00427 
00428         /*
00429          * bitrate tolerance
00430          */
00431 
00432 
00439         unsigned int           rc_undershoot_pct;
00440 
00441 
00448         unsigned int           rc_overshoot_pct;
00449 
00450 
00451         /*
00452          * decoder buffer model parameters
00453          */
00454 
00455 
00465         unsigned int           rc_buf_sz;
00466 
00467 
00475         unsigned int           rc_buf_initial_sz;
00476 
00477 
00485         unsigned int           rc_buf_optimal_sz;
00486 
00487 
00488         /*
00489          * 2 pass rate control parameters
00490          */
00491 
00492 
00501         unsigned int           rc_2pass_vbr_bias_pct;       
00509         unsigned int           rc_2pass_vbr_minsection_pct;
00510 
00511 
00517         unsigned int           rc_2pass_vbr_maxsection_pct;
00518 
00519 
00520         /*
00521          * keyframing settings (kf)
00522          */
00523 
00530         enum vpx_kf_mode       kf_mode;
00531 
00532 
00540         unsigned int           kf_min_dist;
00541 
00542 
00550         unsigned int           kf_max_dist;
00551 
00552     } vpx_codec_enc_cfg_t; 
00577     vpx_codec_err_t vpx_codec_enc_init_ver(vpx_codec_ctx_t      *ctx,
00578                                            vpx_codec_iface_t    *iface,
00579                                            vpx_codec_enc_cfg_t  *cfg,
00580                                            vpx_codec_flags_t     flags,
00581                                            int                   ver);
00582 
00583 
00588 #define vpx_codec_enc_init(ctx, iface, cfg, flags) \
00589     vpx_codec_enc_init_ver(ctx, iface, cfg, flags, VPX_ENCODER_ABI_VERSION)
00590 
00591 
00611     vpx_codec_err_t  vpx_codec_enc_config_default(vpx_codec_iface_t    *iface,
00612             vpx_codec_enc_cfg_t  *cfg,
00613             unsigned int          usage);
00614 
00615 
00630     vpx_codec_err_t  vpx_codec_enc_config_set(vpx_codec_ctx_t            *ctx,
00631             const vpx_codec_enc_cfg_t  *cfg);
00632 
00633 
00645     vpx_fixed_buf_t *vpx_codec_get_global_headers(vpx_codec_ctx_t   *ctx);
00646 
00647 
00648 #define VPX_DL_REALTIME     (1)        
00650 #define VPX_DL_GOOD_QUALITY (1000000)  
00652 #define VPX_DL_BEST_QUALITY (0)        
00690     vpx_codec_err_t  vpx_codec_encode(vpx_codec_ctx_t            *ctx,
00691                                       const vpx_image_t          *img,
00692                                       vpx_codec_pts_t             pts,
00693                                       unsigned long               duration,
00694                                       vpx_enc_frame_flags_t       flags,
00695                                       unsigned long               deadline);
00696 
00697 
00741     vpx_codec_err_t vpx_codec_set_cx_data_buf(vpx_codec_ctx_t       *ctx,
00742             const vpx_fixed_buf_t *buf,
00743             unsigned int           pad_before,
00744             unsigned int           pad_after);
00745 
00746 
00770     const vpx_codec_cx_pkt_t *vpx_codec_get_cx_data(vpx_codec_ctx_t   *ctx,
00771             vpx_codec_iter_t  *iter);
00772 
00773 
00786     const vpx_image_t *vpx_codec_get_preview_frame(vpx_codec_ctx_t   *ctx);
00787 
00788 
00791 #endif
00792 #ifdef __cplusplus
00793 }
00794 #endif