diff --git a/doc/codecs.texi b/doc/codecs.texi
index 1606f6c5c94d14c9a0b33aa1ac7c50b455a197dc..c2cd555284c204e47bfe9f0487626fcd214ac49c 100644
--- a/doc/codecs.texi
+++ b/doc/codecs.texi
@@ -877,6 +877,9 @@ Set frame skip factor.
 
 @item skip_exp @var{integer} (@emph{encoding,video})
 Set frame skip exponent.
+Negative values behave identical to the corresponding positive ones, except
+that the score is normalized.
+Positive values exist primarly for compatibility reasons and are not so useful.
 
 @item skipcmp @var{integer} (@emph{encoding,video})
 Set frame skip compare function.
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index 6bf3e384c6d7242ed49cc916f05048fc660c95a2..5828a27c505dc052a3248ae576447303813a623e 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -1145,7 +1145,7 @@ static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
                 uint8_t *rptr = ref->f.data[plane] + 8 * (x + y * stride);
                 int v   = s->dsp.frame_skip_cmp[1](s, dptr, rptr, stride, 8);
 
-                switch (s->avctx->frame_skip_exp) {
+                switch (FFABS(s->avctx->frame_skip_exp)) {
                 case 0: score    =  FFMAX(score, v);          break;
                 case 1: score   += FFABS(v);                  break;
                 case 2: score64 += v * (int64_t)v;                       break;
@@ -1155,9 +1155,13 @@ static int skip_check(MpegEncContext *s, Picture *p, Picture *ref)
             }
         }
     }
+    emms_c();
 
     if (score)
         score64 = score;
+    if (s->avctx->frame_skip_exp < 0)
+        score64 = pow(score64 / (double)(s->mb_width * s->mb_height),
+                      -1.0/s->avctx->frame_skip_exp);
 
     if (score64 < s->avctx->frame_skip_threshold)
         return 1;
@@ -1307,7 +1311,6 @@ static int select_input_picture(MpegEncContext *s)
                 // FIXME check that te gop check above is +-1 correct
                 av_frame_unref(&s->input_picture[0]->f);
 
-                emms_c();
                 ff_vbv_update(s, 0);
 
                 goto no_output_pic;