Package-Name: ffmpeg
Gentoo-Package: media-video/ffmpeg
Conflicts: ffmpeg-cvs
Rebuild-For: lame x264-svn
Homepage: http://ffmpeg.sourceforge.net/
Source: sourceforge:///ffmpeg/ffmpeg-(\d+(.\d+)+)(-(pre\d+))?.tar.gz $1$4
Zap-Before-Install: 1
Repack:
	tar xzvfp "$(SOURCE)"
	test -d ffmpeg-"$(VERSION)" || mv ffmpeg* ffmpeg-"$(VERSION)"
Compile:
	cp -pf COPYING CREDITS Change* README "$(PREFIX)/"
# FIXME: --enable-mp3lame causes dependency on libmp3lame when linking libavcodec to other things
#	if packager c lame ; then LAME=--enable-mp3lame ; else LAME= ; fi ; \
	if packager c x264-svn ; then X264="--enable-gpl --enable-x264" ; else X264= ; fi ; \
	./configure --prefix="$(PREFIX)" --cc=gcc --extra-cflags="-O3 $(GCC_OPT_FLAGS)" $$LAME $$X264
	$(MAKE)
	$(MAKE) install installlib
	$(MAKE) -C libavcodec/libpostproc
	$(MAKE) -C libavcodec/libpostproc install
	cp -pf libavcodec/libpostproc/libpostproc.a "$(PREFIX)"/lib/
Install:
	$(MAKE) instbin BIN="ffmpeg ffplay ffserver"
	$(MAKE) instinc INC="ffmpeg postproc"
	$(MAKE) instlib LIB="avcodec avformat avutil postproc"
Patch: <<EOT
######## begin rate control patch
Index: libavcodec/ratecontrol.c
===================================================================
RCS file: /cvsroot/ffmpeg/ffmpeg/libavcodec/ratecontrol.c,v
retrieving revision 1.43
diff -u -r1.43 ratecontrol.c
--- libavcodec/ratecontrol.c	14 Feb 2004 13:37:58 -0000	1.43
+++ libavcodec/ratecontrol.c	1 Nov 2004 07:19:29 -0000
@@ -33,7 +33,7 @@
 #ifndef M_E
 #define M_E 2.718281828
 #endif
-
+#define MEANX
 static int init_pass2(MpegEncContext *s);
 static double get_qscale(MpegEncContext *s, RateControlEntry *rce, double rate_factor, int frame_num);
 
@@ -391,30 +391,17 @@
     *qmin_ret= qmin;
     *qmax_ret= qmax;
 }
-
-static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num){
-    RateControlContext *rcc= &s->rc_context;
-    int qmin, qmax;
-    double bits;
-    const int pict_type= rce->new_pict_type;
-    const double buffer_size= s->avctx->rc_buffer_size;
-    const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
-    const double min_rate= s->avctx->rc_min_rate / fps;
-    const double max_rate= s->avctx->rc_max_rate / fps;
-    
-    get_qminmax(&qmin, &qmax, s, pict_type);
-
-    /* modulation */
-    if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==P_TYPE)
-        q*= s->avctx->rc_qmod_amp;
-
-    bits= qp2bits(rce, q);
-//printf("q:%f\n", q);
-    /* buffer overflow/underflow protection */
-    if(buffer_size){
-        double expected_size= rcc->buffer_index;
-        double q_limit;
-
+static double bitrate_constraint(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num)
+{
+  const double buffer_size= s->avctx->rc_buffer_size;
+  const double fps= (double)s->avctx->frame_rate / (double)s->avctx->frame_rate_base;
+  const double min_rate= s->avctx->rc_min_rate / fps;
+  const double max_rate= s->avctx->rc_max_rate / fps;    
+  
+  double q_limit;
+  RateControlContext *rcc= &s->rc_context;
+  double expected_size= rcc->buffer_index;
+  
         if(min_rate){
             double d= 2*(buffer_size - expected_size)/buffer_size;
             if(d>1.0) d=1.0;
@@ -444,6 +431,33 @@
                 q= q_limit;
             }
         }
+	return q;
+
+}
+static double modify_qscale(MpegEncContext *s, RateControlEntry *rce, double q, int frame_num)
+{
+    RateControlContext *rcc= &s->rc_context;
+    int qmin, qmax;
+    double bits;
+    const int pict_type= rce->new_pict_type;
+  
+    get_qminmax(&qmin, &qmax, s, pict_type);
+
+    /* modulation */
+    if(s->avctx->rc_qmod_freq && frame_num%s->avctx->rc_qmod_freq==0 && pict_type==P_TYPE)
+        q*= s->avctx->rc_qmod_amp;
+
+    bits= qp2bits(rce, q);
+//printf("q:%f\n", q);
+    /* buffer overflow/underflow protection */
+    if(s->avctx->rc_buffer_size 
+#ifdef MEANX    
+    	&& !(s->flags&CODEC_FLAG_PASS1)
+#endif	
+	)
+     // MEANX : Dont do min/max in pass 1
+    {
+      q=bitrate_constraint(s, rce, q, frame_num);
     }
 //printf("q:%f max:%f min:%f size:%f index:%d bits:%f agr:%f\n", q,max_rate, min_rate, buffer_size, rcc->buffer_index, bits, s->avctx->rc_buffer_aggressivity);
     if(s->avctx->rc_qsquish==0.0 || qmin==qmax){
@@ -630,11 +644,19 @@
     var= pict_type == I_TYPE ? pic->mb_var_sum : pic->mc_mb_var_sum;
     
     short_term_q = 0; /* avoid warning */
-    if(s->flags&CODEC_FLAG_PASS2){
+    if(s->flags&CODEC_FLAG_PASS2)
+    {
         if(pict_type!=I_TYPE)
             assert(pict_type == rce->new_pict_type);
 
         q= rce->new_qscale / br_compensation;
+	//MEANX, take also constraint in pass 2
+#ifdef MEANX	
+	if(s->avctx->rc_buffer_size)
+	{
+	  q=bitrate_constraint(s, rce, q, picture_number);
+	}
+#endif	
 //printf("%f %f %f last:%d var:%d type:%d//\n", q, rce->new_qscale, br_compensation, s->frame_bits, var, pict_type);
     }else{
         rce->pict_type= 
######## end rate control patch
EOT

/pkg/ffmpeg/
/usr/bin/ffmpeg
/usr/bin/ffplay
/usr/bin/ffserver
/usr/include/ffmpeg
/usr/include/postproc
/usr/lib/libavcodec.*
/usr/lib/libavformat.*
/usr/lib/libavutil.*
/usr/lib/libpostproc.*
