Mercurial > libavcodec.hg
annotate rv30.c @ 8228:416ffc3907bf libavcodec
Remove ineffectual hack that attempts to build ppc/check_altivec.o without
AltiVec flags. The flags are set by configure and used to compile all files
anyway. Setting extra AltiVec options here just duplicates them for the files
for which they are set.
author | diego |
---|---|
date | Sun, 30 Nov 2008 16:57:28 +0000 |
parents | e71badf6877a |
children | 51c9946c70f9 |
rev | line source |
---|---|
5968 | 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 02110-1301 USA | |
20 */ | |
21 | |
22 /** | |
23 * @file rv30.c | |
5981 | 24 * RV30 decoder |
5968 | 25 */ |
26 | |
27 #include "avcodec.h" | |
28 #include "dsputil.h" | |
29 #include "mpegvideo.h" | |
5995 | 30 #include "golomb.h" |
5968 | 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)); | |
8075 | 43 if(get_bits(gb, 3)) |
44 return -1; | |
5968 | 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); | |
6714
05c3a4b419e9
Calculate motion vector information based on PTS provided in slice header
kostya
parents:
6712
diff
changeset
|
51 si->pts = get_bits(gb, 13); |
5968 | 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 /** | |
5981 | 63 * Decode 4x4 intra types array. |
5968 | 64 */ |
5993 | 65 static int rv30_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst) |
5968 | 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){ | |
5995 | 71 int code = svq3_get_ue_golomb(gb) << 1; |
5968 | 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 /** | |
5981 | 91 * Decode macroblock information. |
5968 | 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; | |
5995 | 99 int code = svq3_get_ue_golomb(gb); |
5968 | 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 } | |
6481 | 109 if(s->pict_type != FF_B_TYPE) |
5968 | 110 return rv30_p_types[code]; |
111 else | |
112 return rv30_b_types[code]; | |
113 } | |
114 | |
115 /** | |
5981 | 116 * Initialize decoder. |
5968 | 117 */ |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6481
diff
changeset
|
118 static av_cold int rv30_decode_init(AVCodecContext *avctx) |
5968 | 119 { |
120 RV34DecContext *r = avctx->priv_data; | |
121 | |
122 r->rv30 = 1; | |
123 ff_rv34_decode_init(avctx); | |
124 if(avctx->extradata_size < 2){ | |
5981 | 125 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n"); |
5968 | 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, | |
5992 | 147 CODEC_CAP_DR1 | CODEC_CAP_DELAY, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6714
diff
changeset
|
148 .long_name = NULL_IF_CONFIG_SMALL("RealVideo 3.0"), |
5968 | 149 }; |