comparison h263dec.c @ 498:0b4450c15067 libavcodec

dc scale simplification/optimization
author michaelni
date Tue, 18 Jun 2002 00:46:02 +0000
parents 20108840b0e5
children cd170daf9e4c
comparison
equal deleted inserted replaced
497:5b33d11bd1fb 498:0b4450c15067
74 case CODEC_ID_WMV1: 74 case CODEC_ID_WMV1:
75 s->h263_msmpeg4 = 1; 75 s->h263_msmpeg4 = 1;
76 s->h263_pred = 1; 76 s->h263_pred = 1;
77 s->msmpeg4_version=4; 77 s->msmpeg4_version=4;
78 break; 78 break;
79 case CODEC_ID_WMV2:
80 s->h263_msmpeg4 = 1;
81 s->h263_pred = 1;
82 s->msmpeg4_version=5;
83 break;
79 case CODEC_ID_H263I: 84 case CODEC_ID_H263I:
80 s->h263_intel = 1; 85 s->h263_intel = 1;
81 break; 86 break;
82 default: 87 default:
83 return -1; 88 return -1;
89 if (avctx->codec->id != CODEC_ID_H263 && avctx->codec->id != CODEC_ID_MPEG4) 94 if (avctx->codec->id != CODEC_ID_H263 && avctx->codec->id != CODEC_ID_MPEG4)
90 if (MPV_common_init(s) < 0) 95 if (MPV_common_init(s) < 0)
91 return -1; 96 return -1;
92 97
93 if (s->h263_msmpeg4) 98 if (s->h263_msmpeg4)
94 msmpeg4_decode_init_vlc(s); 99 ff_msmpeg4_decode_init(s);
95 else 100 else
96 h263_decode_init_vlc(s); 101 h263_decode_init_vlc(s);
97 102
98 return 0; 103 return 0;
99 } 104 }
167 return -1; 172 return -1;
168 } 173 }
169 174
170 if(ret==FRAME_SKIPED) return 0; 175 if(ret==FRAME_SKIPED) return 0;
171 /* skip if the header was thrashed */ 176 /* skip if the header was thrashed */
172 if (ret < 0) 177 if (ret < 0){
178 fprintf(stderr, "header damaged\n");
173 return -1; 179 return -1;
180 }
174 /* skip b frames if we dont have reference frames */ 181 /* skip b frames if we dont have reference frames */
175 if(s->num_available_buffers<2 && s->pict_type==B_TYPE) return 0; 182 if(s->num_available_buffers<2 && s->pict_type==B_TYPE) return 0;
176 /* skip b frames if we are in a hurry */ 183 /* skip b frames if we are in a hurry */
177 if(s->hurry_up && s->pict_type==B_TYPE) return 0; 184 if(s->hurry_up && s->pict_type==B_TYPE) return 0;
178 185
213 if(s->msmpeg4_version==1){ 220 if(s->msmpeg4_version==1){
214 s->last_dc[0]= 221 s->last_dc[0]=
215 s->last_dc[1]= 222 s->last_dc[1]=
216 s->last_dc[2]= 128; 223 s->last_dc[2]= 128;
217 } 224 }
225
226 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
227 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
218 228
219 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1; 229 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1;
220 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1); 230 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1);
221 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1; 231 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1;
222 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2); 232 s->block_index[3]= s->block_wrap[0]*(s->mb_y*2 + 2);
243 s->mb_x, s->mb_y, get_bits_count(&s->gb), s->next_resync_pos); 253 s->mb_x, s->mb_y, get_bits_count(&s->gb), s->next_resync_pos);
244 ff_conceal_past_errors(s, 1); 254 ff_conceal_past_errors(s, 1);
245 } 255 }
246 } 256 }
247 s->qscale= s->next_resync_qscale; 257 s->qscale= s->next_resync_qscale;
258 s->y_dc_scale= s->y_dc_scale_table[ s->qscale ];
259 s->c_dc_scale= s->c_dc_scale_table[ s->qscale ];
260
248 s->gb= s->next_resync_gb; 261 s->gb= s->next_resync_gb;
249 s->resync_mb_x= s->mb_x; //we know that the marker is here cuz mb_num_left was the distance to it 262 s->resync_mb_x= s->mb_x; //we know that the marker is here cuz mb_num_left was the distance to it
250 s->resync_mb_y= s->mb_y; 263 s->resync_mb_y= s->mb_y;
251 s->first_slice_line=1; 264 s->first_slice_line=1;
252 265
263 } 276 }
264 } 277 }
265 278
266 //fprintf(stderr,"\nFrame: %d\tMB: %d",avctx->frame_number, (s->mb_y * s->mb_width) + s->mb_x); 279 //fprintf(stderr,"\nFrame: %d\tMB: %d",avctx->frame_number, (s->mb_y * s->mb_width) + s->mb_x);
267 /* DCT & quantize */ 280 /* DCT & quantize */
268 if (s->h263_pred && !(s->msmpeg4_version==1 || s->msmpeg4_version==2)) {
269 /* old ffmpeg encoded msmpeg4v3 workaround */
270 if(s->workaround_bugs==1 && s->msmpeg4_version==3)
271 ff_old_msmpeg4_dc_scale(s);
272 else
273 h263_dc_scale(s);
274 } else {
275 /* default quantization values */
276 s->y_dc_scale = 8;
277 s->c_dc_scale = 8;
278 }
279
280 if(s->decoding_error!=DECODING_DESYNC){ 281 if(s->decoding_error!=DECODING_DESYNC){
281 int last_error= s->decoding_error; 282 int last_error= s->decoding_error;
282 clear_blocks(s->block[0]); 283 clear_blocks(s->block[0]);
283 284
284 s->mv_dir = MV_DIR_FORWARD; 285 s->mv_dir = MV_DIR_FORWARD;
519 h263_decode_end, 520 h263_decode_end,
520 h263_decode_frame, 521 h263_decode_frame,
521 CODEC_CAP_DRAW_HORIZ_BAND, 522 CODEC_CAP_DRAW_HORIZ_BAND,
522 }; 523 };
523 524
525 AVCodec wmv2_decoder = {
526 "wmv2",
527 CODEC_TYPE_VIDEO,
528 CODEC_ID_WMV2,
529 sizeof(MpegEncContext),
530 h263_decode_init,
531 NULL,
532 h263_decode_end,
533 h263_decode_frame,
534 CODEC_CAP_DRAW_HORIZ_BAND,
535 };
536
524 AVCodec h263i_decoder = { 537 AVCodec h263i_decoder = {
525 "h263i", 538 "h263i",
526 CODEC_TYPE_VIDEO, 539 CODEC_TYPE_VIDEO,
527 CODEC_ID_H263I, 540 CODEC_ID_H263I,
528 sizeof(MpegEncContext), 541 sizeof(MpegEncContext),