]> git.sesse.net Git - ffmpeg/blobdiff - libavcodec/h263dec.c
alignment 10l
[ffmpeg] / libavcodec / h263dec.c
index 332eb3b3b7bccc6b4ac18b832372675c3c742966..807d31118f7cb660174e16210920471dfc87c4d5 100644 (file)
@@ -165,7 +165,7 @@ static int decode_slice(MpegEncContext *s){
                 return -1; 
         }
         
-        /* restore variables which where modified */
+        /* restore variables which were modified */
         s->first_slice_line=1;
         s->mb_x= s->resync_mb_x;
         s->mb_y= s->resync_mb_y;
@@ -301,9 +301,9 @@ static int decode_slice(MpegEncContext *s){
         return 0;
     }
 
-    fprintf(stderr, "slice end not reached but screenspace end (%d left %06X)\n", 
+    fprintf(stderr, "slice end not reached but screenspace end (%d left %06X, score= %d)\n", 
             s->gb.size_in_bits - get_bits_count(&s->gb),
-            show_bits(&s->gb, 24));
+            show_bits(&s->gb, 24), s->padding_bug_score);
             
     ff_er_add_slice(s, s->resync_mb_x, s->resync_mb_y, s->mb_x, s->mb_y, (AC_END|DC_END|MV_END)&part_mask);
 
@@ -390,7 +390,7 @@ int ff_h263_decode_frame(AVCodecContext *avctx,
                              uint8_t *buf, int buf_size)
 {
     MpegEncContext *s = avctx->priv_data;
-    int ret,i;
+    int ret;
     AVFrame *pict = data; 
     float new_aspect;
     
@@ -470,29 +470,47 @@ retry:
     } else {
         ret = h263_decode_picture_header(s);
     }
+    
+    if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_size);
+
+    /* skip if the header was thrashed */
+    if (ret < 0){
+        fprintf(stderr, "header damaged\n");
+        return -1;
+    }
+    
     avctx->has_b_frames= !s->low_delay;
+    
+    if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
+        if(s->avctx->stream_codec_tag == ff_get_fourcc("XVID") || 
+           s->avctx->codec_tag == ff_get_fourcc("XVID") || s->avctx->codec_tag == ff_get_fourcc("XVIX"))
+            s->xvid_build= -1;
+#if 0
+        if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->vo_type==0 && s->vol_control_parameters==1
+           && s->padding_bug_score > 0 && s->low_delay) // XVID with modified fourcc 
+            s->xvid_build= -1;
+#endif
+    }
+
+    if(s->xvid_build==0 && s->divx_version==0 && s->lavc_build==0){
+        if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->vo_type==0 && s->vol_control_parameters==0)
+            s->divx_version= 400; //divx 4
+    }
 
     if(s->workaround_bugs&FF_BUG_AUTODETECT){
-        if(s->padding_bug_score > -2 && !s->data_partitioning && !s->resync_marker)
+        s->workaround_bugs &= ~FF_BUG_NO_PADDING;
+        
+        if(s->padding_bug_score > -2 && !s->data_partitioning && (s->divx_version || !s->resync_marker))
             s->workaround_bugs |=  FF_BUG_NO_PADDING;
-        else
-            s->workaround_bugs &= ~FF_BUG_NO_PADDING;
 
         if(s->avctx->codec_tag == ff_get_fourcc("XVIX")) 
             s->workaround_bugs|= FF_BUG_XVID_ILACE;
-#if 0
-        if(s->avctx->codec_tag == ff_get_fourcc("MP4S")) 
-            s->workaround_bugs|= FF_BUG_AC_VLC;
-        
-        if(s->avctx->codec_tag == ff_get_fourcc("M4S2")) 
-            s->workaround_bugs|= FF_BUG_AC_VLC;
-#endif
+
         if(s->avctx->codec_tag == ff_get_fourcc("UMP4")){
             s->workaround_bugs|= FF_BUG_UMP4;
-            s->workaround_bugs|= FF_BUG_AC_VLC;
         }
 
-        if(s->divx_version){
+        if(s->divx_version>=500){
             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
         }
 
@@ -500,18 +518,15 @@ retry:
             s->workaround_bugs|= FF_BUG_QPEL_CHROMA2;
         }
 
-        if(s->avctx->codec_tag == ff_get_fourcc("XVID") && s->xvid_build==0)
-            s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
-        
-        if(s->avctx->codec_tag == ff_get_fourcc("XVID") && s->xvid_build==0)
-            s->padding_bug_score= 256*256*256*64;
-        
         if(s->xvid_build && s->xvid_build<=3)
             s->padding_bug_score= 256*256*256*64;
         
         if(s->xvid_build && s->xvid_build<=1)
             s->workaround_bugs|= FF_BUG_QPEL_CHROMA;
 
+        if(s->xvid_build && s->xvid_build<=12)
+            s->workaround_bugs|= FF_BUG_EDGE;
+
 #define SET_QPEL_FUNC(postfix1, postfix2) \
     s->dsp.put_ ## postfix1 = ff_put_ ## postfix2;\
     s->dsp.put_no_rnd_ ## postfix1 = ff_put_no_rnd_ ## postfix2;\
@@ -523,7 +538,7 @@ retry:
         if(s->lavc_build && s->lavc_build<4655)
             s->workaround_bugs|= FF_BUG_DIRECT_BLOCKSIZE;
 
-        if(s->lavc_build && s->lavc_build<4618){
+        if(s->lavc_build && s->lavc_build<4670){
             s->workaround_bugs|= FF_BUG_EDGE;
         }
 
@@ -537,9 +552,6 @@ retry:
             s->workaround_bugs|= FF_BUG_EDGE;
         }
         
-        if(s->avctx->codec_tag == ff_get_fourcc("DIVX") && s->divx_version==0 && s->lavc_build==0 && s->xvid_build==0 && s->vo_type==0 && s->vol_control_parameters==0 && s->low_delay)
-            s->workaround_bugs|= FF_BUG_EDGE;
-
 #if 0
         if(s->divx_version==500)
             s->padding_bug_score= 256*256*256*64;
@@ -572,6 +584,11 @@ retry:
         SET_QPEL_FUNC(qpel_pixels_tab[1][15], qpel8_mc33_old_c)
     }
 
+    if(avctx->debug & FF_DEBUG_BUGS)
+        printf("bugs: %X lavc_build:%d xvid_build:%d divx_version:%d divx_build:%d %s\n", 
+               s->workaround_bugs, s->lavc_build, s->xvid_build, s->divx_version, s->divx_build,
+               s->divx_packed ? "p" : "");
+    
 #if 0 // dump bits per frame / qp / complexity
 {
     static FILE *f=NULL;
@@ -604,13 +621,6 @@ retry:
 
     if((s->codec_id==CODEC_ID_H263 || s->codec_id==CODEC_ID_H263P))
         s->gob_index = ff_h263_get_gob_height(s);
-
-    if(ret==FRAME_SKIPED) return get_consumed_bytes(s, buf_size);
-    /* skip if the header was thrashed */
-    if (ret < 0){
-        fprintf(stderr, "header damaged\n");
-        return -1;
-    }
     
     // for hurry_up==5
     s->current_picture.pict_type= s->pict_type;