3 * Copyright (c) 2007 Konstantin Shishkov
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 * @file libavcodec/rv30.c
29 #include "mpegvideo.h"
36 static int rv30_parse_slice_header(RV34DecContext
*r
, GetBitContext
*gb
, SliceInfo
*si
)
39 int w
= r
->s
.width
, h
= r
->s
.height
;
43 memset(si
, 0, sizeof(SliceInfo
));
46 si
->type
= get_bits(gb
, 2);
47 if(si
->type
== 1) si
->type
= 0;
50 si
->quant
= get_bits(gb
, 5);
52 si
->pts
= get_bits(gb
, 13);
53 rpr
= get_bits(gb
, r
->rpr
);
55 w
= r
->s
.avctx
->extradata
[6 + rpr
*2] << 2;
56 h
= r
->s
.avctx
->extradata
[7 + rpr
*2] << 2;
60 mb_size
= ((w
+ 15) >> 4) * ((h
+ 15) >> 4);
61 mb_bits
= ff_rv34_get_start_offset(gb
, mb_size
);
62 si
->start
= get_bits(gb
, mb_bits
);
68 * Decode 4x4 intra types array.
70 static int rv30_decode_intra_types(RV34DecContext
*r
, GetBitContext
*gb
, int8_t *dst
)
74 for(i
= 0; i
< 4; i
++, dst
+= r
->s
.b4_stride
- 4){
75 for(j
= 0; j
< 4; j
+= 2){
76 int code
= svq3_get_ue_golomb(gb
) << 1;
78 av_log(r
->s
.avctx
, AV_LOG_ERROR
, "Incorrect intra prediction code\n");
81 for(k
= 0; k
< 2; k
++){
82 int A
= dst
[-r
->s
.b4_stride
] + 1;
84 *dst
++ = rv30_itype_from_context
[A
* 90 + B
* 9 + rv30_itype_code
[code
+ k
]];
86 av_log(r
->s
.avctx
, AV_LOG_ERROR
, "Incorrect intra prediction mode\n");
96 * Decode macroblock information.
98 static int rv30_decode_mb_info(RV34DecContext
*r
)
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
};
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
};
102 MpegEncContext
*s
= &r
->s
;
103 GetBitContext
*gb
= &s
->gb
;
104 int code
= svq3_get_ue_golomb(gb
);
107 av_log(s
->avctx
, AV_LOG_ERROR
, "Incorrect MB type code\n");
111 av_log(s
->avctx
, AV_LOG_ERROR
, "dquant needed\n");
114 if(s
->pict_type
!= FF_B_TYPE
)
115 return rv30_p_types
[code
];
117 return rv30_b_types
[code
];
120 static inline void rv30_weak_loop_filter(uint8_t *src
, const int step
,
121 const int stride
, const int lim
)
123 uint8_t *cm
= ff_cropTbl
+ MAX_NEG_CROP
;
126 for(i
= 0; i
< 4; i
++){
127 diff
= ((src
[-2*step
] - src
[1*step
]) - (src
[-1*step
] - src
[0*step
])*4) >> 3;
128 diff
= av_clip(diff
, -lim
, lim
);
129 src
[-1*step
] = cm
[src
[-1*step
] + diff
];
130 src
[ 0*step
] = cm
[src
[ 0*step
] - diff
];
135 static void rv30_loop_filter(RV34DecContext
*r
, int row
)
137 MpegEncContext
*s
= &r
->s
;
141 int loc_lim
, cur_lim
, left_lim
= 0, top_lim
= 0;
143 mb_pos
= row
* s
->mb_stride
;
144 for(mb_x
= 0; mb_x
< s
->mb_width
; mb_x
++, mb_pos
++){
145 int mbtype
= s
->current_picture_ptr
->mb_type
[mb_pos
];
146 if(IS_INTRA(mbtype
) || IS_SEPARATE_DC(mbtype
))
147 r
->deblock_coefs
[mb_pos
] = 0xFFFF;
149 r
->cbp_chroma
[mb_pos
] = 0xFF;
152 /* all vertical edges are filtered first
153 * and horizontal edges are filtered on the next iteration
155 mb_pos
= row
* s
->mb_stride
;
156 for(mb_x
= 0; mb_x
< s
->mb_width
; mb_x
++, mb_pos
++){
157 cur_lim
= rv30_loop_filt_lim
[s
->current_picture_ptr
->qscale_table
[mb_pos
]];
159 left_lim
= rv30_loop_filt_lim
[s
->current_picture_ptr
->qscale_table
[mb_pos
- 1]];
160 for(j
= 0; j
< 16; j
+= 4){
161 Y
= s
->current_picture_ptr
->data
[0] + mb_x
*16 + (row
*16 + j
) * s
->linesize
+ 4 * !mb_x
;
162 for(i
= !mb_x
; i
< 4; i
++, Y
+= 4){
165 if(r
->deblock_coefs
[mb_pos
] & (1 << ij
))
167 else if(!i
&& r
->deblock_coefs
[mb_pos
- 1] & (1 << (ij
+ 3)))
169 else if( i
&& r
->deblock_coefs
[mb_pos
] & (1 << (ij
- 1)))
172 rv30_weak_loop_filter(Y
, 1, s
->linesize
, loc_lim
);
175 for(k
= 0; k
< 2; k
++){
176 int cur_cbp
, left_cbp
= 0;
177 cur_cbp
= (r
->cbp_chroma
[mb_pos
] >> (k
*4)) & 0xF;
179 left_cbp
= (r
->cbp_chroma
[mb_pos
- 1] >> (k
*4)) & 0xF;
180 for(j
= 0; j
< 8; j
+= 4){
181 C
= s
->current_picture_ptr
->data
[k
+1] + mb_x
*8 + (row
*8 + j
) * s
->uvlinesize
+ 4 * !mb_x
;
182 for(i
= !mb_x
; i
< 2; i
++, C
+= 4){
183 int ij
= i
+ (j
>> 1);
185 if(cur_cbp
&& (1 << ij
))
187 else if(!i
&& left_cbp
& (1 << (ij
+ 1)))
189 else if( i
&& cur_cbp
& (1 << (ij
- 1)))
192 rv30_weak_loop_filter(C
, 1, s
->uvlinesize
, loc_lim
);
197 mb_pos
= row
* s
->mb_stride
;
198 for(mb_x
= 0; mb_x
< s
->mb_width
; mb_x
++, mb_pos
++){
199 cur_lim
= rv30_loop_filt_lim
[s
->current_picture_ptr
->qscale_table
[mb_pos
]];
201 top_lim
= rv30_loop_filt_lim
[s
->current_picture_ptr
->qscale_table
[mb_pos
- s
->mb_stride
]];
202 for(j
= 4*!row
; j
< 16; j
+= 4){
203 Y
= s
->current_picture_ptr
->data
[0] + mb_x
*16 + (row
*16 + j
) * s
->linesize
;
204 for(i
= 0; i
< 4; i
++, Y
+= 4){
207 if(r
->deblock_coefs
[mb_pos
] & (1 << ij
))
209 else if(!j
&& r
->deblock_coefs
[mb_pos
- s
->mb_stride
] & (1 << (ij
+ 12)))
211 else if( j
&& r
->deblock_coefs
[mb_pos
] & (1 << (ij
- 4)))
214 rv30_weak_loop_filter(Y
, s
->linesize
, 1, loc_lim
);
217 for(k
= 0; k
< 2; k
++){
218 int cur_cbp
, top_cbp
= 0;
219 cur_cbp
= (r
->cbp_chroma
[mb_pos
] >> (k
*4)) & 0xF;
221 top_cbp
= (r
->cbp_chroma
[mb_pos
- s
->mb_stride
] >> (k
*4)) & 0xF;
222 for(j
= 4*!row
; j
< 8; j
+= 4){
223 C
= s
->current_picture_ptr
->data
[k
+1] + mb_x
*8 + (row
*8 + j
) * s
->uvlinesize
;
224 for(i
= 0; i
< 2; i
++, C
+= 4){
225 int ij
= i
+ (j
>> 1);
227 if(r
->cbp_chroma
[mb_pos
] && (1 << ij
))
229 else if(!j
&& top_cbp
& (1 << (ij
+ 2)))
231 else if( j
&& cur_cbp
& (1 << (ij
- 2)))
234 rv30_weak_loop_filter(C
, s
->uvlinesize
, 1, loc_lim
);
242 * Initialize decoder.
244 static av_cold
int rv30_decode_init(AVCodecContext
*avctx
)
246 RV34DecContext
*r
= avctx
->priv_data
;
249 ff_rv34_decode_init(avctx
);
250 if(avctx
->extradata_size
< 2){
251 av_log(avctx
, AV_LOG_ERROR
, "Extradata is too small.\n");
254 r
->rpr
= (avctx
->extradata
[1] & 7) >> 1;
255 r
->rpr
= FFMIN(r
->rpr
+ 1, 3);
256 if(avctx
->extradata_size
- 8 < (r
->rpr
- 1) * 2){
257 av_log(avctx
, AV_LOG_ERROR
, "Insufficient extradata - need at least %d bytes, got %d\n",
258 6 + r
->rpr
* 2, avctx
->extradata_size
);
260 r
->parse_slice_header
= rv30_parse_slice_header
;
261 r
->decode_intra_types
= rv30_decode_intra_types
;
262 r
->decode_mb_info
= rv30_decode_mb_info
;
263 r
->loop_filter
= rv30_loop_filter
;
264 r
->luma_dc_quant_i
= rv30_luma_dc_quant
;
265 r
->luma_dc_quant_p
= rv30_luma_dc_quant
;
269 AVCodec rv30_decoder
= {
273 sizeof(RV34DecContext
),
277 ff_rv34_decode_frame
,
278 CODEC_CAP_DR1
| CODEC_CAP_DELAY
,
279 .flush
= ff_mpeg_flush
,
280 .long_name
= NULL_IF_CONFIG_SMALL("RealVideo 3.0"),
281 .pix_fmts
= ff_pixfmt_list_420
,