libxvid_rc.c
Go to the documentation of this file.
1 /*
2  * Xvid rate control wrapper for lavc video encoders
3  *
4  * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
5  *
6  * This file is part of FFmpeg.
7  *
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.
12  *
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.
17  *
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
21  */
22 
23 #include "config.h"
24 #include <xvid.h>
25 #include <unistd.h>
26 #include "libavutil/file.h"
27 #include "avcodec.h"
28 #include "libxvid.h"
29 #include "mpegvideo.h"
30 
31 #undef NDEBUG
32 #include <assert.h>
33 
35  char *tmp_name;
36  int fd, i;
37  xvid_plg_create_t xvid_plg_create = { 0 };
38  xvid_plugin_2pass2_t xvid_2pass2 = { 0 };
39 
40  fd=av_tempfile("xvidrc.", &tmp_name, 0, s->avctx);
41  if (fd == -1) {
42  av_log(NULL, AV_LOG_ERROR, "Can't create temporary pass2 file.\n");
43  return -1;
44  }
45 
46  for(i=0; i<s->rc_context.num_entries; i++){
47  static const char frame_types[] = " ipbs";
48  char tmp[256];
49  RateControlEntry *rce;
50 
51  rce= &s->rc_context.entry[i];
52 
53  snprintf(tmp, sizeof(tmp), "%c %d %d %d %d %d %d\n",
54  frame_types[rce->pict_type], (int)lrintf(rce->qscale / FF_QP2LAMBDA), rce->i_count, s->mb_num - rce->i_count - rce->skip_count,
55  rce->skip_count, (rce->i_tex_bits + rce->p_tex_bits + rce->misc_bits+7)/8, (rce->header_bits+rce->mv_bits+7)/8);
56 
57  if (write(fd, tmp, strlen(tmp)) < 0) {
58  av_log(NULL, AV_LOG_ERROR, "Error %s writing 2pass logfile\n", strerror(errno));
59  av_free(tmp_name);
60  close(fd);
61  return AVERROR(errno);
62  }
63  }
64 
65  close(fd);
66 
67  xvid_2pass2.version= XVID_MAKE_VERSION(1,1,0);
68  xvid_2pass2.filename= tmp_name;
69  xvid_2pass2.bitrate= s->avctx->bit_rate;
70  xvid_2pass2.vbv_size= s->avctx->rc_buffer_size;
71  xvid_2pass2.vbv_maxrate= s->avctx->rc_max_rate;
72  xvid_2pass2.vbv_initial= s->avctx->rc_initial_buffer_occupancy;
73 
74  xvid_plg_create.version= XVID_MAKE_VERSION(1,1,0);
75  xvid_plg_create.fbase= s->avctx->time_base.den;
76  xvid_plg_create.fincr= s->avctx->time_base.num;
77  xvid_plg_create.param= &xvid_2pass2;
78 
79  if(xvid_plugin_2pass2(NULL, XVID_PLG_CREATE, &xvid_plg_create, &s->rc_context.non_lavc_opaque)<0){
80  av_log(NULL, AV_LOG_ERROR, "xvid_plugin_2pass2 failed\n");
81  return -1;
82  }
83  return 0;
84 }
85 
87  xvid_plg_data_t xvid_plg_data = { 0 };
88 
89  xvid_plg_data.version= XVID_MAKE_VERSION(1,1,0);
90  xvid_plg_data.width = s->width;
91  xvid_plg_data.height= s->height;
92  xvid_plg_data.mb_width = s->mb_width;
93  xvid_plg_data.mb_height= s->mb_height;
94  xvid_plg_data.fbase= s->avctx->time_base.den;
95  xvid_plg_data.fincr= s->avctx->time_base.num;
96  xvid_plg_data.min_quant[0]= s->avctx->qmin;
97  xvid_plg_data.min_quant[1]= s->avctx->qmin;
98  xvid_plg_data.min_quant[2]= s->avctx->qmin; //FIXME i/b factor & offset
99  xvid_plg_data.max_quant[0]= s->avctx->qmax;
100  xvid_plg_data.max_quant[1]= s->avctx->qmax;
101  xvid_plg_data.max_quant[2]= s->avctx->qmax; //FIXME i/b factor & offset
102  xvid_plg_data.bquant_offset = 0; // 100 * s->avctx->b_quant_offset;
103  xvid_plg_data.bquant_ratio = 100; // * s->avctx->b_quant_factor;
104 
105  if(!s->rc_context.dry_run_qscale){
106  if(s->picture_number){
107  xvid_plg_data.length=
108  xvid_plg_data.stats.length= (s->frame_bits + 7)/8;
109  xvid_plg_data.frame_num= s->rc_context.last_picture_number;
110  xvid_plg_data.quant= s->qscale;
111 
112  xvid_plg_data.type= s->last_pict_type;
113  if(xvid_plugin_2pass2(s->rc_context.non_lavc_opaque, XVID_PLG_AFTER, &xvid_plg_data, NULL)){
114  av_log(s->avctx, AV_LOG_ERROR, "xvid_plugin_2pass2(handle, XVID_PLG_AFTER, ...) FAILED\n");
115  return -1;
116  }
117  }
119  xvid_plg_data.frame_num= s->picture_number;
120  xvid_plg_data.quant= 0;
121  if(xvid_plugin_2pass2(s->rc_context.non_lavc_opaque, XVID_PLG_BEFORE, &xvid_plg_data, NULL)){
122  av_log(s->avctx, AV_LOG_ERROR, "xvid_plugin_2pass2(handle, XVID_PLG_BEFORE, ...) FAILED\n");
123  return -1;
124  }
125  s->rc_context.dry_run_qscale= xvid_plg_data.quant;
126  }
127  xvid_plg_data.quant= s->rc_context.dry_run_qscale;
128  if(!dry_run)
130 
131  if(s->pict_type == AV_PICTURE_TYPE_B) //FIXME this is not exactly identical to xvid
132  return xvid_plg_data.quant * FF_QP2LAMBDA * s->avctx->b_quant_factor + s->avctx->b_quant_offset;
133  else
134  return xvid_plg_data.quant * FF_QP2LAMBDA;
135 }
136 
138  xvid_plg_destroy_t xvid_plg_destroy;
139 
140  xvid_plugin_2pass2(s->rc_context.non_lavc_opaque, XVID_PLG_DESTROY, &xvid_plg_destroy, NULL);
141 }
int frame_bits
bits used for the current frame
Definition: mpegvideo.h:509
RateControlContext rc_context
contains stuff only accessed in ratecontrol.c
Definition: mpegvideo.h:512
int picture_number
Definition: mpegvideo.h:275
const char * s
Definition: avisynth_c.h:668
RateControlEntry * entry
Definition: ratecontrol.h:65
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
int num
numerator
Definition: rational.h:44
mpegvideo header.
int mb_num
number of MBs of a picture
Definition: mpegvideo.h:282
int qscale
QP.
Definition: mpegvideo.h:369
common functions for use with the Xvid wrappers
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
float b_quant_factor
qscale factor between IP and B-frames If > 0 then the last P-frame quantizer will be used (q= lastp_q...
Misc file utilities.
#define lrintf(x)
Definition: libm_mips.h:70
int mb_height
number of MBs horizontally & vertically
Definition: mpegvideo.h:277
int num_entries
number of RateControlEntries
Definition: ratecontrol.h:64
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
int qmax
maximum quantizer
int rc_max_rate
maximum bitrate
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int ff_xvid_rate_control_init(MpegEncContext *s)
Definition: libxvid_rc.c:34
external API header
int rc_buffer_size
decoder bitstream buffer size
float dry_run_qscale
for xvid rc
Definition: ratecontrol.h:84
int bit_rate
the average bitrate
void ff_xvid_rate_control_uninit(MpegEncContext *s)
Definition: libxvid_rc.c:137
int av_tempfile(const char *prefix, char **filename, int log_offset, void *log_ctx)
Wrapper to work around the lack of mkstemp() on mingw.
NULL
Definition: eval.c:55
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
int qmin
minimum quantizer
int height
picture size. must be a multiple of 16
Definition: mpegvideo.h:245
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
int last_picture_number
for xvid rc
Definition: ratecontrol.h:85
synthesis window for stochastic i
float b_quant_offset
qscale offset between IP and B-frames
#define snprintf
Definition: snprintf.h:34
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
int pict_type
AV_PICTURE_TYPE_I, AV_PICTURE_TYPE_P, AV_PICTURE_TYPE_B, ...
Definition: mpegvideo.h:377
MpegEncContext.
Definition: mpegvideo.h:241
struct AVCodecContext * avctx
Definition: mpegvideo.h:243
void * non_lavc_opaque
context for non lavc rc code (for example xvid)
Definition: ratecontrol.h:83
int last_pict_type
Definition: mpegvideo.h:379
Bi-dir predicted.
Definition: avutil.h:218
int den
denominator
Definition: rational.h:45
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:169
float ff_xvid_rate_estimate_qscale(MpegEncContext *s, int dry_run)
Definition: libxvid_rc.c:86