Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6148 serge 1
/*
2
 * VP8 compatible video decoder
3
 *
4
 * Copyright (C) 2010 David Conrad
5
 * Copyright (C) 2010 Ronald S. Bultje
6
 * Copyright (C) 2010 Jason Garrett-Glaser
7
 * Copyright (C) 2012 Daniel Kang
8
 *
9
 * This file is part of FFmpeg.
10
 *
11
 * FFmpeg is free software; you can redistribute it and/or
12
 * modify it under the terms of the GNU Lesser General Public
13
 * License as published by the Free Software Foundation; either
14
 * version 2.1 of the License, or (at your option) any later version.
15
 *
16
 * FFmpeg is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19
 * Lesser General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU Lesser General Public
22
 * License along with FFmpeg; if not, write to the Free Software
23
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24
 */
25
 
26
#ifndef AVCODEC_VP8_H
27
#define AVCODEC_VP8_H
28
 
29
#include "libavutil/buffer.h"
30
 
31
#include "vp56.h"
32
#include "vp8dsp.h"
33
#include "h264pred.h"
34
#include "thread.h"
35
#if HAVE_PTHREADS
36
#include 
37
#elif HAVE_OS2THREADS
38
#include "compat/os2threads.h"
39
#elif HAVE_W32THREADS
40
#include "compat/w32pthreads.h"
41
#endif
42
 
43
#define VP8_MAX_QUANT 127
44
 
45
enum dct_token {
46
    DCT_0,
47
    DCT_1,
48
    DCT_2,
49
    DCT_3,
50
    DCT_4,
51
    DCT_CAT1,
52
    DCT_CAT2,
53
    DCT_CAT3,
54
    DCT_CAT4,
55
    DCT_CAT5,
56
    DCT_CAT6,
57
    DCT_EOB,
58
 
59
    NUM_DCT_TOKENS
60
};
61
 
62
// used to signal 4x4 intra pred in luma MBs
63
#define MODE_I4x4 4
64
 
65
enum inter_mvmode {
66
    VP8_MVMODE_ZERO = MODE_I4x4 + 1,
67
    VP8_MVMODE_MV,
68
    VP8_MVMODE_SPLIT
69
};
70
 
71
enum inter_splitmvmode {
72
    VP8_SPLITMVMODE_16x8 = 0,    ///< 2 16x8 blocks (vertical)
73
    VP8_SPLITMVMODE_8x16,        ///< 2 8x16 blocks (horizontal)
74
    VP8_SPLITMVMODE_8x8,         ///< 2x2 blocks of 8x8px each
75
    VP8_SPLITMVMODE_4x4,         ///< 4x4 blocks of 4x4px each
76
    VP8_SPLITMVMODE_NONE,        ///< (only used in prediction) no split MVs
77
};
78
 
79
typedef struct VP8FilterStrength {
80
    uint8_t filter_level;
81
    uint8_t inner_limit;
82
    uint8_t inner_filter;
83
} VP8FilterStrength;
84
 
85
typedef struct VP8Macroblock {
86
    uint8_t skip;
87
    // todo: make it possible to check for at least (i4x4 or split_mv)
88
    // in one op. are others needed?
89
    uint8_t mode;
90
    uint8_t ref_frame;
91
    uint8_t partitioning;
92
    uint8_t chroma_pred_mode;
93
    uint8_t segment;
94
    uint8_t intra4x4_pred_mode_mb[16];
95
    uint8_t intra4x4_pred_mode_top[4];
96
    VP56mv mv;
97
    VP56mv bmv[16];
98
} VP8Macroblock;
99
 
100
typedef struct VP8ThreadData {
101
    DECLARE_ALIGNED(16, int16_t, block)[6][4][16];
102
    DECLARE_ALIGNED(16, int16_t, block_dc)[16];
103
    /**
104
     * This is the index plus one of the last non-zero coeff
105
     * for each of the blocks in the current macroblock.
106
     * So, 0 -> no coeffs
107
     *     1 -> dc-only (special transform)
108
     *     2+-> full transform
109
     */
110
    DECLARE_ALIGNED(16, uint8_t, non_zero_count_cache)[6][4];
111
    /**
112
     * For coeff decode, we need to know whether the above block had non-zero
113
     * coefficients. This means for each macroblock, we need data for 4 luma
114
     * blocks, 2 u blocks, 2 v blocks, and the luma dc block, for a total of 9
115
     * per macroblock. We keep the last row in top_nnz.
116
     */
117
    DECLARE_ALIGNED(8, uint8_t, left_nnz)[9];
118
    int thread_nr;
119
#if HAVE_THREADS
120
    pthread_mutex_t lock;
121
    pthread_cond_t  cond;
122
#endif
123
    int thread_mb_pos; // (mb_y << 16) | (mb_x & 0xFFFF)
124
    int wait_mb_pos; // What the current thread is waiting on.
125
    DECLARE_ALIGNED(16, uint8_t, edge_emu_buffer)[21*32];
126
    VP8FilterStrength *filter_strength;
127
} VP8ThreadData;
128
 
129
typedef struct VP8Frame {
130
    ThreadFrame tf;
131
    AVBufferRef *seg_map;
132
} VP8Frame;
133
 
