annotate rv40.c @ 10952:ea8f891d997d libavcodec

H264 DXVA2 implementation It allows VLD H264 decoding using DXVA2 (GPU assisted decoding API under VISTA and Windows 7). It is implemented by using AVHWAccel API. It has been tested successfully for some time in VLC using an nvidia card on Windows 7. To compile it, you need to have the system header dxva2api.h (either from microsoft or using http://downloads.videolan.org/pub/videolan/testing/contrib/dxva2api.h) The generated libavcodec.dll does not depend directly on any new lib as the necessary objects are given by the application using FFmpeg.
author fenrir
date Wed, 20 Jan 2010 18:54:51 +0000
parents d0f2f4e4436c
children 8a4984c5cacc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
1 /*
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
2 * RV40 decoder
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
3 * Copyright (c) 2007 Konstantin Shishkov
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
4 *
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
6 *
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
11 *
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
16 *
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
20 */
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
21
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
22 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8693
diff changeset
23 * @file libavcodec/rv40.c
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
24 * RV40 decoder
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
25 */
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
26
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
27 #include "avcodec.h"
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
28 #include "dsputil.h"
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
29 #include "mpegvideo.h"
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5994
diff changeset
30 #include "golomb.h"
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
31
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
32 #include "rv34.h"
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
33 #include "rv40vlc2.h"
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
34 #include "rv40data.h"
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
35
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
36 static VLC aic_top_vlc;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
37 static VLC aic_mode1_vlc[AIC_MODE1_NUM], aic_mode2_vlc[AIC_MODE2_NUM];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
38 static VLC ptype_vlc[NUM_PTYPE_VLCS], btype_vlc[NUM_BTYPE_VLCS];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
39
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
40 static const int16_t mode2_offs[] = {
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
41 0, 614, 1222, 1794, 2410, 3014, 3586, 4202, 4792, 5382, 5966, 6542,
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
42 7138, 7716, 8292, 8864, 9444, 10030, 10642, 11212, 11814
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
43 };
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
44
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
45 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
46 * Initialize all tables.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
47 */
8693
18737839ed27 Add missing void keyword to parameterless function declarations.
diego
parents: 8369
diff changeset
48 static av_cold void rv40_init_tables(void)
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
49 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
50 int i;
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
51 static VLC_TYPE aic_table[1 << AIC_TOP_BITS][2];
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
52 static VLC_TYPE aic_mode1_table[AIC_MODE1_NUM << AIC_MODE1_BITS][2];
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
53 static VLC_TYPE aic_mode2_table[11814][2];
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
54 static VLC_TYPE ptype_table[NUM_PTYPE_VLCS << PTYPE_VLC_BITS][2];
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
55 static VLC_TYPE btype_table[NUM_BTYPE_VLCS << BTYPE_VLC_BITS][2];
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
56
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
57 aic_top_vlc.table = aic_table;
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
58 aic_top_vlc.table_allocated = 1 << AIC_TOP_BITS;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
59 init_vlc(&aic_top_vlc, AIC_TOP_BITS, AIC_TOP_SIZE,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
60 rv40_aic_top_vlc_bits, 1, 1,
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
61 rv40_aic_top_vlc_codes, 1, 1, INIT_VLC_USE_NEW_STATIC);
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
62 for(i = 0; i < AIC_MODE1_NUM; i++){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
63 // Every tenth VLC table is empty
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
64 if((i % 10) == 9) continue;
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
65 aic_mode1_vlc[i].table = &aic_mode1_table[i << AIC_MODE1_BITS];
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
66 aic_mode1_vlc[i].table_allocated = 1 << AIC_MODE1_BITS;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
67 init_vlc(&aic_mode1_vlc[i], AIC_MODE1_BITS, AIC_MODE1_SIZE,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
68 aic_mode1_vlc_bits[i], 1, 1,
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
69 aic_mode1_vlc_codes[i], 1, 1, INIT_VLC_USE_NEW_STATIC);
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
70 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
71 for(i = 0; i < AIC_MODE2_NUM; i++){
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
72 aic_mode2_vlc[i].table = &aic_mode2_table[mode2_offs[i]];
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
73 aic_mode2_vlc[i].table_allocated = mode2_offs[i + 1] - mode2_offs[i];
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
74 init_vlc(&aic_mode2_vlc[i], AIC_MODE2_BITS, AIC_MODE2_SIZE,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
75 aic_mode2_vlc_bits[i], 1, 1,
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
76 aic_mode2_vlc_codes[i], 2, 2, INIT_VLC_USE_NEW_STATIC);
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
77 }
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
78 for(i = 0; i < NUM_PTYPE_VLCS; i++){
9550
d418640c8d86 cosmetics: remove extra space indentation
kostya
parents: 9518
diff changeset
79 ptype_vlc[i].table = &ptype_table[i << PTYPE_VLC_BITS];
d418640c8d86 cosmetics: remove extra space indentation
kostya
parents: 9518
diff changeset
80 ptype_vlc[i].table_allocated = 1 << PTYPE_VLC_BITS;
d418640c8d86 cosmetics: remove extra space indentation
kostya
parents: 9518
diff changeset
81 init_vlc_sparse(&ptype_vlc[i], PTYPE_VLC_BITS, PTYPE_VLC_SIZE,
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
82 ptype_vlc_bits[i], 1, 1,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
83 ptype_vlc_codes[i], 1, 1,
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
84 ptype_vlc_syms, 1, 1, INIT_VLC_USE_NEW_STATIC);
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
85 }
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
86 for(i = 0; i < NUM_BTYPE_VLCS; i++){
9550
d418640c8d86 cosmetics: remove extra space indentation
kostya
parents: 9518
diff changeset
87 btype_vlc[i].table = &btype_table[i << BTYPE_VLC_BITS];
d418640c8d86 cosmetics: remove extra space indentation
kostya
parents: 9518
diff changeset
88 btype_vlc[i].table_allocated = 1 << BTYPE_VLC_BITS;
d418640c8d86 cosmetics: remove extra space indentation
kostya
parents: 9518
diff changeset
89 init_vlc_sparse(&btype_vlc[i], BTYPE_VLC_BITS, BTYPE_VLC_SIZE,
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
90 btype_vlc_bits[i], 1, 1,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
91 btype_vlc_codes[i], 1, 1,
9518
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
92 btype_vlc_syms, 1, 1, INIT_VLC_USE_NEW_STATIC);
b293cd788af3 Make rv40 decoder use new static VLC initialization method
kostya
parents: 9028
diff changeset
93 }
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
94 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
95
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
96 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
97 * Get stored dimension from bitstream.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
98 *
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
99 * If the width/height is the standard one then it's coded as a 3-bit index.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
100 * Otherwise it is coded as escaped 8-bit portions.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
101 */
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
102 static int get_dimension(GetBitContext *gb, const int *dim)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
103 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
104 int t = get_bits(gb, 3);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
105 int val = dim[t];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
106 if(val < 0)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
107 val = dim[get_bits1(gb) - val];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
108 if(!val){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
109 do{
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
110 t = get_bits(gb, 8);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
111 val += t << 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
112 }while(t == 0xFF);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
113 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
114 return val;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
115 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
116
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
117 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
118 * Get encoded picture size - usually this is called from rv40_parse_slice_header.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
119 */
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
120 static void rv40_parse_picture_size(GetBitContext *gb, int *w, int *h)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
121 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
122 *w = get_dimension(gb, rv40_standard_widths);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
123 *h = get_dimension(gb, rv40_standard_heights);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
124 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
125
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
126 static int rv40_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
127 {
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6712
diff changeset
128 int mb_bits;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
129 int w = r->s.width, h = r->s.height;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
130 int mb_size;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
131
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
132 memset(si, 0, sizeof(SliceInfo));
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
133 if(get_bits1(gb))
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
134 return -1;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
135 si->type = get_bits(gb, 2);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
136 if(si->type == 1) si->type = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
137 si->quant = get_bits(gb, 5);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
138 if(get_bits(gb, 2))
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
139 return -1;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
140 si->vlc_set = get_bits(gb, 2);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
141 skip_bits1(gb);
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6712
diff changeset
142 si->pts = get_bits(gb, 13);
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
143 if(!si->type || !get_bits1(gb))
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
144 rv40_parse_picture_size(gb, &w, &h);
5994
625b4a680d41 Check decoded dimensions for validity
kostya
parents: 5993
diff changeset
145 if(avcodec_check_dimensions(r->s.avctx, w, h) < 0)
625b4a680d41 Check decoded dimensions for validity
kostya
parents: 5993
diff changeset
146 return -1;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
147 si->width = w;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
148 si->height = h;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
149 mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
150 mb_bits = ff_rv34_get_start_offset(gb, mb_size);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
151 si->start = get_bits(gb, mb_bits);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
152
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
153 return 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
154 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
155
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
156 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
157 * Decode 4x4 intra types array.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
158 */
5993
5dfff8f6f524 Intra types will be stored in int8_t array
kostya
parents: 5992
diff changeset
159 static int rv40_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
160 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
161 MpegEncContext *s = &r->s;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
162 int i, j, k, v;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
163 int A, B, C;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
164 int pattern;
5993
5dfff8f6f524 Intra types will be stored in int8_t array
kostya
parents: 5992
diff changeset
165 int8_t *ptr;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
166
9903
305536ce781f RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents: 9550
diff changeset
167 for(i = 0; i < 4; i++, dst += r->intra_types_stride){
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
168 if(!i && s->first_slice_line){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
169 pattern = get_vlc2(gb, aic_top_vlc.table, AIC_TOP_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
170 dst[0] = (pattern >> 2) & 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
171 dst[1] = (pattern >> 1) & 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
172 dst[2] = pattern & 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
173 dst[3] = (pattern << 1) & 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
174 continue;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
175 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
176 ptr = dst;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
177 for(j = 0; j < 4; j++){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
178 /* Coefficients are read using VLC chosen by the prediction pattern
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
179 * The first one (used for retrieving a pair of coefficients) is
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
180 * constructed from the top, top right and left coefficients
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
181 * The second one (used for retrieving only one coefficient) is
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
182 * top + 10 * left.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
183 */
9903
305536ce781f RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents: 9550
diff changeset
184 A = ptr[-r->intra_types_stride + 1]; // it won't be used for the last coefficient in a row
305536ce781f RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents: 9550
diff changeset
185 B = ptr[-r->intra_types_stride];
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
186 C = ptr[-1];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
187 pattern = A + (B << 4) + (C << 8);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
188 for(k = 0; k < MODE2_PATTERNS_NUM; k++)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
189 if(pattern == rv40_aic_table_index[k])
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
190 break;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
191 if(j < 3 && k < MODE2_PATTERNS_NUM){ //pattern is found, decoding 2 coefficients
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
192 v = get_vlc2(gb, aic_mode2_vlc[k].table, AIC_MODE2_BITS, 2);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
193 *ptr++ = v/9;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
194 *ptr++ = v%9;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
195 j++;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
196 }else{
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
197 if(B != -1 && C != -1)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
198 v = get_vlc2(gb, aic_mode1_vlc[B + C*10].table, AIC_MODE1_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
199 else{ // tricky decoding
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
200 v = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
201 switch(C){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
202 case -1: // code 0 -> 1, 1 -> 0
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
203 if(B < 2)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
204 v = get_bits1(gb) ^ 1;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
205 break;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
206 case 0:
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
207 case 2: // code 0 -> 2, 1 -> 0
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
208 v = (get_bits1(gb) ^ 1) << 1;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
209 break;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
210 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
211 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
212 *ptr++ = v;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
213 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
214 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
215 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
216 return 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
217 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
218
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
219 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
220 * Decode macroblock information.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
221 */
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
222 static int rv40_decode_mb_info(RV34DecContext *r)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
223 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
224 MpegEncContext *s = &r->s;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
225 GetBitContext *gb = &s->gb;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
226 int q, i;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
227 int prev_type = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
228 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
229 int blocks[RV34_MB_TYPES] = {0};
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
230 int count = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
231
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
232 if(!r->s.mb_skip_run)
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5994
diff changeset
233 r->s.mb_skip_run = svq3_get_ue_golomb(gb) + 1;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
234
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
235 if(--r->s.mb_skip_run)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
236 return RV34_MB_SKIP;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
237
10117
d0f2f4e4436c Adjust r->avail_cache[] indexes to avoid alignment issues when zeroing block
kostya
parents: 9903
diff changeset
238 if(r->avail_cache[6-1])
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
239 blocks[r->mb_type[mb_pos - 1]]++;
10117
d0f2f4e4436c Adjust r->avail_cache[] indexes to avoid alignment issues when zeroing block
kostya
parents: 9903
diff changeset
240 if(r->avail_cache[6-4]){
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
241 blocks[r->mb_type[mb_pos - s->mb_stride]]++;
10117
d0f2f4e4436c Adjust r->avail_cache[] indexes to avoid alignment issues when zeroing block
kostya
parents: 9903
diff changeset
242 if(r->avail_cache[6-2])
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
243 blocks[r->mb_type[mb_pos - s->mb_stride + 1]]++;
10117
d0f2f4e4436c Adjust r->avail_cache[] indexes to avoid alignment issues when zeroing block
kostya
parents: 9903
diff changeset
244 if(r->avail_cache[6-5])
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
245 blocks[r->mb_type[mb_pos - s->mb_stride - 1]]++;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
246 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
247
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
248 for(i = 0; i < RV34_MB_TYPES; i++){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
249 if(blocks[i] > count){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
250 count = blocks[i];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
251 prev_type = i;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
252 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
253 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6027
diff changeset
254 if(s->pict_type == FF_P_TYPE){
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
255 prev_type = block_num_to_ptype_vlc_num[prev_type];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
256 q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
257 if(q < PBTYPE_ESCAPE)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
258 return q;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
259 q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
260 av_log(s->avctx, AV_LOG_ERROR, "Dquant for P-frame\n");
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
261 }else{
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
262 prev_type = block_num_to_btype_vlc_num[prev_type];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
263 q = get_vlc2(gb, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
264 if(q < PBTYPE_ESCAPE)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
265 return q;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
266 q = get_vlc2(gb, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
267 av_log(s->avctx, AV_LOG_ERROR, "Dquant for B-frame\n");
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
268 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
269 return 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
270 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
271
8146
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
272 #define CLIP_SYMM(a, b) av_clip(a, -(b), b)
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
273 /**
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
274 * weaker deblocking very similar to the one described in 4.4.2 of JVT-A003r1
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
275 */
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
276 static inline void rv40_weak_loop_filter(uint8_t *src, const int step,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
277 const int filter_p1, const int filter_q1,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
278 const int alpha, const int beta,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
279 const int lim_p0q0,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
280 const int lim_q1, const int lim_p1,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
281 const int diff_p1p0, const int diff_q1q0,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
282 const int diff_p1p2, const int diff_q1q2)
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
283 {
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
284 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
285 int t, u, diff;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
286
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
287 t = src[0*step] - src[-1*step];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
288 if(!t)
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
289 return;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
290 u = (alpha * FFABS(t)) >> 7;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
291 if(u > 3 - (filter_p1 && filter_q1))
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
292 return;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
293
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
294 t <<= 2;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
295 if(filter_p1 && filter_q1)
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
296 t += src[-2*step] - src[1*step];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
297 diff = CLIP_SYMM((t + 4) >> 3, lim_p0q0);
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
298 src[-1*step] = cm[src[-1*step] + diff];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
299 src[ 0*step] = cm[src[ 0*step] - diff];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
300 if(FFABS(diff_p1p2) <= beta && filter_p1){
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
301 t = (diff_p1p0 + diff_p1p2 - diff) >> 1;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
302 src[-2*step] = cm[src[-2*step] - CLIP_SYMM(t, lim_p1)];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
303 }
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
304 if(FFABS(diff_q1q2) <= beta && filter_q1){
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
305 t = (diff_q1q0 + diff_q1q2 + diff) >> 1;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
306 src[ 1*step] = cm[src[ 1*step] - CLIP_SYMM(t, lim_q1)];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
307 }
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
308 }
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
309
8198
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
310 static inline void rv40_adaptive_loop_filter(uint8_t *src, const int step,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
311 const int stride, const int dmode,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
312 const int lim_q1, const int lim_p1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
313 const int alpha,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
314 const int beta, const int beta2,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
315 const int chroma, const int edge)
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
316 {
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
317 int diff_p1p0[4], diff_q1q0[4], diff_p1p2[4], diff_q1q2[4];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
318 int sum_p1p0 = 0, sum_q1q0 = 0, sum_p1p2 = 0, sum_q1q2 = 0;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
319 uint8_t *ptr;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
320 int flag_strong0 = 1, flag_strong1 = 1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
321 int filter_p1, filter_q1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
322 int i;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
323 int lims;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
324
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
325 for(i = 0, ptr = src; i < 4; i++, ptr += stride){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
326 diff_p1p0[i] = ptr[-2*step] - ptr[-1*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
327 diff_q1q0[i] = ptr[ 1*step] - ptr[ 0*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
328 sum_p1p0 += diff_p1p0[i];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
329 sum_q1q0 += diff_q1q0[i];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
330 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
331 filter_p1 = FFABS(sum_p1p0) < (beta<<2);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
332 filter_q1 = FFABS(sum_q1q0) < (beta<<2);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
333 if(!filter_p1 && !filter_q1)
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
334 return;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
335
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
336 for(i = 0, ptr = src; i < 4; i++, ptr += stride){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
337 diff_p1p2[i] = ptr[-2*step] - ptr[-3*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
338 diff_q1q2[i] = ptr[ 1*step] - ptr[ 2*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
339 sum_p1p2 += diff_p1p2[i];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
340 sum_q1q2 += diff_q1q2[i];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
341 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
342
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
343 if(edge){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
344 flag_strong0 = filter_p1 && (FFABS(sum_p1p2) < beta2);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
345 flag_strong1 = filter_q1 && (FFABS(sum_q1q2) < beta2);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
346 }else{
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
347 flag_strong0 = flag_strong1 = 0;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
348 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
349
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
350 lims = filter_p1 + filter_q1 + ((lim_q1 + lim_p1) >> 1) + 1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
351 if(flag_strong0 && flag_strong1){ /* strong filtering */
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
352 for(i = 0; i < 4; i++, src += stride){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
353 int sflag, p0, q0, p1, q1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
354 int t = src[0*step] - src[-1*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
355
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
356 if(!t) continue;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
357 sflag = (alpha * FFABS(t)) >> 7;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
358 if(sflag > 1) continue;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
359
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
360 p0 = (25*src[-3*step] + 26*src[-2*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
361 + 26*src[-1*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
362 + 26*src[ 0*step] + 25*src[ 1*step] + rv40_dither_l[dmode + i]) >> 7;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
363 q0 = (25*src[-2*step] + 26*src[-1*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
364 + 26*src[ 0*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
365 + 26*src[ 1*step] + 25*src[ 2*step] + rv40_dither_r[dmode + i]) >> 7;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
366 if(sflag){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
367 p0 = av_clip(p0, src[-1*step] - lims, src[-1*step] + lims);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
368 q0 = av_clip(q0, src[ 0*step] - lims, src[ 0*step] + lims);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
369 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
370 p1 = (25*src[-4*step] + 26*src[-3*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
371 + 26*src[-2*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
372 + 26*p0 + 25*src[ 0*step] + rv40_dither_l[dmode + i]) >> 7;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
373 q1 = (25*src[-1*step] + 26*q0
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
374 + 26*src[ 1*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
375 + 26*src[ 2*step] + 25*src[ 3*step] + rv40_dither_r[dmode + i]) >> 7;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
376 if(sflag){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
377 p1 = av_clip(p1, src[-2*step] - lims, src[-2*step] + lims);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
378 q1 = av_clip(q1, src[ 1*step] - lims, src[ 1*step] + lims);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
379 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
380 src[-2*step] = p1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
381 src[-1*step] = p0;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
382 src[ 0*step] = q0;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
383 src[ 1*step] = q1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
384 if(!chroma){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
385 src[-3*step] = (25*src[-1*step] + 26*src[-2*step] + 51*src[-3*step] + 26*src[-4*step] + 64) >> 7;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
386 src[ 2*step] = (25*src[ 0*step] + 26*src[ 1*step] + 51*src[ 2*step] + 26*src[ 3*step] + 64) >> 7;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
387 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
388 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
389 }else if(filter_p1 && filter_q1){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
390 for(i = 0; i < 4; i++, src += stride)
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
391 rv40_weak_loop_filter(src, step, 1, 1, alpha, beta, lims, lim_q1, lim_p1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
392 diff_p1p0[i], diff_q1q0[i], diff_p1p2[i], diff_q1q2[i]);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
393 }else{
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
394 for(i = 0; i < 4; i++, src += stride)
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
395 rv40_weak_loop_filter(src, step, filter_p1, filter_q1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
396 alpha, beta, lims>>1, lim_q1>>1, lim_p1>>1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
397 diff_p1p0[i], diff_q1q0[i], diff_p1p2[i], diff_q1q2[i]);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
398 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
399 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
400
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
401 static void rv40_v_loop_filter(uint8_t *src, int stride, int dmode,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
402 int lim_q1, int lim_p1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
403 int alpha, int beta, int beta2, int chroma, int edge){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
404 rv40_adaptive_loop_filter(src, 1, stride, dmode, lim_q1, lim_p1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
405 alpha, beta, beta2, chroma, edge);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
406 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
407 static void rv40_h_loop_filter(uint8_t *src, int stride, int dmode,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
408 int lim_q1, int lim_p1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
409 int alpha, int beta, int beta2, int chroma, int edge){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
410 rv40_adaptive_loop_filter(src, stride, 1, dmode, lim_q1, lim_p1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
411 alpha, beta, beta2, chroma, edge);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
412 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
413
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
414 enum RV40BlockPos{
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
415 POS_CUR,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
416 POS_TOP,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
417 POS_LEFT,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
418 POS_BOTTOM,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
419 };
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
420
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
421 #define MASK_CUR 0x0001
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
422 #define MASK_RIGHT 0x0008
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
423 #define MASK_BOTTOM 0x0010
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
424 #define MASK_TOP 0x1000
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
425 #define MASK_Y_TOP_ROW 0x000F
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
426 #define MASK_Y_LAST_ROW 0xF000
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
427 #define MASK_Y_LEFT_COL 0x1111
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
428 #define MASK_Y_RIGHT_COL 0x8888
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
429 #define MASK_C_TOP_ROW 0x0003
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
430 #define MASK_C_LAST_ROW 0x000C
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
431 #define MASK_C_LEFT_COL 0x0005
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
432 #define MASK_C_RIGHT_COL 0x000A
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
433
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
434 static const int neighbour_offs_x[4] = { 0, 0, -1, 0 };
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
435 static const int neighbour_offs_y[4] = { 0, -1, 0, 1 };
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
436
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
437 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
438 * RV40 loop filtering function
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
439 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
440 static void rv40_loop_filter(RV34DecContext *r, int row)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
441 {
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
442 MpegEncContext *s = &r->s;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
443 int mb_pos, mb_x;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
444 int i, j, k;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
445 uint8_t *Y, *C;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
446 int alpha, beta, betaY, betaC;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
447 int q;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
448 int mbtype[4]; ///< current macroblock and its neighbours types
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
449 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
450 * flags indicating that macroblock can be filtered with strong filter
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
451 * it is set only for intra coded MB and MB with DCs coded separately
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
452 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
453 int mb_strong[4];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
454 int clip[4]; ///< MB filter clipping value calculated from filtering strength
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
455 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
456 * coded block patterns for luma part of current macroblock and its neighbours
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
457 * Format:
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
458 * LSB corresponds to the top left block,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
459 * each nibble represents one row of subblocks.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
460 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
461 int cbp[4];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
462 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
463 * coded block patterns for chroma part of current macroblock and its neighbours
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
464 * Format is the same as for luma with two subblocks in a row.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
465 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
466 int uvcbp[4][2];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
467 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
468 * This mask represents the pattern of luma subblocks that should be filtered
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
469 * in addition to the coded ones because because they lie at the edge of
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
470 * 8x8 block with different enough motion vectors
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
471 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
472 int mvmasks[4];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
473
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
474 mb_pos = row * s->mb_stride;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
475 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
476 int mbtype = s->current_picture_ptr->mb_type[mb_pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
477 if(IS_INTRA(mbtype) || IS_SEPARATE_DC(mbtype))
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8225
diff changeset
478 r->cbp_luma [mb_pos] = r->deblock_coefs[mb_pos] = 0xFFFF;
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
479 if(IS_INTRA(mbtype))
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
480 r->cbp_chroma[mb_pos] = 0xFF;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
481 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
482 mb_pos = row * s->mb_stride;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
483 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
484 int y_h_deblock, y_v_deblock;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
485 int c_v_deblock[2], c_h_deblock[2];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
486 int clip_left;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
487 int avail[4];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
488 int y_to_deblock, c_to_deblock[2];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
489
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
490 q = s->current_picture_ptr->qscale_table[mb_pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
491 alpha = rv40_alpha_tab[q];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
492 beta = rv40_beta_tab [q];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
493 betaY = betaC = beta * 3;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
494 if(s->width * s->height <= 176*144)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
495 betaY += beta;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
496
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
497 avail[0] = 1;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
498 avail[1] = row;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
499 avail[2] = mb_x;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
500 avail[3] = row < s->mb_height - 1;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
501 for(i = 0; i < 4; i++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
502 if(avail[i]){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
503 int pos = mb_pos + neighbour_offs_x[i] + neighbour_offs_y[i]*s->mb_stride;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
504 mvmasks[i] = r->deblock_coefs[pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
505 mbtype [i] = s->current_picture_ptr->mb_type[pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
506 cbp [i] = r->cbp_luma[pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
507 uvcbp[i][0] = r->cbp_chroma[pos] & 0xF;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
508 uvcbp[i][1] = r->cbp_chroma[pos] >> 4;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
509 }else{
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
510 mvmasks[i] = 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
511 mbtype [i] = mbtype[0];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
512 cbp [i] = 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
513 uvcbp[i][0] = uvcbp[i][1] = 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
514 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
515 mb_strong[i] = IS_INTRA(mbtype[i]) || IS_SEPARATE_DC(mbtype[i]);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
516 clip[i] = rv40_filter_clip_tbl[mb_strong[i] + 1][q];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
517 }
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8225
diff changeset
518 y_to_deblock = mvmasks[POS_CUR]
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
519 | (mvmasks[POS_BOTTOM] << 16);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
520 /* This pattern contains bits signalling that horizontal edges of
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
521 * the current block can be filtered.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
522 * That happens when either of adjacent subblocks is coded or lies on
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
523 * the edge of 8x8 blocks with motion vectors differing by more than
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
524 * 3/4 pel in any component (any edge orientation for some reason).
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
525 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
526 y_h_deblock = y_to_deblock
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
527 | ((cbp[POS_CUR] << 4) & ~MASK_Y_TOP_ROW)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
528 | ((cbp[POS_TOP] & MASK_Y_LAST_ROW) >> 12);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
529 /* This pattern contains bits signalling that vertical edges of
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
530 * the current block can be filtered.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
531 * That happens when either of adjacent subblocks is coded or lies on
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
532 * the edge of 8x8 blocks with motion vectors differing by more than
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
533 * 3/4 pel in any component (any edge orientation for some reason).
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
534 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
535 y_v_deblock = y_to_deblock
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
536 | ((cbp[POS_CUR] << 1) & ~MASK_Y_LEFT_COL)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
537 | ((cbp[POS_LEFT] & MASK_Y_RIGHT_COL) >> 3);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
538 if(!mb_x)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
539 y_v_deblock &= ~MASK_Y_LEFT_COL;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
540 if(!row)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
541 y_h_deblock &= ~MASK_Y_TOP_ROW;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
542 if(row == s->mb_height - 1 || (mb_strong[POS_CUR] || mb_strong[POS_BOTTOM]))
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
543 y_h_deblock &= ~(MASK_Y_TOP_ROW << 16);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
544 /* Calculating chroma patterns is similar and easier since there is
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
545 * no motion vector pattern for them.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
546 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
547 for(i = 0; i < 2; i++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
548 c_to_deblock[i] = (uvcbp[POS_BOTTOM][i] << 4) | uvcbp[POS_CUR][i];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
549 c_v_deblock[i] = c_to_deblock[i]
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
550 | ((uvcbp[POS_CUR] [i] << 1) & ~MASK_C_LEFT_COL)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
551 | ((uvcbp[POS_LEFT][i] & MASK_C_RIGHT_COL) >> 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
552 c_h_deblock[i] = c_to_deblock[i]
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
553 | ((uvcbp[POS_TOP][i] & MASK_C_LAST_ROW) >> 2)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
554 | (uvcbp[POS_CUR][i] << 2);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
555 if(!mb_x)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
556 c_v_deblock[i] &= ~MASK_C_LEFT_COL;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
557 if(!row)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
558 c_h_deblock[i] &= ~MASK_C_TOP_ROW;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
559 if(row == s->mb_height - 1 || mb_strong[POS_CUR] || mb_strong[POS_BOTTOM])
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
560 c_h_deblock[i] &= ~(MASK_C_TOP_ROW << 4);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
561 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
562
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
563 for(j = 0; j < 16; j += 4){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
564 Y = s->current_picture_ptr->data[0] + mb_x*16 + (row*16 + j) * s->linesize;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
565 for(i = 0; i < 4; i++, Y += 4){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
566 int ij = i + j;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
567 int clip_cur = y_to_deblock & (MASK_CUR << ij) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
568 int dither = j ? ij : i*4;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
569
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
570 // if bottom block is coded then we can filter its top edge
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
571 // (or bottom edge of this block, which is the same)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
572 if(y_h_deblock & (MASK_BOTTOM << ij)){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
573 rv40_h_loop_filter(Y+4*s->linesize, s->linesize, dither,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
574 y_to_deblock & (MASK_BOTTOM << ij) ? clip[POS_CUR] : 0,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
575 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
576 alpha, beta, betaY, 0, 0);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
577 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
578 // filter left block edge in ordinary mode (with low filtering strength)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
579 if(y_v_deblock & (MASK_CUR << ij) && (i || !(mb_strong[POS_CUR] || mb_strong[POS_LEFT]))){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
580 if(!i)
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8225
diff changeset
581 clip_left = mvmasks[POS_LEFT] & (MASK_RIGHT << j) ? clip[POS_LEFT] : 0;
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
582 else
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
583 clip_left = y_to_deblock & (MASK_CUR << (ij-1)) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
584 rv40_v_loop_filter(Y, s->linesize, dither,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
585 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
586 clip_left,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
587 alpha, beta, betaY, 0, 0);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
588 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
589 // filter top edge of the current macroblock when filtering strength is high
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
590 if(!j && y_h_deblock & (MASK_CUR << i) && (mb_strong[POS_CUR] || mb_strong[POS_TOP])){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
591 rv40_h_loop_filter(Y, s->linesize, dither,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
592 clip_cur,
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8225
diff changeset
593 mvmasks[POS_TOP] & (MASK_TOP << i) ? clip[POS_TOP] : 0,
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
594 alpha, beta, betaY, 0, 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
595 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
596 // filter left block edge in edge mode (with high filtering strength)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
597 if(y_v_deblock & (MASK_CUR << ij) && !i && (mb_strong[POS_CUR] || mb_strong[POS_LEFT])){
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8225
diff changeset
598 clip_left = mvmasks[POS_LEFT] & (MASK_RIGHT << j) ? clip[POS_LEFT] : 0;
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
599 rv40_v_loop_filter(Y, s->linesize, dither,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
600 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
601 clip_left,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
602 alpha, beta, betaY, 0, 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
603 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
604 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
605 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
606 for(k = 0; k < 2; k++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
607 for(j = 0; j < 2; j++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
608 C = s->current_picture_ptr->data[k+1] + mb_x*8 + (row*8 + j*4) * s->uvlinesize;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
609 for(i = 0; i < 2; i++, C += 4){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
610 int ij = i + j*2;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
611 int clip_cur = c_to_deblock[k] & (MASK_CUR << ij) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
612 if(c_h_deblock[k] & (MASK_CUR << (ij+2))){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
613 int clip_bot = c_to_deblock[k] & (MASK_CUR << (ij+2)) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
614 rv40_h_loop_filter(C+4*s->uvlinesize, s->uvlinesize, i*8,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
615 clip_bot,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
616 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
617 alpha, beta, betaC, 1, 0);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
618 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
619 if((c_v_deblock[k] & (MASK_CUR << ij)) && (i || !(mb_strong[POS_CUR] || mb_strong[POS_LEFT]))){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
620 if(!i)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
621 clip_left = uvcbp[POS_LEFT][k] & (MASK_CUR << (2*j+1)) ? clip[POS_LEFT] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
622 else
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
623 clip_left = c_to_deblock[k] & (MASK_CUR << (ij-1)) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
624 rv40_v_loop_filter(C, s->uvlinesize, j*8,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
625 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
626 clip_left,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
627 alpha, beta, betaC, 1, 0);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
628 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
629 if(!j && c_h_deblock[k] & (MASK_CUR << ij) && (mb_strong[POS_CUR] || mb_strong[POS_TOP])){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
630 int clip_top = uvcbp[POS_TOP][k] & (MASK_CUR << (ij+2)) ? clip[POS_TOP] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
631 rv40_h_loop_filter(C, s->uvlinesize, i*8,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
632 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
633 clip_top,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
634 alpha, beta, betaC, 1, 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
635 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
636 if(c_v_deblock[k] & (MASK_CUR << ij) && !i && (mb_strong[POS_CUR] || mb_strong[POS_LEFT])){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
637 clip_left = uvcbp[POS_LEFT][k] & (MASK_CUR << (2*j+1)) ? clip[POS_LEFT] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
638 rv40_v_loop_filter(C, s->uvlinesize, j*8,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
639 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
640 clip_left,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
641 alpha, beta, betaC, 1, 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
642 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
643 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
644 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
645 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
646 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
647 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
648
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
649 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
650 * Initialize decoder.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
651 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
652 static av_cold int rv40_decode_init(AVCodecContext *avctx)
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
653 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
654 RV34DecContext *r = avctx->priv_data;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
655
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
656 r->rv30 = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
657 ff_rv34_decode_init(avctx);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
658 if(!aic_top_vlc.bits)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
659 rv40_init_tables();
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
660 r->parse_slice_header = rv40_parse_slice_header;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
661 r->decode_intra_types = rv40_decode_intra_types;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
662 r->decode_mb_info = rv40_decode_mb_info;
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
663 r->loop_filter = rv40_loop_filter;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
664 r->luma_dc_quant_i = rv40_luma_dc_quant[0];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
665 r->luma_dc_quant_p = rv40_luma_dc_quant[1];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
666 return 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
667 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
668
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
669 AVCodec rv40_decoder = {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
670 "rv40",
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
671 CODEC_TYPE_VIDEO,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
672 CODEC_ID_RV40,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
673 sizeof(RV34DecContext),
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
674 rv40_decode_init,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
675 NULL,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
676 ff_rv34_decode_end,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
677 ff_rv34_decode_frame,
5992
61f0987be684 Add decoder flags
kostya
parents: 5983
diff changeset
678 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
8753
64acd0cc269d Add decoder flush after seeking for RV3/4 decoders
kostya
parents: 8718
diff changeset
679 .flush = ff_mpeg_flush,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6714
diff changeset
680 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 4.0"),
9028
0f95e4f0a3f5 Add and use ff_pixfmt_list_420.
michael
parents: 8753
diff changeset
681 .pix_fmts= ff_pixfmt_list_420,
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
682 };