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
139f7409
Commit
139f7409
authored
Nov 21, 2004
by
Gildas Bazin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
* modules/demux/m3u.c: ported to new playlist API.
parent
e0d08374
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
85 additions
and
47 deletions
+85
-47
configure.ac
configure.ac
+1
-1
modules/demux/m3u.c
modules/demux/m3u.c
+84
-46
No files found.
configure.ac
View file @
139f7409
...
...
@@ -954,7 +954,7 @@ VLC_ADD_PLUGINS([trivial_channel_mixer simple_channel_mixer headphone_channel_mi
VLC_ADD_PLUGINS([trivial_mixer spdif_mixer float32_mixer])
VLC_ADD_PLUGINS([aout_file equalizer])
VLC_ADD_PLUGINS([i420_rgb i420_yuy2 i422_yuy2 i420_ymga])
VLC_ADD_PLUGINS([id3 playlist export sgimb])
VLC_ADD_PLUGINS([id3 playlist export sgimb
m3u
])
VLC_ADD_PLUGINS([rawvideo blend scale time marq])
VLC_ADD_PLUGINS([wav araw subtitle vobsub adpcm a52sys dtssys au])
VLC_ADD_PLUGINS([access_file access_udp access_tcp access_http ipv4 access_mms])
...
...
modules/demux/m3u.c
View file @
139f7409
...
...
@@ -5,7 +5,7 @@
* $Id$
*
* Authors: Sigmund Augdal <sigmunau@idi.ntnu.no>
* Gildas Bazin <gbazin@
netcourrier.com
>
* Gildas Bazin <gbazin@
videolan.org
>
* Clment Stenac <zorglub@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify
...
...
@@ -64,7 +64,7 @@ static int Control ( demux_t *, int, va_list );
*****************************************************************************/
vlc_module_begin
();
set_description
(
_
(
"Playlist metademux"
)
);
set_capability
(
"demux2"
,
10
);
set_capability
(
"demux2"
,
5
);
set_callbacks
(
Activate
,
Deactivate
);
add_shortcut
(
"m3u"
);
add_shortcut
(
"asx"
);
...
...
@@ -121,7 +121,7 @@ static int Activate( vlc_object_t * p_this )
* at the content. This is useful for .asp, .php and similar files
* that are actually html. Also useful for some asx files that have
* another extension */
/*
XXX we double check for file != m3u as some asx ...
are just m3u file */
/*
We double check for file != m3u as some asx
are just m3u file */
if
(
i_type
!=
TYPE_M3U
)
{
uint8_t
*
p_peek
;
...
...
@@ -248,14 +248,13 @@ static void XMLSpecialChars ( char *str )
* psz_line is \0 terminated
*****************************************************************************/
static
int
ParseLine
(
demux_t
*
p_demux
,
char
*
psz_line
,
char
*
psz_data
,
vlc_bool_t
*
pb_
next
)
vlc_bool_t
*
pb_
done
)
{
demux_sys_t
*
p_m3u
=
p_demux
->
p_sys
;
char
*
psz_bol
,
*
psz_name
;
psz_bol
=
psz_line
;
*
pb_next
=
VLC_FALSE
;
*
pb_done
=
VLC_FALSE
;
/* Remove unnecessary tabs or spaces at the beginning of line */
while
(
*
psz_bol
==
' '
||
*
psz_bol
==
'\t'
||
...
...
@@ -446,15 +445,14 @@ static int ParseLine( demux_t *p_demux, char *psz_line, char *psz_data,
}
else
if
(
strstr
(
psz_bol
,
"</entry>"
)
||
strstr
(
psz_bol
,
"</Entry>"
))
{
*
pb_
next
=
VLC_TRUE
;
*
pb_
done
=
VLC_TRUE
;
return
0
;
}
/* We are looking for <entry Playstring="blabla"> */
/* We are looking for <entry Playstring="blabla"> */
while
(
*
psz_bol
&&
strncasecmp
(
psz_bol
,
"Playstring"
,
sizeof
(
"Playstring"
)
-
1
)
)
while
(
*
psz_bol
&&
strncasecmp
(
psz_bol
,
"Playstring"
,
sizeof
(
"Playstring"
)
-
1
)
)
psz_bol
++
;
if
(
!*
psz_bol
)
return
0
;
...
...
@@ -567,34 +565,29 @@ static int ParseLine( demux_t *p_demux, char *psz_line, char *psz_data,
if
(
p_m3u
->
i_type
!=
TYPE_B4S
)
{
*
pb_
next
=
VLC_TRUE
;
*
pb_
done
=
VLC_TRUE
;
}
return
1
;
}
static
void
ProcessLine
(
demux_t
*
p_demux
,
playlist_t
*
p_playlist
,
playlist_item_t
*
p_parent
,
char
*
psz_line
,
char
**
ppsz_uri
,
char
**
ppsz_name
,
int
*
pi_options
,
char
***
pppsz_options
,
int
*
pi_position
)
vlc_bool_t
b_flush
)
{
char
psz_data
[
MAX_LINE
];
vlc_bool_t
b_next
;
char
psz_data
[
MAX_LINE
];
vlc_bool_t
b_done
;
switch
(
ParseLine
(
p_demux
,
psz_line
,
psz_data
,
&
b_
next
)
)
switch
(
ParseLine
(
p_demux
,
psz_line
,
psz_data
,
&
b_
done
)
)
{
case
1
:
if
(
*
ppsz_uri
)
{
free
(
*
ppsz_uri
);
}
if
(
*
ppsz_uri
)
free
(
*
ppsz_uri
);
*
ppsz_uri
=
strdup
(
psz_data
);
break
;
case
2
:
if
(
*
ppsz_name
)
{
free
(
*
ppsz_name
);
}
if
(
*
ppsz_name
)
free
(
*
ppsz_name
);
*
ppsz_name
=
strdup
(
psz_data
);
break
;
case
3
:
...
...
@@ -608,13 +601,27 @@ static void ProcessLine ( demux_t *p_demux, playlist_t *p_playlist,
break
;
}
if
(
b_next
&&
*
ppsz_uri
)
if
(
(
b_done
||
b_flush
)
&&
*
ppsz_uri
)
{
playlist_AddExt
(
p_playlist
,
*
ppsz_uri
,
*
ppsz_name
,
PLAYLIST_INSERT
,
*
pi_position
,
-
1
,
(
const
char
**
)
*
pppsz_options
,
*
pi_options
);
playlist_item_t
*
p_item
=
playlist_ItemNew
(
p_playlist
,
*
ppsz_uri
,
*
ppsz_name
);
int
i
;
for
(
i
=
0
;
i
<
*
pi_options
;
i
++
)
{
playlist_ItemAddOption
(
p_item
,
*
pppsz_options
[
i
]
);
}
playlist_NodeAddItem
(
p_playlist
,
p_item
,
p_parent
->
pp_parents
[
0
]
->
i_view
,
p_parent
,
PLAYLIST_APPEND
,
PLAYLIST_END
);
/* We need to declare the parents of the node as the
* same of the parent's ones */
playlist_CopyParents
(
p_parent
,
p_item
);
vlc_input_item_CopyOptions
(
&
p_parent
->
input
,
&
p_item
->
input
);
(
*
pi_position
)
++
;
if
(
*
ppsz_name
)
free
(
*
ppsz_name
);
*
ppsz_name
=
NULL
;
free
(
*
ppsz_uri
);
*
ppsz_uri
=
NULL
;
...
...
@@ -627,6 +634,33 @@ static void ProcessLine ( demux_t *p_demux, playlist_t *p_playlist,
}
}
static
vlc_bool_t
FindItem
(
demux_t
*
p_demux
,
playlist_t
*
p_playlist
,
playlist_item_t
**
pp_item
)
{
vlc_bool_t
b_play
;
if
(
&
p_playlist
->
status
.
p_item
->
input
==
((
input_thread_t
*
)
p_demux
->
p_parent
)
->
input
.
p_item
)
{
msg_Dbg
(
p_playlist
,
"starting playlist playback"
);
*
pp_item
=
p_playlist
->
status
.
p_item
;
b_play
=
VLC_TRUE
;
}
else
{
input_item_t
*
p_current
=
((
input_thread_t
*
)
p_demux
->
p_parent
)
->
input
.
p_item
;
*
pp_item
=
playlist_ItemGetByInput
(
p_playlist
,
p_current
);
if
(
!*
pp_item
)
msg_Dbg
(
p_playlist
,
"unable to find item in playlist"
);
b_play
=
VLC_FALSE
;
}
return
b_play
;
}
/*****************************************************************************
* Demux: reads and demuxes data packets
*****************************************************************************
...
...
@@ -639,7 +673,6 @@ static int Demux( demux_t *p_demux )
char
psz_line
[
MAX_LINE
];
char
p_buf
[
MAX_LINE
],
eol_tok
;
int
i_size
,
i_bufpos
,
i_linepos
=
0
;
playlist_t
*
p_playlist
;
vlc_bool_t
b_discard
=
VLC_FALSE
;
char
*
psz_name
=
NULL
;
...
...
@@ -647,7 +680,9 @@ static int Demux( demux_t *p_demux )
int
i_options
=
0
;
char
**
ppsz_options
=
NULL
;
int
i_position
;
playlist_t
*
p_playlist
;
playlist_item_t
*
p_parent
;
vlc_bool_t
b_play
;
p_playlist
=
(
playlist_t
*
)
vlc_object_find
(
p_demux
,
VLC_OBJECT_PLAYLIST
,
FIND_ANYWHERE
);
...
...
@@ -657,8 +692,9 @@ static int Demux( demux_t *p_demux )
return
-
1
;
}
p_playlist
->
pp_items
[
p_playlist
->
i_index
]
->
b_autodeletion
=
VLC_TRUE
;
i_position
=
p_playlist
->
i_index
+
1
;
b_play
=
FindItem
(
p_demux
,
p_playlist
,
&
p_parent
);
playlist_ItemToNode
(
p_playlist
,
p_parent
);
p_parent
->
input
.
i_type
=
ITEM_TYPE_PLAYLIST
;
/* Depending on wether we are dealing with an m3u/asf file, the end of
* line token will be different */
...
...
@@ -706,25 +742,19 @@ static int Demux( demux_t *p_demux )
psz_line
[
i_linepos
]
=
'\0'
;
i_linepos
=
0
;
ProcessLine
(
p_demux
,
p_playlist
,
psz_line
,
&
psz_uri
,
&
psz_name
,
&
i_options
,
&
ppsz_options
,
&
i_position
);
ProcessLine
(
p_demux
,
p_playlist
,
p_parent
,
psz_line
,
&
psz_uri
,
&
psz_name
,
&
i_options
,
&
ppsz_options
,
VLC_FALSE
);
}
}
if
(
i_linepos
&&
b_discard
!=
VLC_TRUE
&&
eol_tok
==
'\n'
)
if
(
i_linepos
&&
b_discard
!=
VLC_TRUE
&&
eol_tok
==
'\n'
)
{
psz_line
[
i_linepos
]
=
'\0'
;
ProcessLine
(
p_demux
,
p_playlist
,
psz_line
,
&
psz_uri
,
&
psz_name
,
&
i_options
,
&
ppsz_options
,
&
i_position
);
/* Is there a pendding uri without b_next */
if
(
psz_uri
)
{
playlist_AddExt
(
p_playlist
,
psz_uri
,
psz_name
,
PLAYLIST_INSERT
,
i_position
,
-
1
,
(
const
char
**
)
ppsz_options
,
i_options
);
}
ProcessLine
(
p_demux
,
p_playlist
,
p_parent
,
psz_line
,
&
psz_uri
,
&
psz_name
,
&
i_options
,
&
ppsz_options
,
VLC_TRUE
);
}
if
(
psz_uri
)
free
(
psz_uri
);
...
...
@@ -735,6 +765,14 @@ static int Demux( demux_t *p_demux )
if
(
i_options
==
1
)
free
(
ppsz_options
);
}
/* Go back and play the playlist */
if
(
b_play
)
{
playlist_Control
(
p_playlist
,
PLAYLIST_VIEWPLAY
,
p_playlist
->
status
.
i_view
,
p_playlist
->
status
.
p_item
,
NULL
);
}
vlc_object_release
(
p_playlist
);
return
0
;
...
...
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