ffmpeg / libavcodec / rv30.c @ 39902a8c
History  View  Annotate  Download (4.18 KB)
1 
/*


2 
* RV30 decoder

3 
* Copyright (c) 2007 Konstantin Shishkov

4 
*

5 
* This file is part of FFmpeg.

6 
*

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.

11 
*

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.

16 
*

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 021101301 USA

20 
*/

21  
22 
/**

23 
* @file rv30.c

24 
* RV30 decoder

25 
*/

26  
27 
#include "avcodec.h" 
28 
#include "dsputil.h" 
29 
#include "mpegvideo.h" 
30 
#include "golomb.h" 
31  
32 
#include "rv34.h" 
33 
#include "rv30data.h" 
34  
35  
36 
static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si) 
37 
{ 
38 
int mb_bits;

39 
int w = r>s.width, h = r>s.height;

40 
int mb_size;

41  
42 
memset(si, 0, sizeof(SliceInfo)); 
43 
skip_bits(gb, 3);

44 
si>type = get_bits(gb, 2);

45 
if(si>type == 1) si>type = 0; 
46 
if(get_bits1(gb))

47 
return 1; 
48 
si>quant = get_bits(gb, 5);

49 
skip_bits1(gb); 
50 
si>pts = get_bits(gb, 13);

51 
skip_bits(gb, r>rpr); 
52 
si>width = w; 
53 
si>height = h; 
54 
mb_size = ((w + 15) >> 4) * ((h + 15) >> 4); 
55 
mb_bits = ff_rv34_get_start_offset(gb, mb_size); 
56 
si>start = get_bits(gb, mb_bits); 
57 
skip_bits1(gb); 
58 
return 0; 
59 
} 
60  
61 
/**

62 
* Decode 4x4 intra types array.

63 
*/

64 
static int rv30_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst) 
65 
{ 
66 
int i, j, k;

67  
68 
for(i = 0; i < 4; i++, dst += r>s.b4_stride  4){ 
69 
for(j = 0; j < 4; j+= 2){ 
70 
int code = svq3_get_ue_golomb(gb) << 1; 
71 
if(code >= 81*2){ 
72 
av_log(r>s.avctx, AV_LOG_ERROR, "Incorrect intra prediction code\n");

73 
return 1; 
74 
} 
75 
for(k = 0; k < 2; k++){ 
76 
int A = dst[r>s.b4_stride] + 1; 
77 
int B = dst[1] + 1; 
78 
*dst++ = rv30_itype_from_context[A * 90 + B * 9 + rv30_itype_code[code + k]]; 
79 
if(dst[1] == 9){ 
80 
av_log(r>s.avctx, AV_LOG_ERROR, "Incorrect intra prediction mode\n");

81 
return 1; 
82 
} 
83 
} 
84 
} 
85 
} 
86 
return 0; 
87 
} 
88  
89 
/**

90 
* Decode macroblock information.

91 
*/

92 
static int rv30_decode_mb_info(RV34DecContext *r) 
93 
{ 
94 
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 }; 
95 
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 }; 
96 
MpegEncContext *s = &r>s; 
97 
GetBitContext *gb = &s>gb; 
98 
int code = svq3_get_ue_golomb(gb);

99  
100 
if(code > 11){ 
101 
av_log(s>avctx, AV_LOG_ERROR, "Incorrect MB type code\n");

102 
return 1; 
103 
} 
104 
if(code > 5){ 
105 
av_log(s>avctx, AV_LOG_ERROR, "dquant needed\n");

106 
code = 6;

107 
} 
108 
if(s>pict_type != FF_B_TYPE)

109 
return rv30_p_types[code];

110 
else

111 
return rv30_b_types[code];

112 
} 
113  
114 
/**

115 
* Initialize decoder.

116 
*/

117 
static av_cold int rv30_decode_init(AVCodecContext *avctx) 
118 
{ 
119 
RV34DecContext *r = avctx>priv_data; 
120  
121 
r>rv30 = 1;

122 
ff_rv34_decode_init(avctx); 
123 
if(avctx>extradata_size < 2){ 
124 
av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");

125 
return 1; 
126 
} 
127 
r>rpr = (avctx>extradata[1] & 7) >> 1; 
128 
r>rpr = FFMIN(r>rpr + 1, 3); 
129 
r>parse_slice_header = rv30_parse_slice_header; 
130 
r>decode_intra_types = rv30_decode_intra_types; 
131 
r>decode_mb_info = rv30_decode_mb_info; 
132 
r>luma_dc_quant_i = rv30_luma_dc_quant; 
133 
r>luma_dc_quant_p = rv30_luma_dc_quant; 
134 
return 0; 
135 
} 
136  
137 
AVCodec rv30_decoder = { 
138 
"rv30",

139 
CODEC_TYPE_VIDEO, 
140 
CODEC_ID_RV30, 
141 
sizeof(RV34DecContext),

142 
rv30_decode_init, 
143 
NULL,

144 
ff_rv34_decode_end, 
145 
ff_rv34_decode_frame, 
146 
CODEC_CAP_DR1  CODEC_CAP_DELAY, 
147 
.long_name = "RealVideo 3.0",

148 
}; 