comparison h263dec.c @ 454:eda22d628b2d libavcodec

error concealment / error resilience merging s->first_gob_line & s->first_slice_line
author michaelni
date Sun, 02 Jun 2002 12:16:28 +0000
parents 718a22dc121f
children 76c8afc9c1eb
comparison
equal deleted inserted replaced
453:69876443a723 454:eda22d628b2d
47 47
48 /* select sub codec */ 48 /* select sub codec */
49 switch(avctx->codec->id) { 49 switch(avctx->codec->id) {
50 case CODEC_ID_H263: 50 case CODEC_ID_H263:
51 s->gob_number = 0; 51 s->gob_number = 0;
52 s->first_gob_line = 0; 52 s->first_slice_line = 0;
53 break; 53 break;
54 case CODEC_ID_MPEG4: 54 case CODEC_ID_MPEG4:
55 s->time_increment_bits = 4; /* default value for broken headers */ 55 s->time_increment_bits = 4; /* default value for broken headers */
56 s->h263_pred = 1; 56 s->h263_pred = 1;
57 s->has_b_frames = 1; //default, might be overriden in the vol header during header parsing 57 s->has_b_frames = 1; //default, might be overriden in the vol header during header parsing
120 printf("*****frame %d size=%d\n", avctx->frame_number, buf_size); 120 printf("*****frame %d size=%d\n", avctx->frame_number, buf_size);
121 printf("bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]); 121 printf("bytes=%x %x %x %x\n", buf[0], buf[1], buf[2], buf[3]);
122 #endif 122 #endif
123 123
124 s->hurry_up= avctx->hurry_up; 124 s->hurry_up= avctx->hurry_up;
125 125 s->error_resilience= avctx->error_resilience;
126 s->workaround_bugs= avctx->workaround_bugs;
127
126 /* no supplementary picture */ 128 /* no supplementary picture */
127 if (buf_size == 0) { 129 if (buf_size == 0) {
128 *data_size = 0; 130 *data_size = 0;
129 return 0; 131 return 0;
130 } 132 }
163 if (MPV_common_init(s) < 0) 165 if (MPV_common_init(s) < 0)
164 return -1; 166 return -1;
165 } 167 }
166 168
167 if(ret==FRAME_SKIPED) return 0; 169 if(ret==FRAME_SKIPED) return 0;
170 /* skip if the header was thrashed */
168 if (ret < 0) 171 if (ret < 0)
169 return -1; 172 return -1;
170 /* skip b frames if we dont have reference frames */ 173 /* skip b frames if we dont have reference frames */
171 if(s->num_available_buffers<2 && s->pict_type==B_TYPE) return 0; 174 if(s->num_available_buffers<2 && s->pict_type==B_TYPE) return 0;
172 /* skip b frames if we are in a hurry */ 175 /* skip b frames if we are in a hurry */
173 if(s->hurry_up && s->pict_type==B_TYPE) return 0; 176 if(s->hurry_up && s->pict_type==B_TYPE) return 0;
174 177
178 if(s->next_p_frame_damaged){
179 if(s->pict_type==B_TYPE)
180 return 0;
181 else
182 s->next_p_frame_damaged=0;
183 }
184
175 MPV_frame_start(s); 185 MPV_frame_start(s);
176 186
177 #ifdef DEBUG 187 #ifdef DEBUG
178 printf("qscale=%d\n", s->qscale); 188 printf("qscale=%d\n", s->qscale);
179 #endif 189 #endif
190
191 /* init resync/ error resilience specific variables */
192 s->next_resync_qscale= s->qscale;
193 s->next_resync_gb= s->gb;
194 if(s->resync_marker) s->mb_num_left= 0;
195 else s->mb_num_left= s->mb_num;
180 196
181 /* decode each macroblock */ 197 /* decode each macroblock */
182 s->block_wrap[0]= 198 s->block_wrap[0]=
183 s->block_wrap[1]= 199 s->block_wrap[1]=
184 s->block_wrap[2]= 200 s->block_wrap[2]=
188 for(s->mb_y=0; s->mb_y < s->mb_height; s->mb_y++) { 204 for(s->mb_y=0; s->mb_y < s->mb_height; s->mb_y++) {
189 /* Check for GOB headers on H.263 */ 205 /* Check for GOB headers on H.263 */
190 /* FIXME: In the future H.263+ will have intra prediction */ 206 /* FIXME: In the future H.263+ will have intra prediction */
191 /* and we are gonna need another way to detect MPEG4 */ 207 /* and we are gonna need another way to detect MPEG4 */
192 if (s->mb_y && !s->h263_pred) { 208 if (s->mb_y && !s->h263_pred) {
193 s->first_gob_line = h263_decode_gob_header(s); 209 s->first_slice_line = h263_decode_gob_header(s);
210 }
211
212 if(s->msmpeg4_version==1){
213 s->last_dc[0]=
214 s->last_dc[1]=
215 s->last_dc[2]= 128;
194 } 216 }
195 217
196 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1; 218 s->block_index[0]= s->block_wrap[0]*(s->mb_y*2 + 1) - 1;
197 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1); 219 s->block_index[1]= s->block_wrap[0]*(s->mb_y*2 + 1);
198 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1; 220 s->block_index[2]= s->block_wrap[0]*(s->mb_y*2 + 2) - 1;
207 s->block_index[4]++; 229 s->block_index[4]++;
208 s->block_index[5]++; 230 s->block_index[5]++;
209 #ifdef DEBUG 231 #ifdef DEBUG
210 printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y); 232 printf("**mb x=%d y=%d\n", s->mb_x, s->mb_y);
211 #endif 233 #endif
234
235 if(s->resync_marker){
236 if(s->mb_num_left<=0){
237 /* except the first block */
238 if(s->mb_x!=0 || s->mb_y!=0){
239 /* did we miss the next resync marker without noticing an error yet */
240 if(((get_bits_count(&s->gb)+8)&(~7)) != s->next_resync_pos && s->decoding_error==0){
241 fprintf(stderr, "slice end missmatch x:%d y:%d %d %d\n",
242 s->mb_x, s->mb_y, get_bits_count(&s->gb), s->next_resync_pos);
243 ff_conceal_past_errors(s, 1);
244 }
245 }
246 s->qscale= s->next_resync_qscale;
247 s->gb= s->next_resync_gb;
248 s->resync_mb_x= s->mb_x; //we know that the marker is here cuz mb_num_left was the distance to it
249 s->resync_mb_y= s->mb_y;
250 s->first_slice_line=1;
251
252 if(s->codec_id==CODEC_ID_MPEG4){
253 ff_mpeg4_clean_buffers(s);
254 ff_mpeg4_resync(s);
255 }
256 }
257
258 if( s->resync_mb_x==s->mb_x
259 && s->resync_mb_y==s->mb_y && s->decoding_error!=0){
260 fprintf(stderr, "resynced at %d %d\n", s->mb_x, s->mb_y);
261 s->decoding_error= 0;
262 }
263 }
264
212 //fprintf(stderr,"\nFrame: %d\tMB: %d",avctx->frame_number, (s->mb_y * s->mb_width) + s->mb_x); 265 //fprintf(stderr,"\nFrame: %d\tMB: %d",avctx->frame_number, (s->mb_y * s->mb_width) + s->mb_x);
213 /* DCT & quantize */ 266 /* DCT & quantize */
214 if (s->h263_pred && s->msmpeg4_version!=2) { 267 if (s->h263_pred && !(s->msmpeg4_version==1 || s->msmpeg4_version==2)) {
215 /* old ffmpeg encoded msmpeg4v3 workaround */ 268 /* old ffmpeg encoded msmpeg4v3 workaround */
216 if(s->workaround_bugs==1 && s->msmpeg4_version==3) 269 if(s->workaround_bugs==1 && s->msmpeg4_version==3)
217 ff_old_msmpeg4_dc_scale(s); 270 ff_old_msmpeg4_dc_scale(s);
218 else 271 else
219 h263_dc_scale(s); 272 h263_dc_scale(s);
220 } else { 273 } else {
221 /* default quantization values */ 274 /* default quantization values */
222 s->y_dc_scale = 8; 275 s->y_dc_scale = 8;
223 s->c_dc_scale = 8; 276 s->c_dc_scale = 8;
224 } 277 }
225 clear_blocks(s->block[0]); 278
279 if(s->decoding_error!=DECODING_DESYNC){
280 int last_error= s->decoding_error;
281 clear_blocks(s->block[0]);
226 282
227 s->mv_dir = MV_DIR_FORWARD; 283 s->mv_dir = MV_DIR_FORWARD;
228 s->mv_type = MV_TYPE_16X16; 284 s->mv_type = MV_TYPE_16X16;
229 if (s->h263_msmpeg4) { 285 if (s->h263_msmpeg4) {
230 if (msmpeg4_decode_mb(s, s->block) < 0) { 286 if (msmpeg4_decode_mb(s, s->block) < 0) {
231 fprintf(stderr,"\nError at MB: %d\n", (s->mb_y * s->mb_width) + s->mb_x); 287 fprintf(stderr,"Error at MB: %d\n", (s->mb_y * s->mb_width) + s->mb_x);
232 return -1; 288 s->decoding_error=DECODING_DESYNC;
233 } 289 }
234 } else { 290 } else {
235 if (h263_decode_mb(s, s->block) < 0) { 291 if (h263_decode_mb(s, s->block) < 0) {
236 fprintf(stderr,"\nError at MB: %d\n", (s->mb_y * s->mb_width) + s->mb_x); 292 fprintf(stderr,"Error at MB: %d\n", (s->mb_y * s->mb_width) + s->mb_x);
237 return -1; 293 s->decoding_error=DECODING_DESYNC;
294 }
238 } 295 }
239 } 296
297 if(s->decoding_error!=last_error){
298 ff_conceal_past_errors(s, 0);
299 }
300 }
301
302 /* conceal errors */
303 if( s->decoding_error==DECODING_DESYNC
304 || (s->decoding_error==DECODING_ACDC_LOST && s->mb_intra)){
305 s->mv_dir = MV_DIR_FORWARD;
306 s->mv_type = MV_TYPE_16X16;
307 s->mb_skiped=0;
308 s->mb_intra=0;
309 s->mv[0][0][0]=0; //FIXME this is not optimal
310 s->mv[0][0][1]=0;
311 clear_blocks(s->block[0]);
312 }else if(s->decoding_error && !s->mb_intra){
313 clear_blocks(s->block[0]);
314 }
315 //FIXME remove AC for intra
316
240 MPV_decode_mb(s, s->block); 317 MPV_decode_mb(s, s->block);
318
319 s->mb_num_left--;
241 } 320 }
242 if ( avctx->draw_horiz_band 321 if ( avctx->draw_horiz_band
243 && (s->num_available_buffers>=1 || (!s->has_b_frames)) ) { 322 && (s->num_available_buffers>=1 || (!s->has_b_frames)) ) {
244 UINT8 *src_ptr[3]; 323 UINT8 *src_ptr[3];
245 int y, h, offset; 324 int y, h, offset;
265 if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE) 344 if (s->h263_msmpeg4 && s->msmpeg4_version<4 && s->pict_type==I_TYPE)
266 if(msmpeg4_decode_ext_header(s, buf_size) < 0) return -1; 345 if(msmpeg4_decode_ext_header(s, buf_size) < 0) return -1;
267 346
268 /* divx 5.01+ bistream reorder stuff */ 347 /* divx 5.01+ bistream reorder stuff */
269 if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0){ 348 if(s->codec_id==CODEC_ID_MPEG4 && s->bitstream_buffer_size==0){
270 int current_pos= get_bits_count(&s->gb)/8; 349 int current_pos= get_bits_count(&s->gb)>>3;
350
271 if( buf_size - current_pos > 5 351 if( buf_size - current_pos > 5
272 && buf_size - current_pos < BITSTREAM_BUFFER_SIZE){ 352 && buf_size - current_pos < BITSTREAM_BUFFER_SIZE){
273 memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos); 353 int i;
274 s->bitstream_buffer_size= buf_size - current_pos; 354 int startcode_found=0;
355 for(i=current_pos; i<buf_size; i++){
356 if(buf[i]==0 && buf[i+1]==0 && buf[i+2]==1 && buf[i+3]==0xB6){
357 startcode_found=1;
358 break;
359 }
360 }
361 if(startcode_found){
362 memcpy(s->bitstream_buffer, buf + current_pos, buf_size - current_pos);
363 s->bitstream_buffer_size= buf_size - current_pos;
364 }
365 }
366 }
367
368 if(s->bitstream_buffer_size==0 && s->error_resilience>0){
369 int left= s->gb.size*8 - get_bits_count(&s->gb);
370 int max_extra=8;
371
372 if(s->codec_id==CODEC_ID_MPEG4) max_extra+=32;
373
374 if(left>max_extra){
375 fprintf(stderr, "discarding %d junk bits at end, next would be %X\n", left, show_bits(&s->gb, 24));
376 if(s->decoding_error==0)
377 ff_conceal_past_errors(s, 1);
378 }
379 if(left<0){
380 fprintf(stderr, "overreading %d bits\n", -left);
381 if(s->decoding_error==0)
382 ff_conceal_past_errors(s, 1);
275 } 383 }
276 } 384 }
277 385
278 MPV_frame_end(s); 386 MPV_frame_end(s);
279 #if 0 //dirty show MVs, we should export the MV tables and write a filter to show them 387 #if 0 //dirty show MVs, we should export the MV tables and write a filter to show them