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
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
;
42 memset(si
, 0, sizeof(SliceInfo
));
44 si
->type
= get_bits(gb
, 2);
45 if(si
->type
== 1) si
->type
= 0;
48 si
->quant
= get_bits(gb
, 5);
50 si
->pts
= get_bits(gb
, 13);
51 skip_bits(gb
, r
->rpr
);
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
);
62 * Decode 4x4 intra types array.
64 static int rv30_decode_intra_types(RV34DecContext
*r
, GetBitContext
*gb
, int8_t *dst
)
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;
72 av_log(r
->s
.avctx
, AV_LOG_ERROR
, "Incorrect intra prediction code\n");
75 for(k
= 0; k
< 2; k
++){
76 int A
= dst
[-r
->s
.b4_stride
] + 1;
78 *dst
++ = rv30_itype_from_context
[A
* 90 + B
* 9 + rv30_itype_code
[code
+ k
]];
80 av_log(r
->s
.avctx
, AV_LOG_ERROR
, "Incorrect intra prediction mode\n");
90 * Decode macroblock information.
92 static int rv30_decode_mb_info(RV34DecContext
*r
)
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
);
101 av_log(s
->avctx
, AV_LOG_ERROR
, "Incorrect MB type code\n");
105 av_log(s
->avctx
, AV_LOG_ERROR
, "dquant needed\n");
108 if(s
->pict_type
!= FF_B_TYPE
)
109 return rv30_p_types
[code
];
111 return rv30_b_types
[code
];
115 * Initialize decoder.
117 static av_cold
int rv30_decode_init(AVCodecContext
*avctx
)
119 RV34DecContext
*r
= avctx
->priv_data
;
122 ff_rv34_decode_init(avctx
);
123 if(avctx
->extradata_size
< 2){
124 av_log(avctx
, AV_LOG_ERROR
, "Extradata is too small.\n");
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
;
137 AVCodec rv30_decoder
= {
141 sizeof(RV34DecContext
),
145 ff_rv34_decode_frame
,
146 CODEC_CAP_DR1
| CODEC_CAP_DELAY
,
147 .long_name
= NULL_IF_CONFIG_SMALL("RealVideo 3.0"),