3 * VP5 and VP6 compatible video decoder (common features)
5 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
7 * This file is part of FFmpeg.
9 * FFmpeg is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * FFmpeg is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with FFmpeg; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29 #include "mpegvideo.h"
30 #include "bytestream.h"
33 typedef struct vp56_context vp56_context_t
;
34 typedef struct vp56_mv vp56_mv_t
;
36 typedef void (*vp56_parse_vector_adjustment_t
)(vp56_context_t
*s
,
38 typedef int (*vp56_adjust_t
)(int v
, int t
);
39 typedef void (*vp56_filter_t
)(vp56_context_t
*s
, uint8_t *dst
, uint8_t *src
,
40 int offset1
, int offset2
, int stride
,
41 vp56_mv_t mv
, int mask
, int select
, int luma
);
42 typedef void (*vp56_parse_coeff_t
)(vp56_context_t
*s
);
43 typedef void (*vp56_default_models_init_t
)(vp56_context_t
*s
);
44 typedef void (*vp56_parse_vector_models_t
)(vp56_context_t
*s
);
45 typedef void (*vp56_parse_coeff_models_t
)(vp56_context_t
*s
);
46 typedef int (*vp56_parse_header_t
)(vp56_context_t
*s
, uint8_t *buf
,
47 int buf_size
, int *golden_frame
);
52 const uint8_t *buffer
;
53 unsigned long code_word
;
58 vp56_frame_t ref_frame
;
73 AVCodecContext
*avctx
;
78 uint8_t *edge_emu_buffer_alloc
;
79 uint8_t *edge_emu_buffer
;
81 vp56_range_coder_t cc
;
82 vp56_range_coder_t
*ccp
;
88 int mb_width
; /* number of horizontal MB */
89 int mb_height
; /* number of vertical MB */
96 /* DC predictors management */
97 vp56_ref_dc_t
*above_blocks
;
98 vp56_ref_dc_t left_block
[4];
99 int above_block_idx
[6];
100 DCTELEM prev_dc
[3][3]; /* [plan][ref_frame] */
102 /* blocks / macroblock */
104 vp56_macroblock_t
*macroblocks
;
105 DECLARE_ALIGNED_16(DCTELEM
, block_coeff
[6][64]);
106 uint8_t coeff_reorder
[64]; /* used in vp6 only */
107 uint8_t coeff_index_to_pos
[64]; /* used in vp6 only */
110 vp56_mv_t mv
[6]; /* vectors for each block in MB */
111 vp56_mv_t vector_candidate
[2];
112 int vector_candidate_pos
;
114 /* filtering hints */
115 int filter_header
; /* used in vp6 only */
116 int deblock_filtering
;
117 int filter_selection
;
119 int max_vector_length
;
120 int sample_variance_threshold
;
123 uint8_t vector_model_sig
[2]; /* delta sign */
124 uint8_t vector_model_dct
[2]; /* delta coding types */
125 uint8_t vector_model_pdi
[2][2]; /* predefined delta init */
126 uint8_t vector_model_pdv
[2][7]; /* predefined delta values */
127 uint8_t vector_model_fdv
[2][8]; /* 8 bit delta value definition */
128 uint8_t mb_type_model
[3][10][10]; /* model for decoding MB type */
129 uint8_t coeff_model_dccv
[2][11]; /* DC coeff value */
130 uint8_t coeff_model_ract
[2][3][6][11]; /* Run/AC coding type and AC coeff value */
131 uint8_t coeff_model_acct
[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */
132 uint8_t coeff_model_dcct
[2][36][5]; /* DC coeff coding type */
133 uint8_t coeff_model_runv
[2][14]; /* run value (vp6 only) */
134 uint8_t mb_types_stats
[3][10][2]; /* contextual, next MB type stats */
135 uint8_t coeff_ctx
[4][64]; /* used in vp5 only */
136 uint8_t coeff_ctx_last
[4]; /* used in vp5 only */
138 /* upside-down flipping hints */
139 int flip
; /* are we flipping ? */
140 int frbi
; /* first row block index in MB */
141 int srbi
; /* second row block index in MB */
142 int stride
[3]; /* stride for each plan */
144 const uint8_t *vp56_coord_div
;
145 vp56_parse_vector_adjustment_t parse_vector_adjustment
;
146 vp56_adjust_t adjust
;
147 vp56_filter_t filter
;
148 vp56_parse_coeff_t parse_coeff
;
149 vp56_default_models_init_t default_models_init
;
150 vp56_parse_vector_models_t parse_vector_models
;
151 vp56_parse_coeff_models_t parse_coeff_models
;
152 vp56_parse_header_t parse_header
;
156 void vp56_init(vp56_context_t
*s
, AVCodecContext
*avctx
, int flip
);
157 int vp56_free(AVCodecContext
*avctx
);
158 void vp56_init_dequant(vp56_context_t
*s
, int quantizer
);
159 int vp56_decode_frame(AVCodecContext
*avctx
, void *data
, int *data_size
,
160 uint8_t *buf
, int buf_size
);
164 * vp56 specific range coder implementation
167 static inline void vp56_init_range_decoder(vp56_range_coder_t
*c
,
168 const uint8_t *buf
, int buf_size
)
173 c
->code_word
= bytestream_get_be16(&c
->buffer
);
176 static inline int vp56_rac_get_prob(vp56_range_coder_t
*c
, uint8_t prob
)
178 unsigned int low
= 1 + (((c
->high
- 1) * prob
) / 256);
179 unsigned int low_shift
= low
<< 8;
180 int bit
= c
->code_word
>= low_shift
;
184 c
->code_word
-= low_shift
;
190 while (c
->high
< 128) {
193 if (--c
->bits
== 0) {
195 c
->code_word
|= *c
->buffer
++;
201 static inline int vp56_rac_get(vp56_range_coder_t
*c
)
204 int low
= (c
->high
+ 1) >> 1;
205 unsigned int low_shift
= low
<< 8;
206 int bit
= c
->code_word
>= low_shift
;
208 c
->high
= (c
->high
- low
) << 1;
209 c
->code_word
-= low_shift
;
216 if (--c
->bits
== 0) {
218 c
->code_word
|= *c
->buffer
++;
223 static inline int vp56_rac_gets(vp56_range_coder_t
*c
, int bits
)
228 value
= (value
<< 1) | vp56_rac_get(c
);
234 static inline int vp56_rac_gets_nn(vp56_range_coder_t
*c
, int bits
)
236 int v
= vp56_rac_gets(c
, 7) << 1;
240 static inline int vp56_rac_get_tree(vp56_range_coder_t
*c
,
241 const vp56_tree_t
*tree
,
242 const uint8_t *probs
)
244 while (tree
->val
> 0) {
245 if (vp56_rac_get_prob(c
, probs
[tree
->prob_idx
]))