annotate divx4_vbr.c @ 15148:067f10ad6538

New section: "menc-feat-dvd-mpeg4-muxing" about how to mux a video obtained with MEncoder into different containers. Based on Rich's guide and some tips by Nico Sabi. Reviewed by The Wanderer, Dominik 'Rathann' Mierzejewski and Diego Biurrun
author gpoirier
date Wed, 13 Apr 2005 18:53:30 +0000
parents 11b249ef87b0
children f580a7755ac5
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 *
7491
87197e110b4f accepted. so we're now 110% gpl...
arpi
parents: 5285
diff changeset
4 * This file is subject to the terms and conditions of the GNU General Public
87197e110b4f accepted. so we're now 110% gpl...
arpi
parents: 5285
diff changeset
5 * License. See the file COPYING in the main directory of the Linux
87197e110b4f accepted. so we're now 110% gpl...
arpi
parents: 5285
diff changeset
6 * distribution for more details.
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
7 *
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
8 * 2-pass code OpenDivX port:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
9 * Copyright (C) 2001 Christoph Lampert <gruel@gmx.de>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
10 *
7491
87197e110b4f accepted. so we're now 110% gpl...
arpi
parents: 5285
diff changeset
11 * Large parts of this code were taken from VbrControl() from the OpenDivX
87197e110b4f accepted. so we're now 110% gpl...
arpi
parents: 5285
diff changeset
12 * project, (C) divxnetworks, written by Eugene Kuznetsov <ekuznetsov@divxnetworks.com>
87197e110b4f accepted. so we're now 110% gpl...
arpi
parents: 5285
diff changeset
13 * with the permission of Darrius "Junto" Thompson, Director DivX
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
14 */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
15
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
16 #include <stdio.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
17 #include <stdlib.h>
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
18 #include <string.h>
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
19 #include <unistd.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
20 #include <fcntl.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
21 #include <math.h>
4003
92c59012249d stdint.h replaced by inttypes.h (used more frequently in the sources)
pl
parents: 3919
diff changeset
22 #include <inttypes.h>
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
23
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
24 #include "divx4_vbr.h"
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
25
13699
11b249ef87b0 printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents: 8254
diff changeset
26 #include "mp_msg.h"
11b249ef87b0 printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents: 8254
diff changeset
27 #include "help_mp.h"
11b249ef87b0 printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents: 8254
diff changeset
28
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
29 //#include "transcode.h"
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
30
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
31 #define FALSE 0
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
32 #define TRUE 1
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
33
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
34 /* Absolute maximum and minimum quantizers used in VBR modes */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
35 static const int min_quantizer=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
36 static const int max_quantizer=31;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
37
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
38 /* Limits on frame-level deviation of quantizer ( higher values
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
39 correspond to frames with more changes and vice versa ) */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
40 static const float min_quant_delta=-10.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
41 static const float max_quant_delta=5.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
42 /* Limits on stream-level deviation of quantizer ( used to make
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
43 overall bitrate of stream close to requested value ) */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
44 static const float min_rc_quant_delta=.6f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
45 static const float max_rc_quant_delta=1.5f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
46
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
47 /* Crispness parameter controls threshold for decision whether
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
48 to skip the frame or to code it. */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
49 //static const float max_crispness=100.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
50 /* Maximum allowed number of skipped frames in a line. */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
51 //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
52
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
53
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
54 typedef struct entry_s
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
55 /* max 28 bytes/frame or 5 Mb for 2-hour movie */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
56 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
57 int quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
58 int text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
59 int motion_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
60 int total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
61 float mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
62 short is_key_frame;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
63 short drop;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
64 } entry;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
65
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
66 static int m_iCount;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
67 static int m_iQuant;
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7491
diff changeset
68 /*static int m_iCrispness;*/
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
69 static short m_bDrop;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
70 static float m_fQuant;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
71
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
72 static int64_t m_lEncodedBits;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
73 static int64_t m_lExpectedBits;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
74
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
75 static FILE *m_pFile;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
76
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
77 static entry vFrame;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
78 static entry *m_vFrames;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
79 static long lFrameStart;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
80
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
81 static int iNumFrames;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
82 static int dummy;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
83
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
84
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
85 void VbrControl_init_1pass_vbr(int quality, int crispness)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
86 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
87 m_fQuant=min_quantizer+((max_quantizer-min_quantizer)/6.)*(6-quality);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
88 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
89 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
90 VbrControl_update_1pass_vbr();
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
91 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
92
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
93 int VbrControl_init_2pass_vbr_analysis(const char *filename, int quality)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
94 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
95 m_pFile=fopen(filename, "wb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
96 if(m_pFile==0)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
97 return -1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
98 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
99 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
100 fprintf(m_pFile, "##version 1\n");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
101 fprintf(m_pFile, "quality %d\n", quality);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
102 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
103 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
104
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
105 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
106 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
107 int i;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
108
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
109 int64_t text_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
110 int64_t total_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
111 int64_t complexity=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
112 int64_t new_complexity=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
113 int64_t motion_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
114 int64_t denominator=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
115 float qual_multiplier=1.;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
116 char head[20];
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
117
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
118 int64_t desired_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
119 int64_t non_text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
120
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
121 float average_complexity;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
122
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
123 m_pFile=fopen(filename, "rb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
124 if(m_pFile==0)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
125 return -1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
126 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
127 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
128
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
129 fread(head, 10, 1, m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
130 if(!strncmp("##version ", head, 10))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
131 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
132 int version;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
133 int iOldQual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
134 float old_qual, new_qual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
135 fscanf(m_pFile, "%d\n", &version);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
136 fscanf(m_pFile, "quality %d\n", &iOldQual);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
137 switch(iOldQual)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
138 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
139 case 5:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
140 old_qual=1.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
141 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
142 case 4:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
143 old_qual=1.1f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
144 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
145 case 3:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
146 old_qual=1.25f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
147 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
148 case 2:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
149 old_qual=1.4f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
150 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
151 case 1:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
152 old_qual=2.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
153 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
154 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
155 switch(quality)
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 new_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 new_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 new_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 new_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 new_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 qual_multiplier=new_qual/old_qual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
174 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
175 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
176 fseek(m_pFile, 0, SEEK_SET);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
177
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
178 lFrameStart=ftell(m_pFile); // save current position
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
179
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
180 /* removed C++ dependencies, now read file twice :-( */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
181
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
182
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
183 while(!feof(m_pFile))
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7491
diff changeset
184 { fscanf(m_pFile, "Frame %d: intra %hd, quant %d, texture %d, motion %d, total %d\n",
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
185 &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
186
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
187 vFrame.total_bits+=vFrame.text_bits*(qual_multiplier-1);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
188 vFrame.text_bits*=qual_multiplier;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
189 text_bits +=(int64_t)vFrame.text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
190 motion_bits += (int64_t)vFrame.motion_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
191 total_bits +=(int64_t)vFrame.total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
192 complexity +=(int64_t)vFrame.text_bits*vFrame.quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
193
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
194 // printf("Frames %d, texture %d, motion %d, quant %d total %d ",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
195 // iNumFrames, vFrame.text_bits, vFrame.motion_bits, vFrame.quant, vFrame.total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
196 // printf("texture %d, total %d, complexity %lld \n",vFrame.text_bits,vFrame.total_bits, complexity);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
197 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
198 iNumFrames++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
199 average_complexity=complexity/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
200
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
201 // if (verbose & TC_DEBUG) {
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
202 // 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
203 // }
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
204
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
205 m_vFrames = (entry*)malloc(iNumFrames*sizeof(entry));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
206 if (!m_vFrames)
13699
11b249ef87b0 printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents: 8254
diff changeset
207 { mp_msg(MSGT_FIXME, MSGL_FIXME,MSGTR_OutOfMemory);
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
208 return -2; //TC_EXPORT_ERROR;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
209 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
210
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
211 fseek(m_pFile, lFrameStart, SEEK_SET); // start again
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
212
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
213 for (i=0;i<iNumFrames;i++)
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7491
diff changeset
214 { fscanf(m_pFile, "Frame %d: intra %hd, quant %d, texture %d, motion %d, total %d\n",
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
215 &dummy, &(m_vFrames[i].is_key_frame), &(m_vFrames[i].quant),
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
216 &(m_vFrames[i].text_bits), &(m_vFrames[i].motion_bits),
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
217 &(m_vFrames[i].total_bits));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
218
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
219 m_vFrames[i].total_bits += m_vFrames[i].text_bits*(qual_multiplier-1);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
220 m_vFrames[i].text_bits *= qual_multiplier;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
221 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
222
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
223 if (m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
224 { fclose(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
225 m_pFile=NULL;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
226 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
227
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
228 desired_bits=(int64_t)bitrate*(int64_t)iNumFrames/framerate;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
229 non_text_bits=total_bits-text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
230
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
231 if(desired_bits<=non_text_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
232 {
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7491
diff changeset
233 /* char s[200];*/
13699
11b249ef87b0 printf --> mp_msg by the Wanderer <inverseparadox at comcast dot net>
diego
parents: 8254
diff changeset
234 mp_msg(MSGT_FIXME, MSGL_FIXME, MSGTR_OverridingTooLowBitrate,
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
235 (float)(non_text_bits*framerate/(int64_t)iNumFrames));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
236
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
237 desired_bits=non_text_bits*3/2;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
238 /*
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
239 m_fQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
240 for(int i=0; i<iNumFrames; i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
241 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
242 m_vFrames[i].drop=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
243 m_vFrames[i].mult=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
244 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
245 VbrControl_set_quant(m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
246 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
247 */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
248 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
249
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
250 desired_bits -= non_text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
251 /**
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
252 BRIEF EXPLANATION OF WHAT'S GOING ON HERE.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
253 We assume that
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
254 text_bits=complexity / quantizer
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
255 total_bits-text_bits = const(complexity)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
256 where 'complexity' is a characteristic of the frame
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
257 and does not depend much on quantizer dynamics.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
258 Using this equation, we calculate 'average' quantizer
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
259 to be used for encoding ( 1st order effect ).
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
260 Having constant quantizer for the entire stream is not
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
261 very convenient - reconstruction errors are
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
262 more noticeable in low-motion scenes. To compensate
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
263 this effect, we multiply quantizer for each frame by
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
264 (complexity/average_complexity)^k,
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
265 ( k - parameter of adjustment ). k=0 means 'no compensation'
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
266 and k=1 is 'constant bitrate mode'. We choose something in
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
267 between, like 0.5 ( 2nd order effect ).
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 average_complexity=complexity/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
271
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
272 for(i=0; i<iNumFrames; i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
273 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
274 float mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
275 if(m_vFrames[i].is_key_frame)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
276 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
277 if((i+1<iNumFrames) && (m_vFrames[i+1].is_key_frame))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
278 mult=1.25;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
279 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
280 mult=.75;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
281 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
282 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
283 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
284 mult=m_vFrames[i].text_bits*m_vFrames[i].quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
285 mult=(float)sqrt(mult/average_complexity);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
286
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
287 // if(i && m_vFrames[i-1].is_key_frame)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
288 // mult *= 0.75;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
289 if(mult<0.5)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
290 mult=0.5;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
291 if(mult>1.5)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
292 mult=1.5;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
293 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
294
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
295 m_vFrames[i].mult=mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
296 m_vFrames[i].drop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
297 new_complexity+=m_vFrames[i].text_bits*m_vFrames[i].quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
298
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
299 denominator+=desired_bits*m_vFrames[i].mult/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
300 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
301
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
302 m_fQuant=((double)new_complexity)/(double)denominator;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
303
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
304 if(m_fQuant<min_quantizer) m_fQuant=min_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
305 if(m_fQuant>max_quantizer) m_fQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
306 m_pFile=fopen("analyse.log", "wb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
307 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
308 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
309 fprintf(m_pFile, "Total frames: %d Avg quantizer: %f\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
310 iNumFrames, m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
311 fprintf(m_pFile, "Expecting %12lld bits\n", desired_bits+non_text_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
312 fflush(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
313 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
314 VbrControl_set_quant(m_fQuant*m_vFrames[0].mult);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
315 m_lEncodedBits=m_lExpectedBits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
316 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
317 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
318
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
319 int VbrControl_get_intra()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
320 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
321 return m_vFrames[m_iCount].is_key_frame;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
322 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
323
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
324 short VbrControl_get_drop()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
325 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
326 return m_bDrop;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
327 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
328
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
329 int VbrControl_get_quant()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
330 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
331 return m_iQuant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
332 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
333
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
334 void VbrControl_set_quant(float quant)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
335 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
336 m_iQuant=quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
337 if((rand() % 10)<((quant-m_iQuant) * 10))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
338 m_iQuant++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
339 if(m_iQuant<min_quantizer) m_iQuant=min_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
340 if(m_iQuant>max_quantizer) m_iQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
341 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
342
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
343 void VbrControl_update_1pass_vbr()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
344 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
345 VbrControl_set_quant(m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
346 m_iCount++;
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 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
350 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
351 if(!m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
352 return;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
353 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
354 m_iCount, is_key_frame, quant, texture_bits, motion_bits, total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
355 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
356 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
357
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
358 void VbrControl_update_2pass_vbr_encoding(int motion_bits, int texture_bits, int total_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
359 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
360 double q;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
361 double dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
362
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
363 if(m_iCount>=iNumFrames)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
364 return;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
365
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
366 m_lExpectedBits+=(m_vFrames[m_iCount].total_bits-m_vFrames[m_iCount].text_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
367 + m_vFrames[m_iCount].text_bits*m_vFrames[m_iCount].quant/m_fQuant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
368 m_lEncodedBits+=(int64_t)total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
369
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
370 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
371 fprintf(m_pFile, "Frame %d: PRESENT, complexity %d, quant multiplier %f, texture %d, total %d ",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
372 m_iCount, m_vFrames[m_iCount].text_bits*m_vFrames[m_iCount].quant,
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
373 m_vFrames[m_iCount].mult, texture_bits, total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
374
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 q = m_fQuant * m_vFrames[m_iCount].mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
378 if(q<m_fQuant+min_quant_delta) q=m_fQuant+min_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
379 if(q>m_fQuant+max_quant_delta) q=m_fQuant+max_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
380
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
381 dq = (double)m_lEncodedBits/(double)m_lExpectedBits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
382 dq*=dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
383 if(dq<min_rc_quant_delta)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
384 dq=min_rc_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
385 if(dq>max_rc_quant_delta)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
386 dq=max_rc_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
387 if(m_iCount<20) // no framerate corrections in first frames
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
388 dq=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
389 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
390 fprintf(m_pFile, "Progress: expected %12lld, achieved %12lld, dq %f",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
391 m_lExpectedBits, m_lEncodedBits, dq);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
392 q *= dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
393 VbrControl_set_quant(q);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
394 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
395 fprintf(m_pFile, ", new quant %d\n", m_iQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
396 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
397
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
398 void VbrControl_close()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
399 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
400 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
401 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
402 fclose(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
403 m_pFile=NULL;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
404 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
405 free(m_vFrames);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
406 }