@ -652,7 +652,7 @@ static int mov_read_mdhd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
# ifdef DEBUG
av_log ( NULL , AV_LOG_DEBUG , " track[%i].time_scale = %i \n " , c - > fc - > nb_streams - 1 , c - > streams [ c - > fc - > nb_streams - 1 ] - > time_scale ) ; /* time scale */
# endif
get_be32 ( pb ) ; /* duration */
c - > fc - > streams [ c - > fc - > nb_streams - 1 ] - > duration = get_be32 ( pb ) ; /* duration */
get_be16 ( pb ) ; /* language */
get_be16 ( pb ) ; /* quality */
@ -1338,44 +1338,20 @@ av_log(NULL, AV_LOG_DEBUG, "track[%i].stts.entries = %i\n", c->fc->nb_streams-1,
sample_duration = get_be32 ( pb ) ;
c - > streams [ c - > fc - > nb_streams - 1 ] - > stts_data [ i ] . count = sample_count ;
c - > streams [ c - > fc - > nb_streams - 1 ] - > stts_data [ i ] . duration = sample_duration ;
# ifdef DEBUG
av_log ( NULL , AV_LOG_DEBUG , " sample_count=%d, sample_duration=%d \n " , sample_count , sample_duration ) ;
# endif
duration + = sample_duration * sample_count ;
total_sample_count + = sample_count ;
#if 0 //We calculate an average instead, needed by .mp4-files created with nec e606 3g phone
if ( ! i & & st - > codec . codec_type = = CODEC_TYPE_VIDEO ) {
st - > codec . time_base . num = sample_duration ? sample_duration : 1 ;
st - > codec . time_base . den = c - > streams [ c - > fc - > nb_streams - 1 ] - > time_scale ;
# ifdef DEBUG
av_log ( NULL , AV_LOG_DEBUG , " VIDEO FRAME RATE= %i (sd= %i) \n " , st - > codec . time_base . den , sample_duration ) ;
# endif
}
# endif
}
/*The stsd atom which contain codec type sometimes comes after the stts so we cannot check for codec_type*/
if ( duration > 0 )
{
av_reduce (
& st - > codec . time_base . den ,
& st - > codec . time_base . num ,
c - > streams [ c - > fc - > nb_streams - 1 ] - > time_scale * total_sample_count ,
duration ,
INT_MAX
) ;
# ifdef DEBUG
av_log ( NULL , AV_LOG_DEBUG , " FRAME RATE average (video or audio)= %f (tot sample count= %i ,tot dur= %i timescale=%d) \n " , ( float ) st - > codec . time_base . den / st - > codec . time_base . num , total_sample_count , duration , c - > streams [ c - > fc - > nb_streams - 1 ] - > time_scale ) ;
# endif
}
else
{
st - > codec . time_base . num = 1 ;
st - > codec . time_base . den = c - > streams [ c - > fc - > nb_streams - 1 ] - > time_scale ;
}
av_set_pts_info ( st , 64 , 1 , c - > streams [ c - > fc - > nb_streams - 1 ] - > time_scale ) ;
// st->codec.time_base.num = 1;
// st->codec.time_base.den = c->streams[c->fc->nb_streams-1]->time_scale;
st - > nb_frames = total_sample_count ;
if ( duration )
st - > duration = duration ;
return 0 ;
}
@ -1425,7 +1401,6 @@ static int mov_read_trak(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
st - > priv_data = sc ;
st - > codec . codec_type = CODEC_TYPE_MOV_OTHER ;
st - > start_time = 0 ; /* XXX: check */
st - > duration = ( c - > duration * ( int64_t ) AV_TIME_BASE ) / c - > time_scale ;
c - > streams [ c - > fc - > nb_streams - 1 ] = sc ;
return mov_read_default ( c , pb , atom ) ;
@ -1455,7 +1430,7 @@ static int mov_read_tkhd(MOVContext *c, ByteIOContext *pb, MOV_atom_t atom)
st - > id = ( int ) get_be32 ( pb ) ; /* track id (NOT 0 !)*/
get_be32 ( pb ) ; /* reserved */
st - > start_time = 0 ; /* check */
st - > duration = ( get_be32 ( pb ) * ( int64_t ) AV_TIME_BASE ) / c - > time_scale ; /* duration */
get_be32 ( pb ) ; /* highlevel (considering edits) duration in movie timebase */
get_be32 ( pb ) ; /* reserved */
get_be32 ( pb ) ; /* reserved */
@ -2033,12 +2008,8 @@ readchunk:
pts = dts + duration ;
} else
pts = dts ;
pkt - > pts = av_rescale ( pts ,
( int64_t ) s - > streams [ sc - > ffindex ] - > time_base . den ,
( int64_t ) sc - > time_scale * ( int64_t ) s - > streams [ sc - > ffindex ] - > time_base . num ) ;
pkt - > dts = av_rescale ( dts ,
( int64_t ) s - > streams [ sc - > ffindex ] - > time_base . den ,
( int64_t ) sc - > time_scale * ( int64_t ) s - > streams [ sc - > ffindex ] - > time_base . num ) ;
pkt - > pts = pts ;
pkt - > dts = dts ;
# ifdef DEBUG
av_log ( NULL , AV_LOG_DEBUG , " stream #%d smp #%ld dts = %lld pts = %lld (smp:%ld time:%lld idx:%d ent:%d count:%d dur:%d) \n "
, pkt - > stream_index , sc - > current_sample - 1 , pkt - > dts , pkt - > pts
@ -2058,12 +2029,11 @@ readchunk:
/**
* Seek method based on the one described in the Appendix C of QTFileFormat . pdf
*/
static int mov_read_seek ( AVFormatContext * s , int stream_index , int64_t time st amp, int flags )
static int mov_read_seek ( AVFormatContext * s , int stream_index , int64_t sample_time , int flags )
{
MOVContext * mov = ( MOVContext * ) s - > priv_data ;
MOVStreamContext * sc ;
int32_t i , a , b , m ;
int64_t sample_time ;
int64_t start_time ;
int32_t seek_sample , sample ;
int32_t duration ;
@ -2100,10 +2070,6 @@ static int mov_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp
# ifdef DEBUG
av_log ( s , AV_LOG_DEBUG , " Searching for time %li in stream #%i (time_scale=%i) \n " , ( long ) timestamp , mov_idx , sc - > time_scale ) ;
# endif
// convert timestamp from time_base unit to timescale unit
sample_time = av_rescale ( timestamp ,
( int64_t ) sc - > time_scale * s - > streams [ stream_index ] - > time_base . num ,
( int64_t ) s - > streams [ stream_index ] - > time_base . den ) ;
start_time = 0 ; // FIXME use elst atom
sample = 1 ; // sample are 0 based in table
# ifdef DEBUG