//解析BOX
static int mov_read_default(MOVContext *c, AVIOContext *pb, MOVAtom atom)
{
int (*parse)(MOVContext*, AVIOContext*, MOVAtom) = NULL;
a.size = avio_rb32(pb);
a.type = avio_rl32(pb);
然后根据type的具体的parse。
}
//读取sample信息。
static void mov_build_index(MOVContext *mov, AVStream *st)
{
if (av_reallocp_array(&st->index_entries,
st->nb_index_entries + sc->sample_count,
sizeof(*st->index_entries)) < 0) {
st->nb_index_entries = 0;
return;
}
AVIndexEntry *e;
e = &st->index_entries[st->nb_index_entries++];
//每个sample值读到index_entries。
}
//读sample
static AVIndexEntry *mov_find_next_sample(AVFormatContext *s, AVStream **st)
{
AVIndexEntry *sample = NULL;
int64_t best_dts = INT64_MAX;
int i;
for (i = 0; i < s->nb_streams; i++) {
AVStream *avst = s->streams[i];
MOVStreamContext *msc = avst->priv_data;
if (msc->pb && msc->current_sample < avst->nb_index_entries) {
AVIndexEntry *current_sample = &avst->index_entries[msc->current_sample];
int64_t dts = av_rescale(current_sample->timestamp, AV_TIME_BASE, msc->time_scale);
av_log(s, AV_LOG_TRACE, "stream %d, sample %d, dts %"PRId64"\n", i, msc->current_sample, dts);
if (!sample || (!s->pb->seekable && current_sample->pos < sample->pos) ||
(s->pb->seekable &&
((msc->pb != s->pb && dts < best_dts) || (msc->pb == s->pb &&
((FFABS(best_dts - dts) <= AV_TIME_BASE && current_sample->pos < sample->pos) ||
(FFABS(best_dts - dts) > AV_TIME_BASE && dts < best_dts)))))) {
sample = current_sample;
best_dts = dts;
*st = avst;
}
}
}
return sample;
}
static int mov_read_packet(AVFormatContext *s, AVPacket *pkt)
{
调用mov_find_next_sample
pkt->dts = sample->timestamp;
//此处-512变成512,0
if (sc->ctts_data && sc->ctts_index < sc->ctts_count) {
pkt->pts = pkt->dts + sc->dts_shift + sc->ctts_data[sc->ctts_index].duration;
......
}
}