blob: efff94a1d90a0d1e21428bd65f412590fc2af76b
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 variant 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 | int orig_width, orig_height; |
113 | |
114 | uint16_t *cbp_luma; ///< CBP values for luma subblocks |
115 | uint8_t *cbp_chroma; ///< CBP values for chroma subblocks |
116 | uint16_t *deblock_coefs; ///< deblock coefficients for each macroblock |
117 | |
118 | /** 8x8 block available flags (for MV prediction) */ |
119 | DECLARE_ALIGNED(8, uint32_t, avail_cache)[3*4]; |
120 | |
121 | /** temporary blocks for RV4 weighted MC */ |
122 | uint8_t *tmp_b_block_y[2]; |
123 | uint8_t *tmp_b_block_uv[4]; |
124 | uint8_t *tmp_b_block_base; |
125 | |
126 | int (*parse_slice_header)(struct RV34DecContext *r, GetBitContext *gb, SliceInfo *si); |
127 | int (*decode_mb_info)(struct RV34DecContext *r); |
128 | int (*decode_intra_types)(struct RV34DecContext *r, GetBitContext *gb, int8_t *dst); |
129 | void (*loop_filter)(struct RV34DecContext *r, int row); |
130 | }RV34DecContext; |
131 | |
132 | /** |
133 | * common decoding functions |
134 | */ |
135 | int ff_rv34_get_start_offset(GetBitContext *gb, int blocks); |
136 | int ff_rv34_decode_init(AVCodecContext *avctx); |
137 | int ff_rv34_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt); |
138 | int ff_rv34_decode_end(AVCodecContext *avctx); |
139 | int ff_rv34_decode_init_thread_copy(AVCodecContext *avctx); |
140 | int ff_rv34_decode_update_thread_context(AVCodecContext *dst, const AVCodecContext *src); |
141 | |
142 | #endif /* AVCODEC_RV34_H */ |
143 |