diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index dae92e903d4d8efda5000f7c9ece4a0a2c846ec0..6d2922444ffd2c9223d17d1bad015cf86c500ea5 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -17,7 +17,7 @@ extern "C" {
 
 #define FFMPEG_VERSION_INT     0x000408
 #define FFMPEG_VERSION         "0.4.8"
-#define LIBAVCODEC_BUILD       4716
+#define LIBAVCODEC_BUILD       4717
 
 #define LIBAVCODEC_VERSION_INT FFMPEG_VERSION_INT
 #define LIBAVCODEC_VERSION     FFMPEG_VERSION
@@ -1605,6 +1605,20 @@ typedef struct AVCodecContext {
      * - decoding: unused
      */
      int nsse_weight;
+
+    /**
+     * number of macroblock rows at the top which are skiped.
+     * - encoding: unused
+     * - decoding: set by user
+     */
+     int skip_top;
+
+    /**
+     * number of macroblock rows at the bottom which are skiped.
+     * - encoding: unused
+     * - decoding: set by user
+     */
+     int skip_bottom;
 } AVCodecContext;
 
 
diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
index b7aeebddfcbea2d4e782d78cbbd0d58a57cb86e7..c18d775bb6f7eb614e1dd88887ac625d052cae5c 100644
--- a/libavcodec/error_resilience.c
+++ b/libavcodec/error_resilience.c
@@ -652,7 +652,7 @@ void ff_er_add_slice(MpegEncContext *s, int startx, int starty, int endx, int en
  
     s->error_status_table[start_xy] |= VP_START;
 
-    if(start_xy > 0 && s->avctx->thread_count <= 1){
+    if(start_xy > 0 && s->avctx->thread_count <= 1 && s->avctx->skip_top*s->mb_width < start_i){
         int prev_status= s->error_status_table[ s->mb_index2xy[start_i - 1] ];
         
         prev_status &= ~ VP_START;
@@ -667,9 +667,10 @@ void ff_er_frame_end(MpegEncContext *s){
     int threshold= 50;
     int is_intra_likely;
     
-    if(!s->error_resilience || s->error_count==0) return;
+    if(!s->error_resilience || s->error_count==0 || 
+       s->error_count==3*s->mb_width*(s->avctx->skip_top + s->avctx->skip_bottom)) return;
 
-    av_log(s->avctx, AV_LOG_INFO, "concealing errors\n");
+    av_log(s->avctx, AV_LOG_INFO, "concealing %d errors\n", s->error_count);
     
     if(s->current_picture.motion_val[0] == NULL){
         int size = s->b8_stride * 2 * s->mb_height;
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index f235a199b04b9ef616c3a4eda1f8a7eeec2d3aef..ff96bff4afcdcd608168f67bd63682e5e451b6ef 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -2869,6 +2869,11 @@ static int mpeg_decode_frame(AVCodecContext *avctx,
                         if(avctx->hurry_up>=5) break;
                         
                         if (!s->mpeg_enc_ctx_allocated) break;
+
+                        if(s2->codec_id == CODEC_ID_MPEG2VIDEO){
+                            if(mb_y < avctx->skip_top || mb_y >= s2->mb_height - avctx->skip_bottom)
+                                break;
+                        }
                         
                         if(s2->first_slice){
                             s2->first_slice=0;