ffmpeg / libavcodec / rv30.c @ 42d6c3ba
History  View  Annotate  Download (4.22 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 
if(get_bits(gb, 3)) 
44 
return 1; 
45 
si>type = get_bits(gb, 2);

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

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

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

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

63 
* Decode 4x4 intra types array.

64 
*/

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

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

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

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

91 
* Decode macroblock information.

92 
*/

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

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

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

107 
code = 6;

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

110 
return rv30_p_types[code];

111 
else

112 
return rv30_b_types[code];

113 
} 
114  
115 
/**

116 
* Initialize decoder.

117 
*/

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

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

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

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

143 
rv30_decode_init, 
144 
NULL,

145 
ff_rv34_decode_end, 
146 
ff_rv34_decode_frame, 
147 
CODEC_CAP_DR1  CODEC_CAP_DELAY, 
148 
.long_name = NULL_IF_CONFIG_SMALL("RealVideo 3.0"),

149 
}; 