annotate vp56.h @ 6323:e6da66f378c7 libavcodec

mpegvideo.h has two function declarations with the 'inline' specifier but no definition for those functions. The C standard requires a definition to appear in the same translation unit for any function declared with 'inline'. Most of the files including mpegvideo.h do not define those functions. Fix this by removing the 'inline' specifiers from the header. patch by Uoti Urpala
author diego
date Sun, 03 Feb 2008 17:54:30 +0000
parents 1b91ce6c758c
children 7fa807dd7958
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 /**
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
2 * @file vp56.h
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
5830
1d83e9c34641 Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents: 5821
diff changeset
24 #ifndef FFMPEG_VP56_H
1d83e9c34641 Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents: 5821
diff changeset
25 #define FFMPEG_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"
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
29 #include "mpegvideo.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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
33 typedef struct vp56_context vp56_context_t;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
34 typedef struct vp56_mv vp56_mv_t;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
35
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
36 typedef void (*vp56_parse_vector_adjustment_t)(vp56_context_t *s,
3759
64642d08db1b rename vector to vect to avoid clash with Apple gcc
aurel
parents: 3695
diff changeset
37 vp56_mv_t *vect);
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
38 typedef int (*vp56_adjust_t)(int v, int t);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
39 typedef void (*vp56_filter_t)(vp56_context_t *s, uint8_t *dst, uint8_t *src,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
40 int offset1, int offset2, int stride,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
41 vp56_mv_t mv, int mask, int select, int luma);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
42 typedef void (*vp56_parse_coeff_t)(vp56_context_t *s);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
43 typedef void (*vp56_default_models_init_t)(vp56_context_t *s);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
44 typedef void (*vp56_parse_vector_models_t)(vp56_context_t *s);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
45 typedef void (*vp56_parse_coeff_models_t)(vp56_context_t *s);
6297
michael
parents: 5830
diff changeset
46 typedef int (*vp56_parse_header_t)(vp56_context_t *s, const uint8_t *buf,
3695
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
47 int buf_size, int *golden_frame);
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;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
54 } vp56_range_coder_t;
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;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
58 vp56_frame_t ref_frame;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
59 DCTELEM dc_coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
60 } vp56_ref_dc_t;
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;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
69 vp56_mv_t mv;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
70 } vp56_macroblock_t;
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 */
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
87 } vp56_model_t;
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;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
97 vp56_range_coder_t c;
4348
d3dcf62d52c5 add support for another variant of vp6
aurel
parents: 4308
diff changeset
98 vp56_range_coder_t cc;
d3dcf62d52c5 add support for another variant of vp6
aurel
parents: 4308
diff changeset
99 vp56_range_coder_t *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 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
114 vp56_ref_dc_t *above_blocks;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
115 vp56_ref_dc_t left_block[4];
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 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
120 vp56_mb_t mb_type;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
121 vp56_macroblock_t *macroblocks;
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 */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
125 vp56_mv_t mv[6]; /* vectors for each block in MB */
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
126 vp56_mv_t vector_candidate[2];
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;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
149 vp56_parse_vector_adjustment_t parse_vector_adjustment;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
150 vp56_adjust_t adjust;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
151 vp56_filter_t filter;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
152 vp56_parse_coeff_t parse_coeff;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
153 vp56_default_models_init_t default_models_init;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
154 vp56_parse_vector_models_t parse_vector_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
155 vp56_parse_coeff_models_t parse_coeff_models;
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
156 vp56_parse_header_t parse_header;
5711
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
157
dae0f80edbb3 move all model related tables into their own struct
aurel
parents: 5708
diff changeset
158 vp56_model_t *modelp;
5714
314be1cfdcb0 add a new vp6a codec (add alpha plan support to vp6)
aurel
parents: 5711
diff changeset
159 vp56_model_t 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);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
173 void vp56_init_dequant(vp56_context_t *s, int quantizer);
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
174 int vp56_decode_frame(AVCodecContext *avctx, void *data, int *data_size,
6297
michael
parents: 5830
diff changeset
175 const uint8_t *buf, int buf_size);
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
182 static inline void vp56_init_range_decoder(vp56_range_coder_t *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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
191 static inline int vp56_rac_get_prob(vp56_range_coder_t *c, uint8_t prob)
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
216 static inline int vp56_rac_get(vp56_range_coder_t *c)
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
238 static inline int vp56_rac_gets(vp56_range_coder_t *c, int bits)
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
249 static inline int vp56_rac_gets_nn(vp56_range_coder_t *c, int bits)
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
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
255 static inline int vp56_rac_get_tree(vp56_range_coder_t *c,
6795c9e5f983 VP5 and VP6 video decoder
aurel
parents:
diff changeset
256 const vp56_tree_t *tree,
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
5830
1d83e9c34641 Add FFMPEG_ prefix to all multiple inclusion guards.
diego
parents: 5821
diff changeset
268 #endif /* FFMPEG_VP56_H */