Mercurial > mplayer.hg
comparison libmpdemux/open.c @ 6774:3bcd52b7b2ae
Workaround for seeking multiangle discs with missing sml_agli[] table, as a
fallback it uses VOB/CELL id search (slow)
Thanks to Jeffrey Hammel for his multi-angle DVD donation! :)
author | arpi |
---|---|
date | Tue, 23 Jul 2002 23:36:44 +0000 |
parents | 8f49c75a2824 |
children | c52dc92ebf4b |
comparison
equal
deleted
inserted
replaced
6773:24f3276523af | 6774:3bcd52b7b2ae |
---|---|
632 d->cur_pack,d->dsi_pack.dsi_gi.nv_pck_lbn); | 632 d->cur_pack,d->dsi_pack.dsi_gi.nv_pck_lbn); |
633 } else { | 633 } else { |
634 // process! | 634 // process! |
635 d->packs_left = d->dsi_pack.dsi_gi.vobu_ea; | 635 d->packs_left = d->dsi_pack.dsi_gi.vobu_ea; |
636 mp_msg(MSGT_DVD,MSGL_DBG2, "Found NAVI packet! lba=0x%X len=%d \n",d->cur_pack,d->packs_left); | 636 mp_msg(MSGT_DVD,MSGL_DBG2, "Found NAVI packet! lba=0x%X len=%d \n",d->cur_pack,d->packs_left); |
637 //navPrint_DSI(&d->dsi_pack); | |
638 mp_msg(MSGT_DVD,MSGL_DBG3,"\r### CELL %d: Navi: %d/%d IFO: %d/%d \n",d->cur_cell, | |
639 d->dsi_pack.dsi_gi.vobu_c_idn,d->dsi_pack.dsi_gi.vobu_vob_idn, | |
640 d->cur_pgc->cell_position[d->cur_cell].cell_nr, | |
641 d->cur_pgc->cell_position[d->cur_cell].vob_id_nr); | |
642 | |
637 if(d->angle_seek){ | 643 if(d->angle_seek){ |
638 int skip=d->dsi_pack.sml_agli.data[dvd_angle].address; | 644 int i,skip=0; |
639 if(skip) d->cur_pack=d->dsi_pack.dsi_gi.nv_pck_lbn+skip; | 645 for(i=0;i<9;i++) // check if all values zero: |
640 d->angle_seek=0; | 646 if((skip=d->dsi_pack.sml_agli.data[i].address)!=0) break; |
641 mp_msg(MSGT_DVD,MSGL_V, "Angle-seek synced! skip=%d new_lba=0x%X \n",skip,d->cur_pack); | 647 if(skip){ |
648 // sml_agli table has valid data (at least one non-zero): | |
649 d->cur_pack=d->dsi_pack.dsi_gi.nv_pck_lbn+ | |
650 d->dsi_pack.sml_agli.data[dvd_angle].address; | |
651 d->angle_seek=0; | |
652 mp_msg(MSGT_DVD,MSGL_V, "Angle-seek synced using sml_agli map! new_lba=0x%X \n",d->cur_pack); | |
653 } else { | |
654 // check if we're in the right cell, jump otherwise: | |
655 if( (d->dsi_pack.dsi_gi.vobu_c_idn==d->cur_pgc->cell_position[d->cur_cell].cell_nr) && | |
656 (d->dsi_pack.dsi_gi.vobu_vob_idn==d->cur_pgc->cell_position[d->cur_cell].vob_id_nr) ){ | |
657 d->angle_seek=0; | |
658 mp_msg(MSGT_DVD,MSGL_V, "Angle-seek synced by cell/vob IDN search! \n"); | |
659 } else { | |
660 // wrong angle, skip this vobu: | |
661 d->cur_pack=d->dsi_pack.dsi_gi.nv_pck_lbn+ | |
662 d->dsi_pack.dsi_gi.vobu_ea; | |
663 d->angle_seek=2; // DEBUG | |
664 } | |
665 } | |
642 } | 666 } |
643 } | 667 } |
644 ++d->cur_pack; | 668 ++d->cur_pack; |
645 goto read_next; | 669 goto read_next; |
646 } | 670 } |
647 | 671 |
648 ++d->cur_pack; | 672 ++d->cur_pack; |
649 if(d->packs_left>=0) --d->packs_left; | 673 if(d->packs_left>=0) --d->packs_left; |
650 | 674 |
651 if(d->angle_seek) goto read_next; // searching for Navi packet | 675 if(d->angle_seek){ |
676 if(d->angle_seek==2) mp_msg(MSGT_DVD,MSGL_V, "!!! warning! reading packet while angle_seek !!!\n"); | |
677 goto read_next; // searching for Navi packet | |
678 } | |
652 | 679 |
653 return d->cur_pack-1; | 680 return d->cur_pack-1; |
654 } | 681 } |
655 | 682 |
656 void dvd_seek(dvd_priv_t *d,int pos){ | 683 void dvd_seek(dvd_priv_t *d,int pos){ |