mov.c解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/evsqiezi/article/details/81708090

//解析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;

                   ......

         }

}

 

 

猜你喜欢

转载自blog.csdn.net/evsqiezi/article/details/81708090