X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=plugins%2Fdvd%2Fdvd_ifo.c;h=4f6ecd565fa862a4258fa5487809aca7db35610a;hb=dc0df7c21c633dd9c65bdcb6d4c241759a5794a7;hp=24f8ffaf7c190a4dfab5b6de0fbc97a32b9d9f61;hpb=8e3c802c8431943acc7954b9822ff386d8c96ccf;p=vlc diff --git a/plugins/dvd/dvd_ifo.c b/plugins/dvd/dvd_ifo.c index 24f8ffaf7c..4f6ecd565f 100644 --- a/plugins/dvd/dvd_ifo.c +++ b/plugins/dvd/dvd_ifo.c @@ -2,7 +2,7 @@ * dvd_ifo.c: Functions for ifo parsing ***************************************************************************** * Copyright (C) 1999-2001 VideoLAN - * $Id: dvd_ifo.c,v 1.9 2001/02/18 01:42:05 stef Exp $ + * $Id: dvd_ifo.c,v 1.14 2001/02/22 08:44:45 stef Exp $ * * Author: Stéphane Borel * @@ -39,9 +39,14 @@ #include "intf_msg.h" #include "dvd_ifo.h" #include "dvd_udf.h" +#include "dvd_css.h" #include "input_dvd.h" -void CommandRead( ifo_command_t ); +/* + * Local prototypes + */ +static vmg_t ReadVMG ( ifo_t* ); +void CommandRead( ifo_command_t ); /* * IFO Management. @@ -64,6 +69,10 @@ ifo_t IfoInit( int i_fd ) ifo.i_off = (off_t)(i_lba) * DVD_LB_SIZE; ifo.i_pos = lseek( ifo.i_fd, ifo.i_off, SEEK_SET ); + /* Video Manager Initialization */ + intf_WarnMsg( 2, "ifo: initializing VMG" ); + ifo.vmg = ReadVMG( &ifo ); + return ifo; } @@ -72,6 +81,7 @@ ifo_t IfoInit( int i_fd ) *****************************************************************************/ void IfoEnd( ifo_t* p_ifo ) { +#if 0 int i,j; /* Free structures from video title sets */ @@ -121,7 +131,7 @@ void IfoEnd( ifo_t* p_ifo ) free( p_ifo->vmg.pgc.com_tab.p_cell_com ); free( p_ifo->vmg.pgc.com_tab.p_post_com ); free( p_ifo->vmg.pgc.com_tab.p_pre_com ); - +#endif return; } @@ -220,6 +230,7 @@ static pgc_t ReadPGC( ifo_t* p_ifo ) FLUSH(2); GETC( &pgc.i_prg_nb ); GETC( &pgc.i_cell_nb ); +//fprintf( stderr, "PGC: Prg: %d Cell: %d\n", pgc.i_prg_nb, pgc.i_cell_nb ); GETL( &pgc.i_play_time ); GETL( &pgc.i_prohibited_user_op ); for( i=0 ; i<8 ; i++ ) @@ -233,6 +244,7 @@ static pgc_t ReadPGC( ifo_t* p_ifo ) GETS( &pgc.i_next_pgc_nb ); GETS( &pgc.i_prev_pgc_nb ); GETS( &pgc.i_goup_pgc_nb ); +//fprintf( stderr, "PGC: Prev: %d Next: %d Up: %d\n",pgc.i_prev_pgc_nb ,pgc.i_next_pgc_nb, pgc.i_goup_pgc_nb ); GETC( &pgc.i_still_time ); GETC( &pgc.i_play_mode ); for( i=0 ; i<16 ; i++ ) @@ -345,7 +357,7 @@ static pgc_t ReadPGC( ifo_t* p_ifo ) p_ifo->i_pos = lseek( p_ifo->i_fd, i_start + pgc.i_cell_pos_inf_sbyte, SEEK_SET ); pgc.p_cell_pos_inf = malloc( pgc.i_cell_nb *sizeof(cell_pos_inf_t) ); - if( pgc.p_cell_play_inf == NULL ) + if( pgc.p_cell_pos_inf == NULL ) { intf_ErrMsg( "Out of memory" ); p_ifo->b_error = 1; @@ -395,6 +407,7 @@ static pgci_inf_t ReadUnit( ifo_t* p_ifo ) p_ifo->i_pos = lseek( p_ifo->i_fd, i_start + inf.p_srp[i].i_pgci_sbyte, SEEK_SET ); +//fprintf( stderr, "Unit: PGC %d\n", i ); inf.p_srp[i].pgc = ReadPGC( p_ifo ); } @@ -515,6 +528,7 @@ static vobu_admap_t ReadMap( ifo_t* p_ifo ) static vmgi_mat_t ReadVMGInfMat( ifo_t* p_ifo ) { vmgi_mat_t mat; + u64 i_temp; int i; // off_t i_start = p_ifo->i_pos; @@ -548,20 +562,21 @@ static vmgi_mat_t ReadVMGInfMat( ifo_t* p_ifo ) GETL( &mat.i_c_adt_ssector ); GETL( &mat.i_vobu_admap_ssector ); FLUSH( 32 ); - GETS( &mat.i_video_atrt ); +// GETS( &mat.video_atrt ); +FLUSH(2); FLUSH( 1 ); GETC( &mat.i_audio_nb ); //fprintf( stderr, "vmgi audio nb : %d\n", mat.i_audio_nb ); for( i=0 ; i < 8 ; i++ ) { - GETLL( &mat.pi_audio_atrt[i] ); + GETLL( &i_temp ); } FLUSH( 17 ); GETC( &mat.i_subpic_nb ); //fprintf( stderr, "vmgi subpic nb : %d\n", mat.i_subpic_nb ); for( i=0 ; i < mat.i_subpic_nb ; i++ ) { - GET( &mat.pi_subpic_atrt[i], 6 ); + GET( &i_temp, 6 ); /* FIXME : take care of endianness */ } @@ -580,6 +595,7 @@ static vmg_ptt_srpt_t ReadVMGTitlePointer( ifo_t* p_ifo ) //fprintf( stderr, "PTR\n" ); GETS( &ptr.i_ttu_nb ); +//fprintf( stderr, "PTR: TTU nb %d\n", ptr.i_ttu_nb ); FLUSH( 2 ); GETL( &ptr.i_ebyte ); /* Parsing of tts */ @@ -599,7 +615,7 @@ static vmg_ptt_srpt_t ReadVMGTitlePointer( ifo_t* p_ifo ) GETC( &ptr.p_tts[i].i_tts_nb ); GETC( &ptr.p_tts[i].i_vts_ttn ); GETL( &ptr.p_tts[i].i_ssector ); -//fprintf( stderr, "PTR: %d %d %d\n",ptr.p_tts[i].i_tts_nb,ptr.p_tts[i].i_vts_ttn, ptr.p_tts[i].i_ssector ); +//fprintf( stderr, "PTR: %d %d %d\n", ptr.p_tts[i].i_ptt_nb, ptr.p_tts[i].i_tts_nb,ptr.p_tts[i].i_vts_ttn ); } return ptr; @@ -671,11 +687,13 @@ static vmg_vts_atrt_t ReadVTSAttr( ifo_t* p_ifo ) { vmg_vts_atrt_t atrt; int i, j; + u64 i_temp; off_t i_start = p_ifo->i_pos; //fprintf( stderr, "VTS ATTR\n" ); GETS( &atrt.i_vts_nb ); +//fprintf( stderr, "VTS ATTR Nb: %d\n", atrt.i_vts_nb ); FLUSH( 2 ); GETL( &atrt.i_ebyte ); atrt.pi_vts_atrt_sbyte = malloc( atrt.i_vts_nb *sizeof(u32) ); @@ -703,37 +721,39 @@ static vmg_vts_atrt_t ReadVTSAttr( ifo_t* p_ifo ) SEEK_SET ); GETL( &atrt.p_vts_atrt[i].i_ebyte ); GETL( &atrt.p_vts_atrt[i].i_cat_app_type ); - GETS( &atrt.p_vts_atrt[i].i_vtsm_video_atrt ); +// GETS( &atrt.p_vts_atrt[i].vtsm_video_atrt ); +FLUSH(2); FLUSH( 1 ); GETC( &atrt.p_vts_atrt[i].i_vtsm_audio_nb ); //fprintf( stderr, "m audio nb : %d\n", atrt.p_vts_atrt[i].i_vtsm_audio_nb ); for( j=0 ; j<8 ; j++ ) { - GETLL( &atrt.p_vts_atrt[i].pi_vtsm_audio_atrt[j] ); + GETLL( &i_temp ); } FLUSH( 17 ); GETC( &atrt.p_vts_atrt[i].i_vtsm_subpic_nb ); //fprintf( stderr, "m subp nb : %d\n", atrt.p_vts_atrt[i].i_vtsm_subpic_nb ); for( j=0 ; j<28 ; j++ ) { - GET( &atrt.p_vts_atrt[i].pi_vtsm_subpic_atrt[j], 6 ); + GET( &i_temp, 6 ); /* FIXME : Fix endianness issue here */ } FLUSH( 2 ); - GETS( &atrt.p_vts_atrt[i].i_vtstt_video_atrt ); +// GETS( &atrt.p_vts_atrt[i].vtstt_video_atrt ); +FLUSH(2); FLUSH( 1 ); GETL( &atrt.p_vts_atrt[i].i_vtstt_audio_nb ); //fprintf( stderr, "tt audio nb : %d\n", atrt.p_vts_atrt[i].i_vtstt_audio_nb ); for( j=0 ; j<8 ; j++ ) { - GETLL( &atrt.p_vts_atrt[i].pi_vtstt_audio_atrt[j] ); + GETLL( &i_temp ); } FLUSH( 17 ); GETC( &atrt.p_vts_atrt[i].i_vtstt_subpic_nb ); //fprintf( stderr, "tt subp nb : %d\n", atrt.p_vts_atrt[i].i_vtstt_subpic_nb ); for( j=0 ; j<28/*atrt.p_vts_atrt[i].i_vtstt_subpic_nb*/ ; j++ ) { - GET( &atrt.p_vts_atrt[i].pi_vtstt_subpic_atrt[j], 6 ); + GET( &i_temp, 6 ); /* FIXME : Fix endianness issue here */ } } @@ -810,6 +830,7 @@ static vtsi_mat_t ReadVTSInfMat( ifo_t* p_ifo ) { vtsi_mat_t mat; int i; + u64 i_temp; // off_t i_start = p_ifo->i_pos; //fprintf( stderr, "VTSI\n" ); @@ -836,36 +857,61 @@ static vtsi_mat_t ReadVTSInfMat( ifo_t* p_ifo ) GETL( &mat.i_c_adt_ssector ); GETL( &mat.i_vobu_admap_ssector ); FLUSH( 24 ); - GETS( &mat.i_m_video_atrt ); +// GETS( &mat.m_video_atrt ); +FLUSH(2); FLUSH( 1 ); GETC( &mat.i_m_audio_nb ); for( i=0 ; i<8 ; i++ ) { - GETLL( &mat.pi_m_audio_atrt[i] ); + GETLL( &i_temp ); } FLUSH( 17 ); GETC( &mat.i_m_subpic_nb ); for( i=0 ; i<28 ; i++ ) { - GET( &mat.pi_m_subpic_atrt[i], 6 ); + GET( &i_temp, 6 ); /* FIXME : take care of endianness */ } FLUSH( 2 ); - GETS( &mat.i_video_atrt ); +// GETS( &mat.video_atrt ); +FLUSH(2); FLUSH( 1 ); GETC( &mat.i_audio_nb ); //fprintf( stderr, "vtsi audio nb : %d\n", mat.i_audio_nb ); for( i=0 ; i<8 ; i++ ) { - GETLL( &mat.pi_audio_atrt[i] ); + GETLL( &i_temp ); +//fprintf( stderr, "Audio %d: %llx\n", i, i_temp ); + i_temp >>= 32; + mat.p_audio_atrt[i].i_lang_code = i_temp & 0xffff; + i_temp >>= 16; + mat.p_audio_atrt[i].i_num_channels = i_temp & 0x7; + i_temp >>= 4; + mat.p_audio_atrt[i].i_sample_freq = i_temp & 0x3; + i_temp >>= 2; + mat.p_audio_atrt[i].i_quantization = i_temp & 0x3; + i_temp >>= 2; + mat.p_audio_atrt[i].i_appl_mode = i_temp & 0x3; + i_temp >>= 2; + mat.p_audio_atrt[i].i_type = i_temp & 0x3; + i_temp >>= 2; + mat.p_audio_atrt[i].i_multichannel_extension = i_temp & 0x1; + i_temp >>= 1; + mat.p_audio_atrt[i].i_coding_mode = i_temp & 0x7; } FLUSH( 17 ); GETC( &mat.i_subpic_nb ); //fprintf( stderr, "vtsi subpic nb : %d\n", mat.i_subpic_nb ); for( i=0 ; i> 16; +//fprintf( stderr, "Subpic %d: %llx\n", i, i_temp ); + mat.p_subpic_atrt[i].i_caption = i_temp & 0xff; + i_temp >>= 16; + mat.p_subpic_atrt[i].i_lang_code = i_temp & 0xffff; + i_temp >>= 16; + mat.p_subpic_atrt[i].i_prefix = i_temp & 0xffff; } return mat; @@ -880,9 +926,10 @@ static vts_ptt_srpt_t ReadVTSTitlePointer( ifo_t* p_ifo ) int i; off_t i_start = p_ifo->i_pos; -//fprintf( stderr, "PTR\n" ); +//fprintf( stderr, "VTS PTR\n" ); GETS( &ptr.i_ttu_nb ); +//fprintf( stderr, "VTS PTR nb: %d\n", ptr.i_ttu_nb ); FLUSH( 2 ); GETL( &ptr.i_ebyte ); ptr.pi_ttu_sbyte = malloc( ptr.i_ttu_nb *sizeof(u32) ); @@ -910,6 +957,7 @@ static vts_ptt_srpt_t ReadVTSTitlePointer( ifo_t* p_ifo ) ptr.pi_ttu_sbyte[i], SEEK_SET ); GETS( &ptr.p_ttu[i].i_pgc_nb ); GETS( &ptr.p_ttu[i].i_prg_nb ); +//fprintf( stderr, "VTS %d PTR Pgc: %d Prg: %d\n", i,ptr.p_ttu[i].i_pgc_nb, ptr.p_ttu[i].i_prg_nb ); } return ptr; @@ -971,11 +1019,22 @@ static vts_tmap_ti_t ReadVTSTimeMap( ifo_t* p_ifo ) /***************************************************************************** - * ReadVTS : Parse vts*.ifo files to fill the Video Title Set structure. + * IfoReadVTS : Parse vts*.ifo files to fill the Video Title Set structure. *****************************************************************************/ -static vts_t ReadVTS( ifo_t* p_ifo ) +int IfoReadVTS( ifo_t* p_ifo ) { vts_t vts; + off_t i_off; + int i_title; + + intf_WarnMsg( 2, "ifo: initializing VTS %d", p_ifo->i_title ); + + i_title = p_ifo->i_title; + i_off = (off_t)( p_ifo->vmg.ptt_srpt.p_tts[i_title-1].i_ssector ) + * DVD_LB_SIZE + + p_ifo->i_off; + + p_ifo->i_pos = lseek( p_ifo->i_fd, i_off, SEEK_SET ); vts.i_pos = p_ifo->i_pos; @@ -1037,13 +1096,15 @@ static vts_t ReadVTS( ifo_t* p_ifo ) vts.vobu_admap = ReadMap( p_ifo ); } - return vts; + p_ifo->vts = vts; + + return 0; } /* * DVD Information Management */ - +#if 0 /***************************************************************************** * IfoRead : Function that fills structure and calls specified functions * to do it. @@ -1053,10 +1114,6 @@ void IfoRead( ifo_t* p_ifo ) int i; off_t i_off; - /* Video Manager Initialization */ - intf_WarnMsg( 2, "ifo: initializing VMG" ); - p_ifo->vmg = ReadVMG( p_ifo ); - /* Video Title Sets initialization */ p_ifo->p_vts = malloc( p_ifo->vmg.mat.i_tts_nb *sizeof(vts_t) ); if( p_ifo->p_vts == NULL ) @@ -1085,7 +1142,7 @@ void IfoRead( ifo_t* p_ifo ) return; } - +#endif /* * IFO virtual machine : a set of commands that give the * interactive behaviour of the dvd