mirror of https://git.ffmpeg.org/ffmpeg.git
cleanup frame_rate code, this may also fix some large file bugs
Originally committed as revision 2924 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
0a90160a29
commit
d957696f17
|
@ -16,6 +16,9 @@
|
|||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <limits.h>
|
||||
|
||||
#include "avformat.h"
|
||||
#include "avi.h"
|
||||
|
||||
|
@ -1168,8 +1171,8 @@ static int mov_read_stts(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
|
|||
AVStream *st = c->fc->streams[c->fc->nb_streams-1];
|
||||
//MOVStreamContext *sc = (MOVStreamContext *)st->priv_data;
|
||||
int entries, i;
|
||||
int duration=0;
|
||||
int total_sample_count=0;
|
||||
int64_t duration=0;
|
||||
int64_t total_sample_count=0;
|
||||
|
||||
print_atom("stts", atom);
|
||||
|
||||
|
@ -1205,31 +1208,16 @@ printf("track[%i].stts.entries = %i\n", c->fc->nb_streams-1, entries);
|
|||
#endif
|
||||
}
|
||||
|
||||
#define MAX(a,b) a>b?a:b
|
||||
#define MIN(a,b) a>b?b:a
|
||||
/*The stsd atom which contain codec type sometimes comes after the stts so we cannot check for codec_type*/
|
||||
if(duration>0)
|
||||
{
|
||||
//Find greatest common divisor to avoid overflow using the Euclidean Algorithm...
|
||||
uint32_t max=MAX(duration,total_sample_count);
|
||||
uint32_t min=MIN(duration,total_sample_count);
|
||||
uint32_t spare=max%min;
|
||||
|
||||
while(spare!=0)
|
||||
{
|
||||
max=min;
|
||||
min=spare;
|
||||
spare=max%min;
|
||||
}
|
||||
|
||||
duration/=min;
|
||||
total_sample_count/=min;
|
||||
|
||||
//Only support constant frame rate. But lets calculate the average. Needed by .mp4-files created with nec e606 3g phone.
|
||||
//To get better precision, we use the duration as frame_rate_base
|
||||
|
||||
st->codec.frame_rate_base=duration;
|
||||
st->codec.frame_rate = c->streams[c->total_streams]->time_scale * total_sample_count;
|
||||
av_reduce(
|
||||
&st->codec.frame_rate,
|
||||
&st->codec.frame_rate_base,
|
||||
c->streams[c->total_streams]->time_scale * total_sample_count,
|
||||
duration,
|
||||
INT_MAX
|
||||
);
|
||||
|
||||
#ifdef DEBUG
|
||||
printf("FRAME RATE average (video or audio)= %f (tot sample count= %i ,tot dur= %i timescale=%d)\n", (float)st->codec.frame_rate/st->codec.frame_rate_base,total_sample_count,duration,c->streams[c->total_streams]->time_scale);
|
||||
|
@ -1240,8 +1228,6 @@ printf("track[%i].stts.entries = %i\n", c->fc->nb_streams-1, entries);
|
|||
st->codec.frame_rate_base = 1;
|
||||
st->codec.frame_rate = c->streams[c->total_streams]->time_scale;
|
||||
}
|
||||
#undef MAX
|
||||
#undef MIN
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue