aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2002-03-28 22:50:22 +0000
committerMichael Niedermayer <michaelni@gmx.at>2002-03-28 22:50:22 +0000
commit4d69fbc99ef807e278165c9ad09b6a38c2a20de4 (patch)
tree5ee2433fd8a323297205de4c538ea871c7597de4
parent649c00c96d7044aed46d70623e47d7434318e6b9 (diff)
downloadffmpeg-4d69fbc99ef807e278165c9ad09b6a38c2a20de4.tar.gz
force frame type for 2-pass encoding
Originally committed as revision 365 to svn://svn.ffmpeg.org/ffmpeg/trunk
-rw-r--r--libavcodec/avcodec.h2
-rw-r--r--libavcodec/mpegvideo.c7
-rw-r--r--libavcodec/mpegvideo.h1
3 files changed, 7 insertions, 3 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index df6a7cfab7..6b60473466 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -120,6 +120,8 @@ typedef struct AVCodecContext {
int qmin; /* min qscale */
int qmax; /* max qscale */
int max_qdiff; /* max qscale difference between frames */
+
+ int force_type; /* 0= no force, otherwise I_TYPE, P_TYPE, ... */
struct AVCodec *codec;
void *priv_data;
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 1c8bcbdfa6..2a7aca21d2 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -514,9 +514,10 @@ int MPV_encode_picture(AVCodecContext *avctx,
init_put_bits(&s->pb, buf, buf_size, NULL, NULL);
+ s->force_type= avctx->force_type;
if (!s->intra_only) {
/* first picture of GOP is intra */
- if (s->picture_in_gop_number % s->gop_size==0){
+ if (s->picture_in_gop_number % s->gop_size==0 || s->force_type==I_TYPE){
s->picture_in_gop_number=0;
s->pict_type = I_TYPE;
}else
@@ -1313,7 +1314,7 @@ static void encode_picture(MpegEncContext *s, int picture_number)
memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
}
- if(s->avg_mb_var < s->mc_mb_var && s->pict_type != B_TYPE){ //FIXME subtract MV bits
+ if(s->avg_mb_var < s->mc_mb_var && s->pict_type != B_TYPE && (!s->force_type)){ //FIXME subtract MV bits
s->pict_type= I_TYPE;
s->picture_in_gop_number=0;
memset(s->mb_type , MB_TYPE_INTRA, sizeof(UINT8)*s->mb_width*s->mb_height);
@@ -1955,7 +1956,7 @@ static int rate_estimate_qscale(MpegEncContext *s)
double fps;
INT64 wanted_bits;
emms_c();
-
+
fps= (double)s->frame_rate / FRAME_RATE_BASE;
wanted_bits= s->bit_rate*(double)s->picture_number/fps;
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index 03e9eaf550..78c8aeb670 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -66,6 +66,7 @@ typedef struct MpegEncContext {
int max_qdiff; /* max qscale difference between frames */
int encoding; /* true if we are encoding (vs decoding) */
int flags; /* AVCodecContext.flags (HQ, MV4, ...) */
+ int force_type; /* 0= no force, otherwise I_TYPE, P_TYPE, ... */
/* the following fields are managed internally by the encoder */
/* bit output */