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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
1 /*
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
2 * RV30 decoder
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
3 * Copyright (c) 2007 Konstantin Shishkov
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
4 *
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
5 * This file is part of FFmpeg.
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
6 *
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
11 *
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
15 * Lesser General Public License for more details.
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
16 *
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
20 */
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
21
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
22 /**
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
23 * @file rv30.c
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
24 * RV30 decoder
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
25 */
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
26
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
27 #include "avcodec.h"
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
28 #include "dsputil.h"
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
29 #include "mpegvideo.h"
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
30 #include "golomb.h"
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
31
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
32 #include "rv34.h"
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
33 #include "rv30data.h"
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
34
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
35
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
36 static int rv30_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
37 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
38 int mb_bits;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
39 int w = r->s.width, h = r->s.height;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
40 int mb_size;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
41
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
42 memset(si, 0, sizeof(SliceInfo));
8075
e71badf6877a Detect split RV30 slices
kostya
parents: 7040
diff changeset
43 if(get_bits(gb, 3))
e71badf6877a Detect split RV30 slices
kostya
parents: 7040
diff changeset
44 return -1;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
45 si->type = get_bits(gb, 2);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
46 if(si->type == 1) si->type = 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
47 if(get_bits1(gb))
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
48 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
49 si->quant = get_bits(gb, 5);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
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
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
52 skip_bits(gb, r->rpr);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
53 si->width = w;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
54 si->height = h;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
55 mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
56 mb_bits = ff_rv34_get_start_offset(gb, mb_size);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
57 si->start = get_bits(gb, mb_bits);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
58 skip_bits1(gb);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
59 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
60 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
61
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
62 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
63 * Decode 4x4 intra types array.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
64 */
5993
5dfff8f6f524 Intra types will be stored in int8_t array
kostya
parents: 5992
diff changeset
65 static int rv30_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
66 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
67 int i, j, k;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
68
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
69 for(i = 0; i < 4; i++, dst += r->s.b4_stride - 4){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
70 for(j = 0; j < 4; j+= 2){
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
71 int code = svq3_get_ue_golomb(gb) << 1;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
72 if(code >= 81*2){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
73 av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction code\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
74 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
75 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
76 for(k = 0; k < 2; k++){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
77 int A = dst[-r->s.b4_stride] + 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
78 int B = dst[-1] + 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
79 *dst++ = rv30_itype_from_context[A * 90 + B * 9 + rv30_itype_code[code + k]];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
80 if(dst[-1] == 9){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
81 av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction mode\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
82 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
83 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
84 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
85 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
86 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
87 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
88 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
89
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
90 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
91 * Decode macroblock information.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
92 */
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
93 static int rv30_decode_mb_info(RV34DecContext *r)
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
94 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
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 };
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
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 };
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
97 MpegEncContext *s = &r->s;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
98 GetBitContext *gb = &s->gb;
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
99 int code = svq3_get_ue_golomb(gb);
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
100
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
101 if(code > 11){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
102 av_log(s->avctx, AV_LOG_ERROR, "Incorrect MB type code\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
103 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
104 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
105 if(code > 5){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
106 av_log(s->avctx, AV_LOG_ERROR, "dquant needed\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
107 code -= 6;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
108 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5995
diff changeset
109 if(s->pict_type != FF_B_TYPE)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
110 return rv30_p_types[code];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
111 else
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
112 return rv30_b_types[code];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
113 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
114
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
115 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
116 * Initialize decoder.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
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
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
119 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
120 RV34DecContext *r = avctx->priv_data;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
121
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
122 r->rv30 = 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
123 ff_rv34_decode_init(avctx);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
124 if(avctx->extradata_size < 2){
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
125 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
126 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
127 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
128 r->rpr = (avctx->extradata[1] & 7) >> 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
129 r->rpr = FFMIN(r->rpr + 1, 3);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
130 r->parse_slice_header = rv30_parse_slice_header;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
131 r->decode_intra_types = rv30_decode_intra_types;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
132 r->decode_mb_info = rv30_decode_mb_info;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
133 r->luma_dc_quant_i = rv30_luma_dc_quant;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
134 r->luma_dc_quant_p = rv30_luma_dc_quant;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
135 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
136 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
137
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
138 AVCodec rv30_decoder = {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
139 "rv30",
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
140 CODEC_TYPE_VIDEO,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
141 CODEC_ID_RV30,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
142 sizeof(RV34DecContext),
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
143 rv30_decode_init,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
144 NULL,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
145 ff_rv34_decode_end,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
146 ff_rv34_decode_frame,
5992
61f0987be684 Add decoder flags
kostya
parents: 5981
diff changeset
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
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
149 };