annotate vp56.h @ 12197:fbf4d5b1b664 libavcodec

Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag, FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that have been checked specifically on such CPUs and are actually faster than their MMX counterparts. In addition, use this flag to enable particular VP8 and LPC SSE2 functions that are faster than their MMX counterparts. Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author rbultje
date Mon, 19 Jul 2010 22:38:23 +0000
parents 5a794f3f0d75
children 160eceee6c3d
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;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
35 typedef struct vp56_mv VP56mv;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
36
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
37 typedef void (*VP56ParseVectorAdjustment)(VP56Context *s,
8300
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
38 VP56mv *vect);
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
39 typedef void (*VP56Filter)(VP56Context *s, uint8_t *dst, uint8_t *src,
8300
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
40 int offset1, int offset2, int stride,
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
41 VP56mv mv, int mask, int select, int luma);
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
42 typedef void (*VP56ParseCoeff)(VP56Context *s);
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
43 typedef void (*VP56DefaultModelsInit)(VP56Context *s);
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
44 typedef void (*VP56ParseVectorModels)(VP56Context *s);
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
45 typedef void (*VP56ParseCoeffModels)(VP56Context *s);
8300
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
46 typedef int (*VP56ParseHeader)(VP56Context *s, const uint8_t *buf,
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
47 int buf_size, int *golden_frame);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
48
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
49 typedef struct {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
50 int high;
12038
5a794f3f0d75 cosmetic: improve comment breaking at 80 cols
aurel
parents: 12033
diff changeset
51 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
52 bits left) in order to eliminate a negate in cache refilling */
6297
michael
parents: 5830
diff changeset
53 const uint8_t *buffer;
9919
c7c1c6b35a73 vp56dec: ensure range coder won't read past the end of input buffer
aurel
parents: 9428
diff changeset
54 const uint8_t *end;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
55 unsigned long code_word;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
56 } VP56RangeCoder;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
57
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
58 typedef struct {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
59 uint8_t not_null_dc;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
60 VP56Frame ref_frame;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
61 DCTELEM dc_coeff;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
62 } VP56RefDc;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
63
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
64 struct vp56_mv {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
65 int x;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
66 int y;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
67 };
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
68
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
69 typedef struct {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
70 uint8_t type;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
71 VP56mv mv;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
72 } VP56Macroblock;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
73
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
74 typedef struct {
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
75 uint8_t coeff_reorder[64]; /* used in vp6 only */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
76 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
77 uint8_t vector_sig[2]; /* delta sign */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
78 uint8_t vector_dct[2]; /* delta coding types */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
79 uint8_t vector_pdi[2][2]; /* predefined delta init */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
80 uint8_t vector_pdv[2][7]; /* predefined delta values */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
81 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
82 uint8_t coeff_dccv[2][11]; /* DC coeff value */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
83 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
84 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
85 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
86 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
87 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
88 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
89 } VP56Model;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
90
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
91 struct vp56_context {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
92 AVCodecContext *avctx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
93 DSPContext dsp;
11665
85ee3d14b906 VP56: move vp56_edge_filter to new VP56DSPContext
mru
parents: 11644
diff changeset
94 VP56DSPContext vp56dsp;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
95 ScanTable scantable;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
96 AVFrame frames[4];
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
97 AVFrame *framep[6];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
98 uint8_t *edge_emu_buffer_alloc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
99 uint8_t *edge_emu_buffer;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
100 VP56RangeCoder c;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
101 VP56RangeCoder cc;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
102 VP56RangeCoder *ccp;
4308
74b476185cd1 Add support for VP60 and VP61.
aurel
parents: 4078
diff changeset
103 int sub_version;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
104
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
105 /* frame info */
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
106 int plane_width[4];
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
107 int plane_height[4];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
108 int mb_width; /* number of horizontal MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
109 int mb_height; /* number of vertical MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
110 int block_offset[6];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
111
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
112 int quantizer;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
113 uint16_t dequant_dc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
114 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
115 int8_t *qscale_table;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
116
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
117 /* DC predictors management */
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
118 VP56RefDc *above_blocks;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
119 VP56RefDc left_block[4];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
120 int above_block_idx[6];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
121 DCTELEM prev_dc[3][3]; /* [plan][ref_frame] */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
122
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
123 /* blocks / macroblock */
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
124 VP56mb mb_type;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
125 VP56Macroblock *macroblocks;
11369
98970e51365a Remove DECLARE_ALIGNED_{8,16} macros
mru
parents: 11053
diff changeset
126 DECLARE_ALIGNED(16, DCTELEM, block_coeff)[6][64];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
127
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
128 /* motion vectors */
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
129 VP56mv mv[6]; /* vectors for each block in MB */
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
130 VP56mv vector_candidate[2];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
131 int vector_candidate_pos;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
132
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
133 /* filtering hints */
4348
d3dcf62d52c5 add support for another variant of vp6
aurel
parents: 4308
diff changeset
134 int filter_header; /* used in vp6 only */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
135 int deblock_filtering;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
136 int filter_selection;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
137 int filter_mode;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
138 int max_vector_length;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
139 int sample_variance_threshold;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
140
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
141 uint8_t coeff_ctx[4][64]; /* used in vp5 only */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
142 uint8_t coeff_ctx_last[4]; /* used in vp5 only */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
143
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
144 int has_alpha;
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
145
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
146 /* upside-down flipping hints */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
147 int flip; /* are we flipping ? */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
148 int frbi; /* first row block index in MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
149 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
150 int stride[4]; /* stride for each plan */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
151
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
152 const uint8_t *vp56_coord_div;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
153 VP56ParseVectorAdjustment parse_vector_adjustment;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
154 VP56Filter filter;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
155 VP56ParseCoeff parse_coeff;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
156 VP56DefaultModelsInit default_models_init;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
157 VP56ParseVectorModels parse_vector_models;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
158 VP56ParseCoeffModels parse_coeff_models;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
159 VP56ParseHeader parse_header;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
160
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8300
diff changeset
161 VP56Model *modelp;
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8300
diff changeset
162 VP56Model models[2];
5821
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
163
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
164 /* huffman decoding */
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
165 int use_huffman;
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
166 GetBitContext gb;
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
167 VLC dccv_vlc[2];
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
168 VLC runv_vlc[2];
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
169 VLC ract_vlc[2][3][6];
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
170 unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
171 };
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
172
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
173
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
174 void vp56_init(AVCodecContext *avctx, int flip, int has_alpha);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
175 int vp56_free(AVCodecContext *avctx);
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
176 void vp56_init_dequant(VP56Context *s, int quantizer);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
177 int vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
9356
2983bd7deaf5 fix vp5/vp6 decoding by using new prototype for decode function
aurel
parents: 8718
diff changeset
178 AVPacket *avpkt);
3695
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 /**
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
182 * vp56 specific range coder implementation
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
183 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
184
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
185 static inline void vp56_init_range_decoder(VP56RangeCoder *c,
6297
michael
parents: 5830
diff changeset
186 const uint8_t *buf, int buf_size)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
187 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
188 c->high = 255;
12031
5578dcdf030c Optimize vp56 arithmetic decoder
darkshikari
parents: 12029
diff changeset
189 c->bits = -8;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
190 c->buffer = buf;
9919
c7c1c6b35a73 vp56dec: ensure range coder won't read past the end of input buffer
aurel
parents: 9428
diff changeset
191 c->end = buf + buf_size;
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4595
diff changeset
192 c->code_word = bytestream_get_be16(&c->buffer);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
193 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
194
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
195 static inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
196 {
12033
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
197 /* Don't put c->high in a local variable; if we do that, gcc gets
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
198 * the stupids and turns the code below into a branch again. */
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
199 int bits = c->bits;
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
200 unsigned long code_word = c->code_word;
11920
7d04a6cec75f Change a / 256 into a >> 8.
rbultje
parents: 11665
diff changeset
201 unsigned int low = 1 + (((c->high - 1) * prob) >> 8);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
202 unsigned int low_shift = low << 8;
12033
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
203 int bit = code_word >= low_shift;
12029
934968bd410d renormalize VP5/6/7/8 range coder without loop
stefang
parents: 11921
diff changeset
204 int shift;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
205
12033
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
206 /* Incantation to convince GCC to turn these into conditional moves
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
207 * instead of branches -- faster, as this branch is basically
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
208 * unpredictable. */
12032
572c81b3be19 CMOV-ify vp56 arithcoder
darkshikari
parents: 12031
diff changeset
209 c->high = bit ? c->high - low : low;
12033
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
210 code_word = bit ? code_word - low_shift : code_word;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
211
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
212 /* normalize */
12029
934968bd410d renormalize VP5/6/7/8 range coder without loop
stefang
parents: 11921
diff changeset
213 shift = ff_h264_norm_shift[c->high] - 1;
12033
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
214 c->high <<= shift;
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
215 code_word <<= shift;
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
216 bits += shift;
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
217 if(bits >= 0 && c->buffer < c->end) {
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
218 code_word |= *c->buffer++ << bits;
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
219 bits -= 8;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
220 }
12033
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
221 c->bits = bits;
5de2b84a1fc3 Eliminate another redundant instruction in vp56/8 arithcoder
darkshikari
parents: 12032
diff changeset
222 c->code_word = code_word;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
223 return bit;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
224 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
225
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
226 static inline int vp56_rac_get(VP56RangeCoder *c)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
227 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
228 /* equiprobable */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
229 int low = (c->high + 1) >> 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
230 unsigned int low_shift = low << 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
231 int bit = c->code_word >= low_shift;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
232 if (bit) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
233 c->high = (c->high - low) << 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
234 c->code_word -= low_shift;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
235 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
236 c->high = low << 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
237 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
238
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
239 /* normalize */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
240 c->code_word <<= 1;
12031
5578dcdf030c Optimize vp56 arithmetic decoder
darkshikari
parents: 12029
diff changeset
241 if (++c->bits == 0 && c->buffer < c->end) {
5578dcdf030c Optimize vp56 arithmetic decoder
darkshikari
parents: 12029
diff changeset
242 c->bits = -8;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
243 c->code_word |= *c->buffer++;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
244 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
245 return bit;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
246 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
247
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
248 // rounding is different than vp56_rac_get, is vp56_rac_get wrong?
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
249 static inline int vp8_rac_get(VP56RangeCoder *c)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
250 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
251 return vp56_rac_get_prob(c, 128);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
252 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
253
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
254 static inline int vp56_rac_gets(VP56RangeCoder *c, int bits)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
255 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
256 int value = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
257
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
258 while (bits--) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
259 value = (value << 1) | vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
260 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
261
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
262 return value;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
263 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
264
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
265 static inline int vp8_rac_get_uint(VP56RangeCoder *c, int bits)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
266 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
267 int value = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
268
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
269 while (bits--) {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
270 value = (value << 1) | vp8_rac_get(c);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
271 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
272
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
273 return value;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
274 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
275
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
276 // fixme: add 1 bit to all the calls to this?
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
277 static inline int vp8_rac_get_sint(VP56RangeCoder *c, int bits)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
278 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
279 int v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
280
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
281 if (!vp8_rac_get(c))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
282 return 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
283
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
284 v = vp8_rac_get_uint(c, bits);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
285
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
286 if (vp8_rac_get(c))
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
287 v = -v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
288
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
289 return v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
290 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
291
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
292 // P(7)
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
293 static inline int vp56_rac_gets_nn(VP56RangeCoder *c, int bits)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
294 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
295 int v = vp56_rac_gets(c, 7) << 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
296 return v + !v;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
297 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
298
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
299 static inline int vp8_rac_get_nn(VP56RangeCoder *c)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
300 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
301 int v = vp8_rac_get_uint(c, 7) << 1;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
302 return v + !v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
303 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
304
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
305 static inline int vp56_rac_get_tree(VP56RangeCoder *c,
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
306 const VP56Tree *tree,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
307 const uint8_t *probs)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
308 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
309 while (tree->val > 0) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
310 if (vp56_rac_get_prob(c, probs[tree->prob_idx]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
311 tree += tree->val;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
312 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
313 tree++;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
314 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
315 return -tree->val;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
316 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
317
11921
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
318 /**
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
319 * This is identical to vp8_rac_get_tree except for the possibility of starting
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
320 * on a node other than the root node, needed for coeff decode where this is
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
321 * used to save a bit after a 0 token (by disallowing EOB to immediately follow.)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
322 */
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
323 static inline int vp8_rac_get_tree_with_offset(VP56RangeCoder *c, const int8_t (*tree)[2],
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
324 const uint8_t *probs, int i)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
325 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
326 do {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
327 i = tree[i][vp56_rac_get_prob(c, probs[i])];
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
328 } while (i > 0);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
329
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
330 return -i;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
331 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
332
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
333 // how probabilities are associated with decisions is different I think
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
334 // well, the new scheme fits in the old but this way has one fewer branches per decision
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
335 static inline int vp8_rac_get_tree(VP56RangeCoder *c, const int8_t (*tree)[2],
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
336 const uint8_t *probs)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
337 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
338 return vp8_rac_get_tree_with_offset(c, tree, probs, 0);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
339 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
340
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
341 // DCTextra
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
342 static inline int vp8_rac_get_coeff(VP56RangeCoder *c, const uint8_t *prob)
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
343 {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
344 int v = 0;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
345
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
346 do {
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
347 v = (v<<1) + vp56_rac_get_prob(c, *prob++);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
348 } while (*prob);
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
349
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
350 return v;
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
351 }
f2007d7c3f1d Native VP8 decoder.
rbultje
parents: 11920
diff changeset
352
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 6448
diff changeset
353 #endif /* AVCODEC_VP56_H */