Skip to content
GitLab
Menu
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
Steve Lhomme
VLC
Commits
ebcd06fd
Commit
ebcd06fd
authored
Dec 22, 2004
by
Rocky Bernstein
Browse files
Some work towards get segments working again.
parent
f0080eb7
Changes
3
Hide whitespace changes
Inline
Side-by-side
modules/access/vcdx/access.c
View file @
ebcd06fd
...
...
@@ -61,11 +61,9 @@ static int VCDControl ( access_t *p_access, int i_query,
static
void
VCDSetOrigin
(
access_t
*
p_access
,
lsn_t
i_lsn
,
track_t
track
,
const
vcdinfo_itemid_t
*
p_itemid
);
static
int
VCDEntryPoints
(
access_t
*
);
static
int
VCDLIDs
(
access_t
*
);
#ifdef FIXED
static
int
VCDSegments
(
access_t
*
);
#endif
static
vlc_bool_t
VCDEntryPoints
(
access_t
*
);
static
vlc_bool_t
VCDLIDs
(
access_t
*
);
static
vlc_bool_t
VCDSegments
(
access_t
*
);
static
int
VCDTitles
(
access_t
*
);
static
int
VCDReadSector
(
vlc_object_t
*
p_this
,
const
vcdinfo_obj_t
*
p_vcd
,
lsn_t
i_lsn
,
...
...
@@ -204,7 +202,7 @@ VCDReadBlock( access_t * p_access )
*
p_buf
=
0x01
;
dbg_print
(
INPUT_DBG_STILL
,
"Handled still event"
);
p_vcd
->
p_intf
->
p_sys
->
b
_still
=
VLC_TRUE
;
p_vcd
->
in
_still
=
VLC_TRUE
;
var_SetInteger
(
p_access
,
"state"
,
PAUSE_S
);
return
p_block
;
...
...
@@ -483,10 +481,10 @@ VCDPlay( access_t *p_access, vcdinfo_itemid_t itemid )
and initializes area information with that.
Before calling this track information should have been read in.
*****************************************************************************/
static
in
t
static
vlc_bool_
t
VCDEntryPoints
(
access_t
*
p_access
)
{
if
(
!
p_access
||
!
p_access
->
p_sys
)
return
VLC_
EGENERIC
;
if
(
!
p_access
||
!
p_access
->
p_sys
)
return
VLC_
FALSE
;
{
vcdplayer_t
*
p_vcd
=
(
vcdplayer_t
*
)
p_access
->
p_sys
;
...
...
@@ -498,7 +496,7 @@ VCDEntryPoints( access_t * p_access )
if
(
0
==
i_entries
)
{
LOG_ERR
(
"no entires found -- something is wrong"
);
return
VLC_
EGENERIC
;
return
VLC_
FALSE
;
}
p_vcd
->
p_entries
=
malloc
(
sizeof
(
lsn_t
)
*
i_entries
);
...
...
@@ -506,7 +504,7 @@ VCDEntryPoints( access_t * p_access )
if
(
p_vcd
->
p_entries
==
NULL
)
{
LOG_ERR
(
"not enough memory for entry points treatment"
);
return
VLC_
EGENERIC
;
return
VLC_
FALSE
;
}
p_vcd
->
i_entries
=
i_entries
;
...
...
@@ -538,86 +536,63 @@ VCDEntryPoints( access_t * p_access )
msg_Warn
(
p_access
,
"wrong track number found in entry points"
);
}
p_vcd
->
b_valid_ep
=
VLC_TRUE
;
return
0
;
return
VLC_TRUE
;
}
}
/*????? FIXME!!! */
#ifdef FIXED
/*****************************************************************************
* VCDSegments: Reads the information about the segments the disc.
*****************************************************************************/
static
in
t
static
vlc_bool_
t
VCDSegments
(
access_t
*
p_access
)
{
vcdplayer_t
*
p_vcd
;
unsigned
int
i
;
unsigned
int
i_segments
;
p_vcd
=
(
vcdplayer_t
*
)
p_access
->
p_sys
;
i_segments
=
p_vcd
->
num_segments
=
vcdinfo_get_num_segments
(
p_vcd
->
vcd
);
#define area p_access->stream.pp_areas
/* area 0 is reserved for segments. Set Absolute start offset
and size */
area
[
0
]
->
i_plugin_data
=
0
;
input_DelArea
(
p_access
,
area
[
0
]
);
input_AddArea
(
p_access
,
0
,
0
);
area
[
0
]
->
i_start
=
(
off_t
)
p_vcd
->
p_sectors
[
0
]
*
(
off_t
)
M2F2_SECTOR_SIZE
;
area
[
0
]
->
i_size
=
(
off_t
)(
p_vcd
->
p_sectors
[
1
]
-
p_vcd
->
p_sectors
[
0
])
*
(
off_t
)
M2F2_SECTOR_SIZE
;
/* Default Segment */
area
[
0
]
->
i_part
=
0
;
vcdplayer_t
*
p_vcd
=
(
vcdplayer_t
*
)
p_access
->
p_sys
;
unsigned
int
i
;
input_title_t
*
t
;
/* i_plugin_data is used to store which entry point is the first
of the track (area) */
area
[
0
]
->
i_plugin_data
=
0
;
p_vcd
->
i_segments
=
vcdinfo_get_num_segments
(
p_vcd
->
vcd
);
area
[
0
]
->
i_part_nb
=
0
;
dbg_print
(
(
INPUT_DBG_CALL
|
INPUT_DBG_MRL
),
"num LIDs=%d"
,
p_vcd
->
i_segments
);
dbg_print
(
INPUT_DBG_MRL
,
"area[0] id: %d, i_start: %lld, i_size: %lld"
,
area
[
0
]
->
i_id
,
area
[
0
]
->
i_start
,
area
[
0
]
->
i_size
);
if
(
0
==
p_vcd
->
i_segments
)
return
VLC_FALSE
;
if
(
i_segments
==
0
)
return
0
;
t
=
p_vcd
->
p_title
[
p_vcd
->
i_titles
]
=
vlc_input_title_New
();
p_vcd
->
i_titles
++
;
t
->
i_size
=
0
;
/* Not sure Segments have a size associated */
t
->
psz_name
=
strdup
(
_
(
"Segments"
));
/* We have one additional segment allocated so we can get the size
by subtracting seg[i+1] - seg[i].
*/
p_vcd
->
p_segments
=
malloc
(
sizeof
(
lsn_t
)
*
(
i_segments
+
1
)
);
p_vcd
->
p_segments
=
malloc
(
sizeof
(
lsn_t
)
*
(
p_vcd
->
i_segments
+
1
)
);
if
(
p_vcd
->
p_segments
==
NULL
)
{
LOG_ERR
(
"not enough memory for segment treatment"
);
return
-
1
;
return
VLC_FALSE
;
}
/* Update the navigation variables without triggering a callback */
VCDUpdateVar
(
p_access
,
0
,
VLC_VAR_SETVALUE
,
"title"
,
_
(
"Track"
),
"Setting track"
);
var_Change
(
p_access
,
"chapter"
,
VLC_VAR_CLEARCHOICES
,
NULL
,
NULL
);
for
(
i
=
0
;
i
<
i_segments
;
i
++
)
for
(
i
=
0
;
i
<
p_vcd
->
i_segments
;
i
++
)
{
p_vcd
->
p_segments
[
i
]
=
vcdinfo_get_seg_lsn
(
p_vcd
->
vcd
,
i
);
area
[
0
]
->
i_part_nb
++
;
VCDUpdateVar
(
p_access
,
i
,
VLC_VAR_ADDCHOICE
,
"chapter"
,
_
(
"Segment"
),
"Adding segment choice"
);
char
psz_segment
[
100
];
seekpoint_t
*
s
=
vlc_seekpoint_New
();
p_vcd
->
p_segments
[
i
]
=
vcdinfo_get_seg_lsn
(
p_vcd
->
vcd
,
i
);
snprintf
(
psz_segment
,
sizeof
(
psz_segment
),
"%s%02d"
,
_
(
"Segment "
),
i
);
s
->
i_byte_offset
=
0
;
/* Not sure what this would mean here */
s
->
psz_name
=
strdup
(
psz_segment
);
TAB_APPEND
(
t
->
i_seekpoint
,
t
->
seekpoint
,
s
);
}
#undef area
p_vcd
->
p_segments
[
i_segments
]
=
p_vcd
->
p_segments
[
i_segments
-
1
]
+
vcdinfo_get_seg_sector_count
(
p_vcd
->
vcd
,
i_segments
-
1
);
p_vcd
->
p_segments
[
p_vcd
->
i_segments
]
=
p_vcd
->
p_segments
[
p_vcd
->
i_segments
-
1
]
+
vcdinfo_get_seg_sector_count
(
p_vcd
->
vcd
,
p_vcd
->
i_segments
-
1
);
return
0
;
return
VLC_TRUE
;
}
#endif
/*****************************************************************************
Build title table which will be returned via ACCESS_GET_TITLE_INFO.
...
...
@@ -666,14 +641,21 @@ VCDTitles( access_t * p_access )
/*****************************************************************************
VCDLIDs: Reads the LIST IDs from the LOT.
*****************************************************************************/
static
in
t
static
vlc_bool_
t
VCDLIDs
(
access_t
*
p_access
)
{
vcdplayer_t
*
p_vcd
=
(
vcdplayer_t
*
)
p_access
->
p_sys
;
input_title_t
*
t
;
unsigned
int
i_lid
,
i_title
;
p_vcd
->
i_lids
=
vcdinfo_get_num_LIDs
(
p_vcd
->
vcd
);
p_vcd
->
i_lid
=
VCDINFO_INVALID_ENTRY
;
dbg_print
(
(
INPUT_DBG_CALL
|
INPUT_DBG_MRL
),
"num LIDs=%d"
,
p_vcd
->
i_lids
);
if
(
0
==
p_vcd
->
i_lids
)
return
VLC_FALSE
;
if
(
vcdinfo_read_psd
(
p_vcd
->
vcd
))
{
vcdinfo_visit_lot
(
p_vcd
->
vcd
,
VLC_FALSE
);
...
...
@@ -690,10 +672,35 @@ VCDLIDs( access_t * p_access )
#endif
}
dbg_print
(
(
INPUT_DBG_CALL
|
INPUT_DBG_MRL
),
"num LIDs=%d"
,
p_vcd
->
i_lids
);
/* Set up LIDs Navigation Menu */
t
=
vlc_input_title_New
();
t
->
b_menu
=
VLC_TRUE
;
t
->
psz_name
=
strdup
(
"LIDs"
);
i_title
=
p_vcd
->
i_tracks
;
for
(
i_lid
=
1
;
i_lid
<=
p_vcd
->
i_lids
;
i_lid
++
)
{
char
psz_lid
[
100
];
seekpoint_t
*
s
=
vlc_seekpoint_New
();
snprintf
(
psz_lid
,
sizeof
(
psz_lid
),
"%s%02d"
,
_
(
"LID "
),
i_lid
);
s
->
i_byte_offset
=
0
;
/* A lid doesn't have an offset
size associated with it */
s
->
psz_name
=
strdup
(
psz_lid
);
TAB_APPEND
(
t
->
i_seekpoint
,
t
->
seekpoint
,
s
);
}
return
0
;
#if DYNAMICALLY_ALLOCATED
TAB_APPEND
(
p_vcd
->
i_titles
,
p_vcd
->
p_title
,
t
);
#else
p_vcd
->
p_title
[
p_vcd
->
i_titles
]
=
t
;
p_vcd
->
i_titles
++
;
#endif
return
VLC_TRUE
;
}
/*****************************************************************************
...
...
@@ -840,8 +847,6 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track,
vcdplayer_set_origin
(
p_access
);
p_access
->
info
.
i_title
=
i_track
-
1
;
p_access
->
info
.
i_size
=
p_vcd
->
p_title
[
i_title
]
->
i_size
;
p_access
->
info
.
i_pos
=
(
i_lsn
-
p_vcd
->
track_lsn
)
*
M2F2_SECTOR_SIZE
;
p_access
->
info
.
i_update
|=
INPUT_UPDATE_TITLE
|
INPUT_UPDATE_SIZE
...
...
@@ -850,11 +855,20 @@ VCDSetOrigin( access_t *p_access, lsn_t i_lsn, track_t i_track,
if
(
p_itemid
->
type
==
VCDINFO_ITEM_TYPE_ENTRY
)
{
VCDUpdateVar
(
p_access
,
p_itemid
->
num
,
VLC_VAR_SETVALUE
,
"chapter"
,
_
(
"Entry"
),
"Setting entry/segment"
);
p_access
->
info
.
i_title
=
i_track
-
1
;
p_access
->
info
.
i_size
=
p_vcd
->
p_title
[
i_title
]
->
i_size
;
p_access
->
info
.
i_seekpoint
=
p_itemid
->
num
;
}
else
{
}
else
if
(
p_itemid
->
type
==
VCDINFO_ITEM_TYPE_SEGMENT
)
{
VCDUpdateVar
(
p_access
,
p_itemid
->
num
,
VLC_VAR_SETVALUE
,
"chapter"
,
_
(
"Segment"
),
"Setting entry/segment"
);
/* seekpoint is what? ??? */
/* The last title entry is the for segments (when segments exist
and they must here. The segment seekpoints are stored after
the entry seepoints.
*/
p_access
->
info
.
i_title
=
p_vcd
->
i_titles
-
1
;
p_access
->
info
.
i_size
=
150
*
M2F2_SECTOR_SIZE
;
p_access
->
info
.
i_seekpoint
=
p_vcd
->
i_entries
+
p_itemid
->
num
;
}
VCDUpdateTitle
(
p_access
);
...
...
@@ -921,7 +935,7 @@ vcd_Open( vlc_object_t *p_this, const char *psz_dev )
for
(
i
=
0
;
i
<
p_vcd
->
i_segments
;
i
++
)
{
p_vcd
->
segment
[
i
].
size
=
vcdinfo_get_seg_sector_count
(
p_vcdobj
,
i
);
p_vcd
->
segment
[
i
].
start_LSN
=
vcdinfo_get_seg_l
ba
(
p_vcdobj
,
i
);
p_vcd
->
segment
[
i
].
start_LSN
=
vcdinfo_get_seg_l
sn
(
p_vcdobj
,
i
);
}
}
else
p_vcd
->
segment
=
NULL
;
...
...
@@ -984,43 +998,6 @@ VCDUpdateVar( access_t *p_access, int i_num, int i_action,
/*****************************************************************************
* Public routines.
*****************************************************************************/
int
E_
(
DebugCallback
)
(
vlc_object_t
*
p_this
,
const
char
*
psz_name
,
vlc_value_t
oldval
,
vlc_value_t
val
,
void
*
p_data
)
{
vcdplayer_t
*
p_vcd
;
if
(
NULL
==
p_vcd_access
)
return
VLC_EGENERIC
;
p_vcd
=
(
vcdplayer_t
*
)
p_vcd_access
->
p_sys
;
if
(
p_vcd
->
i_debug
&
(
INPUT_DBG_CALL
|
INPUT_DBG_EXT
))
{
msg_Dbg
(
p_vcd_access
,
"Old debug (x%0x) %d, new debug (x%0x) %d"
,
p_vcd
->
i_debug
,
p_vcd
->
i_debug
,
val
.
i_int
,
val
.
i_int
);
}
p_vcd
->
i_debug
=
val
.
i_int
;
return
VLC_SUCCESS
;
}
int
E_
(
BlocksPerReadCallback
)
(
vlc_object_t
*
p_this
,
const
char
*
psz_name
,
vlc_value_t
oldval
,
vlc_value_t
val
,
void
*
p_data
)
{
vcdplayer_t
*
p_vcd
;
if
(
NULL
==
p_vcd_access
)
return
VLC_EGENERIC
;
p_vcd
=
(
vcdplayer_t
*
)
p_vcd_access
->
p_sys
;
if
(
p_vcd
->
i_debug
&
(
INPUT_DBG_CALL
|
INPUT_DBG_EXT
))
{
msg_Dbg
(
p_vcd_access
,
"Old debug (x%0x) %d, new debug (x%0x) %d"
,
p_vcd
->
i_debug
,
p_vcd
->
i_debug
,
val
.
i_int
,
val
.
i_int
);
}
p_vcd
->
i_debug
=
val
.
i_int
;
return
VLC_SUCCESS
;
}
/*****************************************************************************
VCDOpen: open VCD.
...
...
@@ -1111,26 +1088,25 @@ E_(VCDOpen) ( vlc_object_t *p_this )
goto
err_exit
;
}
#ifdef FIXED
/* Initialize segment information. */
VCDSegments
(
p_access
);
#endif
/* Build Navigation Title table. */
/* Build Navigation Title table for the tracks. */
VCDTitles
(
p_access
);
/*
Map
entry points
into
Chapters */
if
(
VCDEntryPoints
(
p_access
)
<
0
)
/*
Add into the above
entry points
as "
Chapters
".
*/
if
(
!
VCDEntryPoints
(
p_access
)
)
{
msg_Warn
(
p_access
,
"could not read entry points, will not use them"
);
p_vcd
->
b_valid_ep
=
VLC_FALSE
;
}
if
(
VCDLIDs
(
p_access
)
<
0
)
/* Initialize LID info and add that as a menu item */
if
(
!
VCDLIDs
(
p_access
)
)
{
msg_Warn
(
p_access
,
"could not read entry LIDs"
);
}
/* Initialize segment information and add that a "Track". */
VCDSegments
(
p_access
);
b_play_ok
=
(
VLC_SUCCESS
==
VCDPlay
(
p_access
,
itemid
));
if
(
!
b_play_ok
)
{
...
...
modules/access/vcdx/vcd.c
View file @
ebcd06fd
...
...
@@ -102,12 +102,12 @@ vlc_module_begin();
set_subcategory
(
SUBCAT_INPUT_ACCESS
);
/* Configuration options */
add_integer
(
MODULE_STRING
"-debug"
,
0
,
E_
(
DebugCallback
)
,
add_integer
(
MODULE_STRING
"-debug"
,
0
,
NULL
,
N_
(
"If nonzero, this gives additional debug information."
),
DEBUG_LONGTEXT
,
VLC_TRUE
);
add_integer
(
MODULE_STRING
"-blocks-per-read"
,
20
,
E_
(
BlocksPerReadCallback
)
,
NULL
,
N_
(
"Number of CD blocks to get in a single read."
),
N_
(
"Number of CD blocks to get in a single read."
),
VLC_TRUE
);
...
...
modules/access/vcdx/vcdplayer.h
View file @
ebcd06fd
...
...
@@ -135,7 +135,10 @@ typedef struct thread_vcd_data_s
unsigned
int
i_titles
;
/* # of navigatable titles. */
input_title_t
*
p_title
[
CDIO_CD_MAX_TRACKS
];
/*
# tracks + menu for segments + menu for LIDs
*/
input_title_t
*
p_title
[
CDIO_CD_MAX_TRACKS
+
2
];
/* Probably gets moved into another structure...*/
intf_thread_t
*
p_intf
;
...
...
Write
Preview
Supports
Markdown
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