X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fvp56.h;h=7f7938b347e0ac4715a91b7e7b30a1d031f64318;hb=ecc1f8c3c8875e31e7cb9b7d9229b1674e1be736;hp=f8b3a8e4b6f7000917b54cc67c847abeda899146;hpb=9110a0e32d5eb421558145459e2a1fcc9720c170;p=ffmpeg diff --git a/libavcodec/vp56.h b/libavcodec/vp56.h index f8b3a8e4b6f..7f7938b347e 100644 --- a/libavcodec/vp56.h +++ b/libavcodec/vp56.h @@ -1,5 +1,5 @@ /** - * @file vp56.h + * @file libavcodec/vp56.h * VP5 and VP6 compatible video decoder (common features) * * Copyright (C) 2006 Aurelien Jacobs @@ -18,45 +18,47 @@ * * You should have received a copy of the GNU Lesser General Public * License along with FFmpeg; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef VP56_H -#define VP56_H +#ifndef AVCODEC_VP56_H +#define AVCODEC_VP56_H #include "vp56data.h" #include "dsputil.h" -#include "mpegvideo.h" - - -typedef struct vp56_context vp56_context_t; -typedef struct vp56_mv vp56_mv_t; - -typedef void (*vp56_parse_vector_adjustment_t)(vp56_context_t *s, - vp56_mv_t *vect); -typedef int (*vp56_adjust_t)(int v, int t); -typedef void (*vp56_filter_t)(vp56_context_t *s, uint8_t *dst, uint8_t *src, - int offset1, int offset2, int stride, - vp56_mv_t mv, int mask, int select, int luma); -typedef void (*vp56_parse_coeff_t)(vp56_context_t *s); -typedef void (*vp56_default_models_init_t)(vp56_context_t *s); -typedef void (*vp56_parse_vector_models_t)(vp56_context_t *s); -typedef void (*vp56_parse_coeff_models_t)(vp56_context_t *s); -typedef int (*vp56_parse_header_t)(vp56_context_t *s, uint8_t *buf, - int buf_size, int *golden_frame); +#include "get_bits.h" +#include "bytestream.h" + + +typedef struct vp56_context VP56Context; +typedef struct vp56_mv VP56mv; + +typedef void (*VP56ParseVectorAdjustment)(VP56Context *s, + VP56mv *vect); +typedef int (*VP56Adjust)(int v, int t); +typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src, + int offset1, int offset2, int stride, + VP56mv mv, int mask, int select, int luma); +typedef void (*VP56ParseCoeff)(VP56Context *s); +typedef void (*VP56DefaultModelsInit)(VP56Context *s); +typedef void (*VP56ParseVectorModels)(VP56Context *s); +typedef void (*VP56ParseCoeffModels)(VP56Context *s); +typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf, + int buf_size, int *golden_frame); typedef struct { int high; int bits; const uint8_t *buffer; + const uint8_t *end; unsigned long code_word; -} vp56_range_coder_t; +} VP56RangeCoder; typedef struct { uint8_t not_null_dc; - vp56_frame_t ref_frame; + VP56Frame ref_frame; DCTELEM dc_coeff; -} vp56_ref_dc_t; +} VP56RefDc; struct vp56_mv { int x; @@ -65,22 +67,42 @@ struct vp56_mv { typedef struct { uint8_t type; - vp56_mv_t mv; -} vp56_macroblock_t; + VP56mv mv; +} VP56Macroblock; + +typedef struct { + uint8_t coeff_reorder[64]; /* used in vp6 only */ + uint8_t coeff_index_to_pos[64]; /* used in vp6 only */ + uint8_t vector_sig[2]; /* delta sign */ + uint8_t vector_dct[2]; /* delta coding types */ + uint8_t vector_pdi[2][2]; /* predefined delta init */ + uint8_t vector_pdv[2][7]; /* predefined delta values */ + uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */ + uint8_t coeff_dccv[2][11]; /* DC coeff value */ + uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */ + uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */ + uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */ + uint8_t coeff_runv[2][14]; /* run value (vp6 only) */ + uint8_t mb_type[3][10][10]; /* model for decoding MB type */ + uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */ +} VP56Model; struct vp56_context { AVCodecContext *avctx; DSPContext dsp; ScanTable scantable; - AVFrame frames[3]; + AVFrame frames[4]; + AVFrame *framep[6]; uint8_t *edge_emu_buffer_alloc; uint8_t *edge_emu_buffer; - vp56_range_coder_t c; + VP56RangeCoder c; + VP56RangeCoder cc; + VP56RangeCoder *ccp; int sub_version; /* frame info */ - int plane_width[3]; - int plane_height[3]; + int plane_width[4]; + int plane_height[4]; int mb_width; /* number of horizontal MB */ int mb_height; /* number of vertical MB */ int block_offset[6]; @@ -88,88 +110,88 @@ struct vp56_context { int quantizer; uint16_t dequant_dc; uint16_t dequant_ac; + int8_t *qscale_table; /* DC predictors management */ - vp56_ref_dc_t *above_blocks; - vp56_ref_dc_t left_block[4]; + VP56RefDc *above_blocks; + VP56RefDc left_block[4]; int above_block_idx[6]; DCTELEM prev_dc[3][3]; /* [plan][ref_frame] */ /* blocks / macroblock */ - vp56_mb_t mb_type; - vp56_macroblock_t *macroblocks; - DECLARE_ALIGNED_16(DCTELEM, block_coeff[6][64]); - uint8_t coeff_reorder[64]; /* used in vp6 only */ - uint8_t coeff_index_to_pos[64]; /* used in vp6 only */ + VP56mb mb_type; + VP56Macroblock *macroblocks; + DECLARE_ALIGNED(16, DCTELEM, block_coeff)[6][64]; /* motion vectors */ - vp56_mv_t mv[6]; /* vectors for each block in MB */ - vp56_mv_t vector_candidate[2]; + VP56mv mv[6]; /* vectors for each block in MB */ + VP56mv vector_candidate[2]; int vector_candidate_pos; /* filtering hints */ + int filter_header; /* used in vp6 only */ int deblock_filtering; int filter_selection; int filter_mode; int max_vector_length; int sample_variance_threshold; - /* AC models */ - uint8_t vector_model_sig[2]; /* delta sign */ - uint8_t vector_model_dct[2]; /* delta coding types */ - uint8_t vector_model_pdi[2][2]; /* predefined delta init */ - uint8_t vector_model_pdv[2][7]; /* predefined delta values */ - uint8_t vector_model_fdv[2][8]; /* 8 bit delta value definition */ - uint8_t mb_type_model[3][10][10]; /* model for decoding MB type */ - uint8_t coeff_model_dccv[2][11]; /* DC coeff value */ - uint8_t coeff_model_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */ - uint8_t coeff_model_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */ - uint8_t coeff_model_dcct[2][36][5]; /* DC coeff coding type */ - uint8_t coeff_model_runv[2][14]; /* run value (vp6 only) */ - uint8_t mb_types_stats[3][10][2]; /* contextual, next MB type stats */ uint8_t coeff_ctx[4][64]; /* used in vp5 only */ uint8_t coeff_ctx_last[4]; /* used in vp5 only */ + int has_alpha; + /* upside-down flipping hints */ int flip; /* are we flipping ? */ int frbi; /* first row block index in MB */ int srbi; /* second row block index in MB */ - int stride[3]; /* stride for each plan */ + int stride[4]; /* stride for each plan */ const uint8_t *vp56_coord_div; - vp56_parse_vector_adjustment_t parse_vector_adjustment; - vp56_adjust_t adjust; - vp56_filter_t filter; - vp56_parse_coeff_t parse_coeff; - vp56_default_models_init_t default_models_init; - vp56_parse_vector_models_t parse_vector_models; - vp56_parse_coeff_models_t parse_coeff_models; - vp56_parse_header_t parse_header; + VP56ParseVectorAdjustment parse_vector_adjustment; + VP56Adjust adjust; + VP56Filter filter; + VP56ParseCoeff parse_coeff; + VP56DefaultModelsInit default_models_init; + VP56ParseVectorModels parse_vector_models; + VP56ParseCoeffModels parse_coeff_models; + VP56ParseHeader parse_header; + + VP56Model *modelp; + VP56Model models[2]; + + /* huffman decoding */ + int use_huffman; + GetBitContext gb; + VLC dccv_vlc[2]; + VLC runv_vlc[2]; + VLC ract_vlc[2][3][6]; + unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */ }; -void vp56_init(vp56_context_t *s, AVCodecContext *avctx, int flip); +void vp56_init(AVCodecContext *avctx, int flip, int has_alpha); int vp56_free(AVCodecContext *avctx); -void vp56_init_dequant(vp56_context_t *s, int quantizer); +void vp56_init_dequant(VP56Context *s, int quantizer); int vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size, - uint8_t *buf, int buf_size); + AVPacket *avpkt); /** * vp56 specific range coder implementation */ -static inline void vp56_init_range_decoder(vp56_range_coder_t *c, +static inline void vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size) { c->high = 255; c->bits = 8; c->buffer = buf; - c->code_word = *c->buffer++ << 8; - c->code_word |= *c->buffer++; + c->end = buf + buf_size; + c->code_word = bytestream_get_be16(&c->buffer); } -static inline int vp56_rac_get_prob(vp56_range_coder_t *c, uint8_t prob) +static inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob) { unsigned int low = 1 + (((c->high - 1) * prob) / 256); unsigned int low_shift = low << 8; @@ -186,7 +208,7 @@ static inline int vp56_rac_get_prob(vp56_range_coder_t *c, uint8_t prob) while (c->high < 128) { c->high <<= 1; c->code_word <<= 1; - if (--c->bits == 0) { + if (--c->bits == 0 && c->buffer < c->end) { c->bits = 8; c->code_word |= *c->buffer++; } @@ -194,7 +216,7 @@ static inline int vp56_rac_get_prob(vp56_range_coder_t *c, uint8_t prob) return bit; } -static inline int vp56_rac_get(vp56_range_coder_t *c) +static inline int vp56_rac_get(VP56RangeCoder *c) { /* equiprobable */ int low = (c->high + 1) >> 1; @@ -209,14 +231,14 @@ static inline int vp56_rac_get(vp56_range_coder_t *c) /* normalize */ c->code_word <<= 1; - if (--c->bits == 0) { + if (--c->bits == 0 && c->buffer < c->end) { c->bits = 8; c->code_word |= *c->buffer++; } return bit; } -static inline int vp56_rac_gets(vp56_range_coder_t *c, int bits) +static inline int vp56_rac_gets(VP56RangeCoder *c, int bits) { int value = 0; @@ -227,14 +249,14 @@ static inline int vp56_rac_gets(vp56_range_coder_t *c, int bits) return value; } -static inline int vp56_rac_gets_nn(vp56_range_coder_t *c, int bits) +static inline int vp56_rac_gets_nn(VP56RangeCoder *c, int bits) { int v = vp56_rac_gets(c, 7) << 1; return v + !v; } -static inline int vp56_rac_get_tree(vp56_range_coder_t *c, - const vp56_tree_t *tree, +static inline int vp56_rac_get_tree(VP56RangeCoder *c, + const VP56Tree *tree, const uint8_t *probs) { while (tree->val > 0) { @@ -246,4 +268,4 @@ static inline int vp56_rac_get_tree(vp56_range_coder_t *c, return -tree->val; } -#endif /* VP56_H */ +#endif /* AVCODEC_VP56_H */