|
|
|
@@ -228,10 +228,12 @@ fail: |
|
|
|
static int64_t read_trun_duration(AVIOContext *in, int default_duration, |
|
|
|
int64_t end) |
|
|
|
{ |
|
|
|
int64_t ret = 0; |
|
|
|
int64_t dts = 0; |
|
|
|
int64_t pos; |
|
|
|
int flags, i; |
|
|
|
int entries; |
|
|
|
int64_t first_pts = 0; |
|
|
|
int64_t max_pts = 0; |
|
|
|
avio_r8(in); /* version */ |
|
|
|
flags = avio_rb24(in); |
|
|
|
if (default_duration <= 0 && !(flags & MOV_TRUN_SAMPLE_DURATION)) { |
|
|
|
@@ -246,19 +248,23 @@ static int64_t read_trun_duration(AVIOContext *in, int default_duration, |
|
|
|
pos = avio_tell(in); |
|
|
|
for (i = 0; i < entries && pos < end; i++) { |
|
|
|
int sample_duration = default_duration; |
|
|
|
int64_t pts = dts; |
|
|
|
if (flags & MOV_TRUN_SAMPLE_DURATION) sample_duration = avio_rb32(in); |
|
|
|
if (flags & MOV_TRUN_SAMPLE_SIZE) avio_rb32(in); |
|
|
|
if (flags & MOV_TRUN_SAMPLE_FLAGS) avio_rb32(in); |
|
|
|
if (flags & MOV_TRUN_SAMPLE_CTS) avio_rb32(in); |
|
|
|
if (flags & MOV_TRUN_SAMPLE_CTS) pts += avio_rb32(in); |
|
|
|
if (sample_duration < 0) { |
|
|
|
fprintf(stderr, "Negative sample duration %d\n", sample_duration); |
|
|
|
return -1; |
|
|
|
} |
|
|
|
ret += sample_duration; |
|
|
|
if (i == 0) |
|
|
|
first_pts = pts; |
|
|
|
max_pts = FFMAX(max_pts, pts + sample_duration); |
|
|
|
dts += sample_duration; |
|
|
|
pos = avio_tell(in); |
|
|
|
} |
|
|
|
|
|
|
|
return ret; |
|
|
|
return max_pts - first_pts; |
|
|
|
} |
|
|
|
|
|
|
|
static int64_t read_moof_duration(AVIOContext *in, int64_t offset) |
|
|
|
|