annotate rv30.c @ 8566:48a4d9f4c6f8 libavcodec

RV30 decoder passes possible frame sizes in extradata and selects an appropriate frame size from them in slice, make my decoder do that as well. This fixes issue 779
author kostya
date Sun, 11 Jan 2009 08:03:45 +0000
parents 51c9946c70f9
children 4a93620c5aac
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 /**
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
23 * @file rv30.c
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);
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
54 if(!rpr){
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
55 si->width = w;
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
56 si->height = h;
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
57 }else{
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
58 si->width = r->s.avctx->extradata[6 + rpr*2] << 2;
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
59 si->height = r->s.avctx->extradata[7 + rpr*2] << 2;
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
60 }
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
61 mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
62 mb_bits = ff_rv34_get_start_offset(gb, mb_size);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
63 si->start = get_bits(gb, mb_bits);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
64 skip_bits1(gb);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
65 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
66 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
67
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
68 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
69 * Decode 4x4 intra types array.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
70 */
5993
5dfff8f6f524 Intra types will be stored in int8_t array
kostya
parents: 5992
diff changeset
71 static int rv30_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
72 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
73 int i, j, k;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
74
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
75 for(i = 0; i < 4; i++, dst += r->s.b4_stride - 4){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
76 for(j = 0; j < 4; j+= 2){
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
77 int code = svq3_get_ue_golomb(gb) << 1;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
78 if(code >= 81*2){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
79 av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction code\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
80 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
81 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
82 for(k = 0; k < 2; k++){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
83 int A = dst[-r->s.b4_stride] + 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
84 int B = dst[-1] + 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
85 *dst++ = rv30_itype_from_context[A * 90 + B * 9 + rv30_itype_code[code + k]];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
86 if(dst[-1] == 9){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
87 av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction mode\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
88 return -1;
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 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
93 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
94 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
95
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
96 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
97 * Decode macroblock information.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
98 */
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
99 static int rv30_decode_mb_info(RV34DecContext *r)
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
100 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
101 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
102 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
103 MpegEncContext *s = &r->s;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
104 GetBitContext *gb = &s->gb;
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
105 int code = svq3_get_ue_golomb(gb);
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
106
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
107 if(code > 11){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
108 av_log(s->avctx, AV_LOG_ERROR, "Incorrect MB type code\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
109 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
110 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
111 if(code > 5){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
112 av_log(s->avctx, AV_LOG_ERROR, "dquant needed\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
113 code -= 6;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
114 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5995
diff changeset
115 if(s->pict_type != FF_B_TYPE)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
116 return rv30_p_types[code];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
117 else
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
118 return rv30_b_types[code];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
119 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
120
8409
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
121 static inline void rv30_weak_loop_filter(uint8_t *src, const int step,
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
122 const int stride, const int lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
123 {
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
124 uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
125 int i, diff;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
126
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
127 for(i = 0; i < 4; i++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
128 diff = ((src[-2*step] - src[1*step]) - (src[-1*step] - src[0*step])*4) >> 3;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
129 diff = av_clip(diff, -lim, lim);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
130 src[-1*step] = cm[src[-1*step] + diff];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
131 src[ 0*step] = cm[src[ 0*step] - diff];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
132 src += stride;
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
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
136 static void rv30_loop_filter(RV34DecContext *r, int row)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
137 {
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
138 MpegEncContext *s = &r->s;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
139 int mb_pos, mb_x;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
140 int i, j, k;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
141 uint8_t *Y, *C;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
142 int loc_lim, cur_lim, left_lim = 0, top_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
143
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
144 mb_pos = row * s->mb_stride;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
145 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
146 int mbtype = s->current_picture_ptr->mb_type[mb_pos];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
147 if(IS_INTRA(mbtype) || IS_SEPARATE_DC(mbtype))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
148 r->deblock_coefs[mb_pos] = 0xFFFF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
149 if(IS_INTRA(mbtype))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
150 r->cbp_chroma[mb_pos] = 0xFF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
151 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
152
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
153 /* all vertical edges are filtered first
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
154 * and horizontal edges are filtered on the next iteration
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
155 */
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
156 mb_pos = row * s->mb_stride;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
157 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
158 cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos]];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
159 if(mb_x)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
160 left_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos - 1]];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
161 for(j = 0; j < 16; j += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
162 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
163 for(i = !mb_x; i < 4; i++, Y += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
164 int ij = i + j;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
165 loc_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
166 if(r->deblock_coefs[mb_pos] & (1 << ij))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
167 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
168 else if(!i && r->deblock_coefs[mb_pos - 1] & (1 << (ij + 3)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
169 loc_lim = left_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
170 else if( i && r->deblock_coefs[mb_pos] & (1 << (ij - 1)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
171 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
172 if(loc_lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
173 rv30_weak_loop_filter(Y, 1, s->linesize, loc_lim);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
174 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
175 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
176 for(k = 0; k < 2; k++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
177 int cur_cbp, left_cbp = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
178 cur_cbp = (r->cbp_chroma[mb_pos] >> (k*4)) & 0xF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
179 if(mb_x)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
180 left_cbp = (r->cbp_chroma[mb_pos - 1] >> (k*4)) & 0xF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
181 for(j = 0; j < 8; j += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
182 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
183 for(i = !mb_x; i < 2; i++, C += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
184 int ij = i + (j >> 1);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
185 loc_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
186 if(cur_cbp && (1 << ij))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
187 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
188 else if(!i && left_cbp & (1 << (ij + 1)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
189 loc_lim = left_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
190 else if( i && cur_cbp & (1 << (ij - 1)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
191 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
192 if(loc_lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
193 rv30_weak_loop_filter(C, 1, s->uvlinesize, loc_lim);
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 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
198 mb_pos = row * s->mb_stride;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
199 for(mb_x = 0; mb_x < s->mb_width; mb_x++, mb_pos++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
200 cur_lim = rv30_loop_filt_lim[s->current_picture_ptr->qscale_table[mb_pos]];
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
201 if(row)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
202 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
203 for(j = 4*!row; j < 16; j += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
204 Y = s->current_picture_ptr->data[0] + mb_x*16 + (row*16 + j) * s->linesize;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
205 for(i = 0; i < 4; i++, Y += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
206 int ij = i + j;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
207 loc_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
208 if(r->deblock_coefs[mb_pos] & (1 << ij))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
209 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
210 else if(!j && r->deblock_coefs[mb_pos - s->mb_stride] & (1 << (ij + 12)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
211 loc_lim = top_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
212 else if( j && r->deblock_coefs[mb_pos] & (1 << (ij - 4)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
213 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
214 if(loc_lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
215 rv30_weak_loop_filter(Y, s->linesize, 1, loc_lim);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
216 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
217 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
218 for(k = 0; k < 2; k++){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
219 int cur_cbp, top_cbp = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
220 cur_cbp = (r->cbp_chroma[mb_pos] >> (k*4)) & 0xF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
221 if(row)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
222 top_cbp = (r->cbp_chroma[mb_pos - s->mb_stride] >> (k*4)) & 0xF;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
223 for(j = 4*!row; j < 8; j += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
224 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
225 for(i = 0; i < 2; i++, C += 4){
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
226 int ij = i + (j >> 1);
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
227 loc_lim = 0;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
228 if(r->cbp_chroma[mb_pos] && (1 << ij))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
229 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
230 else if(!j && top_cbp & (1 << (ij + 2)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
231 loc_lim = top_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
232 else if( j && cur_cbp & (1 << (ij - 2)))
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
233 loc_lim = cur_lim;
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
234 if(loc_lim)
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
235 rv30_weak_loop_filter(C, s->uvlinesize, 1, loc_lim);
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 }
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
241
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
242 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
243 * Initialize decoder.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
244 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
245 static av_cold int rv30_decode_init(AVCodecContext *avctx)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
246 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
247 RV34DecContext *r = avctx->priv_data;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
248
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
249 r->rv30 = 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
250 ff_rv34_decode_init(avctx);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
251 if(avctx->extradata_size < 2){
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
252 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
253 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
254 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
255 r->rpr = (avctx->extradata[1] & 7) >> 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
256 r->rpr = FFMIN(r->rpr + 1, 3);
8566
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
257 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
258 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
259 6 + r->rpr * 2, avctx->extradata_size);
48a4d9f4c6f8 RV30 decoder passes possible frame sizes in extradata and selects
kostya
parents: 8409
diff changeset
260 }
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
261 r->parse_slice_header = rv30_parse_slice_header;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
262 r->decode_intra_types = rv30_decode_intra_types;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
263 r->decode_mb_info = rv30_decode_mb_info;
8409
51c9946c70f9 RV30 loop filter
kostya
parents: 8075
diff changeset
264 r->loop_filter = rv30_loop_filter;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
265 r->luma_dc_quant_i = rv30_luma_dc_quant;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
266 r->luma_dc_quant_p = rv30_luma_dc_quant;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
267 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
268 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
269
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
270 AVCodec rv30_decoder = {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
271 "rv30",
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
272 CODEC_TYPE_VIDEO,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
273 CODEC_ID_RV30,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
274 sizeof(RV34DecContext),
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
275 rv30_decode_init,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
276 NULL,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
277 ff_rv34_decode_end,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
278 ff_rv34_decode_frame,
5992
61f0987be684 Add decoder flags
kostya
parents: 5981
diff changeset
279 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
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"),
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
281 };