Mercurial > libavcodec.hg
annotate xvid_rc.c @ 3604:dad0296d4522 libavcodec
replace MULL with asm too, no significnat speedup but its probably better to not take any chances, some versions of gcc will almost certainly mess it up too if they can
author | michael |
---|---|
date | Tue, 22 Aug 2006 12:07:02 +0000 |
parents | 18af2f7788c6 |
children | c8c591fe26f8 |
rev | line source |
---|---|
3064 | 1 /* |
2 * xvid Rate control wrapper for lavc video encoders | |
3 * | |
4 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | |
5 * | |
6 * This library is free software; you can redistribute it and/or | |
7 * modify it under the terms of the GNU Lesser General Public | |
8 * License as published by the Free Software Foundation; either | |
9 * version 2 of the License, or (at your option) any later version. | |
10 * | |
11 * This library is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * Lesser General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU Lesser General Public | |
17 * License along with this library; if not, write to the Free Software | |
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
19 */ | |
20 | |
21 #include <xvid.h> | |
22 #include <unistd.h> | |
23 #include "avcodec.h" | |
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3204
diff
changeset
|
24 #include "internal.h" |
3064 | 25 //#include "dsputil.h" |
26 #include "mpegvideo.h" | |
27 | |
28 #undef NDEBUG | |
29 #include <assert.h> | |
30 | |
31 extern unsigned int xvid_debug; | |
32 | |
33 int ff_xvid_rate_control_init(MpegEncContext *s){ | |
34 char *tmp_name; | |
35 int fd, i; | |
36 xvid_plg_create_t xvid_plg_create; | |
37 xvid_plugin_2pass2_t xvid_2pass2; | |
38 | |
39 //xvid_debug=-1; | |
40 | |
3233
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3204
diff
changeset
|
41 fd=av_tempfile("xvidrc.", &tmp_name); |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3204
diff
changeset
|
42 if (fd == -1) { |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3204
diff
changeset
|
43 av_log(NULL, AV_LOG_ERROR, "Can't create temporary pass2 file.\n"); |
18af2f7788c6
- Add new file internal.h for common internal-use-only functions.
corey
parents:
3204
diff
changeset
|
44 return -1; |
3064 | 45 } |
46 | |
3204 | 47 for(i=0; i<s->rc_context.num_entries; i++){ |
3064 | 48 static const char *frame_types = " ipbs"; |
49 char tmp[256]; | |
50 RateControlEntry *rce; | |
51 | |
52 rce= &s->rc_context.entry[i]; | |
53 | |
54 snprintf(tmp, sizeof(tmp), "%c %d %d %d %d %d %d\n", | |
55 frame_types[rce->pict_type], (int)lrintf(rce->qscale / FF_QP2LAMBDA), rce->i_count, s->mb_num - rce->i_count - rce->skip_count, | |
3204 | 56 rce->skip_count, (rce->i_tex_bits + rce->p_tex_bits + rce->misc_bits+7)/8, (rce->header_bits+rce->mv_bits+7)/8); |
3064 | 57 |
3204 | 58 //av_log(NULL, AV_LOG_ERROR, "%s\n", tmp); |
3064 | 59 write(fd, tmp, strlen(tmp)); |
60 } | |
61 | |
62 close(fd); | |
63 | |
64 memset(&xvid_2pass2, 0, sizeof(xvid_2pass2)); | |
65 xvid_2pass2.version= XVID_MAKE_VERSION(1,1,0); | |
66 xvid_2pass2.filename= tmp_name; | |
67 xvid_2pass2.bitrate= s->avctx->bit_rate; | |
68 xvid_2pass2.vbv_size= s->avctx->rc_buffer_size; | |
69 xvid_2pass2.vbv_maxrate= s->avctx->rc_max_rate; | |
70 xvid_2pass2.vbv_initial= s->avctx->rc_initial_buffer_occupancy; | |
71 | |
72 memset(&xvid_plg_create, 0, sizeof(xvid_plg_create)); | |
73 xvid_plg_create.version= XVID_MAKE_VERSION(1,1,0); | |
74 xvid_plg_create.fbase= s->avctx->time_base.den; | |
75 xvid_plg_create.fincr= s->avctx->time_base.num; | |
76 xvid_plg_create.param= &xvid_2pass2; | |
77 | |
3204 | 78 if(xvid_plugin_2pass2(NULL, XVID_PLG_CREATE, &xvid_plg_create, &s->rc_context.non_lavc_opaque)<0){ |
79 av_log(NULL, AV_LOG_ERROR, "xvid_plugin_2pass2 failed\n"); | |
80 return -1; | |
81 } | |
82 return 0; | |
3064 | 83 } |
84 | |
85 float ff_xvid_rate_estimate_qscale(MpegEncContext *s, int dry_run){ | |
86 xvid_plg_data_t xvid_plg_data; | |
87 | |
88 memset(&xvid_plg_data, 0, sizeof(xvid_plg_data)); | |
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 | |
3204 | 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; | |
3064 | 104 |
105 #if 0 | |
106 xvid_plg_data.stats.hlength= X | |
107 #endif | |
108 | |
109 if(!s->rc_context.dry_run_qscale){ | |
110 if(s->picture_number){ | |
111 xvid_plg_data.length= | |
112 xvid_plg_data.stats.length= (s->frame_bits + 7)/8; | |
3204 | 113 xvid_plg_data.frame_num= s->rc_context.last_picture_number; |
3064 | 114 xvid_plg_data.quant= s->qscale; |
115 | |
116 xvid_plg_data.type= s->last_pict_type; | |
117 if(xvid_plugin_2pass2(s->rc_context.non_lavc_opaque, XVID_PLG_AFTER, &xvid_plg_data, NULL)){ | |
118 av_log(s->avctx, AV_LOG_ERROR, "xvid_plugin_2pass2(handle, XVID_PLG_AFTER, ...) FAILED\n"); | |
119 return -1; | |
120 } | |
121 } | |
3204 | 122 s->rc_context.last_picture_number= |
3064 | 123 xvid_plg_data.frame_num= s->picture_number; |
124 xvid_plg_data.quant= 0; | |
125 if(xvid_plugin_2pass2(s->rc_context.non_lavc_opaque, XVID_PLG_BEFORE, &xvid_plg_data, NULL)){ | |
126 av_log(s->avctx, AV_LOG_ERROR, "xvid_plugin_2pass2(handle, XVID_PLG_BEFORE, ...) FAILED\n"); | |
127 return -1; | |
128 } | |
129 s->rc_context.dry_run_qscale= xvid_plg_data.quant; | |
130 } | |
131 xvid_plg_data.quant= s->rc_context.dry_run_qscale; | |
132 if(!dry_run) | |
133 s->rc_context.dry_run_qscale= 0; | |
134 | |
3204 | 135 if(s->pict_type == B_TYPE) //FIXME this is not exactly identical to xvid |
136 return xvid_plg_data.quant * FF_QP2LAMBDA * s->avctx->b_quant_factor + s->avctx->b_quant_offset; | |
137 else | |
138 return xvid_plg_data.quant * FF_QP2LAMBDA; | |
3064 | 139 } |
140 | |
141 void ff_xvid_rate_control_uninit(MpegEncContext *s){ | |
142 xvid_plg_destroy_t xvid_plg_destroy; | |
143 | |
144 xvid_plugin_2pass2(s->rc_context.non_lavc_opaque, XVID_PLG_DESTROY, &xvid_plg_destroy, NULL); | |
145 } | |
146 |