diff mpegvideo.c @ 1684:19e781619e3f libavcodec

stuffing to stay above min_bitrate
author michael
date Fri, 12 Dec 2003 21:30:47 +0000
parents 7b810155650f
children cb09cf265a87
line wrap: on
line diff
--- a/mpegvideo.c	Fri Dec 12 19:26:55 2003 +0000
+++ b/mpegvideo.c	Fri Dec 12 21:30:47 2003 +0000
@@ -1715,7 +1715,7 @@
 {
     MpegEncContext *s = avctx->priv_data;
     AVFrame *pic_arg = data;
-    int i;
+    int i, stuffing_count;
 
     if(avctx->pix_fmt != PIX_FMT_YUV420P){
         av_log(avctx, AV_LOG_ERROR, "this codec supports only YUV420P\n");
@@ -1767,11 +1767,35 @@
 
     flush_put_bits(&s->pb);
     s->frame_bits  = (pbBufPtr(&s->pb) - s->pb.buf) * 8;
+
+    stuffing_count= ff_vbv_update(s, s->frame_bits);
+    if(stuffing_count){
+        switch(s->codec_id){
+        case CODEC_ID_MPEG1VIDEO:
+        case CODEC_ID_MPEG2VIDEO:
+            while(stuffing_count--){
+                put_bits(&s->pb, 8, 0);
+            }
+        break;
+        case CODEC_ID_MPEG4:
+            put_bits(&s->pb, 16, 0);
+            put_bits(&s->pb, 16, 0x1C3);
+            stuffing_count -= 4;
+            while(stuffing_count--){
+                put_bits(&s->pb, 8, 0xFF);
+            }
+        break;
+        default:
+            av_log(s->avctx, AV_LOG_ERROR, "vbv buffer overflow\n");
+        }
+        flush_put_bits(&s->pb);
+        s->frame_bits  = (pbBufPtr(&s->pb) - s->pb.buf) * 8;
+    }
     
     s->total_bits += s->frame_bits;
     avctx->frame_bits  = s->frame_bits;
     
-    return pbBufPtr(&s->pb) - s->pb.buf;
+    return s->frame_bits/8;
 }
 
 #endif //CONFIG_ENCODERS