Commit | Line | Data |
---|---|---|
2ba45a60 DM |
1 | /* |
2 | * RV30/40 decoder common data declarations | |
3 | * Copyright (c) 2007 Mike Melanson, Konstantin Shishkov | |
4 | * | |
5 | * This file is part of FFmpeg. | |
6 | * | |
7 | * FFmpeg is free software; you can redistribute it and/or | |
8 | * modify it under the terms of the GNU Lesser General Public | |
9 | * License as published by the Free Software Foundation; either | |
10 | * version 2.1 of the License, or (at your option) any later version. | |
11 | * | |
12 | * FFmpeg is distributed in the hope that it will be useful, | |
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 | * Lesser General Public License for more details. | |
16 | * | |
17 | * You should have received a copy of the GNU Lesser General Public | |
18 | * License along with FFmpeg; if not, write to the Free Software | |
19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 | */ | |
21 | ||
22 | /** | |
23 | * @file | |
24 | * RV30 and RV40 decoder common data declarations | |
25 | */ | |
26 | ||
27 | #ifndef AVCODEC_RV34_H | |
28 | #define AVCODEC_RV34_H | |
29 | ||
30 | #include "avcodec.h" | |
31 | #include "mpegvideo.h" | |
32 | ||
33 | #include "h264pred.h" | |
34 | #include "rv34dsp.h" | |
35 | ||
36 | #define MB_TYPE_SEPARATE_DC 0x01000000 | |
37 | #define IS_SEPARATE_DC(a) ((a) & MB_TYPE_SEPARATE_DC) | |
38 | ||
39 | /** | |
40 | * RV30 and RV40 Macroblock types | |
41 | */ | |
42 | enum RV40BlockTypes{ | |
43 | RV34_MB_TYPE_INTRA, ///< Intra macroblock | |
44 | RV34_MB_TYPE_INTRA16x16, ///< Intra macroblock with DCs in a separate 4x4 block | |
45 | RV34_MB_P_16x16, ///< P-frame macroblock, one motion frame | |
46 | RV34_MB_P_8x8, ///< P-frame macroblock, 8x8 motion compensation partitions | |
47 | RV34_MB_B_FORWARD, ///< B-frame macroblock, forward prediction | |
48 | RV34_MB_B_BACKWARD, ///< B-frame macroblock, backward prediction | |
49 | RV34_MB_SKIP, ///< Skipped block | |
50 | RV34_MB_B_DIRECT, ///< Bidirectionally predicted B-frame macroblock, no motion vectors | |
51 | RV34_MB_P_16x8, ///< P-frame macroblock, 16x8 motion compensation partitions | |
52 | RV34_MB_P_8x16, ///< P-frame macroblock, 8x16 motion compensation partitions | |
53 | RV34_MB_B_BIDIR, ///< Bidirectionally predicted B-frame macroblock, two motion vectors | |
54 | RV34_MB_P_MIX16x16, ///< P-frame macroblock with DCs in a separate 4x4 block, one motion vector | |
55 | RV34_MB_TYPES | |
56 | }; | |
57 | ||
58 | /** | |
59 | * VLC tables used by the decoder | |
60 | * | |
61 | * Intra frame VLC sets do not contain some of those tables. | |
62 | */ | |
63 | typedef struct RV34VLC{ | |
64 | VLC cbppattern[2]; ///< VLCs used for pattern of coded block patterns decoding | |
65 | VLC cbp[2][4]; ///< VLCs used for coded block patterns decoding | |
66 | VLC first_pattern[4]; ///< VLCs used for decoding coefficients in the first subblock | |
67 | VLC second_pattern[2]; ///< VLCs used for decoding coefficients in the subblocks 2 and 3 | |
68 | VLC third_pattern[2]; ///< VLCs used for decoding coefficients in the last subblock | |
69 | VLC coefficient; ///< VLCs used for decoding big coefficients | |
70 | }RV34VLC; | |
71 | ||
72 | /** essential slice information */ | |
73 | typedef struct SliceInfo{ | |
74 | int type; ///< slice type (intra, inter) | |
75 | int quant; ///< quantizer used for this slice | |
76 | int vlc_set; ///< VLCs used for this slice | |
77 | int start, end; ///< start and end macroblocks of the slice | |
78 | int width; ///< coded width | |
79 | int height; ///< coded height | |
80 | int pts; ///< frame timestamp | |
81 | }SliceInfo; | |
82 | ||
83 | /** decoder context */ | |
84 | typedef struct RV34DecContext{ | |
85 | MpegEncContext s; | |
86 | RV34DSPContext rdsp; | |
87 | int8_t *intra_types_hist;///< old block types, used for prediction | |
88 | int8_t *intra_types; ///< block types | |
89 | int intra_types_stride;///< block types array stride | |
90 | const uint8_t *luma_dc_quant_i;///< luma subblock DC quantizer for intraframes | |
91 | const uint8_t *luma_dc_quant_p;///< luma subblock DC quantizer for interframes | |
92 | ||
93 | RV34VLC *cur_vlcs; ///< VLC set used for current frame decoding | |
94 | H264PredContext h; ///< functions for 4x4 and 16x16 intra block prediction | |
95 | SliceInfo si; ///< current slice information | |
96 | ||
97 | int *mb_type; ///< internal macroblock types | |
98 | int block_type; ///< current block type | |
99 | int luma_vlc; ///< which VLC set will be used for decoding of luma blocks | |
100 | int chroma_vlc; ///< which VLC set will be used for decoding of chroma blocks | |
101 | int is16; ///< current block has additional 16x16 specific features or not | |
102 | int dmv[4][2]; ///< differential motion vectors for the current macroblock | |
103 | ||
104 | int rv30; ///< indicates which RV variasnt is currently decoded | |
105 | int max_rpr; | |
106 | ||
107 | int cur_pts, last_pts, next_pts; | |
108 | int scaled_weight; | |
109 | int weight1, weight2; ///< B frame distance fractions (0.14) used in motion compensation | |
110 | int mv_weight1, mv_weight2; | |
111 | ||
112 | uint16_t *cbp_luma; ///< CBP values for luma subblocks | |
113 | uint8_t *cbp_chroma; ///< CBP values for chroma subblocks | |
114 | uint16_t *deblock_coefs; ///< deblock coefficients for each macroblock | |
115 | ||
116 | /** 8x8 block available flags (for MV prediction) */ | |
117 | DECLARE_ALIGNED(8, uint32_t, avail_cache)[3*4]; | |
118 | ||
119 | /** temporary blocks for RV4 weighted MC */ | |
120 | uint8_t *tmp_b_block_y[2]; | |
121 | uint8_t *tmp_b_block_uv[4]; | |
122 | uint8_t *tmp_b_block_base; | |
123 | ||
124 | int (*parse_slice_header)(struct RV34DecContext *r, GetBitContext *gb, SliceInfo *si); | |
125 | int (*decode_mb_info)(struct RV34DecContext *r); | |
126 | int (*decode_intra_types)(struct RV34DecContext *r, GetBitContext *gb, int8_t *dst); | |
127 | void (*loop_filter)(struct RV34DecContext *r, int row); | |
128 | }RV34DecContext; | |
129 | ||
130 | /** | |
131 | * common decoding functions | |
132 | */ | |
133 | int ff_rv34_get_start_offset(GetBitContext *gb, int blocks); | |
134 | int ff_rv34_decode_init(AVCodecContext *avctx); | |
135 | int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt); | |
136 | int ff_rv34_decode_end(AVCodecContext *avctx); | |
137 | int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx); | |
138 | int ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src); | |
139 | ||
140 | #endif /* AVCODEC_RV34_H */ |