Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc
Commits
5427a369
Commit
5427a369
authored
Apr 15, 2001
by
Stéphane Borel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
-I hope I have fixed the ifo bug lastly !
parent
c01112ad
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
39 additions
and
36 deletions
+39
-36
plugins/dvd/dvd_ifo.c
plugins/dvd/dvd_ifo.c
+16
-14
plugins/dvd/input_dvd.c
plugins/dvd/input_dvd.c
+23
-22
No files found.
plugins/dvd/dvd_ifo.c
View file @
5427a369
...
@@ -2,7 +2,7 @@
...
@@ -2,7 +2,7 @@
* dvd_ifo.c: Functions for ifo parsing
* dvd_ifo.c: Functions for ifo parsing
*****************************************************************************
*****************************************************************************
* Copyright (C) 1999-2001 VideoLAN
* Copyright (C) 1999-2001 VideoLAN
* $Id: dvd_ifo.c,v 1.2
1 2001/04/15 15:32:48
stef Exp $
* $Id: dvd_ifo.c,v 1.2
2 2001/04/15 21:17:50
stef Exp $
*
*
* Author: Stphane Borel <stef@via.ecp.fr>
* Author: Stphane Borel <stef@via.ecp.fr>
*
*
...
@@ -78,9 +78,9 @@ static __inline__ u8 ReadByte( ifo_t * p_ifo, u8* pi_buffer, u8** pp_current )
...
@@ -78,9 +78,9 @@ static __inline__ u8 ReadByte( ifo_t * p_ifo, u8* pi_buffer, u8** pp_current )
{
{
u8
i_ret
;
u8
i_ret
;
if
(
*
pp_current
>
=
pi_buffer
+
DVD_LB_SIZE
)
if
(
*
pp_current
>
pi_buffer
+
DVD_LB_SIZE
)
{
{
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
);
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
+
DVD_LB_SIZE
);
}
}
i_ret
=
*
(
*
pp_current
)
++
;
i_ret
=
*
(
*
pp_current
)
++
;
...
@@ -92,9 +92,9 @@ static __inline__ u16 ReadWord( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current )
...
@@ -92,9 +92,9 @@ static __inline__ u16 ReadWord( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current )
{
{
u16
i_ret
;
u16
i_ret
;
if
(
*
pp_current
>
=
pi_buffer
+
DVD_LB_SIZE
-
2
)
if
(
*
pp_current
>
pi_buffer
+
DVD_LB_SIZE
-
2
)
{
{
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
);
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
+
DVD_LB_SIZE
);
}
}
i_ret
=
U16_AT
(
*
pp_current
);
i_ret
=
U16_AT
(
*
pp_current
);
...
@@ -108,9 +108,10 @@ static __inline__ u32 ReadDouble( ifo_t * p_ifo, u8* pi_buffer,
...
@@ -108,9 +108,10 @@ static __inline__ u32 ReadDouble( ifo_t * p_ifo, u8* pi_buffer,
{
{
u32
i_ret
;
u32
i_ret
;
if
(
*
pp_current
>
=
pi_buffer
+
DVD_LB_SIZE
-
4
)
if
(
*
pp_current
>
pi_buffer
+
DVD_LB_SIZE
-
4
)
{
{
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
);
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
+
DVD_LB_SIZE
);
// intf_WarnMsg( 1, "new buffer in double @ %lld", p_ifo->i_pos );
}
}
i_ret
=
U32_AT
(
*
pp_current
);
i_ret
=
U32_AT
(
*
pp_current
);
...
@@ -123,9 +124,9 @@ static __inline__ u64 ReadQuad( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current )
...
@@ -123,9 +124,9 @@ static __inline__ u64 ReadQuad( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current )
{
{
u64
i_ret
;
u64
i_ret
;
if
(
*
pp_current
>
=
pi_buffer
+
DVD_LB_SIZE
-
8
)
if
(
*
pp_current
>
pi_buffer
+
DVD_LB_SIZE
-
8
)
{
{
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
);
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
+
DVD_LB_SIZE
);
}
}
i_ret
=
U64_AT
(
*
pp_current
);
i_ret
=
U64_AT
(
*
pp_current
);
...
@@ -137,9 +138,9 @@ static __inline__ u64 ReadQuad( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current )
...
@@ -137,9 +138,9 @@ static __inline__ u64 ReadQuad( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current )
static
__inline__
void
ReadBits
(
ifo_t
*
p_ifo
,
u8
*
pi_buffer
,
u8
**
pp_current
,
static
__inline__
void
ReadBits
(
ifo_t
*
p_ifo
,
u8
*
pi_buffer
,
u8
**
pp_current
,
u8
*
pi_dest
,
int
i_nb
)
u8
*
pi_dest
,
int
i_nb
)
{
{
if
(
*
pp_current
>
=
pi_buffer
+
DVD_LB_SIZE
-
i_nb
)
if
(
*
pp_current
>
pi_buffer
+
DVD_LB_SIZE
-
i_nb
)
{
{
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
);
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
+
DVD_LB_SIZE
);
}
}
memcpy
(
pi_dest
,
*
pp_current
,
i_nb
);
memcpy
(
pi_dest
,
*
pp_current
,
i_nb
);
...
@@ -151,9 +152,9 @@ static __inline__ void ReadBits( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current,
...
@@ -151,9 +152,9 @@ static __inline__ void ReadBits( ifo_t* p_ifo, u8* pi_buffer, u8** pp_current,
static
__inline__
void
DumpBits
(
ifo_t
*
p_ifo
,
u8
*
pi_buffer
,
static
__inline__
void
DumpBits
(
ifo_t
*
p_ifo
,
u8
*
pi_buffer
,
u8
**
pp_current
,
int
i_nb
)
u8
**
pp_current
,
int
i_nb
)
{
{
if
(
*
pp_current
>
=
pi_buffer
+
DVD_LB_SIZE
-
i_nb
)
if
(
*
pp_current
>
pi_buffer
+
DVD_LB_SIZE
-
i_nb
)
{
{
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
);
*
pp_current
=
FillBuffer
(
p_ifo
,
pi_buffer
,
p_ifo
->
i_pos
+
DVD_LB_SIZE
);
}
}
*
pp_current
+=
i_nb
;
*
pp_current
+=
i_nb
;
...
@@ -1320,7 +1321,7 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, off_t i_pos )
...
@@ -1320,7 +1321,7 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, off_t i_pos )
DumpBits
(
p_ifo
,
pi_buffer
,
&
p_current
,
2
);
DumpBits
(
p_ifo
,
pi_buffer
,
&
p_current
,
2
);
p_cell_inf
->
i_end_byte
=
ReadDouble
(
p_ifo
,
pi_buffer
,
&
p_current
);
p_cell_inf
->
i_end_byte
=
ReadDouble
(
p_ifo
,
pi_buffer
,
&
p_current
);
p_cell_inf
->
i_cell_nb
=
(
p_cell_inf
->
i_end_byte
-
8
)
/
sizeof
(
cell_map_t
);
p_cell_inf
->
i_cell_nb
=
(
p_cell_inf
->
i_end_byte
/* - 7*/
)
/
sizeof
(
cell_map_t
);
//fprintf( stderr, "Cell inf: vob %d end %d cell %d\n", p_cell_inf->i_vob_nb, p_cell_inf->i_end_byte, p_cell_inf->i_cell_nb );
//fprintf( stderr, "Cell inf: vob %d end %d cell %d\n", p_cell_inf->i_vob_nb, p_cell_inf->i_end_byte, p_cell_inf->i_cell_nb );
...
@@ -1338,6 +1339,7 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, off_t i_pos )
...
@@ -1338,6 +1339,7 @@ static int ReadCellInf( ifo_t * p_ifo, cell_inf_t * p_cell_inf, off_t i_pos )
p_cell_inf
->
p_cell_map
[
i
].
i_cell_id
=
ReadByte
(
p_ifo
,
pi_buffer
,
&
p_current
);
p_cell_inf
->
p_cell_map
[
i
].
i_cell_id
=
ReadByte
(
p_ifo
,
pi_buffer
,
&
p_current
);
DumpBits
(
p_ifo
,
pi_buffer
,
&
p_current
,
1
);
DumpBits
(
p_ifo
,
pi_buffer
,
&
p_current
,
1
);
p_cell_inf
->
p_cell_map
[
i
].
i_start_sector
=
ReadDouble
(
p_ifo
,
pi_buffer
,
&
p_current
);
p_cell_inf
->
p_cell_map
[
i
].
i_start_sector
=
ReadDouble
(
p_ifo
,
pi_buffer
,
&
p_current
);
// fprintf(stderr, "sector[%d] %d (%lld)\n", i,ntohl(*(u32*)(p_current)), p_ifo->i_pos);
p_cell_inf
->
p_cell_map
[
i
].
i_end_sector
=
ReadDouble
(
p_ifo
,
pi_buffer
,
&
p_current
);
p_cell_inf
->
p_cell_map
[
i
].
i_end_sector
=
ReadDouble
(
p_ifo
,
pi_buffer
,
&
p_current
);
}
}
...
...
plugins/dvd/input_dvd.c
View file @
5427a369
...
@@ -10,7 +10,7 @@
...
@@ -10,7 +10,7 @@
* -dvd_udf to find files
* -dvd_udf to find files
*****************************************************************************
*****************************************************************************
* Copyright (C) 1998-2001 VideoLAN
* Copyright (C) 1998-2001 VideoLAN
* $Id: input_dvd.c,v 1.4
6 2001/04/15 04:19:57 sam
Exp $
* $Id: input_dvd.c,v 1.4
7 2001/04/15 21:17:50 stef
Exp $
*
*
* Author: Stphane Borel <stef@via.ecp.fr>
* Author: Stphane Borel <stef@via.ecp.fr>
*
*
...
@@ -350,35 +350,34 @@ static int DVDFindCell( thread_dvd_data_t * p_dvd )
...
@@ -350,35 +350,34 @@ static int DVDFindCell( thread_dvd_data_t * p_dvd )
#define title \
#define title \
p_dvd->p_ifo->vts.title_unit.p_title[p_dvd->i_program_chain-1].title
p_dvd->p_ifo->vts.title_unit.p_title[p_dvd->i_program_chain-1].title
#define cell p_dvd->p_ifo->vts.cell_inf
#define cell p_dvd->p_ifo->vts.cell_inf
i_cell
=
p_dvd
->
i_cell
;
i_cell
=
p_dvd
->
i_cell
;
i_index
=
p_dvd
->
i_prg_cell
;
i_index
=
p_dvd
->
i_prg_cell
;
if
(
i_cell
>=
cell
.
i_cell_nb
)
{
return
-
1
;
}
while
(
(
(
title
.
p_cell_pos
[
i_index
].
i_vob_id
!=
while
(
(
(
title
.
p_cell_pos
[
i_index
].
i_vob_id
!=
cell
.
p_cell_map
[
i_cell
].
i_vob_id
)
||
cell
.
p_cell_map
[
i_cell
].
i_vob_id
)
||
(
title
.
p_cell_pos
[
i_index
].
i_cell_id
!=
(
title
.
p_cell_pos
[
i_index
].
i_cell_id
!=
cell
.
p_cell_map
[
i_cell
].
i_cell_id
)
)
&&
cell
.
p_cell_map
[
i_cell
].
i_cell_id
)
)
&&
(
i_cell
<
cell
.
i_cell_nb
)
)
(
i_cell
<
cell
.
i_cell_nb
-
1
)
)
{
{
i_cell
++
;
i_cell
++
;
}
}
/*
intf_WarnMsg
(
1
,
"FindCell: i_cell %d i_index %d found %d nb %d"
,
intf_WarnMsg
(
1
,
"FindCell: i_cell %d i_index %d found %d nb %d"
,
p_dvd
->
i_cell
,
p_dvd
->
i_cell
,
p_dvd
->
i_prg_cell
,
p_dvd
->
i_prg_cell
,
i_cell
,
i_cell
,
cell
.
i_cell_nb
);
cell
.
i_cell_nb
);
*/
if
(
i_cell
==
cell
.
i_cell_nb
)
p_dvd
->
i_cell
=
i_cell
;
{
return
0
;
intf_ErrMsg
(
"dvd error: can't find cell"
);
return
-
1
;
}
else
{
p_dvd
->
i_cell
=
i_cell
;
return
0
;
}
#undef title
#undef title
#undef cell
#undef cell
}
}
...
@@ -411,15 +410,15 @@ static int DVDFindSector( thread_dvd_data_t * p_dvd )
...
@@ -411,15 +410,15 @@ static int DVDFindSector( thread_dvd_data_t * p_dvd )
p_dvd
->
p_ifo
->
vts
.
cell_inf
.
p_cell_map
[
p_dvd
->
i_cell
].
i_end_sector
,
p_dvd
->
p_ifo
->
vts
.
cell_inf
.
p_cell_map
[
p_dvd
->
i_cell
].
i_end_sector
,
title
.
p_cell_play
[
p_dvd
->
i_prg_cell
].
i_end_sector
);
title
.
p_cell_play
[
p_dvd
->
i_prg_cell
].
i_end_sector
);
/*
intf_WarnMsg( 1, "cell: %d sector1: 0x%x end1: 0x%x\n"
intf_WarnMsg
(
1
,
"cell: %d sector1: 0x%x end1: 0x%x
\n
"
"index: %d sector2: 0x%x end2: 0x%x",
"index: %d sector2: 0x%x end2: 0x%x"
,
p_dvd
->
i_cell
,
p_dvd
->
i_cell
,
p_dvd
->
p_ifo
->
vts
.
cell_inf
.
p_cell_map
[
p_dvd
->
i_cell
].
i_start_sector
,
p_dvd
->
p_ifo
->
vts
.
cell_inf
.
p_cell_map
[
p_dvd
->
i_cell
].
i_start_sector
,
p_dvd
->
p_ifo
->
vts
.
cell_inf
.
p_cell_map
[
p_dvd
->
i_cell
].
i_end_sector
,
p_dvd
->
p_ifo
->
vts
.
cell_inf
.
p_cell_map
[
p_dvd
->
i_cell
].
i_end_sector
,
p_dvd
->
i_prg_cell
,
p_dvd
->
i_prg_cell
,
title
.
p_cell_play
[
p_dvd
->
i_prg_cell
].
i_start_sector
,
title
.
p_cell_play
[
p_dvd
->
i_prg_cell
].
i_start_sector
,
title
.
p_cell_play
[
p_dvd
->
i_prg_cell
].
i_end_sector
);
title
.
p_cell_play
[
p_dvd
->
i_prg_cell
].
i_end_sector
);
*/
#undef title
#undef title
return
0
;
return
0
;
...
@@ -427,7 +426,6 @@ static int DVDFindSector( thread_dvd_data_t * p_dvd )
...
@@ -427,7 +426,6 @@ static int DVDFindSector( thread_dvd_data_t * p_dvd )
/*****************************************************************************
/*****************************************************************************
* DVDChapterSelect: find the cell corresponding to requested chapter
* DVDChapterSelect: find the cell corresponding to requested chapter
* When called to find chapter 1, also sets title size and end.
*****************************************************************************/
*****************************************************************************/
static
int
DVDChapterSelect
(
thread_dvd_data_t
*
p_dvd
,
int
i_chapter
)
static
int
DVDChapterSelect
(
thread_dvd_data_t
*
p_dvd
,
int
i_chapter
)
{
{
...
@@ -448,7 +446,7 @@ static int DVDChapterSelect( thread_dvd_data_t * p_dvd, int i_chapter )
...
@@ -448,7 +446,7 @@ static int DVDChapterSelect( thread_dvd_data_t * p_dvd, int i_chapter )
/* start is : beginning of vts vobs + offset to vob x */
/* start is : beginning of vts vobs + offset to vob x */
p_dvd
->
i_start
=
p_dvd
->
i_title_start
+
p_dvd
->
i_start
=
p_dvd
->
i_title_start
+
DVD_LB_SIZE
*
(
off_t
)(
p_dvd
->
i_sector
);
DVD_LB_SIZE
*
(
off_t
)(
p_dvd
->
i_sector
);
/* Position the fd pointer on the right address */
/* Position the fd pointer on the right address */
p_dvd
->
i_start
=
lseek
(
p_dvd
->
i_fd
,
p_dvd
->
i_start
,
SEEK_SET
);
p_dvd
->
i_start
=
lseek
(
p_dvd
->
i_fd
,
p_dvd
->
i_start
,
SEEK_SET
);
...
@@ -574,11 +572,13 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
...
@@ -574,11 +572,13 @@ static int DVDSetArea( input_thread_t * p_input, input_area_t * p_area )
{
{
p_dvd
->
i_cell
=
vts
.
cell_inf
.
i_cell_nb
-
1
;
p_dvd
->
i_cell
=
vts
.
cell_inf
.
i_cell_nb
-
1
;
}
}
p_dvd
->
i_sector
=
0
;
p_dvd
->
i_sector
=
0
;
p_dvd
->
i_size
=
DVD_LB_SIZE
*
p_dvd
->
i_size
=
DVD_LB_SIZE
*
(
off_t
)(
vts
.
cell_inf
.
p_cell_map
[
p_dvd
->
i_cell
].
i_end_sector
);
(
off_t
)(
vts
.
cell_inf
.
p_cell_map
[
p_dvd
->
i_cell
].
i_end_sector
);
intf_WarnMsg
(
2
,
"dvd info: stream size 1: %lld @ %d"
,
p_dvd
->
i_size
,
vts
.
cell_inf
.
p_cell_map
[
p_dvd
->
i_cell
].
i_end_sector
);
if
(
DVDChapterSelect
(
p_dvd
,
1
)
<
0
)
if
(
DVDChapterSelect
(
p_dvd
,
1
)
<
0
)
{
{
intf_ErrMsg
(
"dvd error: can't find first chapter"
);
intf_ErrMsg
(
"dvd error: can't find first chapter"
);
...
@@ -1217,6 +1217,7 @@ static void DVDSeek( input_thread_t * p_input, off_t i_off )
...
@@ -1217,6 +1217,7 @@ static void DVDSeek( input_thread_t * p_input, off_t i_off )
/* Find first title cell which is inside program cell */
/* Find first title cell which is inside program cell */
if
(
DVDFindCell
(
p_dvd
)
<
0
)
if
(
DVDFindCell
(
p_dvd
)
<
0
)
{
{
/* no following cell : we're at eof */
intf_ErrMsg
(
"dvd error: cell seeking failed"
);
intf_ErrMsg
(
"dvd error: cell seeking failed"
);
p_input
->
b_error
=
1
;
p_input
->
b_error
=
1
;
return
;
return
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment