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;

                   ......

         }

}

 

 

今天小编要给大家介绍一款专门用来恢复Cannon的EOS相机内存卡上误删除和误格式化丢失的MOV录像文件的专业软件——佳能MOV视频文件恢复软件(EOS相机恢复)。佳能MOV视频文件恢复软件(EOS相机恢复)采用碎片处理技术,可以根据MOV的碎片信息,自动在内存里面重组出正确的数据,恢复后的文件可以正常播放和编辑。软件界面美观简洁、简单全面、实用方便,无需培训,即可快速上手,轻轻松松完成日常MOV恢复功能,真正做到简单全面实用。是用户实现MOV恢复功能的好帮手。 佳能MOV相机录像恢复软件升级特点 恢复的范围更广:能恢复常见的各种型号的佳能相机中误删除或误格式化导致丢失的MOV视频,目前软件已通过测试的数码相机型号有:G1X、5DⅡ、5DⅢ、6D、60D、70D、600D、650D、1DX等都支持其内置内存卡恢复; 恢复的界面更直观:除了延续以前的能预览的独特效果外,还对每个视频文件的拍摄时间进行了描述,对每个文件的状态(正常/需要修复)进行了备注,这样可以快速判断要恢复的重要视频软件能否恢复成功。 恢复的方式更自由:加入扫描磁盘镜像文件的功能,方便做专业做数据恢复业务的人员;而且还加入了参数(数据区开始位置、簇大小)设置的选项,可以根据实际情况灵活的设置其参数,精准的设置扫描恢复范围。 改进一个MOV规范的兼容性,更准确的识别扫描到的文件状态。 佳能MOV视频文件恢复软件(EOS相机恢复) v8.1 更新日志 改进重组文件的算法,加入对EOS-1DX型号的支持。 改进移动设备SD卡的分区识别功能。 增加佳能EOS 5D4型号相机的支持。 增加按文件大小或者时间排序的功能。 修改一个保存恢复文件的BUG。 加入检测相机卡掉线功能,提示用户重新插卡恢复。 扫描速度改进。 改进校验文件完整性的算法。 增加选择框来打开或者关闭自动预览视频的功能。 修改大于2G的文件修复的BUG。 优化选择数据的顺序,扫描的效果更好。 增加自动修复有损坏的视频文件功能,有损坏的文件在恢复后文件可以播放完整。 佳能MOV相机录像恢复截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

山西茄子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值