00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00027 #include "avcodec.h"
00028 #include "dsputil.h"
00029 #include "mpegvideo.h"
00030 #include "golomb.h"
00031
00032 #include "rv34.h"
00033 #include "rv40vlc2.h"
00034 #include "rv40data.h"
00035
00036 static VLC aic_top_vlc;
00037 static VLC aic_mode1_vlc[AIC_MODE1_NUM], aic_mode2_vlc[AIC_MODE2_NUM];
00038 static VLC ptype_vlc[NUM_PTYPE_VLCS], btype_vlc[NUM_BTYPE_VLCS];
00039
00043 static void rv40_init_tables()
00044 {
00045 int i;
00046
00047 init_vlc(&aic_top_vlc, AIC_TOP_BITS, AIC_TOP_SIZE,
00048 rv40_aic_top_vlc_bits, 1, 1,
00049 rv40_aic_top_vlc_codes, 1, 1, INIT_VLC_USE_STATIC);
00050 for(i = 0; i < AIC_MODE1_NUM; i++){
00051
00052 if((i % 10) == 9) continue;
00053 init_vlc(&aic_mode1_vlc[i], AIC_MODE1_BITS, AIC_MODE1_SIZE,
00054 aic_mode1_vlc_bits[i], 1, 1,
00055 aic_mode1_vlc_codes[i], 1, 1, INIT_VLC_USE_STATIC);
00056 }
00057 for(i = 0; i < AIC_MODE2_NUM; i++){
00058 init_vlc(&aic_mode2_vlc[i], AIC_MODE2_BITS, AIC_MODE2_SIZE,
00059 aic_mode2_vlc_bits[i], 1, 1,
00060 aic_mode2_vlc_codes[i], 2, 2, INIT_VLC_USE_STATIC);
00061 }
00062 for(i = 0; i < NUM_PTYPE_VLCS; i++)
00063 init_vlc_sparse(&ptype_vlc[i], PTYPE_VLC_BITS, PTYPE_VLC_SIZE,
00064 ptype_vlc_bits[i], 1, 1,
00065 ptype_vlc_codes[i], 1, 1,
00066 ptype_vlc_syms, 1, 1, INIT_VLC_USE_STATIC);
00067 for(i = 0; i < NUM_BTYPE_VLCS; i++)
00068 init_vlc_sparse(&btype_vlc[i], BTYPE_VLC_BITS, BTYPE_VLC_SIZE,
00069 btype_vlc_bits[i], 1, 1,
00070 btype_vlc_codes[i], 1, 1,
00071 btype_vlc_syms, 1, 1, INIT_VLC_USE_STATIC);
00072 }
00073
00080 static int get_dimension(GetBitContext *gb, const int *dim)
00081 {
00082 int t = get_bits(gb, 3);
00083 int val = dim[t];
00084 if(val < 0)
00085 val = dim[get_bits1(gb) - val];
00086 if(!val){
00087 do{
00088 t = get_bits(gb, 8);
00089 val += t << 2;
00090 }while(t == 0xFF);
00091 }
00092 return val;
00093 }
00094
00098 static void rv40_parse_picture_size(GetBitContext *gb, int *w, int *h)
00099 {
00100 *w = get_dimension(gb, rv40_standard_widths);
00101 *h = get_dimension(gb, rv40_standard_heights);
00102 }
00103
00104 static int rv40_parse_slice_header(RV34DecContext *r, GetBitContext *gb, SliceInfo *si)
00105 {
00106 int t, mb_bits;
00107 int w = r->s.width, h = r->s.height;
00108 int mb_size;
00109
00110 memset(si, 0, sizeof(SliceInfo));
00111 if(get_bits1(gb))
00112 return -1;
00113 si->type = get_bits(gb, 2);
00114 if(si->type == 1) si->type = 0;
00115 si->quant = get_bits(gb, 5);
00116 if(get_bits(gb, 2))
00117 return -1;
00118 si->vlc_set = get_bits(gb, 2);
00119 skip_bits1(gb);
00120 t = get_bits(gb, 13);
00121 if(!si->type || !get_bits1(gb))
00122 rv40_parse_picture_size(gb, &w, &h);
00123 if(avcodec_check_dimensions(r->s.avctx, w, h) < 0)
00124 return -1;
00125 si->width = w;
00126 si->height = h;
00127 mb_size = ((w + 15) >> 4) * ((h + 15) >> 4);
00128 mb_bits = ff_rv34_get_start_offset(gb, mb_size);
00129 si->start = get_bits(gb, mb_bits);
00130
00131 return 0;
00132 }
00133
00137 static int rv40_decode_intra_types(RV34DecContext *r, GetBitContext *gb, int8_t *dst)
00138 {
00139 MpegEncContext *s = &r->s;
00140 int i, j, k, v;
00141 int A, B, C;
00142 int pattern;
00143 int8_t *ptr;
00144
00145 for(i = 0; i < 4; i++, dst += s->b4_stride){
00146 if(!i && s->first_slice_line){
00147 pattern = get_vlc2(gb, aic_top_vlc.table, AIC_TOP_BITS, 1);
00148 dst[0] = (pattern >> 2) & 2;
00149 dst[1] = (pattern >> 1) & 2;
00150 dst[2] = pattern & 2;
00151 dst[3] = (pattern << 1) & 2;
00152 continue;
00153 }
00154 ptr = dst;
00155 for(j = 0; j < 4; j++){
00156
00157
00158
00159
00160
00161
00162 A = ptr[-s->b4_stride + 1];
00163 B = ptr[-s->b4_stride];
00164 C = ptr[-1];
00165 pattern = A + (B << 4) + (C << 8);
00166 for(k = 0; k < MODE2_PATTERNS_NUM; k++)
00167 if(pattern == rv40_aic_table_index[k])
00168 break;
00169 if(j < 3 && k < MODE2_PATTERNS_NUM){
00170 v = get_vlc2(gb, aic_mode2_vlc[k].table, AIC_MODE2_BITS, 2);
00171 *ptr++ = v/9;
00172 *ptr++ = v%9;
00173 j++;
00174 }else{
00175 if(B != -1 && C != -1)
00176 v = get_vlc2(gb, aic_mode1_vlc[B + C*10].table, AIC_MODE1_BITS, 1);
00177 else{
00178 v = 0;
00179 switch(C){
00180 case -1:
00181 if(B < 2)
00182 v = get_bits1(gb) ^ 1;
00183 break;
00184 case 0:
00185 case 2:
00186 v = (get_bits1(gb) ^ 1) << 1;
00187 break;
00188 }
00189 }
00190 *ptr++ = v;
00191 }
00192 }
00193 }
00194 return 0;
00195 }
00196
00200 static int rv40_decode_mb_info(RV34DecContext *r)
00201 {
00202 MpegEncContext *s = &r->s;
00203 GetBitContext *gb = &s->gb;
00204 int q, i;
00205 int prev_type = 0;
00206 int mb_pos = s->mb_x + s->mb_y * s->mb_stride;
00207 int blocks[RV34_MB_TYPES] = {0};
00208 int count = 0;
00209
00210 if(!r->s.mb_skip_run)
00211 r->s.mb_skip_run = svq3_get_ue_golomb(gb) + 1;
00212
00213 if(--r->s.mb_skip_run)
00214 return RV34_MB_SKIP;
00215
00216 if(r->avail_cache[5-1])
00217 blocks[r->mb_type[mb_pos - 1]]++;
00218 if(r->avail_cache[5-4]){
00219 blocks[r->mb_type[mb_pos - s->mb_stride]]++;
00220 if(r->avail_cache[5-2])
00221 blocks[r->mb_type[mb_pos - s->mb_stride + 1]]++;
00222 if(r->avail_cache[5-5])
00223 blocks[r->mb_type[mb_pos - s->mb_stride - 1]]++;
00224 }
00225
00226 for(i = 0; i < RV34_MB_TYPES; i++){
00227 if(blocks[i] > count){
00228 count = blocks[i];
00229 prev_type = i;
00230 }
00231 }
00232 if(s->pict_type == P_TYPE){
00233 prev_type = block_num_to_ptype_vlc_num[prev_type];
00234 q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);
00235 if(q < PBTYPE_ESCAPE)
00236 return q;
00237 q = get_vlc2(gb, ptype_vlc[prev_type].table, PTYPE_VLC_BITS, 1);
00238 av_log(s->avctx, AV_LOG_ERROR, "Dquant for P-frame\n");
00239 }else{
00240 prev_type = block_num_to_btype_vlc_num[prev_type];
00241 q = get_vlc2(gb, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 1);
00242 if(q < PBTYPE_ESCAPE)
00243 return q;
00244 q = get_vlc2(gb, btype_vlc[prev_type].table, BTYPE_VLC_BITS, 1);
00245 av_log(s->avctx, AV_LOG_ERROR, "Dquant for B-frame\n");
00246 }
00247 return 0;
00248 }
00249
00253 static int rv40_decode_init(AVCodecContext *avctx)
00254 {
00255 RV34DecContext *r = avctx->priv_data;
00256
00257 r->rv30 = 0;
00258 ff_rv34_decode_init(avctx);
00259 if(!aic_top_vlc.bits)
00260 rv40_init_tables();
00261 r->parse_slice_header = rv40_parse_slice_header;
00262 r->decode_intra_types = rv40_decode_intra_types;
00263 r->decode_mb_info = rv40_decode_mb_info;
00264 r->luma_dc_quant_i = rv40_luma_dc_quant[0];
00265 r->luma_dc_quant_p = rv40_luma_dc_quant[1];
00266 return 0;
00267 }
00268
00269 AVCodec rv40_decoder = {
00270 "rv40",
00271 CODEC_TYPE_VIDEO,
00272 CODEC_ID_RV40,
00273 sizeof(RV34DecContext),
00274 rv40_decode_init,
00275 NULL,
00276 ff_rv34_decode_end,
00277 ff_rv34_decode_frame,
00278 CODEC_CAP_DR1 | CODEC_CAP_DELAY,
00279 };