annotate divx4_vbr.c @ 8843:c70444c5b516

I have seen problems where DVD subtitles don't display at the right time and sometimes they don't appear at all. The problem stems from the fact that subtitle command packets are being applied as soon as they are read and assembled from the input stream. Sometimes, a fully assembled subtitle packet arrives at the spudec_assemble function before the previous subtitle appears onscreen and thus the viewer only sees the second subtitle. So I created a patch that queues assembled subtitle packets and applies them at the appropriate time within the heartbeat function. The reset function clears the packet queue when seeking through the video. Tomasz Farkas <tomasz_farkas@yahoo.co.uk>
author arpi
date Wed, 08 Jan 2003 18:36:36 +0000
parents 772d6d27fd66
children 11b249ef87b0
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
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
26 //#include "transcode.h"
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
27
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
28 #define FALSE 0
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
29 #define TRUE 1
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
30
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
31 /* Absolute maximum and minimum quantizers used in VBR modes */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
32 static const int min_quantizer=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
33 static const int max_quantizer=31;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
34
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
35 /* Limits on frame-level deviation of quantizer ( higher values
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
36 correspond to frames with more changes and vice versa ) */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
37 static const float min_quant_delta=-10.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
38 static const float max_quant_delta=5.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
39 /* Limits on stream-level deviation of quantizer ( used to make
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
40 overall bitrate of stream close to requested value ) */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
41 static const float min_rc_quant_delta=.6f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
42 static const float max_rc_quant_delta=1.5f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
43
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
44 /* Crispness parameter controls threshold for decision whether
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
45 to skip the frame or to code it. */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
46 //static const float max_crispness=100.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
47 /* Maximum allowed number of skipped frames in a line. */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
48 //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
49
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
50
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
51 typedef struct entry_s
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
52 /* max 28 bytes/frame or 5 Mb for 2-hour movie */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
53 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
54 int quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
55 int text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
56 int motion_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
57 int total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
58 float mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
59 short is_key_frame;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
60 short drop;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
61 } entry;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
62
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
63 static int m_iCount;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
64 static int m_iQuant;
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7491
diff changeset
65 /*static int m_iCrispness;*/
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
66 static short m_bDrop;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
67 static float m_fQuant;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
68
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
69 static int64_t m_lEncodedBits;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
70 static int64_t m_lExpectedBits;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
71
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
72 static FILE *m_pFile;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
73
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
74 static entry vFrame;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
75 static entry *m_vFrames;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
76 static long lFrameStart;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
77
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
78 static int iNumFrames;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
79 static int dummy;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
80
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
81
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
82 void VbrControl_init_1pass_vbr(int quality, int crispness)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
83 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
84 m_fQuant=min_quantizer+((max_quantizer-min_quantizer)/6.)*(6-quality);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
85 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
86 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
87 VbrControl_update_1pass_vbr();
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
88 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
89
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
90 int VbrControl_init_2pass_vbr_analysis(const char *filename, int quality)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
91 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
92 m_pFile=fopen(filename, "wb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
93 if(m_pFile==0)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
94 return -1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
95 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
96 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
97 fprintf(m_pFile, "##version 1\n");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
98 fprintf(m_pFile, "quality %d\n", quality);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
99 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
100 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
101
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
102 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
103 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
104 int i;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
105
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
106 int64_t text_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
107 int64_t total_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
108 int64_t complexity=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
109 int64_t new_complexity=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
110 int64_t motion_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
111 int64_t denominator=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
112 float qual_multiplier=1.;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
113 char head[20];
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
114
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
115 int64_t desired_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
116 int64_t non_text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
117
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
118 float average_complexity;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
119
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
120 m_pFile=fopen(filename, "rb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
121 if(m_pFile==0)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
122 return -1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
123 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
124 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
125
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
126 fread(head, 10, 1, m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
127 if(!strncmp("##version ", head, 10))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
128 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
129 int version;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
130 int iOldQual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
131 float old_qual, new_qual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
132 fscanf(m_pFile, "%d\n", &version);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
133 fscanf(m_pFile, "quality %d\n", &iOldQual);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
134 switch(iOldQual)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
135 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
136 case 5:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
137 old_qual=1.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
138 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
139 case 4:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
140 old_qual=1.1f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
141 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
142 case 3:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
143 old_qual=1.25f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
144 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
145 case 2:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
146 old_qual=1.4f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
147 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
148 case 1:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
149 old_qual=2.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
150 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
151 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
152 switch(quality)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
153 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
154 case 5:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
155 new_qual=1.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
156 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
157 case 4:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
158 new_qual=1.1f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
159 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
160 case 3:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
161 new_qual=1.25f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
162 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
163 case 2:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
164 new_qual=1.4f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
165 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
166 case 1:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
167 new_qual=2.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
168 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
169 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
170 qual_multiplier=new_qual/old_qual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
171 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
172 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
173 fseek(m_pFile, 0, SEEK_SET);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
174
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
175 lFrameStart=ftell(m_pFile); // save current position
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
176
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
177 /* removed C++ dependencies, now read file twice :-( */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
178
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
179
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
180 while(!feof(m_pFile))
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7491
diff changeset
181 { 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
182 &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
183
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
184 vFrame.total_bits+=vFrame.text_bits*(qual_multiplier-1);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
185 vFrame.text_bits*=qual_multiplier;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
186 text_bits +=(int64_t)vFrame.text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
187 motion_bits += (int64_t)vFrame.motion_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
188 total_bits +=(int64_t)vFrame.total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
189 complexity +=(int64_t)vFrame.text_bits*vFrame.quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
190
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
191 // printf("Frames %d, texture %d, motion %d, quant %d total %d ",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
192 // iNumFrames, vFrame.text_bits, vFrame.motion_bits, vFrame.quant, vFrame.total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
193 // printf("texture %d, total %d, complexity %lld \n",vFrame.text_bits,vFrame.total_bits, complexity);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
194 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
195 iNumFrames++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
196 average_complexity=complexity/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
197
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
198 // if (verbose & TC_DEBUG) {
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
199 // 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
200 // }
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
201
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
202 m_vFrames = (entry*)malloc(iNumFrames*sizeof(entry));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
203 if (!m_vFrames)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
204 { printf("out of memory");
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
205 return -2; //TC_EXPORT_ERROR;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
206 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
207
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
208 fseek(m_pFile, lFrameStart, SEEK_SET); // start again
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
209
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
210 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
211 { 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
212 &dummy, &(m_vFrames[i].is_key_frame), &(m_vFrames[i].quant),
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
213 &(m_vFrames[i].text_bits), &(m_vFrames[i].motion_bits),
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
214 &(m_vFrames[i].total_bits));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
215
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
216 m_vFrames[i].total_bits += m_vFrames[i].text_bits*(qual_multiplier-1);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
217 m_vFrames[i].text_bits *= qual_multiplier;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
218 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
219
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
220 if (m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
221 { fclose(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
222 m_pFile=NULL;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
223 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
224
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
225 desired_bits=(int64_t)bitrate*(int64_t)iNumFrames/framerate;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
226 non_text_bits=total_bits-text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
227
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
228 if(desired_bits<=non_text_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
229 {
8254
772d6d27fd66 warning patch by (Dominik Mierzejewski <dominik at rangers dot eu dot org>)
michael
parents: 7491
diff changeset
230 /* char s[200];*/
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
231 printf("Specified bitrate is too low for this clip.\n"
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
232 "Minimum possible bitrate for the clip is %.0f kbps. Overriding\n"
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
233 "user-specified value.\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
234 (float)(non_text_bits*framerate/(int64_t)iNumFrames));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
235
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
236 desired_bits=non_text_bits*3/2;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
237 /*
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
238 m_fQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
239 for(int i=0; i<iNumFrames; i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
240 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
241 m_vFrames[i].drop=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
242 m_vFrames[i].mult=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
243 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
244 VbrControl_set_quant(m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
245 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
246 */
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 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 BRIEF EXPLANATION OF WHAT'S GOING ON HERE.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
252 We assume that
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
253 text_bits=complexity / quantizer
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
254 total_bits-text_bits = const(complexity)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
255 where 'complexity' is a characteristic of the frame
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
256 and does not depend much on quantizer dynamics.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
257 Using this equation, we calculate 'average' quantizer
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
258 to be used for encoding ( 1st order effect ).
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
259 Having constant quantizer for the entire stream is not
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
260 very convenient - reconstruction errors are
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
261 more noticeable in low-motion scenes. To compensate
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
262 this effect, we multiply quantizer for each frame by
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
263 (complexity/average_complexity)^k,
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
264 ( k - parameter of adjustment ). k=0 means 'no compensation'
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
265 and k=1 is 'constant bitrate mode'. We choose something in
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
266 between, like 0.5 ( 2nd order effect ).
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 average_complexity=complexity/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
270
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
271 for(i=0; i<iNumFrames; i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
272 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
273 float mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
274 if(m_vFrames[i].is_key_frame)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
275 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
276 if((i+1<iNumFrames) && (m_vFrames[i+1].is_key_frame))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
277 mult=1.25;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
278 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
279 mult=.75;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
280 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
281 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
282 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
283 mult=m_vFrames[i].text_bits*m_vFrames[i].quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
284 mult=(float)sqrt(mult/average_complexity);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
285
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
286 // if(i && m_vFrames[i-1].is_key_frame)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
287 // mult *= 0.75;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
288 if(mult<0.5)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
289 mult=0.5;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
290 if(mult>1.5)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
291 mult=1.5;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
292 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
293
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
294 m_vFrames[i].mult=mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
295 m_vFrames[i].drop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
296 new_complexity+=m_vFrames[i].text_bits*m_vFrames[i].quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
297
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
298 denominator+=desired_bits*m_vFrames[i].mult/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
299 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
300
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
301 m_fQuant=((double)new_complexity)/(double)denominator;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
302
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
303 if(m_fQuant<min_quantizer) m_fQuant=min_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
304 if(m_fQuant>max_quantizer) m_fQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
305 m_pFile=fopen("analyse.log", "wb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
306 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
307 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
308 fprintf(m_pFile, "Total frames: %d Avg quantizer: %f\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
309 iNumFrames, m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
310 fprintf(m_pFile, "Expecting %12lld bits\n", desired_bits+non_text_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
311 fflush(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
312 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
313 VbrControl_set_quant(m_fQuant*m_vFrames[0].mult);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
314 m_lEncodedBits=m_lExpectedBits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
315 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
316 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
317
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
318 int VbrControl_get_intra()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
319 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
320 return m_vFrames[m_iCount].is_key_frame;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
321 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
322
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
323 short VbrControl_get_drop()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
324 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
325 return m_bDrop;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
326 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
327
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
328 int VbrControl_get_quant()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
329 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
330 return m_iQuant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
331 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
332
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
333 void VbrControl_set_quant(float quant)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
334 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
335 m_iQuant=quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
336 if((rand() % 10)<((quant-m_iQuant) * 10))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
337 m_iQuant++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
338 if(m_iQuant<min_quantizer) m_iQuant=min_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
339 if(m_iQuant>max_quantizer) m_iQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
340 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
341
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
342 void VbrControl_update_1pass_vbr()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
343 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
344 VbrControl_set_quant(m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
345 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
346 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
347
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
348 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
349 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
350 if(!m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
351 return;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
352 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
353 m_iCount, is_key_frame, quant, texture_bits, motion_bits, total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
354 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
355 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
356
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
357 void VbrControl_update_2pass_vbr_encoding(int motion_bits, int texture_bits, int total_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
358 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
359 double q;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
360 double dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
361
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
362 if(m_iCount>=iNumFrames)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
363 return;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
364
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
365 m_lExpectedBits+=(m_vFrames[m_iCount].total_bits-m_vFrames[m_iCount].text_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
366 + m_vFrames[m_iCount].text_bits*m_vFrames[m_iCount].quant/m_fQuant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
367 m_lEncodedBits+=(int64_t)total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
368
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
369 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
370 fprintf(m_pFile, "Frame %d: PRESENT, complexity %d, quant multiplier %f, texture %d, total %d ",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
371 m_iCount, m_vFrames[m_iCount].text_bits*m_vFrames[m_iCount].quant,
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
372 m_vFrames[m_iCount].mult, texture_bits, total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
373
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
374 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
375
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
376 q = m_fQuant * m_vFrames[m_iCount].mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
377 if(q<m_fQuant+min_quant_delta) q=m_fQuant+min_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
378 if(q>m_fQuant+max_quant_delta) q=m_fQuant+max_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
379
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
380 dq = (double)m_lEncodedBits/(double)m_lExpectedBits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
381 dq*=dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
382 if(dq<min_rc_quant_delta)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
383 dq=min_rc_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
384 if(dq>max_rc_quant_delta)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
385 dq=max_rc_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
386 if(m_iCount<20) // no framerate corrections in first frames
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
387 dq=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
388 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
389 fprintf(m_pFile, "Progress: expected %12lld, achieved %12lld, dq %f",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
390 m_lExpectedBits, m_lEncodedBits, dq);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
391 q *= dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
392 VbrControl_set_quant(q);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
393 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
394 fprintf(m_pFile, ", new quant %d\n", m_iQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
395 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
396
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
397 void VbrControl_close()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
398 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
399 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
400 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
401 fclose(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
402 m_pFile=NULL;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
403 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
404 free(m_vFrames);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
405 }