annotate rv30.c @ 6920:d02af7474bff libavcodec

Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays. fixes CID84 RUN2 CID85 RUN2 CID86 RUN2 CID87 RUN2 CID88 RUN2 CID89 RUN2 CID90 RUN2 CID91 RUN2 CID92 RUN2 CID93 RUN2 CID94 RUN2 CID95 RUN2 CID96 RUN2 CID97 RUN2 CID98 RUN2 CID99 RUN2 CID100 RUN2 CID101 RUN2 CID102 RUN2 CID103 RUN2 CID104 RUN2 CID105 RUN2 CID106 RUN2
author michael
date Wed, 28 May 2008 11:59:41 +0000
parents 05c3a4b419e9
children e943e1409077
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));
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
43 skip_bits(gb, 3);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
44 si->type = get_bits(gb, 2);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
45 if(si->type == 1) si->type = 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
46 if(get_bits1(gb))
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
47 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
48 si->quant = get_bits(gb, 5);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
49 skip_bits1(gb);
6714
05c3a4b419e9 Calculate motion vector information based on PTS provided in slice header
kostya
parents: 6712
diff changeset
50 si->pts = get_bits(gb, 13);
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
51 skip_bits(gb, r->rpr);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
52 si->width = w;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
53 si->height = h;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
54 mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
55 mb_bits = ff_rv34_get_start_offset(gb, mb_size);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
56 si->start = get_bits(gb, mb_bits);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
57 skip_bits1(gb);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
58 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
59 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
60
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
61 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
62 * Decode 4x4 intra types array.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
63 */
5993
5dfff8f6f524 Intra types will be stored in int8_t array
kostya
parents: 5992
diff changeset
64 static int rv30_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
65 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
66 int i, j, k;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
67
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
68 for(i = 0; i < 4; i++, dst += r->s.b4_stride - 4){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
69 for(j = 0; j < 4; j+= 2){
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
70 int code = svq3_get_ue_golomb(gb) << 1;
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
71 if(code >= 81*2){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
72 av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction code\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
73 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
74 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
75 for(k = 0; k < 2; k++){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
76 int A = dst[-r->s.b4_stride] + 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
77 int B = dst[-1] + 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
78 *dst++ = rv30_itype_from_context[A * 90 + B * 9 + rv30_itype_code[code + k]];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
79 if(dst[-1] == 9){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
80 av_log(r->s.avctx, AV_LOG_ERROR, "Incorrect intra prediction mode\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
81 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
82 }
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 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
87 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
88
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
89 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
90 * Decode macroblock information.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
91 */
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
92 static int rv30_decode_mb_info(RV34DecContext *r)
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
93 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
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 };
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
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 };
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
96 MpegEncContext *s = &r->s;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
97 GetBitContext *gb = &s->gb;
5995
a33699306850 Use existing function for VLC reading
kostya
parents: 5993
diff changeset
98 int code = svq3_get_ue_golomb(gb);
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
99
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
100 if(code > 11){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
101 av_log(s->avctx, AV_LOG_ERROR, "Incorrect MB type code\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
102 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
103 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
104 if(code > 5){
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
105 av_log(s->avctx, AV_LOG_ERROR, "dquant needed\n");
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
106 code -= 6;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
107 }
6481
493dc59d469a add FF_ prefix to all (frame)_TYPE usage
aurel
parents: 5995
diff changeset
108 if(s->pict_type != FF_B_TYPE)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
109 return rv30_p_types[code];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
110 else
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
111 return rv30_b_types[code];
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
112 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
113
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
114 /**
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
115 * Initialize decoder.
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
116 */
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 6481
diff changeset
117 static av_cold int rv30_decode_init(AVCodecContext *avctx)
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
118 {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
119 RV34DecContext *r = avctx->priv_data;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
120
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
121 r->rv30 = 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
122 ff_rv34_decode_init(avctx);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
123 if(avctx->extradata_size < 2){
5981
b60d7f351e9d cosmetics: comment spelling fixes
diego
parents: 5968
diff changeset
124 av_log(avctx, AV_LOG_ERROR, "Extradata is too small.\n");
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
125 return -1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
126 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
127 r->rpr = (avctx->extradata[1] & 7) >> 1;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
128 r->rpr = FFMIN(r->rpr + 1, 3);
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
129 r->parse_slice_header = rv30_parse_slice_header;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
130 r->decode_intra_types = rv30_decode_intra_types;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
131 r->decode_mb_info = rv30_decode_mb_info;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
132 r->luma_dc_quant_i = rv30_luma_dc_quant;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
133 r->luma_dc_quant_p = rv30_luma_dc_quant;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
134 return 0;
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
135 }
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
136
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
137 AVCodec rv30_decoder = {
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
138 "rv30",
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
139 CODEC_TYPE_VIDEO,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
140 CODEC_ID_RV30,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
141 sizeof(RV34DecContext),
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
142 rv30_decode_init,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
143 NULL,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
144 ff_rv34_decode_end,
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
145 ff_rv34_decode_frame,
5992
61f0987be684 Add decoder flags
kostya
parents: 5981
diff changeset
146 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
6712
5b3acf9fd50a Add long names to AVCodec declarations.
diego
parents: 6517
diff changeset
147 .long_name = "RealVideo 3.0",
5968
3f452f275542 RealVideo 3 decoder functions
kostya
parents:
diff changeset
148 };