|
|
|
@ -225,7 +225,8 @@ fail: |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int64_t read_trun_duration(AVIOContext *in, int64_t end) |
|
|
|
|
static int64_t read_trun_duration(AVIOContext *in, int default_duration, |
|
|
|
|
int64_t end) |
|
|
|
|
{ |
|
|
|
|
int64_t ret = 0; |
|
|
|
|
int64_t pos; |
|
|
|
@ -233,7 +234,7 @@ static int64_t read_trun_duration(AVIOContext *in, int64_t end) |
|
|
|
|
int entries; |
|
|
|
|
avio_r8(in); /* version */ |
|
|
|
|
flags = avio_rb24(in); |
|
|
|
|
if (!(flags & MOV_TRUN_SAMPLE_DURATION)) { |
|
|
|
|
if (default_duration <= 0 && !(flags & MOV_TRUN_SAMPLE_DURATION)) { |
|
|
|
|
fprintf(stderr, "No sample duration in trun flags\n"); |
|
|
|
|
return -1; |
|
|
|
|
} |
|
|
|
@ -244,7 +245,7 @@ static int64_t read_trun_duration(AVIOContext *in, int64_t end) |
|
|
|
|
|
|
|
|
|
pos = avio_tell(in); |
|
|
|
|
for (i = 0; i < entries && pos < end; i++) { |
|
|
|
|
int sample_duration = 0; |
|
|
|
|
int sample_duration = default_duration; |
|
|
|
|
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); |
|
|
|
@ -265,6 +266,7 @@ static int64_t read_moof_duration(AVIOContext *in, int64_t offset) |
|
|
|
|
int64_t ret = -1; |
|
|
|
|
int32_t moof_size, size, tag; |
|
|
|
|
int64_t pos = 0; |
|
|
|
|
int default_duration = 0; |
|
|
|
|
|
|
|
|
|
avio_seek(in, offset, SEEK_SET); |
|
|
|
|
moof_size = avio_rb32(in); |
|
|
|
@ -282,8 +284,21 @@ static int64_t read_moof_duration(AVIOContext *in, int64_t offset) |
|
|
|
|
pos = avio_tell(in); |
|
|
|
|
size = avio_rb32(in); |
|
|
|
|
tag = avio_rb32(in); |
|
|
|
|
if (tag == MKBETAG('t', 'f', 'h', 'd')) { |
|
|
|
|
int flags = 0; |
|
|
|
|
avio_r8(in); /* version */ |
|
|
|
|
flags = avio_rb24(in); |
|
|
|
|
avio_rb32(in); /* track_id */ |
|
|
|
|
if (flags & MOV_TFHD_BASE_DATA_OFFSET) |
|
|
|
|
avio_rb64(in); |
|
|
|
|
if (flags & MOV_TFHD_STSD_ID) |
|
|
|
|
avio_rb32(in); |
|
|
|
|
if (flags & MOV_TFHD_DEFAULT_DURATION) |
|
|
|
|
default_duration = avio_rb32(in); |
|
|
|
|
} |
|
|
|
|
if (tag == MKBETAG('t', 'r', 'u', 'n')) { |
|
|
|
|
return read_trun_duration(in, pos + size); |
|
|
|
|
return read_trun_duration(in, default_duration, |
|
|
|
|
pos + size); |
|
|
|
|
} |
|
|
|
|
avio_seek(in, pos + size, SEEK_SET); |
|
|
|
|
} |
|
|
|
|