annotate vp56.h @ 9473:e38284cd69dc libavcodec

Use memcpy instead of the very inefficient bytecopy where both are correct (i.e. no overlap of src and dst is possible).
author reimar
date Fri, 17 Apr 2009 17:20:48 +0000
parents 0dce4fe6e6f3
children c7c1c6b35a73
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8304
diff changeset
2 * @file libavcodec/vp56.h
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"
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
31
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
32
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
33 typedef struct vp56_context VP56Context;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
34 typedef struct vp56_mv VP56mv;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
35
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
36 typedef void (*VP56ParseVectorAdjustment)(VP56Context *s,
8300
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
37 VP56mv *vect);
c47323828269 cosmetics: vertical alignment
aurel
parents: 8299
diff changeset
38 typedef int (*VP56Adjust)(int v, int t);
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;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
51 int bits;
6297
michael
parents: 5830
diff changeset
52 const uint8_t *buffer;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
53 unsigned long code_word;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
54 } VP56RangeCoder;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
55
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
56 typedef struct {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
57 uint8_t not_null_dc;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
58 VP56Frame ref_frame;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
59 DCTELEM dc_coeff;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
60 } VP56RefDc;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
61
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
62 struct vp56_mv {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
63 int x;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
64 int y;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
65 };
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
66
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
67 typedef struct {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
68 uint8_t type;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
69 VP56mv mv;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
70 } VP56Macroblock;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
71
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
72 typedef struct {
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
73 uint8_t coeff_reorder[64]; /* used in vp6 only */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
74 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
75 uint8_t vector_sig[2]; /* delta sign */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
76 uint8_t vector_dct[2]; /* delta coding types */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
77 uint8_t vector_pdi[2][2]; /* predefined delta init */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
78 uint8_t vector_pdv[2][7]; /* predefined delta values */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
79 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
80 uint8_t coeff_dccv[2][11]; /* DC coeff value */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
81 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
82 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
83 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
84 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
85 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
86 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
87 } VP56Model;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
88
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
89 struct vp56_context {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
90 AVCodecContext *avctx;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
91 DSPContext dsp;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
92 ScanTable scantable;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
93 AVFrame frames[4];
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
94 AVFrame *framep[6];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
95 uint8_t *edge_emu_buffer_alloc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
96 uint8_t *edge_emu_buffer;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
97 VP56RangeCoder c;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
98 VP56RangeCoder cc;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
99 VP56RangeCoder *ccp;
4308
74b476185cd1 Add support for VP60 and VP61.
aurel
parents: 4078
diff changeset
100 int sub_version;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
101
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
102 /* frame info */
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
103 int plane_width[4];
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
104 int plane_height[4];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
105 int mb_width; /* number of horizontal MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
106 int mb_height; /* number of vertical MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
107 int block_offset[6];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
108
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
109 int quantizer;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
110 uint16_t dequant_dc;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
111 uint16_t dequant_ac;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
112
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
113 /* DC predictors management */
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
114 VP56RefDc *above_blocks;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
115 VP56RefDc left_block[4];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
116 int above_block_idx[6];
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
117 DCTELEM prev_dc[3][3]; /* [plan][ref_frame] */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
118
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
119 /* blocks / macroblock */
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
120 VP56mb mb_type;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
121 VP56Macroblock *macroblocks;
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
122 DECLARE_ALIGNED_16(DCTELEM, block_coeff[6][64]);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
123
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
124 /* motion vectors */
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
125 VP56mv mv[6]; /* vectors for each block in MB */
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
126 VP56mv vector_candidate[2];
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
127 int vector_candidate_pos;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
128
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
129 /* filtering hints */
4348
d3dcf62d52c5 add support for another variant of vp6
aurel
parents: 4308
diff changeset
130 int filter_header; /* used in vp6 only */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
131 int deblock_filtering;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
132 int filter_selection;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
133 int filter_mode;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
134 int max_vector_length;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
135 int sample_variance_threshold;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
136
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
137 uint8_t coeff_ctx[4][64]; /* used in vp5 only */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
138 uint8_t coeff_ctx_last[4]; /* used in vp5 only */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
139
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
140 int has_alpha;
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
141
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
142 /* upside-down flipping hints */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
143 int flip; /* are we flipping ? */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
144 int frbi; /* first row block index in MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
145 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
146 int stride[4]; /* stride for each plan */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
147
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
148 const uint8_t *vp56_coord_div;
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
149 VP56ParseVectorAdjustment parse_vector_adjustment;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
150 VP56Adjust adjust;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
151 VP56Filter filter;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
152 VP56ParseCoeff parse_coeff;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
153 VP56DefaultModelsInit default_models_init;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
154 VP56ParseVectorModels parse_vector_models;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
155 VP56ParseCoeffModels parse_coeff_models;
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
156 VP56ParseHeader parse_header;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
157
8304
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8300
diff changeset
158 VP56Model *modelp;
3cddc18caeca rename Vp56Model to VP56Model for consistency
aurel
parents: 8300
diff changeset
159 VP56Model models[2];
5821
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
160
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
161 /* huffman decoding */
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
162 int use_huffman;
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
163 GetBitContext gb;
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
164 VLC dccv_vlc[2];
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
165 VLC runv_vlc[2];
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
166 VLC ract_vlc[2][3][6];
51918cb97f6f add support for VP6 with huffman encoded blocks
aurel
parents: 5714
diff changeset
167 unsigned int nb_null[2][2]; /* number of consecutive NULL DC/AC */
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
168 };
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
169
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
170
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
171 void vp56_init(AVCodecContext *avctx, int flip, int has_alpha);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
172 int vp56_free(AVCodecContext *avctx);
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
173 void vp56_init_dequant(VP56Context *s, int quantizer);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
174 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
175 AVPacket *avpkt);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
176
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
177
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
178 /**
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
179 * vp56 specific range coder implementation
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
180 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
181
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
182 static inline void vp56_init_range_decoder(VP56RangeCoder *c,
6297
michael
parents: 5830
diff changeset
183 const uint8_t *buf, int buf_size)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
184 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
185 c->high = 255;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
186 c->bits = 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
187 c->buffer = buf;
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4595
diff changeset
188 c->code_word = bytestream_get_be16(&c->buffer);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
189 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
190
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
191 static inline int vp56_rac_get_prob(VP56RangeCoder *c, uint8_t prob)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
192 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
193 unsigned int low = 1 + (((c->high - 1) * prob) / 256);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
194 unsigned int low_shift = low << 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
195 int bit = c->code_word >= low_shift;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
196
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
197 if (bit) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
198 c->high -= low;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
199 c->code_word -= low_shift;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
200 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
201 c->high = low;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
202 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
203
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
204 /* normalize */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
205 while (c->high < 128) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
206 c->high <<= 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
207 c->code_word <<= 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
208 if (--c->bits == 0) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
209 c->bits = 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
210 c->code_word |= *c->buffer++;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
211 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
212 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
213 return bit;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
214 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
215
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
216 static inline int vp56_rac_get(VP56RangeCoder *c)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
217 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
218 /* equiprobable */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
219 int low = (c->high + 1) >> 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
220 unsigned int low_shift = low << 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
221 int bit = c->code_word >= low_shift;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
222 if (bit) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
223 c->high = (c->high - low) << 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
224 c->code_word -= low_shift;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
225 } else {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
226 c->high = low << 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
227 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
228
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
229 /* normalize */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
230 c->code_word <<= 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
231 if (--c->bits == 0) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
232 c->bits = 8;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
233 c->code_word |= *c->buffer++;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
234 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
235 return bit;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
236 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
237
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
238 static inline int vp56_rac_gets(VP56RangeCoder *c, int bits)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
239 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
240 int value = 0;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
241
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
242 while (bits--) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
243 value = (value << 1) | vp56_rac_get(c);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
244 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
245
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
246 return value;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
247 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
248
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
249 static inline int vp56_rac_gets_nn(VP56RangeCoder *c, int bits)
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
250 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
251 int v = vp56_rac_gets(c, 7) << 1;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
252 return v + !v;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
253 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
254
8299
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
255 static inline int vp56_rac_get_tree(VP56RangeCoder *c,
524cb7f5ad2b avoid POSIX reserved _t suffix
aurel
parents: 7760
diff changeset
256 const VP56Tree *tree,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
257 const uint8_t *probs)
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
258 {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
259 while (tree->val > 0) {
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
260 if (vp56_rac_get_prob(c, probs[tree->prob_idx]))
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
261 tree += tree->val;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
262 else
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
263 tree++;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
264 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
265 return -tree->val;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
266 }
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
267
7760
c4a4495715dd Globally rename the header inclusion guard names.
stefano
parents: 6448
diff changeset
268 #endif /* AVCODEC_VP56_H */