Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
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-1.1
Commits
2d109a77
Commit
2d109a77
authored
Jun 23, 2004
by
Clément Stenac
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix id3 and id3tag (using meta)
parent
0011cc99
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
98 additions
and
96 deletions
+98
-96
modules/demux/mpeg/mpga.c
modules/demux/mpeg/mpga.c
+31
-7
modules/demux/util/id3.c
modules/demux/util/id3.c
+7
-21
modules/demux/util/id3tag.c
modules/demux/util/id3tag.c
+60
-68
No files found.
modules/demux/mpeg/mpga.c
View file @
2d109a77
...
@@ -29,6 +29,8 @@
...
@@ -29,6 +29,8 @@
#include <vlc/vlc.h>
#include <vlc/vlc.h>
#include <vlc/input.h>
#include <vlc/input.h>
#include "vlc_meta.h"
/*****************************************************************************
/*****************************************************************************
* Module descriptor
* Module descriptor
*****************************************************************************/
*****************************************************************************/
...
@@ -59,6 +61,8 @@ struct demux_sys_t
...
@@ -59,6 +61,8 @@ struct demux_sys_t
int
i_bitrate_avg
;
/* extracted from Xing header */
int
i_bitrate_avg
;
/* extracted from Xing header */
vlc_meta_t
*
meta
;
es_out_id_t
*
p_es
;
es_out_id_t
*
p_es
;
};
};
...
@@ -165,9 +169,19 @@ static int Open( vlc_object_t * p_this )
...
@@ -165,9 +169,19 @@ static int Open( vlc_object_t * p_this )
}
}
}
}
/* skip possible id3 header */
p_demux
->
p_sys
=
p_sys
=
malloc
(
sizeof
(
demux_sys_t
)
);
p_sys
->
i_time
=
1
;
p_sys
->
i_bitrate_avg
=
0
;
p_sys
->
meta
=
NULL
;
/* skip/parse possible id3 header */
if
(
(
p_id3
=
module_Need
(
p_demux
,
"id3"
,
NULL
,
0
)
)
)
if
(
(
p_id3
=
module_Need
(
p_demux
,
"id3"
,
NULL
,
0
)
)
)
{
{
p_sys
->
meta
=
(
vlc_meta_t
*
)
p_demux
->
p_private
;
/* temporary */
msg_Dbg
(
p_demux
,
"Title : %s"
,
vlc_meta_GetValue
(
p_sys
->
meta
,
VLC_META_TITLE
)
);
p_demux
->
p_private
=
NULL
;
module_Unneed
(
p_demux
,
p_id3
);
module_Unneed
(
p_demux
,
p_id3
);
}
}
...
@@ -209,9 +223,6 @@ static int Open( vlc_object_t * p_this )
...
@@ -209,9 +223,6 @@ static int Open( vlc_object_t * p_this )
p_demux
->
pf_demux
=
Demux
;
p_demux
->
pf_demux
=
Demux
;
p_demux
->
pf_control
=
Control
;
p_demux
->
pf_control
=
Control
;
p_demux
->
p_sys
=
p_sys
=
malloc
(
sizeof
(
demux_sys_t
)
);
p_sys
->
i_time
=
1
;
p_sys
->
i_bitrate_avg
=
0
;
es_format_Init
(
&
fmt
,
AUDIO_ES
,
VLC_FOURCC
(
'm'
,
'p'
,
'g'
,
'a'
)
);
es_format_Init
(
&
fmt
,
AUDIO_ES
,
VLC_FOURCC
(
'm'
,
'p'
,
'g'
,
'a'
)
);
...
@@ -388,8 +399,21 @@ static void Close( vlc_object_t * p_this )
...
@@ -388,8 +399,21 @@ static void Close( vlc_object_t * p_this )
static
int
Control
(
demux_t
*
p_demux
,
int
i_query
,
va_list
args
)
static
int
Control
(
demux_t
*
p_demux
,
int
i_query
,
va_list
args
)
{
{
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
demux_sys_t
*
p_sys
=
p_demux
->
p_sys
;
return
demux2_vaControlHelper
(
p_demux
->
s
,
0
,
-
1
,
vlc_meta_t
**
pp_meta
;
p_sys
->
i_bitrate_avg
,
1
,
i_query
,
args
);
switch
(
i_query
)
{
case
DEMUX_GET_META
:
pp_meta
=
(
vlc_meta_t
**
)
va_arg
(
args
,
vlc_meta_t
**
);
*
pp_meta
=
vlc_meta_Duplicate
(
p_sys
->
meta
);
return
VLC_SUCCESS
;
default:
return
demux2_vaControlHelper
(
p_demux
->
s
,
0
,
-
1
,
p_sys
->
i_bitrate_avg
,
1
,
i_query
,
args
);
}
}
}
modules/demux/util/id3.c
View file @
2d109a77
...
@@ -49,38 +49,25 @@ vlc_module_end();
...
@@ -49,38 +49,25 @@ vlc_module_end();
****************************************************************************/
****************************************************************************/
static
int
SkipID3Tag
(
vlc_object_t
*
p_this
)
static
int
SkipID3Tag
(
vlc_object_t
*
p_this
)
{
{
input_thread_t
*
p_input
=
NULL
;
demux_t
*
p_demux
=
(
demux_t
*
)
p_this
;
uint8_t
*
p_peek
;
uint8_t
*
p_peek
;
int
i_size
;
int
i_size
;
uint8_t
version
,
revision
;
uint8_t
version
,
revision
;
int
b_footer
;
int
b_footer
;
if
(
p_this
->
i_object_type
==
VLC_OBJECT_INPUT
)
p_demux
->
p_private
=
NULL
;
{
p_input
=
(
input_thread_t
*
)
p_this
;
}
if
(
p_input
==
NULL
)
{
p_input
=
vlc_object_find
(
p_this
,
VLC_OBJECT_INPUT
,
FIND_ANYWHERE
);
if
(
p_input
==
NULL
)
{
return
VLC_EGENERIC
;
}
}
msg_Dbg
(
p_
input
,
"checking for ID3 tag"
);
msg_Dbg
(
p_
demux
,
"checking for ID3 tag"
);
/* get 10 byte id3 header */
/* get 10 byte id3 header */
if
(
stream_Peek
(
p_
input
->
s
,
&
p_peek
,
10
)
<
10
)
if
(
stream_Peek
(
p_
demux
->
s
,
&
p_peek
,
10
)
<
10
)
{
{
msg_Err
(
p_input
,
"cannot peek()"
);
msg_Err
(
p_demux
,
"cannot peek()"
);
vlc_object_release
(
p_input
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
if
(
p_peek
[
0
]
!=
'I'
||
p_peek
[
1
]
!=
'D'
||
p_peek
[
2
]
!=
'3'
)
if
(
p_peek
[
0
]
!=
'I'
||
p_peek
[
1
]
!=
'D'
||
p_peek
[
2
]
!=
'3'
)
{
{
vlc_object_release
(
p_input
);
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
...
@@ -98,11 +85,10 @@ static int SkipID3Tag( vlc_object_t *p_this )
...
@@ -98,11 +85,10 @@ static int SkipID3Tag( vlc_object_t *p_this )
i_size
+=
10
;
i_size
+=
10
;
/* Skip the entire tag */
/* Skip the entire tag */
stream_Read
(
p_
input
->
s
,
NULL
,
i_size
);
stream_Read
(
p_
demux
->
s
,
NULL
,
i_size
);
msg_Dbg
(
p_
input
,
"ID3v2.%d revision %d tag found, skiping %d bytes"
,
msg_Dbg
(
p_
demux
,
"ID3v2.%d revision %d tag found, skiping %d bytes"
,
version
,
revision
,
i_size
);
version
,
revision
,
i_size
);
vlc_object_release
(
p_input
);
return
VLC_SUCCESS
;
return
VLC_SUCCESS
;
}
}
modules/demux/util/id3tag.c
View file @
2d109a77
...
@@ -31,10 +31,10 @@
...
@@ -31,10 +31,10 @@
#include <vlc/intf.h>
#include <vlc/intf.h>
#include <vlc/input.h>
#include <vlc/input.h>
#include "ninput.h"
#include <sys/types.h>
#include <sys/types.h>
#include "vlc_meta.h"
#include <id3tag.h>
#include <id3tag.h>
#include "id3genres.h"
#include "id3genres.h"
...
@@ -59,22 +59,31 @@ vlc_module_end();
...
@@ -59,22 +59,31 @@ vlc_module_end();
/*****************************************************************************
/*****************************************************************************
* ParseID3Tag : parse an id3tag into the info structures
* ParseID3Tag : parse an id3tag into the info structures
*****************************************************************************/
*****************************************************************************/
static
void
ParseID3Tag
(
input_thread_t
*
p_input
,
uint8_t
*
p_data
,
int
i_size
)
static
void
ParseID3Tag
(
demux_t
*
p_demux
,
uint8_t
*
p_data
,
int
i_size
)
{
{
struct
id3_tag
*
p_id3_tag
;
struct
id3_tag
*
p_id3_tag
;
struct
id3_frame
*
p_frame
;
struct
id3_frame
*
p_frame
;
char
*
psz_temp
;
char
*
psz_temp
;
vlc_value_t
val
;
vlc_value_t
val
;
int
i
;
int
i
;
input_thread_t
*
p_input
;
p_input
=
vlc_object_find
(
p_demux
,
VLC_OBJECT_INPUT
,
FIND_PARENT
);
if
(
!
p_input
)
{
return
VLC_EGENERIC
;
}
var_Get
(
p_input
,
"demuxed-id3"
,
&
val
);
var_Get
(
p_input
,
"demuxed-id3"
,
&
val
);
if
(
val
.
b_bool
)
if
(
val
.
b_bool
)
{
{
msg_Dbg
(
p_
input
,
"the ID3 tag was already parsed"
);
msg_Dbg
(
p_
demux
,
"the ID3 tag was already parsed"
);
return
;
return
;
}
}
val
.
b_bool
=
VLC_FALSE
;
val
.
b_bool
=
VLC_FALSE
;
p_id3_tag
=
id3_tag_parse
(
p_data
,
i_size
);
p_id3_tag
=
id3_tag_parse
(
p_data
,
i_size
);
i
=
0
;
i
=
0
;
...
@@ -92,34 +101,34 @@ static void ParseID3Tag( input_thread_t *p_input, uint8_t *p_data, int i_size )
...
@@ -92,34 +101,34 @@ static void ParseID3Tag( input_thread_t *p_input, uint8_t *p_data, int i_size )
int
i_genre
;
int
i_genre
;
char
*
psz_endptr
;
char
*
psz_endptr
;
i_genre
=
strtol
(
psz_temp
,
&
psz_endptr
,
10
);
i_genre
=
strtol
(
psz_temp
,
&
psz_endptr
,
10
);
if
(
psz_temp
!=
psz_endptr
&&
i_genre
>=
0
&&
i_genre
<
NUM_GENRES
)
if
(
psz_temp
!=
psz_endptr
&&
i_genre
>=
0
&&
i_genre
<
NUM_GENRES
)
{
{
input_Control
(
p_input
,
INPUT_ADD_INFO
,
"ID3"
,
vlc_meta_Add
(
(
vlc_meta_t
*
)
p_demux
->
p_private
,
(
char
*
)
p_frame
->
description
,
VLC_META_GENRE
,
ppsz_genres
[
atoi
(
psz_temp
)]);
ppsz_genres
[
atoi
(
psz_temp
)]);
}
}
else
else
{
{
input_Control
(
p_input
,
INPUT_ADD_INFO
,
"ID3"
,
/* Unknown genre */
(
char
*
)
p_frame
->
description
,
psz_temp
);
vlc_meta_Add
(
(
vlc_meta_t
*
)
p_demux
->
p_private
,
VLC_META_GENRE
,
psz_temp
);
}
}
}
}
else
if
(
!
strcmp
(
p_frame
->
id
,
ID3_FRAME_TITLE
)
)
else
if
(
!
strcmp
(
p_frame
->
id
,
ID3_FRAME_TITLE
)
)
{
{
input_Control
(
p_input
,
INPUT_SET_NAME
,
psz_temp
);
vlc_meta_Add
(
(
vlc_meta_t
*
)
p_demux
->
p_private
,
input_Control
(
p_input
,
INPUT_ADD_INFO
,
"ID3"
,
VLC_META_TITLE
,
psz_temp
);
(
char
*
)
p_frame
->
description
,
psz_temp
);
// input_Control( p_demux, INPUT_SET_NAME
, psz_temp );
}
}
else
if
(
!
strcmp
(
p_frame
->
id
,
ID3_FRAME_ARTIST
)
)
else
if
(
!
strcmp
(
p_frame
->
id
,
ID3_FRAME_ARTIST
)
)
{
{
input_Control
(
p_input
,
INPUT_ADD_INFO
,
vlc_meta_Add
(
(
vlc_meta_t
*
)
p_demux
->
p_private
,
_
(
"General"
),
_
(
"Author"
),
psz_temp
);
VLC_META_ARTIST
,
psz_temp
);
input_Control
(
p_input
,
INPUT_ADD_INFO
,
"ID3"
,
(
char
*
)
p_frame
->
description
,
psz_temp
);
}
}
else
else
{
{
input_Control
(
p_input
,
INPUT_ADD_INFO
,
"ID3"
,
/* Unknown meta info */
vlc_meta_Add
(
(
vlc_meta_t
*
)
p_demux
->
p_private
,
(
char
*
)
p_frame
->
description
,
psz_temp
);
(
char
*
)
p_frame
->
description
,
psz_temp
);
}
}
free
(
psz_temp
);
free
(
psz_temp
);
...
@@ -129,7 +138,9 @@ static void ParseID3Tag( input_thread_t *p_input, uint8_t *p_data, int i_size )
...
@@ -129,7 +138,9 @@ static void ParseID3Tag( input_thread_t *p_input, uint8_t *p_data, int i_size )
id3_tag_delete
(
p_id3_tag
);
id3_tag_delete
(
p_id3_tag
);
val
.
b_bool
=
VLC_TRUE
;
val
.
b_bool
=
VLC_TRUE
;
var_Change
(
p_input
,
"demuxed-id3"
,
VLC_VAR_SETVALUE
,
&
val
,
NULL
);
var_Change
(
p_demux
,
"demuxed-id3"
,
VLC_VAR_SETVALUE
,
&
val
,
NULL
);
vlc_object_release
(
p_input
);
}
}
/*****************************************************************************
/*****************************************************************************
...
@@ -138,44 +149,34 @@ static void ParseID3Tag( input_thread_t *p_input, uint8_t *p_data, int i_size )
...
@@ -138,44 +149,34 @@ static void ParseID3Tag( input_thread_t *p_input, uint8_t *p_data, int i_size )
****************************************************************************/
****************************************************************************/
static
int
ParseID3Tags
(
vlc_object_t
*
p_this
)
static
int
ParseID3Tags
(
vlc_object_t
*
p_this
)
{
{
input_thread_t
*
p_input
=
NULL
;
demux_t
*
p_demux
=
(
demux_t
*
)
p_this
;
uint8_t
*
p_peek
;
uint8_t
*
p_peek
;
int
i_size
;
int
i_size
;
int
i_size2
;
int
i_size2
;
vlc_bool_t
b_seekable
;
if
(
p_this
->
i_object_type
==
VLC_OBJECT_INPUT
)
p_demux
->
p_private
=
(
void
*
)
vlc_meta_New
();
{
p_input
=
(
input_thread_t
*
)
p_this
;
}
if
(
p_input
==
NULL
)
{
p_input
=
vlc_object_find
(
p_this
,
VLC_OBJECT_INPUT
,
FIND_ANYWHERE
);
if
(
p_input
==
NULL
)
{
return
VLC_EGENERIC
;
}
}
msg_Dbg
(
p_
input
,
"checking for ID3 tag"
);
msg_Dbg
(
p_
demux
,
"checking for ID3 tag"
);
if
(
p_input
->
stream
.
b_seekable
&&
stream_Control
(
p_demux
->
s
,
STREAM_CAN_FASTSEEK
,
&
b_seekable
);
p_input
->
stream
.
i_method
!=
INPUT_METHOD_NETWORK
)
if
(
b_seekable
)
{
{
int64_t
i_init
;
int64_t
i_pos
;
int64_t
i_pos
;
/*look for a ID3v1 tag at the end of the file*/
/*look for a ID3v1 tag at the end of the file*/
i_pos
=
stream_Size
(
p_input
->
s
);
i_init
=
stream_Tell
(
p_demux
->
s
);
i_pos
=
stream_Size
(
p_demux
->
s
);
if
(
i_pos
>
128
)
if
(
i_pos
>
128
)
{
{
input_AccessReinit
(
p_input
);
stream_Seek
(
p_demux
->
s
,
i_pos
-
128
);
p_input
->
pf_seek
(
p_input
,
i_pos
-
128
);
/* get 10 byte id3 header */
/* get 10 byte id3 header */
if
(
stream_Peek
(
p_
input
->
s
,
&
p_peek
,
10
)
<
10
)
if
(
stream_Peek
(
p_
demux
->
s
,
&
p_peek
,
10
)
<
10
)
{
{
msg_Err
(
p_input
,
"cannot peek()"
);
msg_Err
(
p_demux
,
"cannot peek()"
);
vlc_object_release
(
p_input
);
return
(
VLC_EGENERIC
);
return
(
VLC_EGENERIC
);
}
}
...
@@ -183,72 +184,63 @@ static int ParseID3Tags( vlc_object_t *p_this )
...
@@ -183,72 +184,63 @@ static int ParseID3Tags( vlc_object_t *p_this )
if
(
i_size2
==
128
)
if
(
i_size2
==
128
)
{
{
/* peek the entire tag */
/* peek the entire tag */
if
(
stream_Peek
(
p_
input
->
s
,
&
p_peek
,
i_size2
)
<
i_size2
)
if
(
stream_Peek
(
p_
demux
->
s
,
&
p_peek
,
i_size2
)
<
i_size2
)
{
{
msg_Err
(
p_input
,
"cannot peek()"
);
msg_Err
(
p_demux
,
"cannot peek()"
);
vlc_object_release
(
p_input
);
return
(
VLC_EGENERIC
);
return
(
VLC_EGENERIC
);
}
}
msg_Dbg
(
p_
input
,
"found ID3v1 tag"
);
msg_Dbg
(
p_
demux
,
"found ID3v1 tag"
);
ParseID3Tag
(
p_
input
,
p_peek
,
i_size2
);
ParseID3Tag
(
p_
demux
,
p_peek
,
i_size2
);
}
}
/* look for ID3v2.4 tag at end of file */
/* look for ID3v2.4 tag at end of file */
/* get 10 byte ID3 footer */
/* get 10 byte ID3 footer */
if
(
stream_Peek
(
p_
input
->
s
,
&
p_peek
,
128
)
<
128
)
if
(
stream_Peek
(
p_
demux
->
s
,
&
p_peek
,
128
)
<
128
)
{
{
msg_Err
(
p_input
,
"cannot peek()"
);
msg_Err
(
p_demux
,
"cannot peek()"
);
vlc_object_release
(
p_input
);
return
(
VLC_EGENERIC
);
return
(
VLC_EGENERIC
);
}
}
i_size2
=
id3_tag_query
(
p_peek
+
118
,
10
);
i_size2
=
id3_tag_query
(
p_peek
+
118
,
10
);
if
(
i_size2
<
0
&&
i_pos
>
-
i_size2
)
if
(
i_size2
<
0
&&
i_pos
>
-
i_size2
)
{
/* id3v2.4 footer found */
{
/* id3v2.4 footer found */
input_AccessReinit
(
p_input
);
stream_Seek
(
p_demux
->
s
,
i_pos
+
i_size2
);
p_input
->
pf_seek
(
p_input
,
i_pos
+
i_size2
);
/* peek the entire tag */
/* peek the entire tag */
if
(
stream_Peek
(
p_
input
->
s
,
&
p_peek
,
i_size2
)
<
i_size2
)
if
(
stream_Peek
(
p_
demux
->
s
,
&
p_peek
,
i_size2
)
<
i_size2
)
{
{
msg_Err
(
p_input
,
"cannot peek()"
);
msg_Err
(
p_demux
,
"cannot peek()"
);
vlc_object_release
(
p_input
);
return
(
VLC_EGENERIC
);
return
(
VLC_EGENERIC
);
}
}
msg_Dbg
(
p_
input
,
"found ID3v2 tag at end of file"
);
msg_Dbg
(
p_
demux
,
"found ID3v2 tag at end of file"
);
ParseID3Tag
(
p_
input
,
p_peek
,
i_size2
);
ParseID3Tag
(
p_
demux
,
p_peek
,
i_size2
);
}
}
}
}
input_AccessReinit
(
p_input
);
stream_Seek
(
p_demux
->
s
,
i_init
);
p_input
->
pf_seek
(
p_input
,
0
);
}
}
/* get 10 byte id3 header */
/* get 10 byte id3 header */
if
(
stream_Peek
(
p_
input
->
s
,
&
p_peek
,
10
)
<
10
)
if
(
stream_Peek
(
p_
demux
->
s
,
&
p_peek
,
10
)
<
10
)
{
{
msg_Err
(
p_input
,
"cannot peek()"
);
msg_Err
(
p_demux
,
"cannot peek()"
);
vlc_object_release
(
p_input
);
return
(
VLC_EGENERIC
);
return
(
VLC_EGENERIC
);
}
}
i_size
=
id3_tag_query
(
p_peek
,
10
);
i_size
=
id3_tag_query
(
p_peek
,
10
);
if
(
i_size
<=
0
)
if
(
i_size
<=
0
)
{
{
vlc_object_release
(
p_input
);
return
(
VLC_SUCCESS
);
return
(
VLC_SUCCESS
);
}
}
/* Read the entire tag */
/* Read the entire tag */
p_peek
=
malloc
(
i_size
);
p_peek
=
malloc
(
i_size
);
if
(
!
p_peek
||
stream_Read
(
p_
input
->
s
,
p_peek
,
i_size
)
<
i_size
)
if
(
!
p_peek
||
stream_Read
(
p_
demux
->
s
,
p_peek
,
i_size
)
<
i_size
)
{
{
msg_Err
(
p_
input
,
"cannot read ID3 tag"
);
msg_Err
(
p_
demux
,
"cannot read ID3 tag"
);
if
(
p_peek
)
free
(
p_peek
);
if
(
p_peek
)
free
(
p_peek
);
vlc_object_release
(
p_input
);
return
(
VLC_EGENERIC
);
return
(
VLC_EGENERIC
);
}
}
ParseID3Tag
(
p_
input
,
p_peek
,
i_size
);
ParseID3Tag
(
p_
demux
,
p_peek
,
i_size
);
msg_Dbg
(
p_
input
,
"found ID3v2 tag"
);
msg_Dbg
(
p_
demux
,
"found ID3v2 tag"
);
free
(
p_peek
);
free
(
p_peek
);
vlc_object_release
(
p_input
);
return
(
VLC_SUCCESS
);
return
(
VLC_SUCCESS
);
}
}
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