mirror of
https://gitee.com/openharmony/third_party_ffmpeg
synced 2024-11-24 11:49:48 +00:00
movdec: fix dts generation in fragmented files
Do not use AVStream's duration for dts generation since it contains in some cases the duration of the whole file instead of duration of the samples in the moov. This happens if the mdhd holds the duration of the whole file but has no entries or a zero duration in its stts.
This commit is contained in:
parent
2c98f407c8
commit
7f19bdc2a2
@ -126,6 +126,7 @@ typedef struct MOVStreamContext {
|
||||
uint32_t palette[256];
|
||||
int has_palette;
|
||||
int64_t data_size;
|
||||
int64_t track_end; ///< used for dts generation in fragmented movie files
|
||||
} MOVStreamContext;
|
||||
|
||||
typedef struct MOVContext {
|
||||
|
@ -1639,6 +1639,7 @@ static int mov_read_stts(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
st->nb_frames= total_sample_count;
|
||||
if (duration)
|
||||
st->duration= duration;
|
||||
sc->track_end = duration;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2233,7 +2234,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
|
||||
if (flags & 0x001) data_offset = avio_rb32(pb);
|
||||
if (flags & 0x004) first_sample_flags = avio_rb32(pb);
|
||||
dts = st->duration - sc->time_offset;
|
||||
dts = sc->track_end - sc->time_offset;
|
||||
offset = frag->base_data_offset + data_offset;
|
||||
distance = 0;
|
||||
av_dlog(c->fc, "first sample flags 0x%x\n", first_sample_flags);
|
||||
@ -2263,7 +2264,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
|
||||
sc->data_size += sample_size;
|
||||
}
|
||||
frag->moof_offset = offset;
|
||||
st->duration = dts + sc->time_offset;
|
||||
st->duration = sc->track_end = dts + sc->time_offset;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user