You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

406 lines
14KB

  1. /*
  2. Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at>
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  14. */
  15. #include <inttypes.h>
  16. #include <stdio.h>
  17. #include "common.h" //needed for mpegvideo.h to compile
  18. #include "dsputil.h" //needed for mpegvideo.h to compile
  19. #include "avcodec.h"
  20. #include "mpegvideo.h"
  21. #define STATS_FILE "lavc_stats.txt"
  22. static int init_pass2(MpegEncContext *s);
  23. void ff_write_pass1_stats(MpegEncContext *s){
  24. RateControlContext *rcc= &s->rc_context;
  25. // fprintf(c->stats_file, "type:%d q:%d icount:%d pcount:%d scount:%d itex:%d ptex%d mv:%d misc:%d fcode:%d bcode:%d\")
  26. fprintf(rcc->stats_file, "in:%d out:%d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d fcode:%d bcode:%d\n",
  27. s->picture_number, s->input_picture_number - s->max_b_frames, s->pict_type,
  28. s->qscale, s->i_tex_bits, s->p_tex_bits, s->mv_bits, s->misc_bits, s->f_code, s->b_code);
  29. }
  30. int ff_rate_control_init(MpegEncContext *s)
  31. {
  32. RateControlContext *rcc= &s->rc_context;
  33. emms_c();
  34. if(s->flags&CODEC_FLAG_PASS1){
  35. rcc->stats_file= fopen(STATS_FILE, "w");
  36. if(!rcc->stats_file){
  37. fprintf(stderr, "failed to open " STATS_FILE "\n");
  38. return -1;
  39. }
  40. } else if(s->flags&CODEC_FLAG_PASS2){
  41. int size;
  42. int i;
  43. rcc->stats_file= fopen(STATS_FILE, "r");
  44. if(!rcc->stats_file){
  45. fprintf(stderr, "failed to open " STATS_FILE "\n");
  46. return -1;
  47. }
  48. /* find number of pics without reading the file twice :) */
  49. fseek(rcc->stats_file, 0, SEEK_END);
  50. size= ftell(rcc->stats_file);
  51. fseek(rcc->stats_file, 0, SEEK_SET);
  52. size/= 64; // we need at least 64 byte to store a line ...
  53. rcc->entry = (RateControlEntry*)av_mallocz(size*sizeof(RateControlEntry));
  54. for(i=0; !feof(rcc->stats_file); i++){
  55. RateControlEntry *rce;
  56. int picture_number;
  57. int e;
  58. e= fscanf(rcc->stats_file, "in:%d ", &picture_number);
  59. rce= &rcc->entry[picture_number];
  60. e+=fscanf(rcc->stats_file, "out:%*d type:%d q:%d itex:%d ptex:%d mv:%d misc:%d fcode:%*d bcode:%*d\n",
  61. &rce->pict_type, &rce->qscale, &rce->i_tex_bits, &rce->p_tex_bits, &rce->mv_bits, &rce->misc_bits);
  62. if(e!=7){
  63. fprintf(stderr, STATS_FILE " is damaged\n");
  64. return -1;
  65. }
  66. }
  67. rcc->num_entries= i;
  68. if(init_pass2(s) < 0) return -1;
  69. }
  70. /* no 2pass stuff, just normal 1-pass */
  71. //initial values, they dont really matter as they will be totally different within a few frames
  72. s->i_pred.coeff= s->p_pred.coeff= 7.0;
  73. s->i_pred.count= s->p_pred.count= 1.0;
  74. s->i_pred.decay= s->p_pred.decay= 0.4;
  75. // use more bits at the beginning, otherwise high motion at the begin will look like shit
  76. s->qsum=100 * s->qmin;
  77. s->qcount=100;
  78. s->short_term_qsum=0.001;
  79. s->short_term_qcount=0.001;
  80. return 0;
  81. }
  82. void ff_rate_control_uninit(MpegEncContext *s)
  83. {
  84. RateControlContext *rcc= &s->rc_context;
  85. emms_c();
  86. if(rcc->stats_file)
  87. fclose(rcc->stats_file);
  88. rcc->stats_file = NULL;
  89. av_freep(&rcc->entry);
  90. }
  91. //----------------------------------
  92. // 1 Pass Code
  93. static double predict(Predictor *p, double q, double var)
  94. {
  95. return p->coeff*var / (q*p->count);
  96. }
  97. static void update_predictor(Predictor *p, double q, double var, double size)
  98. {
  99. double new_coeff= size*q / (var + 1);
  100. if(var<1000) return;
  101. p->count*= p->decay;
  102. p->coeff*= p->decay;
  103. p->count++;
  104. p->coeff+= new_coeff;
  105. }
  106. int ff_rate_estimate_qscale(MpegEncContext *s)
  107. {
  108. int qmin= s->qmin;
  109. int qmax= s->qmax;
  110. int rate_q=5;
  111. float q;
  112. int qscale;
  113. float br_compensation;
  114. double diff;
  115. double short_term_q;
  116. double long_term_q;
  117. double fps;
  118. int picture_number= s->input_picture_number - s->max_b_frames;
  119. int64_t wanted_bits;
  120. emms_c();
  121. fps= (double)s->frame_rate / FRAME_RATE_BASE;
  122. wanted_bits= (uint64_t)(s->bit_rate*(double)picture_number/fps);
  123. // printf("%d %d %d\n", picture_number, (int)wanted_bits, (int)s->total_bits);
  124. if(s->pict_type==B_TYPE){
  125. qmin= (int)(qmin*s->b_quant_factor+0.5);
  126. qmax= (int)(qmax*s->b_quant_factor+0.5);
  127. }
  128. if(qmin<1) qmin=1;
  129. if(qmax>31) qmax=31;
  130. if(qmax<=qmin) qmax= qmin;
  131. /* update predictors */
  132. if(picture_number>2){
  133. if(s->pict_type!=B_TYPE && s->last_non_b_pict_type == P_TYPE){
  134. //printf("%d %d %d %f\n", s->qscale, s->last_mc_mb_var, s->frame_bits, s->p_pred.coeff);
  135. update_predictor(&s->p_pred, s->last_non_b_qscale, s->last_non_b_mc_mb_var, s->pb_frame_bits);
  136. }
  137. }
  138. if(s->pict_type == I_TYPE){
  139. short_term_q= s->short_term_qsum/s->short_term_qcount;
  140. long_term_q= s->qsum/s->qcount*(s->total_bits+1)/(wanted_bits+1); //+1 to avoid nan & 0
  141. q= 1/((1/long_term_q - 1/short_term_q)*s->qcompress + 1/short_term_q);
  142. }else if(s->pict_type==B_TYPE){
  143. q= (int)(s->last_non_b_qscale*s->b_quant_factor+0.5);
  144. }else{ //P Frame
  145. int i;
  146. int diff, best_diff=1000000000;
  147. for(i=1; i<=31; i++){
  148. diff= predict(&s->p_pred, i, s->mc_mb_var) - (double)s->bit_rate/fps;
  149. if(diff<0) diff= -diff;
  150. if(diff<best_diff){
  151. best_diff= diff;
  152. rate_q= i;
  153. }
  154. }
  155. s->short_term_qsum*=s->qblur;
  156. s->short_term_qcount*=s->qblur;
  157. s->short_term_qsum+= rate_q;
  158. s->short_term_qcount++;
  159. short_term_q= s->short_term_qsum/s->short_term_qcount;
  160. long_term_q= s->qsum/s->qcount*(s->total_bits+1)/(wanted_bits+1); //+1 to avoid nan & 0
  161. // q= (long_term_q - short_term_q)*s->qcompress + short_term_q;
  162. q= 1/((1/long_term_q - 1/short_term_q)*s->qcompress + 1/short_term_q);
  163. }
  164. diff= s->total_bits - wanted_bits;
  165. br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance;
  166. if(br_compensation<=0.0) br_compensation=0.001;
  167. q/=br_compensation;
  168. //printf("%f %f %f\n", q, br_compensation, short_term_q);
  169. qscale= (int)(q + 0.5);
  170. if (qscale<qmin) qscale=qmin;
  171. else if(qscale>qmax) qscale=qmax;
  172. if(s->pict_type!=B_TYPE){
  173. s->qsum+= qscale;
  174. s->qcount++;
  175. if (qscale<s->last_non_b_qscale-s->max_qdiff) qscale=s->last_non_b_qscale-s->max_qdiff;
  176. else if(qscale>s->last_non_b_qscale+s->max_qdiff) qscale=s->last_non_b_qscale+s->max_qdiff;
  177. }
  178. //printf("q:%d diff:%d comp:%f rate_q:%d st_q:%f fvar:%d last_size:%d\n", qscale, (int)diff, br_compensation,
  179. // rate_q, short_term_q, s->mc_mb_var, s->frame_bits);
  180. //printf("%d %d\n", s->bit_rate, (int)fps);
  181. return qscale;
  182. }
  183. //----------------------------------------------
  184. // 2-Pass code
  185. static int init_pass2(MpegEncContext *s)
  186. {
  187. RateControlContext *rcc= &s->rc_context;
  188. int i;
  189. double fps= (double)s->frame_rate / FRAME_RATE_BASE;
  190. double complexity[5]={0,0,0,0,0}; // aproximate bits at quant=1
  191. double avg_quantizer[5];
  192. uint64_t const_bits[5]={0,0,0,0,0}; // quantizer idependant bits
  193. uint64_t available_bits[5];
  194. uint64_t all_const_bits;
  195. uint64_t all_available_bits= (uint64_t)(s->bit_rate*(double)rcc->num_entries/fps);
  196. int num_frames[5]={0,0,0,0,0};
  197. double rate_factor=0;
  198. double step;
  199. int last_i_frame=-10000000;
  200. /* find complexity & const_bits & decide the pict_types */
  201. for(i=0; i<rcc->num_entries; i++){
  202. RateControlEntry *rce= &rcc->entry[i];
  203. if(s->b_frame_strategy==0 || s->max_b_frames==0){
  204. rce->new_pict_type= rce->pict_type;
  205. }else{
  206. int j;
  207. int next_non_b_type=P_TYPE;
  208. switch(rce->pict_type){
  209. case I_TYPE:
  210. if(i-last_i_frame>s->gop_size/2){ //FIXME this is not optimal
  211. rce->new_pict_type= I_TYPE;
  212. last_i_frame= i;
  213. }else{
  214. rce->new_pict_type= P_TYPE; // will be caught by the scene detection anyway
  215. }
  216. break;
  217. case P_TYPE:
  218. rce->new_pict_type= P_TYPE;
  219. break;
  220. case B_TYPE:
  221. for(j=i+1; j<i+s->max_b_frames+2 && j<rcc->num_entries; j++){
  222. if(rcc->entry[j].pict_type != B_TYPE){
  223. next_non_b_type= rcc->entry[j].pict_type;
  224. break;
  225. }
  226. }
  227. if(next_non_b_type==I_TYPE)
  228. rce->new_pict_type= P_TYPE;
  229. else
  230. rce->new_pict_type= B_TYPE;
  231. break;
  232. }
  233. }
  234. complexity[rce->new_pict_type]+= (rce->i_tex_bits+ rce->p_tex_bits)*(double)rce->qscale;
  235. const_bits[rce->new_pict_type]+= rce->mv_bits + rce->misc_bits;
  236. num_frames[rce->new_pict_type]++;
  237. }
  238. all_const_bits= const_bits[I_TYPE] + const_bits[P_TYPE] + const_bits[B_TYPE];
  239. if(all_available_bits < all_const_bits){
  240. fprintf(stderr, "requested bitrate is to low\n");
  241. return -1;
  242. }
  243. // avg_complexity= complexity/rcc->num_entries;
  244. avg_quantizer[P_TYPE]=
  245. avg_quantizer[I_TYPE]= (complexity[I_TYPE]+complexity[P_TYPE] + complexity[B_TYPE]/s->b_quant_factor)
  246. / (all_available_bits - all_const_bits);
  247. avg_quantizer[B_TYPE]= avg_quantizer[P_TYPE]*s->b_quant_factor;
  248. //printf("avg quantizer: %f %f\n", avg_quantizer[P_TYPE], avg_quantizer[B_TYPE]);
  249. for(i=0; i<5; i++){
  250. available_bits[i]= const_bits[i] + complexity[i]/avg_quantizer[i];
  251. }
  252. //printf("%lld %lld %lld %lld\n", available_bits[I_TYPE], available_bits[P_TYPE], available_bits[B_TYPE], all_available_bits);
  253. for(step=256*256; step>0.0000001; step*=0.5){
  254. uint64_t expected_bits=0;
  255. rate_factor+= step;
  256. /* find qscale */
  257. for(i=0; i<rcc->num_entries; i++){
  258. RateControlEntry *rce= &rcc->entry[i];
  259. double short_term_q, q, bits_left;
  260. const int pict_type= rce->new_pict_type;
  261. int qmin= s->qmin;
  262. int qmax= s->qmax;
  263. if(pict_type==B_TYPE){
  264. qmin= (int)(qmin*s->b_quant_factor+0.5);
  265. qmax= (int)(qmax*s->b_quant_factor+0.5);
  266. }
  267. if(qmin<1) qmin=1;
  268. if(qmax>31) qmax=31;
  269. if(qmax<=qmin) qmax= qmin;
  270. switch(s->rc_strategy){
  271. case 0:
  272. bits_left= available_bits[pict_type]/num_frames[pict_type]*rate_factor - rce->misc_bits - rce->mv_bits;
  273. if(bits_left<1.0) bits_left=1.0;
  274. short_term_q= rce->qscale*(rce->i_tex_bits + rce->p_tex_bits)/bits_left;
  275. break;
  276. case 1:
  277. bits_left= (available_bits[pict_type] - const_bits[pict_type])/num_frames[pict_type]*rate_factor;
  278. if(bits_left<1.0) bits_left=1.0;
  279. short_term_q= rce->qscale*(rce->i_tex_bits + rce->p_tex_bits)/bits_left;
  280. break;
  281. case 2:
  282. bits_left= available_bits[pict_type]/num_frames[pict_type]*rate_factor;
  283. if(bits_left<1.0) bits_left=1.0;
  284. short_term_q= rce->qscale*(rce->i_tex_bits + rce->p_tex_bits + rce->misc_bits + rce->mv_bits)/bits_left;
  285. break;
  286. default:
  287. fprintf(stderr, "unknown strategy\n");
  288. short_term_q=3; //gcc warning fix
  289. }
  290. if(short_term_q>31.0) short_term_q=31.0;
  291. else if (short_term_q<1.0) short_term_q=1.0;
  292. q= 1/((1/avg_quantizer[pict_type] - 1/short_term_q)*s->qcompress + 1/short_term_q);
  293. if (q<qmin) q=qmin;
  294. else if(q>qmax) q=qmax;
  295. //printf("lq:%f, sq:%f t:%f q:%f\n", avg_quantizer[rce->pict_type], short_term_q, bits_left, q);
  296. rce->new_qscale= q;
  297. }
  298. /* smooth curve */
  299. /* find expected bits */
  300. for(i=0; i<rcc->num_entries; i++){
  301. RateControlEntry *rce= &rcc->entry[i];
  302. double factor= rce->qscale / rce->new_qscale;
  303. rce->expected_bits= expected_bits;
  304. expected_bits += (int)(rce->misc_bits + rce->mv_bits + (rce->i_tex_bits + rce->p_tex_bits)*factor + 0.5);
  305. }
  306. // printf("%d %d %f\n", (int)expected_bits, (int)all_available_bits, rate_factor);
  307. if(expected_bits > all_available_bits) rate_factor-= step;
  308. }
  309. return 0;
  310. }
  311. int ff_rate_estimate_qscale_pass2(MpegEncContext *s)
  312. {
  313. int qmin= s->qmin;
  314. int qmax= s->qmax;
  315. float q;
  316. int qscale;
  317. float br_compensation;
  318. double diff;
  319. int picture_number= s->picture_number;
  320. RateControlEntry *rce= &s->rc_context.entry[picture_number];
  321. int64_t wanted_bits= rce->expected_bits;
  322. emms_c();
  323. // printf("%d %d %d\n", picture_number, (int)wanted_bits, (int)s->total_bits);
  324. if(s->pict_type==B_TYPE){
  325. qmin= (int)(qmin*s->b_quant_factor+0.5);
  326. qmax= (int)(qmax*s->b_quant_factor+0.5);
  327. }
  328. if(qmin<1) qmin=1;
  329. if(qmax>31) qmax=31;
  330. if(qmax<=qmin) qmax= qmin;
  331. q= rce->new_qscale;
  332. diff= s->total_bits - wanted_bits;
  333. br_compensation= (s->bit_rate_tolerance - diff)/s->bit_rate_tolerance;
  334. if(br_compensation<=0.0) br_compensation=0.001;
  335. q/=br_compensation;
  336. qscale= (int)(q + 0.5);
  337. if (qscale<qmin) qscale=qmin;
  338. else if(qscale>qmax) qscale=qmax;
  339. // printf("%d %d %d %d type:%d\n", qmin, qscale, qmax, picture_number, s->pict_type); fflush(stdout);
  340. return qscale;
  341. }