环境:mplayer,及它下面的stream
说明:1。本文只是阅读它的代码,没有进行调试跟踪,可能有出入不对的地方.

2。希望读者对dvd的逻辑结构有些了解,如vts, pgc, chapter, cell它们的关系.

dvd如何通过时间来定位的,可通过dvd_seek_to_time来分析,看看它是如何通过时间来定位的。也就是把时间转换成sector, DVDReadBlocks中的参数offset Block
它的定位就有点象物理学中的千分尺(游标卡尺),先通过时间查到所属dvd的cell,再在cell中找到时间偏移量,这时才确定dvd_read_sector所需要的cur_pack. <<DVDReadBlocks(d->title, d->cur_pack, 1, data)>>

static int dvd_seek_to_time(stream_t *stream, ifo_handle_t *vts_file, double sec)
{
    unsigned int i, j, k, timeunit, ac_time, tmap_sector=0, cell_sector=0, vobu_sector=0;
    int t=0;
    double tm, duration;
    off_t pos = -1;
    dvd_priv_t *d = stream->priv;
    vts_tmapt_t *vts_tmapt = vts_file->vts_tmapt;

if(!vts_file->vts_tmapt || sec < 0)
        return 0;

//pgc时间长度。(从opes_s源代码来看,mplay是以pgc为单元来处理播放的)

duration = (double) mp_get_titleset_length(d->vts_file, d->tt_srpt, d->cur_title-1) / 1000.0f;
    if(sec > duration)
      return 0;

//在pgc中找到vobu的sector,用于找到所属的cell

i=d->cur_pgc_idx;
    timeunit = vts_tmapt->tmap[i].tmu;
    for(j = 0; j < vts_tmapt->tmap[i].nr_of_entries; j++) {
      ac_time = timeunit * (j + 1);
      if(ac_time >= sec)
        break;
      tmap_sector = vts_tmapt->tmap[i].map_ent[j] & 0x7fffffff;
    }

//search enclosing cell
//定位cell,当前tmap_sector所属的dvd cell
    for(i=0; i<d->cur_pgc->nr_of_cells; i++) {
      if(tmap_sector >= d->cur_pgc->cell_playback[i].first_sector &&
        tmap_sector <= d->cur_pgc->cell_playback[i].last_sector) {
        cell_sector = d->cur_pgc->cell_playback[i].first_sector;
        break;
      }
    }
// 让查询指针指向cell的起始位置

pos = ((off_t)cell_sector)<<11;
    stream_seek(stream, pos);
    do {
      stream_skip(stream, 2048);
      t = mp_dvdtimetomsec(&d->dsi_pack.dsi_gi.c_eltm);
    } while(!t);
    tm = dvd_get_current_time(stream, 0);
// 让查询指针指向cell的偏移位置(tmap_sector与cell_sector在同一时刻是不同的值)

pos = ((off_t)tmap_sector)<<11;
    stream_seek(stream, pos);
    //now get current time in terms of the cell+cell time offset
    memset(&d->dsi_pack.dsi_gi.c_eltm, 0, sizeof(dvd_time_t));
//找到sec在cell中对应的位置stream->pos.
    while(tm <= sec) {
        if(!stream_skip(stream, 2048))
          break;
        tm = dvd_get_current_time(stream, 0);
    };

//后面这段个人还不太理解它的作用,下面猜测可能:
1。与关键帧相关以确定画面是在一个关键位置上
2。tmap_sector与cell_sector对应关系的转换
3. 有关文档参考:http://www.mpucoder.com/DVD/ifo.html#vam
    tmap_sector = stream->pos >> 11;

//search closest VOBU sector
    k=(vts_file->vts_vobu_admap->last_byte + 1 - VOBU_ADMAP_SIZE)/4; //entries in the vobu admap
    for(i=1; i<k; i++) {
      if(vts_file->vts_vobu_admap->vobu_start_sectors[i] > tmap_sector)
        break;
    }
    vobu_sector = vts_file->vts_vobu_admap->vobu_start_sectors[i-1];
    pos = ((off_t)vobu_sector) << 11;
    stream_seek(stream, pos);

return 1;
}

这个函数多次调用stream_seek,stream_skip,从它们源代码来看,最终会调用fill_buffer->dvd_read_sector->DVDReadBlocks来定位的。
以上理解有不对不处或需要补充的,请留言。

关于mplayer dvd seek定位函数dvd_seek_to_time相关推荐

  1. C语言中文件定位函数总结

    C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...

  2. C语言文件指针的基本函数介绍包含了fpoen、fclose、fgetc、fputc、fscanf、fprintf、fgets、fputs、fread、fwrite函数以及文件定位函数.

    一.打开关闭文件 只打开文件   再关闭文件 #include <stdio.h> #include<stdlib.h> main() {FILE *fp;fp = fopen ...

  3. Halcon基于形状的几何定位函数说明

    Halcon基于形状的几何定位函数说明 1. create_shape_model(Template: : //reduce_domain后的模板图像 NumLevels,//金字塔的层数,可设为&q ...

  4. python文件定位函数_C语言中文件定位函数总结

    C语言中文件定位函数主要是:fseek, ftell, fsetpos, fgetpos. 先来讲前两个函数,这是最基本的定位函数: fseek函数:能把文件指针移动到文件任何位置,其原型是:int ...

  5. C语言中的光标定位函数

    C语言中的光标定位函数(将光标移动到屏幕的指定位置) 所谓的光标定位函数,就是实现键盘输入坐标值从而把鼠标的光标移动到相应坐标位置的函数模块,在简单的小游戏如贪吃蛇等需要定位输出的程序中有着较为广泛的 ...

  6. 关于Visual Assistant X助手在定位函数及结构体成员变量不准确的问题

    我们在使用VS开发程序时,习惯使用Visual Assistant X助手来协助我们工作.Visual Assistant X确实给我们带来了很多的便利和好处,但是在有些情况下,也会给我们带来一些问题 ...

  7. Problem A: 算法4-5:求子串位置的定位函数

    Problem Description 在算法4-1中已经描述过一种定位子串的算法,但其依赖字符串的其他操作(使用了算法4-3描述的子串提取以及字符串比较). 下面给出书中另一种相对独立的定位子串算法 ...

  8. eclipse快捷键(定位函数,查找类,查找方法)

    1.定位函数 ctrl + 鼠标左键:跳转到引用的方法 alt + left :从所跳转到引用的方法返回原方法 alt + right:从原处返回到引用的方法 2.查找类 查找类Ctrl+Shift+ ...

  9. C语言 题目 1689: 数据结构-求子串位置的定位函数

    题目描述 在算法4-1中已经描述过一种定位子串的算法,但其依赖字符串的其他操作(使用了算法4-3描述的子串提取以及字符串比较). 下面给出书中另一种相对独立的定位子串算法: 图:求子串位置的定位函数 ...

最新文章

  1. 小米 samba linux,不折腾会死:CentOS7访问小米路由(Samba服务)
  2. js学习笔记9----时间操作
  3. mysql重启电脑提示145_MYSQL错误:Can’t open file: ‘#215;#215;#215;.MYI’ (errno: 145)修复方法...
  4. C#-修改图书借阅管理系统-错误与SQL server 2008错误、复制数据库
  5. qt自定义窗口添加父窗口后,显示不出来
  6. sql etl_使用SQL TRY函数进行ETL优化
  7. scrollTop、clientHeight、 scrollHeight...学完真的理解了
  8. 模板方法模式(模板方法设计模式)详解——小马同学@Tian
  9. 2023南京邮电大学计算机考研信息汇总
  10. AutoCAD 2019 mac中文
  11. 你知道哪些中国学生普遍生疏但意境很美的英语词汇?
  12. 苹果设备如何进入恢复模式
  13. oracle to_char 进制转换_〖Oracle 转载〗Oracle的数据类型转换 to_char
  14. 2021年G3锅炉水处理考试内容及G3锅炉水处理模拟试题
  15. 2021年3月PHP免费自学最全教程来了
  16. 关于input=file的用法
  17. VS2019调试功能学习
  18. AI坦克对战(实现人机)
  19. 计算机无法代替的工作有哪些,人工智能代替不了哪些行业?一起来看看!
  20. 淘宝top sdk java源码中的问题

热门文章

  1. 【学习周报】深度学习笔记第六周
  2. 选择中医 - 醒脑(养生、穴位)
  3. 阿里巴巴、Amazon、Windows、Android、Google、Internet、iPhone、汽车底盘、以及信用卡都属于平台经济--产品平台---供应链平台---产业平台--双边市场平台
  4. 基于注意力机制的深度协同推荐模型
  5. 工厂模式 五种写法总结
  6. 数据挖掘的过程是什么?通俗易懂
  7. linux推送打印机脚本,共享Linux 打印机给Windows
  8. 2022年中国农业现代化发展现状
  9. 地推项目大全_地推吧:app线上推广渠道大全(软件app上新地推)
  10. ASCII码对照表(C++17 实现ANSI、UTF8、Unicode字符编码互转)