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){