annotate divx4_vbr.c @ 5950:184f37880f90

Darwin needs to run ranlib on any static lib before linking, we do this in this script just before the final linking.
author atmos4
date Fri, 03 May 2002 19:23:15 +0000
parents d1cbcf738db1
children 87197e110b4f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
1 /*
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
2 * divx4_vbr.c
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
3 *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
4 * Copyright (C) Thomas Östreich - June 2001
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
5 *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
6 * 2-pass code OpenDivX port:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
7 * Copyright (C) 2001 Christoph Lampert <gruel@gmx.de>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
8 *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
9 * This file is part of transcode, a linux video stream processing tool
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
10 *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
11 * transcode is free software; you can redistribute it and/or modify
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
12 * it under the terms of the GNU General Public License as published by
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
13 * the Free Software Foundation; either version 2, or (at your option)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
14 * any later version.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
15 *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
16 * transcode is distributed in the hope that it will be useful,
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
19 * GNU General Public License for more details.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
20 *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
21 * You should have received a copy of the GNU General Public License
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
22 * along with GNU Make; see the file COPYING. If not, write to
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
23 * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
24 *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
25 */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
26
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
27
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
28 /**********************************************************
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
29 * Two-pass-code from OpenDivX *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
30 * *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
31 * Large parts of this code were taken from VbrControl() *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
32 * from the OpenDivX project, (C) divxnetworks, *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
33 * this code is published under DivX Open license, which *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
34 * can be found... somewhere... oh, whatever... *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
35 **********************************************************/
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
36
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
37 #include <stdio.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
38 #include <stdlib.h>
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
39 #include <string.h>
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
40 #include <unistd.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
41 #include <fcntl.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
42 #include <math.h>
4003
92c59012249d stdint.h replaced by inttypes.h (used more frequently in the sources)
pl
parents: 3919
diff changeset
43 #include <inttypes.h>
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
44
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
45 #include "divx4_vbr.h"
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
46
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
47 //#include "transcode.h"
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
48
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
49 #define FALSE 0
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
50 #define TRUE 1
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
51
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
52 /* Absolute maximum and minimum quantizers used in VBR modes */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
53 static const int min_quantizer=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
54 static const int max_quantizer=31;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
55
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
56 /* Limits on frame-level deviation of quantizer ( higher values
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
57 correspond to frames with more changes and vice versa ) */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
58 static const float min_quant_delta=-10.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
59 static const float max_quant_delta=5.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
60 /* Limits on stream-level deviation of quantizer ( used to make
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
61 overall bitrate of stream close to requested value ) */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
62 static const float min_rc_quant_delta=.6f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
63 static const float max_rc_quant_delta=1.5f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
64
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
65 /* Crispness parameter controls threshold for decision whether
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
66 to skip the frame or to code it. */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
67 //static const float max_crispness=100.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
68 /* Maximum allowed number of skipped frames in a line. */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
69 //static const int max_drops_line=0; // CHL We don't drop frames at the moment!
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
70
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
71
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
72 typedef struct entry_s
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
73 /* max 28 bytes/frame or 5 Mb for 2-hour movie */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
74 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
75 int quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
76 int text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
77 int motion_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
78 int total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
79 float mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
80 short is_key_frame;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
81 short drop;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
82 } entry;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
83
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
84 static int m_iCount;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
85 static int m_iQuant;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
86 static int m_iCrispness;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
87 static short m_bDrop;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
88 static float m_fQuant;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
89
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
90 static int64_t m_lEncodedBits;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
91 static int64_t m_lExpectedBits;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
92
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
93 static FILE *m_pFile;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
94
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
95 static entry vFrame;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
96 static entry *m_vFrames;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
97 static long lFrameStart;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
98
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
99 static int iNumFrames;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
100 static int dummy;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
101
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
102
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
103 void VbrControl_init_1pass_vbr(int quality, int crispness)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
104 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
105 m_fQuant=min_quantizer+((max_quantizer-min_quantizer)/6.)*(6-quality);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
106 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
107 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
108 VbrControl_update_1pass_vbr();
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
109 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
110
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
111 int VbrControl_init_2pass_vbr_analysis(const char *filename, int quality)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
112 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
113 m_pFile=fopen(filename, "wb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
114 if(m_pFile==0)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
115 return -1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
116 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
117 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
118 fprintf(m_pFile, "##version 1\n");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
119 fprintf(m_pFile, "quality %d\n", quality);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
120 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
121 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
122
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
123 int VbrControl_init_2pass_vbr_encoding(const char *filename, int bitrate, double framerate, int crispness, int quality)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
124 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
125 int i;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
126
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
127 int64_t text_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
128 int64_t total_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
129 int64_t complexity=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
130 int64_t new_complexity=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
131 int64_t motion_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
132 int64_t denominator=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
133 float qual_multiplier=1.;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
134 char head[20];
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
135
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
136 int64_t desired_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
137 int64_t non_text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
138
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
139 float average_complexity;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
140
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
141 m_pFile=fopen(filename, "rb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
142 if(m_pFile==0)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
143 return -1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
144 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
145 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
146
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
147 fread(head, 10, 1, m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
148 if(!strncmp("##version ", head, 10))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
149 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
150 int version;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
151 int iOldQual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
152 float old_qual, new_qual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
153 fscanf(m_pFile, "%d\n", &version);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
154 fscanf(m_pFile, "quality %d\n", &iOldQual);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
155 switch(iOldQual)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
156 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
157 case 5:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
158 old_qual=1.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
159 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
160 case 4:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
161 old_qual=1.1f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
162 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
163 case 3:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
164 old_qual=1.25f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
165 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
166 case 2:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
167 old_qual=1.4f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
168 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
169 case 1:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
170 old_qual=2.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
171 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
172 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
173 switch(quality)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
174 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
175 case 5:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
176 new_qual=1.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
177 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
178 case 4:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
179 new_qual=1.1f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
180 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
181 case 3:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
182 new_qual=1.25f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
183 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
184 case 2:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
185 new_qual=1.4f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
186 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
187 case 1:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
188 new_qual=2.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
189 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
190 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
191 qual_multiplier=new_qual/old_qual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
192 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
193 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
194 fseek(m_pFile, 0, SEEK_SET);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
195
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
196 lFrameStart=ftell(m_pFile); // save current position
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
197
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
198 /* removed C++ dependencies, now read file twice :-( */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
199
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
200
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
201 while(!feof(m_pFile))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
202 { fscanf(m_pFile, "Frame %d: intra %d, quant %d, texture %d, motion %d, total %d\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
203 &iNumFrames, &(vFrame.is_key_frame), &(vFrame.quant), &(vFrame.text_bits), &(vFrame.motion_bits), &(vFrame.total_bits));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
204
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
205 vFrame.total_bits+=vFrame.text_bits*(qual_multiplier-1);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
206 vFrame.text_bits*=qual_multiplier;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
207 text_bits +=(int64_t)vFrame.text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
208 motion_bits += (int64_t)vFrame.motion_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
209 total_bits +=(int64_t)vFrame.total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
210 complexity +=(int64_t)vFrame.text_bits*vFrame.quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
211
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
212 // printf("Frames %d, texture %d, motion %d, quant %d total %d ",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
213 // iNumFrames, vFrame.text_bits, vFrame.motion_bits, vFrame.quant, vFrame.total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
214 // printf("texture %d, total %d, complexity %lld \n",vFrame.text_bits,vFrame.total_bits, complexity);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
215 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
216 iNumFrames++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
217 average_complexity=complexity/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
218
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
219 // if (verbose & TC_DEBUG) {
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
220 // fprintf(stderr, "(%s) frames %d, texture %lld, motion %lld, total %lld, complexity %lld\n", __FILE__, iNumFrames, text_bits, motion_bits, total_bits, complexity);
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
221 // }
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
222
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
223 m_vFrames = (entry*)malloc(iNumFrames*sizeof(entry));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
224 if (!m_vFrames)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
225 { printf("out of memory");
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
226 return -2; //TC_EXPORT_ERROR;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
227 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
228
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
229 fseek(m_pFile, lFrameStart, SEEK_SET); // start again
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
230
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
231 for (i=0;i<iNumFrames;i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
232 { fscanf(m_pFile, "Frame %d: intra %d, quant %d, texture %d, motion %d, total %d\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
233 &dummy, &(m_vFrames[i].is_key_frame), &(m_vFrames[i].quant),
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
234 &(m_vFrames[i].text_bits), &(m_vFrames[i].motion_bits),
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
235 &(m_vFrames[i].total_bits));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
236
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
237 m_vFrames[i].total_bits += m_vFrames[i].text_bits*(qual_multiplier-1);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
238 m_vFrames[i].text_bits *= qual_multiplier;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
239 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
240
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
241 if (m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
242 { fclose(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
243 m_pFile=NULL;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
244 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
245
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
246 desired_bits=(int64_t)bitrate*(int64_t)iNumFrames/framerate;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
247 non_text_bits=total_bits-text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
248
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
249 if(desired_bits<=non_text_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
250 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
251 char s[200];
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
252 printf("Specified bitrate is too low for this clip.\n"
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
253 "Minimum possible bitrate for the clip is %.0f kbps. Overriding\n"
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
254 "user-specified value.\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
255 (float)(non_text_bits*framerate/(int64_t)iNumFrames));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
256
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
257 desired_bits=non_text_bits*3/2;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
258 /*
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
259 m_fQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
260 for(int i=0; i<iNumFrames; i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
261 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
262 m_vFrames[i].drop=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
263 m_vFrames[i].mult=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
264 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
265 VbrControl_set_quant(m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
266 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
267 */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
268 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
269
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
270 desired_bits -= non_text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
271 /**
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
272 BRIEF EXPLANATION OF WHAT'S GOING ON HERE.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
273 We assume that
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
274 text_bits=complexity / quantizer
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
275 total_bits-text_bits = const(complexity)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
276 where 'complexity' is a characteristic of the frame
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
277 and does not depend much on quantizer dynamics.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
278 Using this equation, we calculate 'average' quantizer
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
279 to be used for encoding ( 1st order effect ).
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
280 Having constant quantizer for the entire stream is not
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
281 very convenient - reconstruction errors are
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
282 more noticeable in low-motion scenes. To compensate
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
283 this effect, we multiply quantizer for each frame by
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
284 (complexity/average_complexity)^k,
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
285 ( k - parameter of adjustment ). k=0 means 'no compensation'
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
286 and k=1 is 'constant bitrate mode'. We choose something in
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
287 between, like 0.5 ( 2nd order effect ).
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
288 **/
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
289
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
290 average_complexity=complexity/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
291
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
292 for(i=0; i<iNumFrames; i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
293 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
294 float mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
295 if(m_vFrames[i].is_key_frame)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
296 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
297 if((i+1<iNumFrames) && (m_vFrames[i+1].is_key_frame))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
298 mult=1.25;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
299 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
300 mult=.75;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
301 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
302 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
303 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
304 mult=m_vFrames[i].text_bits*m_vFrames[i].quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
305 mult=(float)sqrt(mult/average_complexity);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
306
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
307 // if(i && m_vFrames[i-1].is_key_frame)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
308 // mult *= 0.75;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
309 if(mult<0.5)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
310 mult=0.5;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
311 if(mult>1.5)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
312 mult=1.5;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
313 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
314
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
315 m_vFrames[i].mult=mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
316 m_vFrames[i].drop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
317 new_complexity+=m_vFrames[i].text_bits*m_vFrames[i].quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
318
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
319 denominator+=desired_bits*m_vFrames[i].mult/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
320 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
321
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
322 m_fQuant=((double)new_complexity)/(double)denominator;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
323
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
324 if(m_fQuant<min_quantizer) m_fQuant=min_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
325 if(m_fQuant>max_quantizer) m_fQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
326 m_pFile=fopen("analyse.log", "wb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
327 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
328 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
329 fprintf(m_pFile, "Total frames: %d Avg quantizer: %f\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
330 iNumFrames, m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
331 fprintf(m_pFile, "Expecting %12lld bits\n", desired_bits+non_text_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
332 fflush(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
333 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
334 VbrControl_set_quant(m_fQuant*m_vFrames[0].mult);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
335 m_lEncodedBits=m_lExpectedBits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
336 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
337 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
338
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
339 int VbrControl_get_intra()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
340 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
341 return m_vFrames[m_iCount].is_key_frame;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
342 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
343
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
344 short VbrControl_get_drop()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
345 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
346 return m_bDrop;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
347 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
348
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
349 int VbrControl_get_quant()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
350 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
351 return m_iQuant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
352 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
353
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
354 void VbrControl_set_quant(float quant)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
355 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
356 m_iQuant=quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
357 if((rand() % 10)<((quant-m_iQuant) * 10))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
358 m_iQuant++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
359 if(m_iQuant<min_quantizer) m_iQuant=min_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
360 if(m_iQuant>max_quantizer) m_iQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
361 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
362
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
363 void VbrControl_update_1pass_vbr()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
364 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
365 VbrControl_set_quant(m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
366 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
367 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
368
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
369 void VbrControl_update_2pass_vbr_analysis(int is_key_frame, int motion_bits, int texture_bits, int total_bits, int quant)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
370 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
371 if(!m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
372 return;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
373 fprintf(m_pFile, "Frame %d: intra %d, quant %d, texture %d, motion %d, total %d\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
374 m_iCount, is_key_frame, quant, texture_bits, motion_bits, total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
375 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
376 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
377
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
378 void VbrControl_update_2pass_vbr_encoding(int motion_bits, int texture_bits, int total_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
379 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
380 double q;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
381 double dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
382
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
383 if(m_iCount>=iNumFrames)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
384 return;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
385
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
386 m_lExpectedBits+=(m_vFrames[m_iCount].total_bits-m_vFrames[m_iCount].text_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
387 + m_vFrames[m_iCount].text_bits*m_vFrames[m_iCount].quant/m_fQuant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
388 m_lEncodedBits+=(int64_t)total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
389
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
390 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
391 fprintf(m_pFile, "Frame %d: PRESENT, complexity %d, quant multiplier %f, texture %d, total %d ",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
392 m_iCount, m_vFrames[m_iCount].text_bits*m_vFrames[m_iCount].quant,
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
393 m_vFrames[m_iCount].mult, texture_bits, total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
394
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
395 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
396
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
397 q = m_fQuant * m_vFrames[m_iCount].mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
398 if(q<m_fQuant+min_quant_delta) q=m_fQuant+min_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
399 if(q>m_fQuant+max_quant_delta) q=m_fQuant+max_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
400
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
401 dq = (double)m_lEncodedBits/(double)m_lExpectedBits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
402 dq*=dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
403 if(dq<min_rc_quant_delta)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
404 dq=min_rc_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
405 if(dq>max_rc_quant_delta)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
406 dq=max_rc_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
407 if(m_iCount<20) // no framerate corrections in first frames
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
408 dq=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
409 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
410 fprintf(m_pFile, "Progress: expected %12lld, achieved %12lld, dq %f",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
411 m_lExpectedBits, m_lEncodedBits, dq);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
412 q *= dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
413 VbrControl_set_quant(q);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
414 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
415 fprintf(m_pFile, ", new quant %d\n", m_iQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
416 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
417
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
418 void VbrControl_close()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
419 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
420 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
421 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
422 fclose(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
423 m_pFile=NULL;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
424 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
425 free(m_vFrames);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
426 }