mov.c解析

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

                   ......

         }

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值