annotate rv40.c @ 8790:1045a26cb90d libavcodec

Fix crash when encoding using libschroedinger. Currently only pixel and half-pixel motion vector precisions are supported in libschroedinger. Setting the mv_precision field to 2 (i.e. quarter pixel) causes a crash in the libschroedinger encoder calls. By not setting this parameter, we fall back to the default value used in libschroedinger. patch by Anuradha Suraparaju, anuradha rd.bbc.co uk
author diego
date Tue, 10 Feb 2009 14:27:16 +0000
parents 64acd0cc269d
children 0f95e4f0a3f5
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
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
40 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
41 * Initialize all tables.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
42 */
8693
18737839ed27 Add missing void keyword to parameterless function declarations.
diego
parents: 8369
diff changeset
43 static av_cold void rv40_init_tables(void)
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
44 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
45 int i;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
46
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
47 init_vlc(&aic_top_vlc, AIC_TOP_BITS, AIC_TOP_SIZE,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
48 rv40_aic_top_vlc_bits, 1, 1,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
49 rv40_aic_top_vlc_codes, 1, 1, INIT_VLC_USE_STATIC);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
50 for(i = 0; i < AIC_MODE1_NUM; i++){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
51 // Every tenth VLC table is empty
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
52 if((i % 10) == 9) continue;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
53 init_vlc(&aic_mode1_vlc[i], AIC_MODE1_BITS, AIC_MODE1_SIZE,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
54 aic_mode1_vlc_bits[i], 1, 1,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
55 aic_mode1_vlc_codes[i], 1, 1, INIT_VLC_USE_STATIC);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
56 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
57 for(i = 0; i < AIC_MODE2_NUM; i++){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
58 init_vlc(&aic_mode2_vlc[i], AIC_MODE2_BITS, AIC_MODE2_SIZE,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
59 aic_mode2_vlc_bits[i], 1, 1,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
60 aic_mode2_vlc_codes[i], 2, 2, INIT_VLC_USE_STATIC);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
61 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
62 for(i = 0; i < NUM_PTYPE_VLCS; i++)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
63 init_vlc_sparse(&ptype_vlc[i], PTYPE_VLC_BITS, PTYPE_VLC_SIZE,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
64 ptype_vlc_bits[i], 1, 1,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
65 ptype_vlc_codes[i], 1, 1,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
66 ptype_vlc_syms, 1, 1, INIT_VLC_USE_STATIC);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
67 for(i = 0; i < NUM_BTYPE_VLCS; i++)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
68 init_vlc_sparse(&btype_vlc[i], BTYPE_VLC_BITS, BTYPE_VLC_SIZE,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
69 btype_vlc_bits[i], 1, 1,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
70 btype_vlc_codes[i], 1, 1,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
71 btype_vlc_syms, 1, 1, INIT_VLC_USE_STATIC);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
72 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
73
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
74 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
75 * Get stored dimension from bitstream.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
76 *
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
77 * 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
78 * Otherwise it is coded as escaped 8-bit portions.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
79 */
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
80 static int get_dimension(GetBitContext *gb, const int *dim)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
81 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
82 int t = get_bits(gb, 3);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
83 int val = dim[t];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
84 if(val < 0)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
85 val = dim[get_bits1(gb) - val];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
86 if(!val){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
87 do{
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
88 t = get_bits(gb, 8);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
89 val += t << 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
90 }while(t == 0xFF);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
91 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
92 return val;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
93 }
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 * Get encoded picture size - usually this is called from rv40_parse_slice_header.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
97 */
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
98 static void rv40_parse_picture_size(GetBitContext *gb, int *w, int *h)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
99 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
100 *w = get_dimension(gb, rv40_standard_widths);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
101 *h = get_dimension(gb, rv40_standard_heights);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
102 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
103
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
104 static int rv40_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
105 {
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6712
diff changeset
106 int mb_bits;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
107 int w = r->s.width, h = r->s.height;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
108 int mb_size;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
109
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
110 memset(si, 0, sizeof(SliceInfo));
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
111 if(get_bits1(gb))
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
112 return -1;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
113 si->type = get_bits(gb, 2);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
114 if(si->type == 1) si->type = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
115 si->quant = get_bits(gb, 5);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
116 if(get_bits(gb, 2))
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
117 return -1;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
118 si->vlc_set = get_bits(gb, 2);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
119 skip_bits1(gb);
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6712
diff changeset
120 si->pts = get_bits(gb, 13);
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
121 if(!si->type || !get_bits1(gb))
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
122 rv40_parse_picture_size(gb, &w, &h);
5994
625b4a680d41 Check decoded dimensions for validity
kostya
parents: 5993
diff changeset
123 if(avcodec_check_dimensions(r->s.avctx, w, h) < 0)
625b4a680d41 Check decoded dimensions for validity
kostya
parents: 5993
diff changeset
124 return -1;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
125 si->width = w;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
126 si->height = h;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
127 mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
128 mb_bits = ff_rv34_get_start_offset(gb, mb_size);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
129 si->start = get_bits(gb, mb_bits);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
130
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
131 return 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
132 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
133
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
134 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
135 * Decode 4x4 intra types array.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
136 */
5993
5dfff8f6f524 Intra types will be stored in int8_t array
kostya
parents: 5992
diff changeset
137 static int rv40_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
138 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
139 MpegEncContext *s = &r->s;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
140 int i, j, k, v;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
141 int A, B, C;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
142 int pattern;
5993
5dfff8f6f524 Intra types will be stored in int8_t array
kostya
parents: 5992
diff changeset
143 int8_t *ptr;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
144
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
145 for(i = 0; i < 4; i++, dst += s->b4_stride){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
146 if(!i && s->first_slice_line){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
147 pattern = get_vlc2(gb, aic_top_vlc.table, AIC_TOP_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
148 dst[0] = (pattern >> 2) & 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
149 dst[1] = (pattern >> 1) & 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
150 dst[2] = pattern & 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
151 dst[3] = (pattern << 1) & 2;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
152 continue;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
153 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
154 ptr = dst;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
155 for(j = 0; j < 4; j++){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
156 /* Coefficients are read using VLC chosen by the prediction pattern
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
157 * The first one (used for retrieving a pair of coefficients) is
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
158 * constructed from the top, top right and left coefficients
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
159 * The second one (used for retrieving only one coefficient) is
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
160 * top + 10 * left.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
161 */
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
162 A = ptr[-s->b4_stride + 1]; // it won't be used for the last coefficient in a row
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
163 B = ptr[-s->b4_stride];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
164 C = ptr[-1];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
165 pattern = A + (B << 4) + (C << 8);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
166 for(k = 0; k < MODE2_PATTERNS_NUM; k++)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
167 if(pattern == rv40_aic_table_index[k])
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
168 break;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
169 if(j < 3 && k < MODE2_PATTERNS_NUM){ //pattern is found, decoding 2 coefficients
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
170 v = get_vlc2(gb, aic_mode2_vlc[k].table, AIC_MODE2_BITS, 2);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
171 *ptr++ = v/9;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
172 *ptr++ = v%9;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
173 j++;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
174 }else{
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
175 if(B != -1 && C != -1)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
176 v = get_vlc2(gb, aic_mode1_vlc[B + C*10].table, AIC_MODE1_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
177 else{ // tricky decoding
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
178 v = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
179 switch(C){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
180 case -1: // code 0 -> 1, 1 -> 0
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
181 if(B < 2)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
182 v = get_bits1(gb) ^ 1;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
183 break;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
184 case 0:
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
185 case 2: // code 0 -> 2, 1 -> 0
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
186 v = (get_bits1(gb) ^ 1) << 1;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
187 break;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
188 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
189 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
190 *ptr++ = v;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
191 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
192 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
193 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
194 return 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
195 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
196
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
197 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
198 * Decode macroblock information.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
199 */
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
200 static int rv40_decode_mb_info(RV34DecContext *r)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
201 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
202 MpegEncContext *s = &r->s;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
203 GetBitContext *gb = &s->gb;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
204 int q, i;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
205 int prev_type = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
206 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
207 int blocks[RV34_MB_TYPES] = {0};
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
208 int count = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
209
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
210 if(!r->s.mb_skip_run)
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5994
diff changeset
211 r->s.mb_skip_run = svq3_get_ue_golomb(gb) + 1;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
212
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
213 if(--r->s.mb_skip_run)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
214 return RV34_MB_SKIP;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
215
6027
d1b9b395b1db RV40 decoder should use availability cache
kostya
parents: 5995
diff changeset
216 if(r->avail_cache[5-1])
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
217 blocks[r->mb_type[mb_pos - 1]]++;
6027
d1b9b395b1db RV40 decoder should use availability cache
kostya
parents: 5995
diff changeset
218 if(r->avail_cache[5-4]){
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
219 blocks[r->mb_type[mb_pos - s->mb_stride]]++;
6027
d1b9b395b1db RV40 decoder should use availability cache
kostya
parents: 5995
diff changeset
220 if(r->avail_cache[5-2])
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
221 blocks[r->mb_type[mb_pos - s->mb_stride + 1]]++;
6027
d1b9b395b1db RV40 decoder should use availability cache
kostya
parents: 5995
diff changeset
222 if(r->avail_cache[5-5])
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
223 blocks[r->mb_type[mb_pos - s->mb_stride - 1]]++;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
224 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
225
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
226 for(i = 0; i < RV34_MB_TYPES; i++){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
227 if(blocks[i] > count){
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
228 count = blocks[i];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
229 prev_type = i;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
230 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
231 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 6027
diff changeset
232 if(s->pict_type == FF_P_TYPE){
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
233 prev_type = block_num_to_ptype_vlc_num[prev_type];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
234 q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
235 if(q < PBTYPE_ESCAPE)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
236 return q;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
237 q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
238 av_log(s->avctx, AV_LOG_ERROR, "Dquant for P-frame\n");
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
239 }else{
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
240 prev_type = block_num_to_btype_vlc_num[prev_type];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
241 q = get_vlc2(gb, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
242 if(q < PBTYPE_ESCAPE)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
243 return q;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
244 q = get_vlc2(gb, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 1);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
245 av_log(s->avctx, AV_LOG_ERROR, "Dquant for B-frame\n");
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
246 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
247 return 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
248 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
249
8146
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
250 #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
251 /**
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
252 * 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
253 */
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
254 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
255 const int filter_p1, const int filter_q1,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
256 const int alpha, const int beta,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
257 const int lim_p0q0,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
258 const int lim_q1, const int lim_p1,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
259 const int diff_p1p0, const int diff_q1q0,
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
260 const int diff_p1p2, const int diff_q1q2)
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
261 {
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
262 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
263 int t, u, diff;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
264
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
265 t = src[0*step] - src[-1*step];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
266 if(!t)
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
267 return;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
268 u = (alpha * FFABS(t)) >> 7;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
269 if(u > 3 - (filter_p1 && filter_q1))
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
270 return;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
271
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
272 t <<= 2;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
273 if(filter_p1 && filter_q1)
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
274 t += src[-2*step] - src[1*step];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
275 diff = CLIP_SYMM((t + 4) >> 3, lim_p0q0);
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
276 src[-1*step] = cm[src[-1*step] + diff];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
277 src[ 0*step] = cm[src[ 0*step] - diff];
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
278 if(FFABS(diff_p1p2) <= beta && filter_p1){
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
279 t = (diff_p1p0 + diff_p1p2 - diff) >> 1;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
280 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
281 }
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
282 if(FFABS(diff_q1q2) <= beta && filter_q1){
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
283 t = (diff_q1q0 + diff_q1q2 + diff) >> 1;
4a92ea42a8bc Weak deblock filter function for future RV40 loop filter
kostya
parents: 7040
diff changeset
284 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
285 }
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
8198
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
288 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
289 const int stride, const int dmode,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
290 const int lim_q1, const int lim_p1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
291 const int alpha,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
292 const int beta, const int beta2,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
293 const int chroma, const int edge)
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
294 {
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
295 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
296 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
297 uint8_t *ptr;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
298 int flag_strong0 = 1, flag_strong1 = 1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
299 int filter_p1, filter_q1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
300 int i;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
301 int lims;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
302
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
303 for(i = 0, ptr = src; i < 4; i++, ptr += stride){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
304 diff_p1p0[i] = ptr[-2*step] - ptr[-1*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
305 diff_q1q0[i] = ptr[ 1*step] - ptr[ 0*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
306 sum_p1p0 += diff_p1p0[i];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
307 sum_q1q0 += diff_q1q0[i];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
308 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
309 filter_p1 = FFABS(sum_p1p0) < (beta<<2);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
310 filter_q1 = FFABS(sum_q1q0) < (beta<<2);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
311 if(!filter_p1 && !filter_q1)
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
312 return;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
313
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
314 for(i = 0, ptr = src; i < 4; i++, ptr += stride){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
315 diff_p1p2[i] = ptr[-2*step] - ptr[-3*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
316 diff_q1q2[i] = ptr[ 1*step] - ptr[ 2*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
317 sum_p1p2 += diff_p1p2[i];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
318 sum_q1q2 += diff_q1q2[i];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
319 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
320
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
321 if(edge){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
322 flag_strong0 = filter_p1 && (FFABS(sum_p1p2) < beta2);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
323 flag_strong1 = filter_q1 && (FFABS(sum_q1q2) < beta2);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
324 }else{
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
325 flag_strong0 = flag_strong1 = 0;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
326 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
327
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
328 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
329 if(flag_strong0 && flag_strong1){ /* strong filtering */
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
330 for(i = 0; i < 4; i++, src += stride){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
331 int sflag, p0, q0, p1, q1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
332 int t = src[0*step] - src[-1*step];
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
333
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
334 if(!t) continue;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
335 sflag = (alpha * FFABS(t)) >> 7;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
336 if(sflag > 1) continue;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
337
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
338 p0 = (25*src[-3*step] + 26*src[-2*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
339 + 26*src[-1*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
340 + 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
341 q0 = (25*src[-2*step] + 26*src[-1*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
342 + 26*src[ 0*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
343 + 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
344 if(sflag){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
345 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
346 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
347 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
348 p1 = (25*src[-4*step] + 26*src[-3*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
349 + 26*src[-2*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
350 + 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
351 q1 = (25*src[-1*step] + 26*q0
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
352 + 26*src[ 1*step]
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
353 + 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
354 if(sflag){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
355 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
356 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
357 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
358 src[-2*step] = p1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
359 src[-1*step] = p0;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
360 src[ 0*step] = q0;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
361 src[ 1*step] = q1;
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
362 if(!chroma){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
363 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
364 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
365 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
366 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
367 }else if(filter_p1 && filter_q1){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
368 for(i = 0; i < 4; i++, src += stride)
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
369 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
370 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
371 }else{
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
372 for(i = 0; i < 4; i++, src += stride)
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
373 rv40_weak_loop_filter(src, step, filter_p1, filter_q1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
374 alpha, beta, lims>>1, lim_q1>>1, lim_p1>>1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
375 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
376 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
377 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
378
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
379 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
380 int lim_q1, int lim_p1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
381 int alpha, int beta, int beta2, int chroma, int edge){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
382 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
383 alpha, beta, beta2, chroma, edge);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
384 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
385 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
386 int lim_q1, int lim_p1,
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
387 int alpha, int beta, int beta2, int chroma, int edge){
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
388 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
389 alpha, beta, beta2, chroma, edge);
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
390 }
de344498875e Strong filtering function for future RV40 loop filter
kostya
parents: 8146
diff changeset
391
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
392 enum RV40BlockPos{
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
393 POS_CUR,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
394 POS_TOP,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
395 POS_LEFT,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
396 POS_BOTTOM,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
397 };
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
398
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
399 #define MASK_CUR 0x0001
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
400 #define MASK_RIGHT 0x0008
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
401 #define MASK_BOTTOM 0x0010
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
402 #define MASK_TOP 0x1000
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
403 #define MASK_Y_TOP_ROW 0x000F
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
404 #define MASK_Y_LAST_ROW 0xF000
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
405 #define MASK_Y_LEFT_COL 0x1111
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
406 #define MASK_Y_RIGHT_COL 0x8888
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
407 #define MASK_C_TOP_ROW 0x0003
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
408 #define MASK_C_LAST_ROW 0x000C
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
409 #define MASK_C_LEFT_COL 0x0005
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
410 #define MASK_C_RIGHT_COL 0x000A
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
411
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
412 static const int neighbour_offs_x[4] = { 0, 0, -1, 0 };
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
413 static const int neighbour_offs_y[4] = { 0, -1, 0, 1 };
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
414
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
415 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
416 * RV40 loop filtering function
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
417 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
418 static void rv40_loop_filter(RV34DecContext *r, int row)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
419 {
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
420 MpegEncContext *s = &r->s;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
421 int mb_pos, mb_x;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
422 int i, j, k;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
423 uint8_t *Y, *C;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
424 int alpha, beta, betaY, betaC;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
425 int q;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
426 int mbtype[4]; ///< current macroblock and its neighbours types
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
427 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
428 * flags indicating that macroblock can be filtered with strong filter
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
429 * it is set only for intra coded MB and MB with DCs coded separately
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
430 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
431 int mb_strong[4];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
432 int clip[4]; ///< MB filter clipping value calculated from filtering strength
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
433 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
434 * coded block patterns for luma part of current macroblock and its neighbours
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
435 * Format:
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
436 * LSB corresponds to the top left block,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
437 * each nibble represents one row of subblocks.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
438 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
439 int cbp[4];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
440 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
441 * coded block patterns for chroma part of current macroblock and its neighbours
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
442 * Format is the same as for luma with two subblocks in a row.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
443 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
444 int uvcbp[4][2];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
445 /**
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
446 * This mask represents the pattern of luma subblocks that should be filtered
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
447 * in addition to the coded ones because because they lie at the edge of
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
448 * 8x8 block with different enough motion vectors
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
449 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
450 int mvmasks[4];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
451
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
452 mb_pos = row * s->mb_stride;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
453 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
454 int mbtype = s->current_picture_ptr->mb_type[mb_pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
455 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
456 r->cbp_luma [mb_pos] = r->deblock_coefs[mb_pos] = 0xFFFF;
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
457 if(IS_INTRA(mbtype))
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
458 r->cbp_chroma[mb_pos] = 0xFF;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
459 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
460 mb_pos = row * s->mb_stride;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
461 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
462 int y_h_deblock, y_v_deblock;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
463 int c_v_deblock[2], c_h_deblock[2];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
464 int clip_left;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
465 int avail[4];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
466 int y_to_deblock, c_to_deblock[2];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
467
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
468 q = s->current_picture_ptr->qscale_table[mb_pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
469 alpha = rv40_alpha_tab[q];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
470 beta = rv40_beta_tab [q];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
471 betaY = betaC = beta * 3;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
472 if(s->width * s->height <= 176*144)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
473 betaY += beta;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
474
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
475 avail[0] = 1;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
476 avail[1] = row;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
477 avail[2] = mb_x;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
478 avail[3] = row < s->mb_height - 1;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
479 for(i = 0; i < 4; i++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
480 if(avail[i]){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
481 int pos = mb_pos + neighbour_offs_x[i] + neighbour_offs_y[i]*s->mb_stride;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
482 mvmasks[i] = r->deblock_coefs[pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
483 mbtype [i] = s->current_picture_ptr->mb_type[pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
484 cbp [i] = r->cbp_luma[pos];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
485 uvcbp[i][0] = r->cbp_chroma[pos] & 0xF;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
486 uvcbp[i][1] = r->cbp_chroma[pos] >> 4;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
487 }else{
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
488 mvmasks[i] = 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
489 mbtype [i] = mbtype[0];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
490 cbp [i] = 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
491 uvcbp[i][0] = uvcbp[i][1] = 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
492 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
493 mb_strong[i] = IS_INTRA(mbtype[i]) || IS_SEPARATE_DC(mbtype[i]);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
494 clip[i] = rv40_filter_clip_tbl[mb_strong[i] + 1][q];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
495 }
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8225
diff changeset
496 y_to_deblock = mvmasks[POS_CUR]
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
497 | (mvmasks[POS_BOTTOM] << 16);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
498 /* This pattern contains bits signalling that horizontal edges of
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
499 * the current block can be filtered.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
500 * That happens when either of adjacent subblocks is coded or lies on
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
501 * the edge of 8x8 blocks with motion vectors differing by more than
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
502 * 3/4 pel in any component (any edge orientation for some reason).
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
503 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
504 y_h_deblock = y_to_deblock
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
505 | ((cbp[POS_CUR] << 4) & ~MASK_Y_TOP_ROW)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
506 | ((cbp[POS_TOP] & MASK_Y_LAST_ROW) >> 12);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
507 /* This pattern contains bits signalling that vertical edges of
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
508 * the current block can be filtered.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
509 * That happens when either of adjacent subblocks is coded or lies on
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
510 * the edge of 8x8 blocks with motion vectors differing by more than
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
511 * 3/4 pel in any component (any edge orientation for some reason).
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
512 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
513 y_v_deblock = y_to_deblock
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
514 | ((cbp[POS_CUR] << 1) & ~MASK_Y_LEFT_COL)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
515 | ((cbp[POS_LEFT] & MASK_Y_RIGHT_COL) >> 3);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
516 if(!mb_x)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
517 y_v_deblock &= ~MASK_Y_LEFT_COL;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
518 if(!row)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
519 y_h_deblock &= ~MASK_Y_TOP_ROW;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
520 if(row == s->mb_height - 1 || (mb_strong[POS_CUR] || mb_strong[POS_BOTTOM]))
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
521 y_h_deblock &= ~(MASK_Y_TOP_ROW << 16);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
522 /* Calculating chroma patterns is similar and easier since there is
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
523 * no motion vector pattern for them.
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
524 */
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
525 for(i = 0; i < 2; i++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
526 c_to_deblock[i] = (uvcbp[POS_BOTTOM][i] << 4) | uvcbp[POS_CUR][i];
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
527 c_v_deblock[i] = c_to_deblock[i]
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
528 | ((uvcbp[POS_CUR] [i] << 1) & ~MASK_C_LEFT_COL)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
529 | ((uvcbp[POS_LEFT][i] & MASK_C_RIGHT_COL) >> 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
530 c_h_deblock[i] = c_to_deblock[i]
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
531 | ((uvcbp[POS_TOP][i] & MASK_C_LAST_ROW) >> 2)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
532 | (uvcbp[POS_CUR][i] << 2);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
533 if(!mb_x)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
534 c_v_deblock[i] &= ~MASK_C_LEFT_COL;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
535 if(!row)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
536 c_h_deblock[i] &= ~MASK_C_TOP_ROW;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
537 if(row == s->mb_height - 1 || mb_strong[POS_CUR] || mb_strong[POS_BOTTOM])
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
538 c_h_deblock[i] &= ~(MASK_C_TOP_ROW << 4);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
539 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
540
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
541 for(j = 0; j < 16; j += 4){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
542 Y = s->current_picture_ptr->data[0] + mb_x*16 + (row*16 + j) * s->linesize;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
543 for(i = 0; i < 4; i++, Y += 4){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
544 int ij = i + j;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
545 int clip_cur = y_to_deblock & (MASK_CUR << ij) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
546 int dither = j ? ij : i*4;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
547
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
548 // if bottom block is coded then we can filter its top edge
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
549 // (or bottom edge of this block, which is the same)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
550 if(y_h_deblock & (MASK_BOTTOM << ij)){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
551 rv40_h_loop_filter(Y+4*s->linesize, s->linesize, dither,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
552 y_to_deblock & (MASK_BOTTOM << ij) ? clip[POS_CUR] : 0,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
553 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
554 alpha, beta, betaY, 0, 0);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
555 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
556 // filter left block edge in ordinary mode (with low filtering strength)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
557 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
558 if(!i)
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8225
diff changeset
559 clip_left = mvmasks[POS_LEFT] & (MASK_RIGHT << j) ? clip[POS_LEFT] : 0;
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
560 else
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
561 clip_left = y_to_deblock & (MASK_CUR << (ij-1)) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
562 rv40_v_loop_filter(Y, s->linesize, dither,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
563 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
564 clip_left,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
565 alpha, beta, betaY, 0, 0);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
566 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
567 // filter top edge of the current macroblock when filtering strength is high
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
568 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
569 rv40_h_loop_filter(Y, s->linesize, dither,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
570 clip_cur,
8369
45c3780b1a96 Merge deblocking pattern with CBP for RV30/40 loop filtering
kostya
parents: 8225
diff changeset
571 mvmasks[POS_TOP] & (MASK_TOP << i) ? clip[POS_TOP] : 0,
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
572 alpha, beta, betaY, 0, 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
573 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
574 // filter left block edge in edge mode (with high filtering strength)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
575 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
576 clip_left = mvmasks[POS_LEFT] & (MASK_RIGHT << j) ? clip[POS_LEFT] : 0;
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
577 rv40_v_loop_filter(Y, s->linesize, dither,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
578 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
579 clip_left,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
580 alpha, beta, betaY, 0, 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
581 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
582 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
583 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
584 for(k = 0; k < 2; k++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
585 for(j = 0; j < 2; j++){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
586 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
587 for(i = 0; i < 2; i++, C += 4){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
588 int ij = i + j*2;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
589 int clip_cur = c_to_deblock[k] & (MASK_CUR << ij) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
590 if(c_h_deblock[k] & (MASK_CUR << (ij+2))){
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
591 int clip_bot = c_to_deblock[k] & (MASK_CUR << (ij+2)) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
592 rv40_h_loop_filter(C+4*s->uvlinesize, s->uvlinesize, i*8,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
593 clip_bot,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
594 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
595 alpha, beta, betaC, 1, 0);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
596 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
597 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
598 if(!i)
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
599 clip_left = uvcbp[POS_LEFT][k] & (MASK_CUR << (2*j+1)) ? clip[POS_LEFT] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
600 else
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
601 clip_left = c_to_deblock[k] & (MASK_CUR << (ij-1)) ? clip[POS_CUR] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
602 rv40_v_loop_filter(C, s->uvlinesize, j*8,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
603 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
604 clip_left,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
605 alpha, beta, betaC, 1, 0);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
606 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
607 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
608 int clip_top = uvcbp[POS_TOP][k] & (MASK_CUR << (ij+2)) ? clip[POS_TOP] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
609 rv40_h_loop_filter(C, s->uvlinesize, i*8,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
610 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
611 clip_top,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
612 alpha, beta, betaC, 1, 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
613 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
614 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
615 clip_left = uvcbp[POS_LEFT][k] & (MASK_CUR << (2*j+1)) ? clip[POS_LEFT] : 0;
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
616 rv40_v_loop_filter(C, s->uvlinesize, j*8,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
617 clip_cur,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
618 clip_left,
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
619 alpha, beta, betaC, 1, 1);
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
620 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
621 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
622 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
623 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
624 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
625 }
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
626
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
627 /**
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
628 * Initialize decoder.
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
629 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
630 static av_cold int rv40_decode_init(AVCodecContext *avctx)
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
631 {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
632 RV34DecContext *r = avctx->priv_data;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
633
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
634 r->rv30 = 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
635 ff_rv34_decode_init(avctx);
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
636 if(!aic_top_vlc.bits)
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
637 rv40_init_tables();
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
638 r->parse_slice_header = rv40_parse_slice_header;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
639 r->decode_intra_types = rv40_decode_intra_types;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
640 r->decode_mb_info = rv40_decode_mb_info;
8225
d133e597db2d RV40 loop filter
kostya
parents: 8198
diff changeset
641 r->loop_filter = rv40_loop_filter;
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
642 r->luma_dc_quant_i = rv40_luma_dc_quant[0];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
643 r->luma_dc_quant_p = rv40_luma_dc_quant[1];
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
644 return 0;
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
645 }
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
646
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
647 AVCodec rv40_decoder = {
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
648 "rv40",
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
649 CODEC_TYPE_VIDEO,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
650 CODEC_ID_RV40,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
651 sizeof(RV34DecContext),
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
652 rv40_decode_init,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
653 NULL,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
654 ff_rv34_decode_end,
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
655 ff_rv34_decode_frame,
5992
61f0987be684 Add decoder flags
kostya
parents: 5983
diff changeset
656 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
8753
64acd0cc269d Add decoder flush after seeking for RV3/4 decoders
kostya
parents: 8718
diff changeset
657 .flush = ff_mpeg_flush,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6714
diff changeset
658 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 4.0"),
5983
f0ae240d8349 RV40 decoder specific functions
kostya
parents:
diff changeset
659 };