123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494 |
- /********************************************************************
- * *
- * THIS FILE IS PART OF THE OggTheora SOFTWARE CODEC SOURCE CODE. *
- * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS *
- * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
- * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING. *
- * *
- * THE Theora SOURCE CODE IS COPYRIGHT (C) 2002-2009 *
- * by the Xiph.Org Foundation http://www.xiph.org/ *
- * *
- ********************************************************************
- function:
- last mod: $Id: encint.h 16503 2009-08-22 18:14:02Z giles $
- ********************************************************************/
- #if !defined(_encint_H)
- # define _encint_H (1)
- # if defined(HAVE_CONFIG_H)
- # include "config.h"
- # endif
- # include "theora/theoraenc.h"
- # include "internal.h"
- # include "ocintrin.h"
- # include "mathops.h"
- # include "enquant.h"
- # include "huffenc.h"
- /*# define OC_COLLECT_METRICS*/
- typedef oc_mv oc_mv2[2];
- typedef struct oc_enc_opt_vtable oc_enc_opt_vtable;
- typedef struct oc_mb_enc_info oc_mb_enc_info;
- typedef struct oc_mode_scheme_chooser oc_mode_scheme_chooser;
- typedef struct oc_iir_filter oc_iir_filter;
- typedef struct oc_frame_metrics oc_frame_metrics;
- typedef struct oc_rc_state oc_rc_state;
- typedef struct th_enc_ctx oc_enc_ctx;
- typedef struct oc_token_checkpoint oc_token_checkpoint;
- /*Constants for the packet-out state machine specific to the encoder.*/
- /*Next packet to emit: Data packet, but none are ready yet.*/
- #define OC_PACKET_EMPTY (0)
- /*Next packet to emit: Data packet, and one is ready.*/
- #define OC_PACKET_READY (1)
- /*All features enabled.*/
- #define OC_SP_LEVEL_SLOW (0)
- /*Enable early skip.*/
- #define OC_SP_LEVEL_EARLY_SKIP (1)
- /*Disable motion compensation.*/
- #define OC_SP_LEVEL_NOMC (2)
- /*Maximum valid speed level.*/
- #define OC_SP_LEVEL_MAX (2)
- /*The bits used for each of the MB mode codebooks.*/
- extern const unsigned char OC_MODE_BITS[2][OC_NMODES];
- /*The bits used for each of the MV codebooks.*/
- extern const unsigned char OC_MV_BITS[2][64];
- /*The minimum value that can be stored in a SB run for each codeword.
- The last entry is the upper bound on the length of a single SB run.*/
- extern const ogg_uint16_t OC_SB_RUN_VAL_MIN[8];
- /*The bits used for each SB run codeword.*/
- extern const unsigned char OC_SB_RUN_CODE_NBITS[7];
- /*The bits used for each block run length (starting with 1).*/
- extern const unsigned char OC_BLOCK_RUN_CODE_NBITS[30];
- /*Encoder specific functions with accelerated variants.*/
- struct oc_enc_opt_vtable{
- unsigned (*frag_sad)(const unsigned char *_src,
- const unsigned char *_ref,int _ystride);
- unsigned (*frag_sad_thresh)(const unsigned char *_src,
- const unsigned char *_ref,int _ystride,unsigned _thresh);
- unsigned (*frag_sad2_thresh)(const unsigned char *_src,
- const unsigned char *_ref1,const unsigned char *_ref2,int _ystride,
- unsigned _thresh);
- unsigned (*frag_satd_thresh)(const unsigned char *_src,
- const unsigned char *_ref,int _ystride,unsigned _thresh);
- unsigned (*frag_satd2_thresh)(const unsigned char *_src,
- const unsigned char *_ref1,const unsigned char *_ref2,int _ystride,
- unsigned _thresh);
- unsigned (*frag_intra_satd)(const unsigned char *_src,int _ystride);
- void (*frag_sub)(ogg_int16_t _diff[64],const unsigned char *_src,
- const unsigned char *_ref,int _ystride);
- void (*frag_sub_128)(ogg_int16_t _diff[64],
- const unsigned char *_src,int _ystride);
- void (*frag_copy2)(unsigned char *_dst,
- const unsigned char *_src1,const unsigned char *_src2,int _ystride);
- void (*frag_recon_intra)(unsigned char *_dst,int _ystride,
- const ogg_int16_t _residue[64]);
- void (*frag_recon_inter)(unsigned char *_dst,
- const unsigned char *_src,int _ystride,const ogg_int16_t _residue[64]);
- void (*fdct8x8)(ogg_int16_t _y[64],const ogg_int16_t _x[64]);
- };
- void oc_enc_vtable_init(oc_enc_ctx *_enc);
- /*Encoder-specific macroblock information.*/
- struct oc_mb_enc_info{
- /*Neighboring macro blocks that have MVs available from the current frame.*/
- unsigned cneighbors[4];
- /*Neighboring macro blocks to use for MVs from the previous frame.*/
- unsigned pneighbors[4];
- /*The number of current-frame neighbors.*/
- unsigned char ncneighbors;
- /*The number of previous-frame neighbors.*/
- unsigned char npneighbors;
- /*Flags indicating which MB modes have been refined.*/
- unsigned char refined;
- /*Motion vectors for a macro block for the current frame and the
- previous two frames.
- Each is a set of 2 vectors against OC_FRAME_GOLD and OC_FRAME_PREV, which
- can be used to estimate constant velocity and constant acceleration
- predictors.
- Uninitialized MVs are (0,0).*/
- oc_mv2 analysis_mv[3];
- /*Current unrefined analysis MVs.*/
- oc_mv unref_mv[2];
- /*Unrefined block MVs.*/
- oc_mv block_mv[4];
- /*Refined block MVs.*/
- oc_mv ref_mv[4];
- /*Minimum motion estimation error from the analysis stage.*/
- ogg_uint16_t error[2];
- /*MB error for half-pel refinement for each frame type.*/
- unsigned satd[2];
- /*Block error for half-pel refinement.*/
- unsigned block_satd[4];
- };
- /*State machine to estimate the opportunity cost of coding a MB mode.*/
- struct oc_mode_scheme_chooser{
- /*Pointers to the a list containing the index of each mode in the mode
- alphabet used by each scheme.
- The first entry points to the dynamic scheme0_ranks, while the remaining 7
- point to the constant entries stored in OC_MODE_SCHEMES.*/
- const unsigned char *mode_ranks[8];
- /*The ranks for each mode when coded with scheme 0.
- These are optimized so that the more frequent modes have lower ranks.*/
- unsigned char scheme0_ranks[OC_NMODES];
- /*The list of modes, sorted in descending order of frequency, that
- corresponds to the ranks above.*/
- unsigned char scheme0_list[OC_NMODES];
- /*The number of times each mode has been chosen so far.*/
- int mode_counts[OC_NMODES];
- /*The list of mode coding schemes, sorted in ascending order of bit cost.*/
- unsigned char scheme_list[8];
- /*The number of bits used by each mode coding scheme.*/
- ptrdiff_t scheme_bits[8];
- };
- void oc_mode_scheme_chooser_init(oc_mode_scheme_chooser *_chooser);
- /*A 2nd order low-pass Bessel follower.
- We use this for rate control because it has fast reaction time, but is
- critically damped.*/
- struct oc_iir_filter{
- ogg_int32_t c[2];
- ogg_int64_t g;
- ogg_int32_t x[2];
- ogg_int32_t y[2];
- };
- /*The 2-pass metrics associated with a single frame.*/
- struct oc_frame_metrics{
- /*The log base 2 of the scale factor for this frame in Q24 format.*/
- ogg_int32_t log_scale;
- /*The number of application-requested duplicates of this frame.*/
- unsigned dup_count:31;
- /*The frame type from pass 1.*/
- unsigned frame_type:1;
- };
- /*Rate control state information.*/
- struct oc_rc_state{
- /*The target average bits per frame.*/
- ogg_int64_t bits_per_frame;
- /*The current buffer fullness (bits available to be used).*/
- ogg_int64_t fullness;
- /*The target buffer fullness.
- This is where we'd like to be by the last keyframe the appears in the next
- buf_delay frames.*/
- ogg_int64_t target;
- /*The maximum buffer fullness (total size of the buffer).*/
- ogg_int64_t max;
- /*The log of the number of pixels in a frame in Q57 format.*/
- ogg_int64_t log_npixels;
- /*The exponent used in the rate model in Q8 format.*/
- unsigned exp[2];
- /*The number of frames to distribute the buffer usage over.*/
- int buf_delay;
- /*The total drop count from the previous frame.
- This includes duplicates explicitly requested via the
- TH_ENCCTL_SET_DUP_COUNT API as well as frames we chose to drop ourselves.*/
- ogg_uint32_t prev_drop_count;
- /*The log of an estimated scale factor used to obtain the real framerate, for
- VFR sources or, e.g., 12 fps content doubled to 24 fps, etc.*/
- ogg_int64_t log_drop_scale;
- /*The log of estimated scale factor for the rate model in Q57 format.*/
- ogg_int64_t log_scale[2];
- /*The log of the target quantizer level in Q57 format.*/
- ogg_int64_t log_qtarget;
- /*Will we drop frames to meet bitrate target?*/
- unsigned char drop_frames;
- /*Do we respect the maximum buffer fullness?*/
- unsigned char cap_overflow;
- /*Can the reservoir go negative?*/
- unsigned char cap_underflow;
- /*Second-order lowpass filters to track scale and VFR.*/
- oc_iir_filter scalefilter[2];
- int inter_count;
- int inter_delay;
- int inter_delay_target;
- oc_iir_filter vfrfilter;
- /*Two-pass mode state.
- 0 => 1-pass encoding.
- 1 => 1st pass of 2-pass encoding.
- 2 => 2nd pass of 2-pass encoding.*/
- int twopass;
- /*Buffer for current frame metrics.*/
- unsigned char twopass_buffer[48];
- /*The number of bytes in the frame metrics buffer.
- When 2-pass encoding is enabled, this is set to 0 after each frame is
- submitted, and must be non-zero before the next frame will be accepted.*/
- int twopass_buffer_bytes;
- int twopass_buffer_fill;
- /*Whether or not to force the next frame to be a keyframe.*/
- unsigned char twopass_force_kf;
- /*The metrics for the previous frame.*/
- oc_frame_metrics prev_metrics;
- /*The metrics for the current frame.*/
- oc_frame_metrics cur_metrics;
- /*The buffered metrics for future frames.*/
- oc_frame_metrics *frame_metrics;
- int nframe_metrics;
- int cframe_metrics;
- /*The index of the current frame in the circular metric buffer.*/
- int frame_metrics_head;
- /*The frame count of each type (keyframes, delta frames, and dup frames);
- 32 bits limits us to 2.268 years at 60 fps.*/
- ogg_uint32_t frames_total[3];
- /*The number of frames of each type yet to be processed.*/
- ogg_uint32_t frames_left[3];
- /*The sum of the scale values for each frame type.*/
- ogg_int64_t scale_sum[2];
- /*The start of the window over which the current scale sums are taken.*/
- int scale_window0;
- /*The end of the window over which the current scale sums are taken.*/
- int scale_window_end;
- /*The frame count of each type in the current 2-pass window; this does not
- include dup frames.*/
- int nframes[3];
- /*The total accumulated estimation bias.*/
- ogg_int64_t rate_bias;
- };
- void oc_rc_state_init(oc_rc_state *_rc,oc_enc_ctx *_enc);
- void oc_rc_state_clear(oc_rc_state *_rc);
- void oc_enc_rc_resize(oc_enc_ctx *_enc);
- int oc_enc_select_qi(oc_enc_ctx *_enc,int _qti,int _clamp);
- void oc_enc_calc_lambda(oc_enc_ctx *_enc,int _frame_type);
- int oc_enc_update_rc_state(oc_enc_ctx *_enc,
- long _bits,int _qti,int _qi,int _trial,int _droppable);
- int oc_enc_rc_2pass_out(oc_enc_ctx *_enc,unsigned char **_buf);
- int oc_enc_rc_2pass_in(oc_enc_ctx *_enc,unsigned char *_buf,size_t _bytes);
- /*The internal encoder state.*/
- struct th_enc_ctx{
- /*Shared encoder/decoder state.*/
- oc_theora_state state;
- /*Buffer in which to assemble packets.*/
- oggpack_buffer opb;
- /*Encoder-specific macroblock information.*/
- oc_mb_enc_info *mb_info;
- /*DC coefficients after prediction.*/
- ogg_int16_t *frag_dc;
- /*The list of coded macro blocks, in coded order.*/
- unsigned *coded_mbis;
- /*The number of coded macro blocks.*/
- size_t ncoded_mbis;
- /*Whether or not packets are ready to be emitted.
- This takes on negative values while there are remaining header packets to
- be emitted, reaches 0 when the codec is ready for input, and becomes
- positive when a frame has been processed and data packets are ready.*/
- int packet_state;
- /*The maximum distance between keyframes.*/
- ogg_uint32_t keyframe_frequency_force;
- /*The number of duplicates to produce for the next frame.*/
- ogg_uint32_t dup_count;
- /*The number of duplicates remaining to be emitted for the current frame.*/
- ogg_uint32_t nqueued_dups;
- /*The number of duplicates emitted for the last frame.*/
- ogg_uint32_t prev_dup_count;
- /*The current speed level.*/
- int sp_level;
- /*Whether or not VP3 compatibility mode has been enabled.*/
- unsigned char vp3_compatible;
- /*Whether or not any INTER frames have been coded.*/
- unsigned char coded_inter_frame;
- /*Whether or not previous frame was dropped.*/
- unsigned char prevframe_dropped;
- /*Stores most recently chosen Huffman tables for each frame type, DC and AC
- coefficients, and luma and chroma tokens.
- The actual Huffman table used for a given coefficient depends not only on
- the choice made here, but also its index in the zig-zag ordering.*/
- unsigned char huff_idxs[2][2][2];
- /*Current count of bits used by each MV coding mode.*/
- size_t mv_bits[2];
- /*The mode scheme chooser for estimating mode coding costs.*/
- oc_mode_scheme_chooser chooser;
- /*The number of vertical super blocks in an MCU.*/
- int mcu_nvsbs;
- /*The SSD error for skipping each fragment in the current MCU.*/
- unsigned *mcu_skip_ssd;
- /*The DCT token lists for each coefficient and each plane.*/
- unsigned char **dct_tokens[3];
- /*The extra bits associated with each DCT token.*/
- ogg_uint16_t **extra_bits[3];
- /*The number of DCT tokens for each coefficient for each plane.*/
- ptrdiff_t ndct_tokens[3][64];
- /*Pending EOB runs for each coefficient for each plane.*/
- ogg_uint16_t eob_run[3][64];
- /*The offset of the first DCT token for each coefficient for each plane.*/
- unsigned char dct_token_offs[3][64];
- /*The last DC coefficient for each plane and reference frame.*/
- int dc_pred_last[3][3];
- #if defined(OC_COLLECT_METRICS)
- /*Fragment SATD statistics for MB mode estimation metrics.*/
- unsigned *frag_satd;
- /*Fragment SSD statistics for MB mode estimation metrics.*/
- unsigned *frag_ssd;
- #endif
- /*The R-D optimization parameter.*/
- int lambda;
- /*The huffman tables in use.*/
- th_huff_code huff_codes[TH_NHUFFMAN_TABLES][TH_NDCT_TOKENS];
- /*The quantization parameters in use.*/
- th_quant_info qinfo;
- oc_iquant *enquant_tables[64][3][2];
- oc_iquant_table enquant_table_data[64][3][2];
- /*An "average" quantizer for each quantizer type (INTRA or INTER) and qi
- value.
- This is used to paramterize the rate control decisions.
- They are kept in the log domain to simplify later processing.
- Keep in mind these are DCT domain quantizers, and so are scaled by an
- additional factor of 4 from the pixel domain.*/
- ogg_int64_t log_qavg[2][64];
- /*The buffer state used to drive rate control.*/
- oc_rc_state rc;
- /*Table for encoder acceleration functions.*/
- oc_enc_opt_vtable opt_vtable;
- };
- void oc_enc_analyze_intra(oc_enc_ctx *_enc,int _recode);
- int oc_enc_analyze_inter(oc_enc_ctx *_enc,int _allow_keyframe,int _recode);
- #if defined(OC_COLLECT_METRICS)
- void oc_enc_mode_metrics_collect(oc_enc_ctx *_enc);
- void oc_enc_mode_metrics_dump(oc_enc_ctx *_enc);
- #endif
- /*Perform fullpel motion search for a single MB against both reference frames.*/
- void oc_mcenc_search(oc_enc_ctx *_enc,int _mbi);
- /*Refine a MB MV for one frame.*/
- void oc_mcenc_refine1mv(oc_enc_ctx *_enc,int _mbi,int _frame);
- /*Refine the block MVs.*/
- void oc_mcenc_refine4mv(oc_enc_ctx *_enc,int _mbi);
- /*Used to rollback a tokenlog transaction when we retroactively decide to skip
- a fragment.
- A checkpoint is taken right before each token is added.*/
- struct oc_token_checkpoint{
- /*The color plane the token was added to.*/
- unsigned char pli;
- /*The zig-zag index the token was added to.*/
- unsigned char zzi;
- /*The outstanding EOB run count before the token was added.*/
- ogg_uint16_t eob_run;
- /*The token count before the token was added.*/
- ptrdiff_t ndct_tokens;
- };
- void oc_enc_tokenize_start(oc_enc_ctx *_enc);
- int oc_enc_tokenize_ac(oc_enc_ctx *_enc,int _pli,ptrdiff_t _fragi,
- ogg_int16_t *_qdct,const ogg_uint16_t *_dequant,const ogg_int16_t *_dct,
- int _zzi,oc_token_checkpoint **_stack,int _acmin);
- void oc_enc_tokenlog_rollback(oc_enc_ctx *_enc,
- const oc_token_checkpoint *_stack,int _n);
- void oc_enc_pred_dc_frag_rows(oc_enc_ctx *_enc,
- int _pli,int _fragy0,int _frag_yend);
- void oc_enc_tokenize_dc_frag_list(oc_enc_ctx *_enc,int _pli,
- const ptrdiff_t *_coded_fragis,ptrdiff_t _ncoded_fragis,
- int _prev_ndct_tokens1,int _prev_eob_run1);
- void oc_enc_tokenize_finish(oc_enc_ctx *_enc);
- /*Utility routine to encode one of the header packets.*/
- int oc_state_flushheader(oc_theora_state *_state,int *_packet_state,
- oggpack_buffer *_opb,const th_quant_info *_qinfo,
- const th_huff_code _codes[TH_NHUFFMAN_TABLES][TH_NDCT_TOKENS],
- const char *_vendor,th_comment *_tc,ogg_packet *_op);
- /*Encoder-specific accelerated functions.*/
- void oc_enc_frag_sub(const oc_enc_ctx *_enc,ogg_int16_t _diff[64],
- const unsigned char *_src,const unsigned char *_ref,int _ystride);
- void oc_enc_frag_sub_128(const oc_enc_ctx *_enc,ogg_int16_t _diff[64],
- const unsigned char *_src,int _ystride);
- unsigned oc_enc_frag_sad(const oc_enc_ctx *_enc,const unsigned char *_src,
- const unsigned char *_ref,int _ystride);
- unsigned oc_enc_frag_sad_thresh(const oc_enc_ctx *_enc,
- const unsigned char *_src,const unsigned char *_ref,int _ystride,
- unsigned _thresh);
- unsigned oc_enc_frag_sad2_thresh(const oc_enc_ctx *_enc,
- const unsigned char *_src,const unsigned char *_ref1,
- const unsigned char *_ref2,int _ystride,unsigned _thresh);
- unsigned oc_enc_frag_satd_thresh(const oc_enc_ctx *_enc,
- const unsigned char *_src,const unsigned char *_ref,int _ystride,
- unsigned _thresh);
- unsigned oc_enc_frag_satd2_thresh(const oc_enc_ctx *_enc,
- const unsigned char *_src,const unsigned char *_ref1,
- const unsigned char *_ref2,int _ystride,unsigned _thresh);
- unsigned oc_enc_frag_intra_satd(const oc_enc_ctx *_enc,
- const unsigned char *_src,int _ystride);
- void oc_enc_frag_copy2(const oc_enc_ctx *_enc,unsigned char *_dst,
- const unsigned char *_src1,const unsigned char *_src2,int _ystride);
- void oc_enc_frag_recon_intra(const oc_enc_ctx *_enc,
- unsigned char *_dst,int _ystride,const ogg_int16_t _residue[64]);
- void oc_enc_frag_recon_inter(const oc_enc_ctx *_enc,unsigned char *_dst,
- const unsigned char *_src,int _ystride,const ogg_int16_t _residue[64]);
- void oc_enc_fdct8x8(const oc_enc_ctx *_enc,ogg_int16_t _y[64],
- const ogg_int16_t _x[64]);
- /*Default pure-C implementations.*/
- void oc_enc_vtable_init_c(oc_enc_ctx *_enc);
- void oc_enc_frag_sub_c(ogg_int16_t _diff[64],
- const unsigned char *_src,const unsigned char *_ref,int _ystride);
- void oc_enc_frag_sub_128_c(ogg_int16_t _diff[64],
- const unsigned char *_src,int _ystride);
- void oc_enc_frag_copy2_c(unsigned char *_dst,
- const unsigned char *_src1,const unsigned char *_src2,int _ystride);
- unsigned oc_enc_frag_sad_c(const unsigned char *_src,
- const unsigned char *_ref,int _ystride);
- unsigned oc_enc_frag_sad_thresh_c(const unsigned char *_src,
- const unsigned char *_ref,int _ystride,unsigned _thresh);
- unsigned oc_enc_frag_sad2_thresh_c(const unsigned char *_src,
- const unsigned char *_ref1,const unsigned char *_ref2,int _ystride,
- unsigned _thresh);
- unsigned oc_enc_frag_satd_thresh_c(const unsigned char *_src,
- const unsigned char *_ref,int _ystride,unsigned _thresh);
- unsigned oc_enc_frag_satd2_thresh_c(const unsigned char *_src,
- const unsigned char *_ref1,const unsigned char *_ref2,int _ystride,
- unsigned _thresh);
- unsigned oc_enc_frag_intra_satd_c(const unsigned char *_src,int _ystride);
- void oc_enc_fdct8x8_c(ogg_int16_t _y[64],const ogg_int16_t _x[64]);
- #endif
|