annotate divx4_vbr.c @ 4218:3931c41f740a

Added new syncengine thanks to a new previously undocumented feature of the em8300, this might fix playback on both slow and fast machines (more testing needed). This also requires users to get the em8300 driver from cvs until the next version is released (will probably happen this weekend) Added lots of comments, should be pretty easy to understand most of the internals now Added lots of brackets to if's for's while's etc, this is not a cosmetical thing but rather due to the fact I got some very odd bugs with else's since I didn't properly use brackets (and it's the K&R standard to have brackets everywhere) Fixed some bugs that would occur when disabling libmp1e Switched to default to the new naming scheme of device nodes, the driver will slowly switch over to this state, if it can't find devices under the new name it will try the old naming scheme I stopped opening devices in non-blocking mode, it would break the new syncengine which tries to burst data to the device (alot of times meaning it will fill the fifo pretty fast which would previously result in jerkyness on fast machines) The device now sets the initial state of the pts and speed (probably not needed, but assumption is the mother of all fuckups =) Keep the control interface open during the entire duration of the libvo device, we might need this to flush video buffers on seeking (currently not implemented, therefore seeking is broken) This is beta stuff to the driver, I will get some users to test it for me and do my best to fix seeking as soon as possible...
author mswitch
date Thu, 17 Jan 2002 10:33:47 +0000
parents 92c59012249d
children d1cbcf738db1
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 <sys/stat.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
41 #include <unistd.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
42 #include <fcntl.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
43 #include <dlfcn.h>
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
44 #include <math.h>
4003
92c59012249d stdint.h replaced by inttypes.h (used more frequently in the sources)
pl
parents: 3919
diff changeset
45 #include <inttypes.h>
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
46
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
47 #include "divx4_vbr.h"
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
48
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
49 //#include "transcode.h"
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
50
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
51 #define FALSE 0
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
52 #define TRUE 1
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
53
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
54 /* Absolute maximum and minimum quantizers used in VBR modes */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
55 static const int min_quantizer=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
56 static const int max_quantizer=31;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
57
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
58 /* Limits on frame-level deviation of quantizer ( higher values
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
59 correspond to frames with more changes and vice versa ) */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
60 static const float min_quant_delta=-10.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
61 static const float max_quant_delta=5.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
62 /* Limits on stream-level deviation of quantizer ( used to make
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
63 overall bitrate of stream close to requested value ) */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
64 static const float min_rc_quant_delta=.6f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
65 static const float max_rc_quant_delta=1.5f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
66
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
67 /* Crispness parameter controls threshold for decision whether
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
68 to skip the frame or to code it. */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
69 //static const float max_crispness=100.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
70 /* Maximum allowed number of skipped frames in a line. */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
71 //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
72
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
73
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
74 typedef struct entry_s
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
75 /* max 28 bytes/frame or 5 Mb for 2-hour movie */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
76 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
77 int quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
78 int text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
79 int motion_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
80 int total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
81 float mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
82 short is_key_frame;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
83 short drop;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
84 } entry;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
85
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
86 static int m_iCount;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
87 static int m_iQuant;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
88 static int m_iCrispness;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
89 static short m_bDrop;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
90 static float m_fQuant;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
91
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
92 static int64_t m_lEncodedBits;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
93 static int64_t m_lExpectedBits;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
94
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
95 static FILE *m_pFile;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
96
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
97 static entry vFrame;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
98 static entry *m_vFrames;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
99 static long lFrameStart;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
100
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
101 static int iNumFrames;
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
102 static int dummy;
2641
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 void VbrControl_init_1pass_vbr(int quality, int crispness)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
106 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
107 m_fQuant=min_quantizer+((max_quantizer-min_quantizer)/6.)*(6-quality);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
108 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
109 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
110 VbrControl_update_1pass_vbr();
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
111 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
112
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
113 int VbrControl_init_2pass_vbr_analysis(const char *filename, int quality)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
114 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
115 m_pFile=fopen(filename, "wb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
116 if(m_pFile==0)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
117 return -1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
118 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
119 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
120 fprintf(m_pFile, "##version 1\n");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
121 fprintf(m_pFile, "quality %d\n", quality);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
122 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
123 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
124
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
125 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
126 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
127 int i;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
128
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
129 int64_t text_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
130 int64_t total_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
131 int64_t complexity=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
132 int64_t new_complexity=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
133 int64_t motion_bits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
134 int64_t denominator=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
135 float qual_multiplier=1.;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
136 char head[20];
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
137
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
138 int64_t desired_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
139 int64_t non_text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
140
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
141 float average_complexity;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
142
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
143 m_pFile=fopen(filename, "rb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
144 if(m_pFile==0)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
145 return -1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
146 m_bDrop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
147 m_iCount=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
148
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
149 fread(head, 10, 1, m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
150 if(!strncmp("##version ", head, 10))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
151 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
152 int version;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
153 int iOldQual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
154 float old_qual, new_qual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
155 fscanf(m_pFile, "%d\n", &version);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
156 fscanf(m_pFile, "quality %d\n", &iOldQual);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
157 switch(iOldQual)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
158 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
159 case 5:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
160 old_qual=1.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
161 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
162 case 4:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
163 old_qual=1.1f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
164 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
165 case 3:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
166 old_qual=1.25f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
167 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
168 case 2:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
169 old_qual=1.4f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
170 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
171 case 1:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
172 old_qual=2.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
173 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
174 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
175 switch(quality)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
176 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
177 case 5:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
178 new_qual=1.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
179 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
180 case 4:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
181 new_qual=1.1f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
182 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
183 case 3:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
184 new_qual=1.25f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
185 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
186 case 2:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
187 new_qual=1.4f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
188 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
189 case 1:
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
190 new_qual=2.f;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
191 break;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
192 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
193 qual_multiplier=new_qual/old_qual;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
194 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
195 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
196 fseek(m_pFile, 0, SEEK_SET);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
197
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
198 lFrameStart=ftell(m_pFile); // save current position
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
199
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
200 /* removed C++ dependencies, now read file twice :-( */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
201
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
202
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
203 while(!feof(m_pFile))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
204 { 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
205 &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
206
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
207 vFrame.total_bits+=vFrame.text_bits*(qual_multiplier-1);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
208 vFrame.text_bits*=qual_multiplier;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
209 text_bits +=(int64_t)vFrame.text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
210 motion_bits += (int64_t)vFrame.motion_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
211 total_bits +=(int64_t)vFrame.total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
212 complexity +=(int64_t)vFrame.text_bits*vFrame.quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
213
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
214 // printf("Frames %d, texture %d, motion %d, quant %d total %d ",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
215 // iNumFrames, vFrame.text_bits, vFrame.motion_bits, vFrame.quant, vFrame.total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
216 // printf("texture %d, total %d, complexity %lld \n",vFrame.text_bits,vFrame.total_bits, complexity);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
217 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
218 iNumFrames++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
219 average_complexity=complexity/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
220
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
221 // if (verbose & TC_DEBUG) {
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
222 // 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
223 // }
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
224
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
225 m_vFrames = (entry*)malloc(iNumFrames*sizeof(entry));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
226 if (!m_vFrames)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
227 { printf("out of memory");
2642
0e6e13261d79 divx4_vbr -> mplayer integration
arpi
parents: 2641
diff changeset
228 return -2; //TC_EXPORT_ERROR;
2641
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
229 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
230
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
231 fseek(m_pFile, lFrameStart, SEEK_SET); // start again
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
232
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
233 for (i=0;i<iNumFrames;i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
234 { 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
235 &dummy, &(m_vFrames[i].is_key_frame), &(m_vFrames[i].quant),
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
236 &(m_vFrames[i].text_bits), &(m_vFrames[i].motion_bits),
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
237 &(m_vFrames[i].total_bits));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
238
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
239 m_vFrames[i].total_bits += m_vFrames[i].text_bits*(qual_multiplier-1);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
240 m_vFrames[i].text_bits *= qual_multiplier;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
241 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
242
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
243 if (m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
244 { fclose(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
245 m_pFile=NULL;
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 desired_bits=(int64_t)bitrate*(int64_t)iNumFrames/framerate;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
249 non_text_bits=total_bits-text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
250
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
251 if(desired_bits<=non_text_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
252 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
253 char s[200];
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
254 printf("Specified bitrate is too low for this clip.\n"
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
255 "Minimum possible bitrate for the clip is %.0f kbps. Overriding\n"
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
256 "user-specified value.\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
257 (float)(non_text_bits*framerate/(int64_t)iNumFrames));
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
258
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
259 desired_bits=non_text_bits*3/2;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
260 /*
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
261 m_fQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
262 for(int i=0; i<iNumFrames; i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
263 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
264 m_vFrames[i].drop=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
265 m_vFrames[i].mult=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
266 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
267 VbrControl_set_quant(m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
268 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
269 */
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
270 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
271
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
272 desired_bits -= non_text_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
273 /**
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
274 BRIEF EXPLANATION OF WHAT'S GOING ON HERE.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
275 We assume that
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
276 text_bits=complexity / quantizer
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
277 total_bits-text_bits = const(complexity)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
278 where 'complexity' is a characteristic of the frame
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
279 and does not depend much on quantizer dynamics.
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
280 Using this equation, we calculate 'average' quantizer
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
281 to be used for encoding ( 1st order effect ).
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
282 Having constant quantizer for the entire stream is not
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
283 very convenient - reconstruction errors are
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
284 more noticeable in low-motion scenes. To compensate
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
285 this effect, we multiply quantizer for each frame by
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
286 (complexity/average_complexity)^k,
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
287 ( k - parameter of adjustment ). k=0 means 'no compensation'
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
288 and k=1 is 'constant bitrate mode'. We choose something in
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
289 between, like 0.5 ( 2nd order effect ).
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
290 **/
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
291
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
292 average_complexity=complexity/iNumFrames;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
293
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
294 for(i=0; i<iNumFrames; i++)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
295 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
296 float mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
297 if(m_vFrames[i].is_key_frame)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
298 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
299 if((i+1<iNumFrames) && (m_vFrames[i+1].is_key_frame))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
300 mult=1.25;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
301 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
302 mult=.75;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
303 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
304 else
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
305 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
306 mult=m_vFrames[i].text_bits*m_vFrames[i].quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
307 mult=(float)sqrt(mult/average_complexity);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
308
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
309 // if(i && m_vFrames[i-1].is_key_frame)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
310 // mult *= 0.75;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
311 if(mult<0.5)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
312 mult=0.5;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
313 if(mult>1.5)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
314 mult=1.5;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
315 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
316
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
317 m_vFrames[i].mult=mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
318 m_vFrames[i].drop=FALSE;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
319 new_complexity+=m_vFrames[i].text_bits*m_vFrames[i].quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
320
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
321 denominator+=desired_bits*m_vFrames[i].mult/iNumFrames;
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 m_fQuant=((double)new_complexity)/(double)denominator;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
325
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
326 if(m_fQuant<min_quantizer) m_fQuant=min_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
327 if(m_fQuant>max_quantizer) m_fQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
328 m_pFile=fopen("analyse.log", "wb");
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
329 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
330 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
331 fprintf(m_pFile, "Total frames: %d Avg quantizer: %f\n",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
332 iNumFrames, m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
333 fprintf(m_pFile, "Expecting %12lld bits\n", desired_bits+non_text_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
334 fflush(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
335 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
336 VbrControl_set_quant(m_fQuant*m_vFrames[0].mult);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
337 m_lEncodedBits=m_lExpectedBits=0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
338 return 0;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
339 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
340
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
341 int VbrControl_get_intra()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
342 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
343 return m_vFrames[m_iCount].is_key_frame;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
344 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
345
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
346 short VbrControl_get_drop()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
347 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
348 return m_bDrop;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
349 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
350
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
351 int VbrControl_get_quant()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
352 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
353 return m_iQuant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
354 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
355
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
356 void VbrControl_set_quant(float quant)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
357 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
358 m_iQuant=quant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
359 if((rand() % 10)<((quant-m_iQuant) * 10))
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
360 m_iQuant++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
361 if(m_iQuant<min_quantizer) m_iQuant=min_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
362 if(m_iQuant>max_quantizer) m_iQuant=max_quantizer;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
363 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
364
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
365 void VbrControl_update_1pass_vbr()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
366 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
367 VbrControl_set_quant(m_fQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
368 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
369 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
370
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
371 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
372 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
373 if(!m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
374 return;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
375 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
376 m_iCount, is_key_frame, quant, texture_bits, motion_bits, total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
377 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
378 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
379
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
380 void VbrControl_update_2pass_vbr_encoding(int motion_bits, int texture_bits, int total_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
381 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
382 double q;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
383 double dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
384
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
385 if(m_iCount>=iNumFrames)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
386 return;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
387
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
388 m_lExpectedBits+=(m_vFrames[m_iCount].total_bits-m_vFrames[m_iCount].text_bits)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
389 + m_vFrames[m_iCount].text_bits*m_vFrames[m_iCount].quant/m_fQuant;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
390 m_lEncodedBits+=(int64_t)total_bits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
391
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
392 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
393 fprintf(m_pFile, "Frame %d: PRESENT, complexity %d, quant multiplier %f, texture %d, total %d ",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
394 m_iCount, m_vFrames[m_iCount].text_bits*m_vFrames[m_iCount].quant,
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
395 m_vFrames[m_iCount].mult, texture_bits, total_bits);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
396
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
397 m_iCount++;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
398
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
399 q = m_fQuant * m_vFrames[m_iCount].mult;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
400 if(q<m_fQuant+min_quant_delta) q=m_fQuant+min_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
401 if(q>m_fQuant+max_quant_delta) q=m_fQuant+max_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
402
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
403 dq = (double)m_lEncodedBits/(double)m_lExpectedBits;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
404 dq*=dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
405 if(dq<min_rc_quant_delta)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
406 dq=min_rc_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
407 if(dq>max_rc_quant_delta)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
408 dq=max_rc_quant_delta;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
409 if(m_iCount<20) // no framerate corrections in first frames
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
410 dq=1;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
411 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
412 fprintf(m_pFile, "Progress: expected %12lld, achieved %12lld, dq %f",
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
413 m_lExpectedBits, m_lEncodedBits, dq);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
414 q *= dq;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
415 VbrControl_set_quant(q);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
416 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
417 fprintf(m_pFile, ", new quant %d\n", m_iQuant);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
418 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
419
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
420 void VbrControl_close()
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
421 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
422 if(m_pFile)
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
423 {
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
424 fclose(m_pFile);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
425 m_pFile=NULL;
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
426 }
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
427 free(m_vFrames);
41b67e5e5d38 initial import from transcode
arpi
parents:
diff changeset
428 }