134
#define MAX_THREADS 8
135
typedef struct VP8Context {
136
    VP8ThreadData *thread_data;
137
    AVCodecContext *avctx;
138
    VP8Frame *framep[4];
139
    VP8Frame *next_framep[4];
140
    VP8Frame *curframe;
141
    VP8Frame *prev_frame;
142
 
143
    uint16_t mb_width;   /* number of horizontal MB */
144
    uint16_t mb_height;  /* number of vertical MB */
145
    int linesize;
146
    int uvlinesize;
147
 
148
    uint8_t keyframe;
149
    uint8_t deblock_filter;
150
    uint8_t mbskip_enabled;
151
    uint8_t profile;
152
    VP56mv mv_min;
153
    VP56mv mv_max;
154
 
155
    int8_t sign_bias[4]; ///< one state [0, 1] per ref frame type
156
    int ref_count[3];
157
 
158
    /**
159
     * Base parameters for segmentation, i.e. per-macroblock parameters.
160
     * These must be kept unchanged even if segmentation is not used for
161
     * a frame, since the values persist between interframes.
162
     */
163
    struct {
164
        uint8_t enabled;
165
        uint8_t absolute_vals;
166
        uint8_t update_map;
167
        int8_t base_quant[4];
168
        int8_t filter_level[4];     ///< base loop filter level
169
    } segmentation;
170
 
171
    struct {
172
        uint8_t simple;
173
        uint8_t level;
174
        uint8_t sharpness;
175
    } filter;
176
 
177
    VP8Macroblock *macroblocks;
178
 
179
    uint8_t *intra4x4_pred_mode_top;
180
    uint8_t intra4x4_pred_mode_left[4];
181
 
182
    /**
183
     * Macroblocks can have one of 4 different quants in a frame when
184
     * segmentation is enabled.
185
     * If segmentation is disabled, only the first segment's values are used.
186
     */
187
    struct {
188
        // [0] - DC qmul  [1] - AC qmul
189
        int16_t luma_qmul[2];
190
        int16_t luma_dc_qmul[2];    ///< luma dc-only block quant
191
        int16_t chroma_qmul[2];
192
    } qmat[4];
193
 
194
    struct {
195
        uint8_t enabled;    ///< whether each mb can have a different strength based on mode/ref
196
 
197
        /**
198
         * filter strength adjustment for the following macroblock modes:
199
         * [0-3] - i16x16 (always zero)
200
         * [4]   - i4x4
201
         * [5]   - zero mv
202
         * [6]   - inter modes except for zero or split mv
203
         * [7]   - split mv
204
         *  i16x16 modes never have any adjustment
205
         */
206
        int8_t mode[VP8_MVMODE_SPLIT+1];
207
 
208
        /**
209
         * filter strength adjustment for macroblocks that reference:
210
         * [0] - intra / VP56_FRAME_CURRENT
211
         * [1] - VP56_FRAME_PREVIOUS
212
         * [2] - VP56_FRAME_GOLDEN
213
         * [3] - altref / VP56_FRAME_GOLDEN2
214
         */
215
        int8_t ref[4];
216
    } lf_delta;
217
 
218
    uint8_t (*top_border)[16+8+8];
219
    uint8_t (*top_nnz)[9];
220
 
221
    VP56RangeCoder c;   ///< header context, includes mb modes and motion vectors
222
 
223
    /**
224
     * These are all of the updatable probabilities for binary decisions.
225
     * They are only implictly reset on keyframes, making it quite likely
226
     * for an interframe to desync if a prior frame's header was corrupt
227
     * or missing outright!
228
     */
229
    struct {
230
        uint8_t segmentid[3];
231
        uint8_t mbskip;
232
        uint8_t intra;
233
        uint8_t last;
234
        uint8_t golden;
235
        uint8_t pred16x16[4];
236
        uint8_t pred8x8c[3];
237
        uint8_t token[4][16][3][NUM_DCT_TOKENS-1];
238
        uint8_t mvc[2][19];
239
    } prob[2];
240
 
241
    VP8Macroblock *macroblocks_base;
242
    int invisible;
243
    int update_last;    ///< update VP56_FRAME_PREVIOUS with the current one
244
    int update_golden;  ///< VP56_FRAME_NONE if not updated, or which frame to copy if so
245
    int update_altref;
246
 
247
    /**
248
     * If this flag is not set, all the probability updates
249
     * are discarded after this frame is decoded.
250
     */
251
    int update_probabilities;
252
 
253
    /**
254
     * All coefficients are contained in separate arith coding contexts.
255
     * There can be 1, 2, 4, or 8 of these after the header context.
256
     */
257
    int num_coeff_partitions;
258
    VP56RangeCoder coeff_partition[8];
259
    VideoDSPContext vdsp;
260
    VP8DSPContext vp8dsp;
261
    H264PredContext hpc;
262
    vp8_mc_func put_pixels_tab[3][3][3];
263
    VP8Frame frames[5];
264
 
265
    int num_jobs;
266
    /**
267
     * This describes the macroblock memory layout.
268
     * 0 -> Only width+height*2+1 macroblocks allocated (frame/single thread).
269
     * 1 -> Macroblocks for entire frame alloced (sliced thread).
270
     */
271
    int mb_layout;
272
} VP8Context;
273
 
274
int ff_vp8_decode_init(AVCodecContext *avctx);
275
 
276
int ff_vp8_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
277
                        AVPacket *avpkt);
278
 
279
int ff_vp8_decode_free(AVCodecContext *avctx);
280
 
281
#endif /* AVCODEC_VP8_H */