annotate vp56.h @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents d0b25641338b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
1 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11369
diff changeset
2 * @file
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
3 * VP5 and VP6 compatible video decoder (common features)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
4 *
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
5 * Copyright (C) 2006 Aurelien Jacobs <aurel@gnuage.org>
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
6 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3759
diff changeset
7 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3759
diff changeset
8 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3759
diff changeset
9 * FFmpeg is free software; you can redistribute it and/or
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
10 * modify it under the terms of the GNU Lesser General Public
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
11 * License as published by the Free Software Foundation; either
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
12 * version 2.1 of the License, or (at your option) any later version.
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
13 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3759
diff changeset
14 * FFmpeg is distributed in the hope that it will be useful,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
17 * Lesser General Public License for more details.
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
18 *
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
19 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3759
diff changeset
20 * License along with FFmpeg; if not, write to the Free Software
5215
2b72f9bc4f06 license header consistency cosmetics
diego
parents: 5089
diff changeset
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
22 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
23
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 6448
diff changeset
24 #ifndef AVCODEC_VP56_H
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 6448
diff changeset
25 #define AVCODEC_VP56_H
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
26
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
27 #include "vp56data.h"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
28 #include "dsputil.h"
9428
0dce4fe6e6f3 Rename bitstream.h to get_bits.h.
stefano
parents: 9356
diff changeset
29 #include "get_bits.h"
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4595
diff changeset
30 #include "bytestream.h"
12029
934968bd410d renormalize VP5/6/7/8 range coder without loop
stefang
parents: 11921
diff changeset
31 #include "cabac.h"
11665
85ee3d14b906 VP56: move vp56_edge_filter to new VP56DSPContext
mru
parents: 11644
diff changeset
32 #include "vp56dsp.h"
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
33
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
34 typedef struct vp56_context VP56Context;
12217
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12216
diff changeset
35
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12216
diff changeset
36 typedef struct {
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12216
diff changeset
37 int16_t x;
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12216
diff changeset
38 int16_t y;
f6b229456bdf Much faster VP8 mv and mode prediction
darkshikari
parents: 12216
diff changeset
39 } DECLARE_ALIGNED(4, , VP56mv);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
40
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
41 typedef void (*VP56ParseVectorAdjustment)(VP56Context *s,
8300
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
42 VP56mv *vect);
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
43 typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src,
8300
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
44 int offset1, int offset2, int stride,
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
45 VP56mv mv, int mask, int select, int luma);
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
46 typedef void (*VP56ParseCoeff)(VP56Context *s);
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
47 typedef void (*VP56DefaultModelsInit)(VP56Context *s);
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
48 typedef void (*VP56ParseVectorModels)(VP56Context *s);
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
49 typedef void (*VP56ParseCoeffModels)(VP56Context *s);
8300
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
50 typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf,
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
51 int buf_size, int *golden_frame);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
52
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
53 typedef struct {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
54 int high;
12038
5a794f3f0d75 cosmetic: improve comment breaking at 80 cols
aurel
parents: 12033
diff changeset
55 int bits; /* stored negated (i.e. negative "bits" is a positive number of
5a794f3f0d75 cosmetic: improve comment breaking at 80 cols
aurel
parents: 12033
diff changeset
56 bits left) in order to eliminate a negate in cache refilling */
6297
michael
parents: 5830
diff changeset
57 const uint8_t *buffer;
9919
c7c1c6b35a73 vp56dec: ensure range coder won't read past the end of input buffer
aurel
parents: 9428
diff changeset
58 const uint8_t *end;
12250
0d81ba00151a vp56's arith decoder's code_word is only 16 bits, no need for unsigned long
conrad
parents: 12217
diff changeset
59 unsigned int code_word;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
60 } VP56RangeCoder;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
61
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
62 typedef struct {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
63 uint8_t not_null_dc;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
64 VP56Frame ref_frame;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
65 DCTELEM dc_coeff;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
66 } VP56RefDc;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
67
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
68 typedef struct {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
69 uint8_t type;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
70 VP56mv mv;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
71 } VP56Macroblock;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
72
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
73 typedef struct {
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
74 uint8_t coeff_reorder[64]; /* used in vp6 only */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
75 uint8_t coeff_index_to_pos[64]; /* used in vp6 only */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
76 uint8_t vector_sig[2]; /* delta sign */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
77 uint8_t vector_dct[2]; /* delta coding types */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
78 uint8_t vector_pdi[2][2]; /* predefined delta init */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
79 uint8_t vector_pdv[2][7]; /* predefined delta values */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
80 uint8_t vector_fdv[2][8]; /* 8 bit delta value definition */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
81 uint8_t coeff_dccv[2][11]; /* DC coeff value */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
82 uint8_t coeff_ract[2][3][6][11]; /* Run/AC coding type and AC coeff value */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
83 uint8_t coeff_acct[2][3][3][6][5];/* vp5 only AC coding type for coding group < 3 */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
84 uint8_t coeff_dcct[2][36][5]; /* DC coeff coding type */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
85 uint8_t coeff_runv[2][14]; /* run value (vp6 only) */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
86 uint8_t mb_type[3][10][10]; /* model for decoding MB type */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
87 uint8_t mb_types_stats[3][10][2];/* contextual, next MB type stats */
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8300
diff changeset
88 } VP56Model;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
89
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
90 struct vp56_context {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
91 AVCodecContext *avctx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
92 DSPContext dsp;
11665
85ee3d14b906 VP56: move vp56_edge_filter to new VP56DSPContext
mru
parents: 11644
diff changeset
93 VP56DSPContext vp56dsp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
94 ScanTable scantable;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
95 AVFrame frames[4];
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
96 AVFrame *framep[6];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
97 uint8_t *edge_emu_buffer_alloc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
98 uint8_t *edge_emu_buffer;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
99 VP56RangeCoder c;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
100 VP56RangeCoder cc;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
101 VP56RangeCoder *ccp;
4308
74b476185cd1 Add support for VP60 and VP61.
aurel
parents: 4078
diff changeset
102 int sub_version;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
103
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
104 /* frame info */
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
105 int plane_width[4];
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
106 int plane_height[4];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
107 int mb_width; /* number of horizontal MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
108 int mb_height; /* number of vertical MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
109 int block_offset[6];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
110
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
111 int quantizer;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
112 uint16_t dequant_dc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
113 uint16_t dequant_ac;
11053
c57e72227d7d Make VP5 and VP6 decoders output a qscale table to allow for more automatic
reimar
parents: 10961
diff changeset
114 int8_t *qscale_table;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
115
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
116 /* DC predictors management */
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
117 VP56RefDc *above_blocks;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
118 VP56RefDc left_block[4];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
119 int above_block_idx[6];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
120 DCTELEM prev_dc[3][3]; /* [plan][ref_frame] */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
121
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
122 /* blocks / macroblock */
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
123 VP56mb mb_type;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
124 VP56Macroblock *macroblocks;
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 11053
diff changeset
125 DECLARE_ALIGNED(16, DCTELEM, block_coeff)[6][64];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
126
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
127 /* motion vectors */
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
128 VP56mv mv[6]; /* vectors for each block in MB */
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
129 VP56mv vector_candidate[2];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
130 int vector_candidate_pos;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
131
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
132 /* filtering hints */
4348
d3dcf62d52c5 add support for another variant of vp6
aurel
parents: 4308
diff changeset
133 int filter_header; /* used in vp6 only */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
134 int deblock_filtering;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
135 int filter_selection;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
136 int filter_mode;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
137 int max_vector_length;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
138 int sample_variance_threshold;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
139
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
140 uint8_t coeff_ctx[4][64]; /* used in vp5 only */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
141 uint8_t coeff_ctx_last[4]; /* used in vp5 only */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
142
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
143 int has_alpha;
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
144
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
145 /* upside-down flipping hints */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
146 int flip; /* are we flipping ? */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
147 int frbi; /* first row block index in MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
148 int srbi; /* second row block index in MB */
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
149 int stride[4]; /* stride for each plan */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
150
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
151 const uint8_t *vp56_coord_div;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
152 VP56ParseVectorAdjustment parse_vector_adjustment;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
153 VP56Filter filter;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
154 VP56ParseCoeff parse_coeff;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
155 VP56DefaultModelsInit default_models_init;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
156 VP56ParseVectorModels parse_vector_models;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
157 VP56ParseCoeffModels parse_coeff_models;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
158 VP56ParseHeader parse_header;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
159
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8300
diff changeset
160 VP56Model *modelp;
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8300
diff changeset
161 VP56Model models[2];
5821
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
162
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
163 /* huffman decoding */
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
164 int use_huffman;
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
165 GetBitContext gb;
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
166 VLC dccv_vlc[2];
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
167 VLC runv_vlc[2];
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
168 VLC ract_vlc[2][3][6];
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
169 unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
170 };
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
171
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
172
12292
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 12256
diff changeset
173 void ff_vp56_init(AVCodecContext *avctx, int flip, int has_alpha);
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 12256
diff changeset
174 int ff_vp56_free(AVCodecContext *avctx);
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 12256
diff changeset
175 void ff_vp56_init_dequant(VP56Context *s, int quantizer);
d8364962cc4a ff_prefix non static vp56 functions.
alexc
parents: 12256
diff changeset
176 int ff_vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
12293
83400282990a Reindent after last commit.
alexc
parents: 12292
diff changeset
177 AVPacket *avpkt);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
178
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
179
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
180 /**
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
181 * vp56 specific range coder implementation
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
182 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
183
12365
7c54834209f6 VP5/6/8: eliminate CABAC dependency
darkshikari
parents: 12355
diff changeset
184 extern const uint8_t ff_vp56_norm_shift[256];
7c54834209f6 VP5/6/8: eliminate CABAC dependency
darkshikari
parents: 12355
diff changeset
185 void ff_vp56_init_range_decoder(VP56RangeCoder *c, const uint8_t *buf, int buf_size);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
186
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
187 static av_always_inline unsigned int vp56_rac_renorm(VP56RangeCoder *c)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
188 {
12365
7c54834209f6 VP5/6/8: eliminate CABAC dependency
darkshikari
parents: 12355
diff changeset
189 int shift = ff_vp56_norm_shift[c->high];
12033
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
190 int bits = c->bits;
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
191 unsigned int code_word = c->code_word;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
192
12033
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
193 c->high <<= shift;
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
194 code_word <<= shift;
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
195 bits += shift;
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
196 if(bits >= 0 && c->buffer < c->end) {
12385
d0b25641338b VP5/6/8: ~7% faster arithmetic decoding
darkshikari
parents: 12365
diff changeset
197 code_word |= bytestream_get_be16(&c->buffer) << bits;
d0b25641338b VP5/6/8: ~7% faster arithmetic decoding
darkshikari
parents: 12365
diff changeset
198 bits -= 16;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
199 }
12033
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
200 c->bits = bits;
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
201 return code_word;
12251
bbe8e7233c5d Split renorm of vp56 arith decoder to its own function
conrad
parents: 12250
diff changeset
202 }
bbe8e7233c5d Split renorm of vp56 arith decoder to its own function
conrad
parents: 12250
diff changeset
203
12256
6e6c92d36c4b Inline asm for VP56 arith coder
conrad
parents: 12253
diff changeset
204 #if ARCH_X86
6e6c92d36c4b Inline asm for VP56 arith coder
conrad
parents: 12253
diff changeset
205 #include "x86/vp56_arith.h"
6e6c92d36c4b Inline asm for VP56 arith coder
conrad
parents: 12253
diff changeset
206 #endif
6e6c92d36c4b Inline asm for VP56 arith coder
conrad
parents: 12253
diff changeset
207
6e6c92d36c4b Inline asm for VP56 arith coder
conrad
parents: 12253
diff changeset
208 #ifndef vp56_rac_get_prob
6e6c92d36c4b Inline asm for VP56 arith coder
conrad
parents: 12253
diff changeset
209 #define vp56_rac_get_prob vp56_rac_get_prob
12349
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
210 static av_always_inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob)
12251
bbe8e7233c5d Split renorm of vp56 arith decoder to its own function
conrad
parents: 12250
diff changeset
211 {
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
212 unsigned int code_word = vp56_rac_renorm(c);
12251
bbe8e7233c5d Split renorm of vp56 arith decoder to its own function
conrad
parents: 12250
diff changeset
213 unsigned int low = 1 + (((c->high - 1) * prob) >> 8);
12385
d0b25641338b VP5/6/8: ~7% faster arithmetic decoding
darkshikari
parents: 12365
diff changeset
214 unsigned int low_shift = low << 16;
12251
bbe8e7233c5d Split renorm of vp56 arith decoder to its own function
conrad
parents: 12250
diff changeset
215 int bit = code_word >= low_shift;
bbe8e7233c5d Split renorm of vp56 arith decoder to its own function
conrad
parents: 12250
diff changeset
216
bbe8e7233c5d Split renorm of vp56 arith decoder to its own function
conrad
parents: 12250
diff changeset
217 c->high = bit ? c->high - low : low;
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
218 c->code_word = bit ? code_word - low_shift : code_word;
12251
bbe8e7233c5d Split renorm of vp56 arith decoder to its own function
conrad
parents: 12250
diff changeset
219
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
220 return bit;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
221 }
12256
6e6c92d36c4b Inline asm for VP56 arith coder
conrad
parents: 12253
diff changeset
222 #endif
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
223
12253
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
224 // branchy variant, to be used where there's a branch based on the bit decoded
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
225 static av_always_inline int vp56_rac_get_prob_branchy(VP56RangeCoder *c, int prob)
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
226 {
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
227 unsigned long code_word = vp56_rac_renorm(c);
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
228 unsigned low = 1 + (((c->high - 1) * prob) >> 8);
12385
d0b25641338b VP5/6/8: ~7% faster arithmetic decoding
darkshikari
parents: 12365
diff changeset
229 unsigned low_shift = low << 16;
12253
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
230
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
231 if (code_word >= low_shift) {
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
232 c->high -= low;
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
233 c->code_word = code_word - low_shift;
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
234 return 1;
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
235 }
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
236
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
237 c->high = low;
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
238 c->code_word = code_word;
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
239 return 0;
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
240 }
112b3a0db187 Decode DCT tokens by branching to a different code path for each branch
conrad
parents: 12252
diff changeset
241
12349
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
242 static av_always_inline int vp56_rac_get(VP56RangeCoder *c)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
243 {
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
244 unsigned int code_word = vp56_rac_renorm(c);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
245 /* equiprobable */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
246 int low = (c->high + 1) >> 1;
12385
d0b25641338b VP5/6/8: ~7% faster arithmetic decoding
darkshikari
parents: 12365
diff changeset
247 unsigned int low_shift = low << 16;
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
248 int bit = code_word >= low_shift;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
249 if (bit) {
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
250 c->high -= low;
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
251 code_word -= low_shift;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
252 } else {
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
253 c->high = low;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
254 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
255
12252
b8211cda076d Move renormalization of the VP56 arith decoder to before decoding a bit
conrad
parents: 12251
diff changeset
256 c->code_word = code_word;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
257 return bit;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
258 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
259
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
260 // rounding is different than vp56_rac_get, is vp56_rac_get wrong?
12349
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
261 static av_always_inline int vp8_rac_get(VP56RangeCoder *c)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
262 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
263 return vp56_rac_get_prob(c, 128);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
264 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
265
12355
e25a985a550c Silence unused function warnings in vp56.h
darkshikari
parents: 12349
diff changeset
266 static av_unused int vp56_rac_gets(VP56RangeCoder *c, int bits)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
267 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
268 int value = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
269
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
270 while (bits--) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
271 value = (value << 1) | vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
272 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
273
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
274 return value;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
275 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
276
12355
e25a985a550c Silence unused function warnings in vp56.h
darkshikari
parents: 12349
diff changeset
277 static av_unused int vp8_rac_get_uint(VP56RangeCoder *c, int bits)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
278 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
279 int value = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
280
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
281 while (bits--) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
282 value = (value << 1) | vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
283 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
284
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
285 return value;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
286 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
287
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
288 // fixme: add 1 bit to all the calls to this?
12355
e25a985a550c Silence unused function warnings in vp56.h
darkshikari
parents: 12349
diff changeset
289 static av_unused int vp8_rac_get_sint(VP56RangeCoder *c, int bits)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
290 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
291 int v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
292
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
293 if (!vp8_rac_get(c))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
294 return 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
295
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
296 v = vp8_rac_get_uint(c, bits);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
297
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
298 if (vp8_rac_get(c))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
299 v = -v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
300
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
301 return v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
302 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
303
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
304 // P(7)
12355
e25a985a550c Silence unused function warnings in vp56.h
darkshikari
parents: 12349
diff changeset
305 static av_unused int vp56_rac_gets_nn(VP56RangeCoder *c, int bits)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
306 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
307 int v = vp56_rac_gets(c, 7) << 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
308 return v + !v;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
309 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
310
12355
e25a985a550c Silence unused function warnings in vp56.h
darkshikari
parents: 12349
diff changeset
311 static av_unused int vp8_rac_get_nn(VP56RangeCoder *c)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
312 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
313 int v = vp8_rac_get_uint(c, 7) << 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
314 return v + !v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
315 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
316
12349
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
317 static av_always_inline
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
318 int vp56_rac_get_tree(VP56RangeCoder *c,
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
319 const VP56Tree *tree,
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
320 const uint8_t *probs)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
321 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
322 while (tree->val > 0) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
323 if (vp56_rac_get_prob(c, probs[tree->prob_idx]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
324 tree += tree->val;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
325 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
326 tree++;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
327 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
328 return -tree->val;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
329 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
330
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
331 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
332 * This is identical to vp8_rac_get_tree except for the possibility of starting
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
333 * on a node other than the root node, needed for coeff decode where this is
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
334 * used to save a bit after a 0 token (by disallowing EOB to immediately follow.)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
335 */
12349
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
336 static av_always_inline
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
337 int vp8_rac_get_tree_with_offset(VP56RangeCoder *c, const int8_t (*tree)[2],
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
338 const uint8_t *probs, int i)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
339 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
340 do {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
341 i = tree[i][vp56_rac_get_prob(c, probs[i])];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
342 } while (i > 0);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
343
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
344 return -i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
345 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
346
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
347 // how probabilities are associated with decisions is different I think
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
348 // well, the new scheme fits in the old but this way has one fewer branches per decision
12349
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
349 static av_always_inline
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
350 int vp8_rac_get_tree(VP56RangeCoder *c, const int8_t (*tree)[2],
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
351 const uint8_t *probs)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
352 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
353 return vp8_rac_get_tree_with_offset(c, tree, probs, 0);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
354 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
355
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
356 // DCTextra
12349
f618c62a6ddb VP5/6/8: tweak some arithcoder inlining
darkshikari
parents: 12293
diff changeset
357 static av_always_inline int vp8_rac_get_coeff(VP56RangeCoder *c, const uint8_t *prob)
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
358 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
359 int v = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
360
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
361 do {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
362 v = (v<<1) + vp56_rac_get_prob(c, *prob++);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
363 } while (*prob);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
364
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
365 return v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
366 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
367
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 6448
diff changeset
368 #endif /* AVCODEC_VP56_H */