annotate rv30.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents 7dd2a45249a9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
1 /*
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
2 * RV30 decoder
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
3 * Copyright (c) 2007 Konstantin Shishkov
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
4 *
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
6 *
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
11 *
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
16 *
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
20 */
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
21
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
22 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
23 * @file
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
24 * RV30 decoder
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
25 */
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
26
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
27 #include "avcodec.h"
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
28 #include "dsputil.h"
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
29 #include "mpegvideo.h"
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
30 #include "golomb.h"
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
31
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
32 #include "rv34.h"
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
33 #include "rv30data.h"
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
34
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
35
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
36 static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
37 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
38 int mb_bits;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
39 int w = r->s.width, h = r->s.height;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
40 int mb_size;
8566
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
41 int rpr;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
42
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
43 memset(si, 0, sizeof(SliceInfo));
8075
e71badf6877a Detect split RV30 slices
kostya
parents: 7040
diff changeset
44 if(get_bits(gb, 3))
e71badf6877a Detect split RV30 slices
kostya
parents: 7040
diff changeset
45 return -1;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
46 si->type = get_bits(gb, 2);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
47 if(si->type == 1) si->type = 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
48 if(get_bits1(gb))
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
49 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
50 si->quant = get_bits(gb, 5);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
51 skip_bits1(gb);
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6712
diff changeset
52 si->pts = get_bits(gb, 13);
8566
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
53 rpr = get_bits(gb, r->rpr);
8568
4a93620c5aac 30l: when reading mb_offset in RV30 slice header its size
kostya
parents: 8566
diff changeset
54 if(rpr){
4a93620c5aac 30l: when reading mb_offset in RV30 slice header its size
kostya
parents: 8566
diff changeset
55 w = r->s.avctx->extradata[6 + rpr*2] << 2;
4a93620c5aac 30l: when reading mb_offset in RV30 slice header its size
kostya
parents: 8566
diff changeset
56 h = r->s.avctx->extradata[7 + rpr*2] << 2;
8566
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
57 }
8568
4a93620c5aac 30l: when reading mb_offset in RV30 slice header its size
kostya
parents: 8566
diff changeset
58 si->width = w;
4a93620c5aac 30l: when reading mb_offset in RV30 slice header its size
kostya
parents: 8566
diff changeset
59 si->height = h;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
60 mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
61 mb_bits = ff_rv34_get_start_offset(gb, mb_size);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
62 si->start = get_bits(gb, mb_bits);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
63 skip_bits1(gb);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
64 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
65 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
66
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
67 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
68 * Decode 4x4 intra types array.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
69 */
5993
5dfff8f6f524 Intra types will be stored in int8_t array
kostya
parents: 5992
diff changeset
70 static int rv30_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
71 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
72 int i, j, k;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
73
9903
305536ce781f RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents: 9028
diff changeset
74 for(i = 0; i < 4; i++, dst += r->intra_types_stride - 4){
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
75 for(j = 0; j < 4; j+= 2){
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
76 int code = svq3_get_ue_golomb(gb) << 1;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
77 if(code >= 81*2){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
78 av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction code\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
79 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
80 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
81 for(k = 0; k < 2; k++){
9903
305536ce781f RV3/4 intra types array causes alignment issues (at least on ARM5), thus change
kostya
parents: 9028
diff changeset
82 int A = dst[-r->intra_types_stride] + 1;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
83 int B = dst[-1] + 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
84 *dst++ = rv30_itype_from_context[A * 90 + B * 9 + rv30_itype_code[code + k]];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
85 if(dst[-1] == 9){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
86 av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction mode\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
87 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
88 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
89 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
90 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
91 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
92 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
93 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
94
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
95 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
96 * Decode macroblock information.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
97 */
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
98 static int rv30_decode_mb_info(RV34DecContext *r)
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
99 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
100 static const int rv30_p_types[6] = { RV34_MB_SKIP, RV34_MB_P_16x16, RV34_MB_P_8x8, -1, RV34_MB_TYPE_INTRA, RV34_MB_TYPE_INTRA16x16 };
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
101 static const int rv30_b_types[6] = { RV34_MB_SKIP, RV34_MB_B_DIRECT, RV34_MB_B_FORWARD, RV34_MB_B_BACKWARD, RV34_MB_TYPE_INTRA, RV34_MB_TYPE_INTRA16x16 };
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
102 MpegEncContext *s = &r->s;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
103 GetBitContext *gb = &s->gb;
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
104 int code = svq3_get_ue_golomb(gb);
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
105
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
106 if(code > 11){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
107 av_log(s->avctx, AV_LOG_ERROR, "Incorrect MB type code\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
108 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
109 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
110 if(code > 5){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
111 av_log(s->avctx, AV_LOG_ERROR, "dquant needed\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
112 code -= 6;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
113 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5995
diff changeset
114 if(s->pict_type != FF_B_TYPE)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
115 return rv30_p_types[code];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
116 else
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
117 return rv30_b_types[code];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
118 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
119
8409
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
120 static inline void rv30_weak_loop_filter(uint8_t *src, const int step,
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
121 const int stride, const int lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
122 {
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
123 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
124 int i, diff;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
125
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
126 for(i = 0; i < 4; i++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
127 diff = ((src[-2*step] - src[1*step]) - (src[-1*step] - src[0*step])*4) >> 3;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
128 diff = av_clip(diff, -lim, lim);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
129 src[-1*step] = cm[src[-1*step] + diff];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
130 src[ 0*step] = cm[src[ 0*step] - diff];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
131 src += stride;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
132 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
133 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
134
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
135 static void rv30_loop_filter(RV34DecContext *r, int row)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
136 {
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
137 MpegEncContext *s = &r->s;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
138 int mb_pos, mb_x;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
139 int i, j, k;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
140 uint8_t *Y, *C;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
141 int loc_lim, cur_lim, left_lim = 0, top_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
142
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
143 mb_pos = row * s->mb_stride;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
144 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
145 int mbtype = s->current_picture_ptr->mb_type[mb_pos];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
146 if(IS_INTRA(mbtype) || IS_SEPARATE_DC(mbtype))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
147 r->deblock_coefs[mb_pos] = 0xFFFF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
148 if(IS_INTRA(mbtype))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
149 r->cbp_chroma[mb_pos] = 0xFF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
150 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
151
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
152 /* all vertical edges are filtered first
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
153 * and horizontal edges are filtered on the next iteration
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
154 */
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
155 mb_pos = row * s->mb_stride;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
156 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
157 cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos]];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
158 if(mb_x)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
159 left_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos - 1]];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
160 for(j = 0; j < 16; j += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
161 Y = s->current_picture_ptr->data[0] + mb_x*16 + (row*16 + j) * s->linesize + 4 * !mb_x;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
162 for(i = !mb_x; i < 4; i++, Y += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
163 int ij = i + j;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
164 loc_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
165 if(r->deblock_coefs[mb_pos] & (1 << ij))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
166 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
167 else if(!i && r->deblock_coefs[mb_pos - 1] & (1 << (ij + 3)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
168 loc_lim = left_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
169 else if( i && r->deblock_coefs[mb_pos] & (1 << (ij - 1)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
170 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
171 if(loc_lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
172 rv30_weak_loop_filter(Y, 1, s->linesize, loc_lim);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
173 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
174 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
175 for(k = 0; k < 2; k++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
176 int cur_cbp, left_cbp = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
177 cur_cbp = (r->cbp_chroma[mb_pos] >> (k*4)) & 0xF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
178 if(mb_x)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
179 left_cbp = (r->cbp_chroma[mb_pos - 1] >> (k*4)) & 0xF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
180 for(j = 0; j < 8; j += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
181 C = s->current_picture_ptr->data[k+1] + mb_x*8 + (row*8 + j) * s->uvlinesize + 4 * !mb_x;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
182 for(i = !mb_x; i < 2; i++, C += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
183 int ij = i + (j >> 1);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
184 loc_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
185 if(cur_cbp && (1 << ij))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
186 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
187 else if(!i && left_cbp & (1 << (ij + 1)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
188 loc_lim = left_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
189 else if( i && cur_cbp & (1 << (ij - 1)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
190 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
191 if(loc_lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
192 rv30_weak_loop_filter(C, 1, s->uvlinesize, loc_lim);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
193 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
194 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
195 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
196 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
197 mb_pos = row * s->mb_stride;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
198 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
199 cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos]];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
200 if(row)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
201 top_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos - s->mb_stride]];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
202 for(j = 4*!row; j < 16; j += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
203 Y = s->current_picture_ptr->data[0] + mb_x*16 + (row*16 + j) * s->linesize;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
204 for(i = 0; i < 4; i++, Y += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
205 int ij = i + j;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
206 loc_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
207 if(r->deblock_coefs[mb_pos] & (1 << ij))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
208 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
209 else if(!j && r->deblock_coefs[mb_pos - s->mb_stride] & (1 << (ij + 12)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
210 loc_lim = top_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
211 else if( j && r->deblock_coefs[mb_pos] & (1 << (ij - 4)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
212 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
213 if(loc_lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
214 rv30_weak_loop_filter(Y, s->linesize, 1, loc_lim);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
215 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
216 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
217 for(k = 0; k < 2; k++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
218 int cur_cbp, top_cbp = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
219 cur_cbp = (r->cbp_chroma[mb_pos] >> (k*4)) & 0xF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
220 if(row)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
221 top_cbp = (r->cbp_chroma[mb_pos - s->mb_stride] >> (k*4)) & 0xF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
222 for(j = 4*!row; j < 8; j += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
223 C = s->current_picture_ptr->data[k+1] + mb_x*8 + (row*8 + j) * s->uvlinesize;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
224 for(i = 0; i < 2; i++, C += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
225 int ij = i + (j >> 1);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
226 loc_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
227 if(r->cbp_chroma[mb_pos] && (1 << ij))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
228 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
229 else if(!j && top_cbp & (1 << (ij + 2)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
230 loc_lim = top_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
231 else if( j && cur_cbp & (1 << (ij - 2)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
232 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
233 if(loc_lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
234 rv30_weak_loop_filter(C, s->uvlinesize, 1, loc_lim);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
235 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
236 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
237 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
238 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
239 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
240
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
241 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
242 * Initialize decoder.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
243 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
244 static av_cold int rv30_decode_init(AVCodecContext *avctx)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
245 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
246 RV34DecContext *r = avctx->priv_data;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
247
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
248 r->rv30 = 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
249 ff_rv34_decode_init(avctx);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
250 if(avctx->extradata_size < 2){
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
251 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
252 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
253 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
254 r->rpr = (avctx->extradata[1] & 7) >> 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
255 r->rpr = FFMIN(r->rpr + 1, 3);
8566
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
256 if(avctx->extradata_size - 8 < (r->rpr - 1) * 2){
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
257 av_log(avctx, AV_LOG_ERROR, "Insufficient extradata - need at least %d bytes, got %d\n",
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
258 6 + r->rpr * 2, avctx->extradata_size);
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
259 }
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
260 r->parse_slice_header = rv30_parse_slice_header;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
261 r->decode_intra_types = rv30_decode_intra_types;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
262 r->decode_mb_info = rv30_decode_mb_info;
8409
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
263 r->loop_filter = rv30_loop_filter;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
264 r->luma_dc_quant_i = rv30_luma_dc_quant;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
265 r->luma_dc_quant_p = rv30_luma_dc_quant;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
266 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
267 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
268
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
269 AVCodec rv30_decoder = {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
270 "rv30",
11560
8a4984c5cacc Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents: 9903
diff changeset
271 AVMEDIA_TYPE_VIDEO,
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
272 CODEC_ID_RV30,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
273 sizeof(RV34DecContext),
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
274 rv30_decode_init,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
275 NULL,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
276 ff_rv34_decode_end,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
277 ff_rv34_decode_frame,
5992
61f0987be684 Add decoder flags
kostya
parents: 5981
diff changeset
278 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
8753
64acd0cc269d Add decoder flush after seeking for RV3/4 decoders
kostya
parents: 8718
diff changeset
279 .flush = ff_mpeg_flush,
7040
e943e1409077 Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents: 6714
diff changeset
280 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 3.0"),
9028
0f95e4f0a3f5 Add and use ff_pixfmt_list_420.
michael
parents: 8753
diff changeset
281 .pix_fmts= ff_pixfmt_list_420,
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
282 };