2 * Xvid rate control wrapper for lavc video encoders
4 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
6 * This file is part of FFmpeg.
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
35 #include "libavutil/attributes.h"
36 #include "libavutil/file.h"
40 #include "mpegvideo.h"
42 av_cold
int ff_xvid_rate_control_init(MpegEncContext
*s
)
46 xvid_plg_create_t xvid_plg_create
= { 0 };
47 xvid_plugin_2pass2_t xvid_2pass2
= { 0 };
49 fd
= av_tempfile("xvidrc.", &tmp_name
, 0, s
->avctx
);
51 av_log(NULL
, AV_LOG_ERROR
, "Can't create temporary pass2 file.\n");
55 for (i
= 0; i
< s
->rc_context
.num_entries
; i
++) {
56 static const char frame_types
[] = " ipbs";
58 RateControlEntry
*rce
;
60 rce
= &s
->rc_context
.entry
[i
];
62 snprintf(tmp
, sizeof(tmp
), "%c %d %d %d %d %d %d\n",
63 frame_types
[rce
->pict_type
],
64 (int) lrintf(rce
->qscale
/ FF_QP2LAMBDA
),
65 rce
->i_count
, s
->mb_num
- rce
->i_count
- rce
->skip_count
,
67 (rce
->i_tex_bits
+ rce
->p_tex_bits
+ rce
->misc_bits
+ 7) / 8,
68 (rce
->header_bits
+ rce
->mv_bits
+ 7) / 8);
70 if (write(fd
, tmp
, strlen(tmp
)) < 0) {
71 int ret
= AVERROR(errno
);
72 av_log(NULL
, AV_LOG_ERROR
, "Error %s writing 2pass logfile\n", strerror(errno
));
81 xvid_2pass2
.version
= XVID_MAKE_VERSION(1, 1, 0);
82 xvid_2pass2
.filename
= tmp_name
;
83 xvid_2pass2
.bitrate
= s
->avctx
->bit_rate
;
84 xvid_2pass2
.vbv_size
= s
->avctx
->rc_buffer_size
;
85 xvid_2pass2
.vbv_maxrate
= s
->avctx
->rc_max_rate
;
86 xvid_2pass2
.vbv_initial
= s
->avctx
->rc_initial_buffer_occupancy
;
88 xvid_plg_create
.version
= XVID_MAKE_VERSION(1, 1, 0);
89 xvid_plg_create
.fbase
= s
->avctx
->time_base
.den
;
90 xvid_plg_create
.fincr
= s
->avctx
->time_base
.num
;
91 xvid_plg_create
.param
= &xvid_2pass2
;
93 if (xvid_plugin_2pass2(NULL
, XVID_PLG_CREATE
, &xvid_plg_create
,
94 &s
->rc_context
.non_lavc_opaque
) < 0) {
95 av_log(NULL
, AV_LOG_ERROR
, "xvid_plugin_2pass2 failed\n");
101 float ff_xvid_rate_estimate_qscale(MpegEncContext
*s
, int dry_run
)
103 xvid_plg_data_t xvid_plg_data
= { 0 };
105 xvid_plg_data
.version
= XVID_MAKE_VERSION(1, 1, 0);
106 xvid_plg_data
.width
= s
->width
;
107 xvid_plg_data
.height
= s
->height
;
108 xvid_plg_data
.mb_width
= s
->mb_width
;
109 xvid_plg_data
.mb_height
= s
->mb_height
;
110 xvid_plg_data
.fbase
= s
->avctx
->time_base
.den
;
111 xvid_plg_data
.fincr
= s
->avctx
->time_base
.num
;
112 xvid_plg_data
.min_quant
[0] = s
->avctx
->qmin
;
113 xvid_plg_data
.min_quant
[1] = s
->avctx
->qmin
;
114 xvid_plg_data
.min_quant
[2] = s
->avctx
->qmin
; // FIXME i/b factor & offset
115 xvid_plg_data
.max_quant
[0] = s
->avctx
->qmax
;
116 xvid_plg_data
.max_quant
[1] = s
->avctx
->qmax
;
117 xvid_plg_data
.max_quant
[2] = s
->avctx
->qmax
; // FIXME i/b factor & offset
118 xvid_plg_data
.bquant_offset
= 0; // 100 * s->avctx->b_quant_offset;
119 xvid_plg_data
.bquant_ratio
= 100; // * s->avctx->b_quant_factor;
121 if (!s
->rc_context
.dry_run_qscale
) {
122 if (s
->picture_number
) {
123 xvid_plg_data
.length
=
124 xvid_plg_data
.stats
.length
= (s
->frame_bits
+ 7) / 8;
125 xvid_plg_data
.frame_num
= s
->rc_context
.last_picture_number
;
126 xvid_plg_data
.quant
= s
->qscale
;
127 xvid_plg_data
.type
= s
->last_pict_type
;
128 if (xvid_plugin_2pass2(s
->rc_context
.non_lavc_opaque
,
129 XVID_PLG_AFTER
, &xvid_plg_data
, NULL
)) {
130 av_log(s
->avctx
, AV_LOG_ERROR
,
131 "xvid_plugin_2pass2(handle, XVID_PLG_AFTER, ...) FAILED\n");
135 s
->rc_context
.last_picture_number
=
136 xvid_plg_data
.frame_num
= s
->picture_number
;
137 xvid_plg_data
.quant
= 0;
138 if (xvid_plugin_2pass2(s
->rc_context
.non_lavc_opaque
,
139 XVID_PLG_BEFORE
, &xvid_plg_data
, NULL
)) {
140 av_log(s
->avctx
, AV_LOG_ERROR
,
141 "xvid_plugin_2pass2(handle, XVID_PLG_BEFORE, ...) FAILED\n");
144 s
->rc_context
.dry_run_qscale
= xvid_plg_data
.quant
;
146 xvid_plg_data
.quant
= s
->rc_context
.dry_run_qscale
;
148 s
->rc_context
.dry_run_qscale
= 0;
150 // FIXME this is not exactly identical to Xvid
151 if (s
->pict_type
== AV_PICTURE_TYPE_B
)
152 return xvid_plg_data
.quant
* FF_QP2LAMBDA
* s
->avctx
->b_quant_factor
+
153 s
->avctx
->b_quant_offset
;
155 return xvid_plg_data
.quant
* FF_QP2LAMBDA
;
158 av_cold
void ff_xvid_rate_control_uninit(MpegEncContext
*s
)
160 xvid_plg_destroy_t xvid_plg_destroy
;
162 xvid_plugin_2pass2(s
->rc_context
.non_lavc_opaque
, XVID_PLG_DESTROY
,
163 &xvid_plg_destroy
, NULL
);