Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
F
ffmpeg.wasm-core
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Linshizhi
ffmpeg.wasm-core
Commits
ba445f55
Commit
ba445f55
authored
Feb 27, 2012
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
id3v2enc: add a function for writing attached pictures.
Unused so far.
parent
24fe1a3b
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
87 additions
and
9 deletions
+87
-9
id3v2.h
libavformat/id3v2.h
+5
-0
id3v2enc.c
libavformat/id3v2enc.c
+82
-9
No files found.
libavformat/id3v2.h
View file @
ba445f55
...
...
@@ -107,6 +107,11 @@ void ff_id3v2_start(ID3v2EncContext *id3, AVIOContext *pb, int id3v2_version,
*/
int
ff_id3v2_write_metadata
(
AVFormatContext
*
s
,
ID3v2EncContext
*
id3
);
/**
* Write an attached picture from pkt into an ID3v2 tag.
*/
int
ff_id3v2_write_apic
(
AVFormatContext
*
s
,
ID3v2EncContext
*
id3
,
AVPacket
*
pkt
);
/**
* Finalize an opened ID3v2 tag.
*/
...
...
libavformat/id3v2enc.c
View file @
ba445f55
...
...
@@ -19,6 +19,7 @@
*/
#include <stdint.h>
#include <string.h>
#include "libavutil/dict.h"
#include "libavutil/intreadwrite.h"
...
...
@@ -40,6 +41,20 @@ static int string_is_ascii(const uint8_t *str)
return
!*
str
;
}
static
void
id3v2_encode_string
(
AVIOContext
*
pb
,
const
uint8_t
*
str
,
enum
ID3v2Encoding
enc
)
{
int
(
*
put
)(
AVIOContext
*
,
const
char
*
);
if
(
enc
==
ID3v2_ENCODING_UTF16BOM
)
{
avio_wl16
(
pb
,
0xFEFF
);
/* BOM */
put
=
avio_put_str16le
;
}
else
put
=
avio_put_str
;
put
(
pb
,
str
);
}
/**
* Write a text frame with one (normal frames) or two (TXXX frames) strings
* according to encoding (only UTF-8 or UTF-16+BOM supported).
...
...
@@ -50,7 +65,6 @@ static int id3v2_put_ttag(ID3v2EncContext *id3, AVIOContext *avioc, const char *
{
int
len
;
uint8_t
*
pb
;
int
(
*
put
)(
AVIOContext
*
,
const
char
*
);
AVIOContext
*
dyn_buf
;
if
(
avio_open_dyn_buf
(
&
dyn_buf
)
<
0
)
return
AVERROR
(
ENOMEM
);
...
...
@@ -62,15 +76,9 @@ static int id3v2_put_ttag(ID3v2EncContext *id3, AVIOContext *avioc, const char *
enc
=
ID3v2_ENCODING_ISO8859
;
avio_w8
(
dyn_buf
,
enc
);
if
(
enc
==
ID3v2_ENCODING_UTF16BOM
)
{
avio_wl16
(
dyn_buf
,
0xFEFF
);
/* BOM */
put
=
avio_put_str16le
;
}
else
put
=
avio_put_str
;
put
(
dyn_buf
,
str1
);
id3v2_encode_string
(
dyn_buf
,
str1
,
enc
);
if
(
str2
)
put
(
dyn_buf
,
str2
);
id3v2_encode_string
(
dyn_buf
,
str2
,
enc
);
len
=
avio_close_dyn_buf
(
dyn_buf
,
&
pb
);
avio_wb32
(
avioc
,
tag
);
...
...
@@ -147,6 +155,71 @@ int ff_id3v2_write_metadata(AVFormatContext *s, ID3v2EncContext *id3)
return
0
;
}
int
ff_id3v2_write_apic
(
AVFormatContext
*
s
,
ID3v2EncContext
*
id3
,
AVPacket
*
pkt
)
{
AVStream
*
st
=
s
->
streams
[
pkt
->
stream_index
];
AVDictionaryEntry
*
e
;
AVIOContext
*
dyn_buf
;
uint8_t
*
buf
;
const
CodecMime
*
mime
=
ff_id3v2_mime_tags
;
const
char
*
mimetype
=
NULL
,
*
desc
=
""
;
int
enc
=
id3
->
version
==
3
?
ID3v2_ENCODING_UTF16BOM
:
ID3v2_ENCODING_UTF8
;
int
i
,
len
,
type
=
0
;
/* get the mimetype*/
while
(
mime
->
id
!=
CODEC_ID_NONE
)
{
if
(
mime
->
id
==
st
->
codec
->
codec_id
)
{
mimetype
=
mime
->
str
;
break
;
}
mime
++
;
}
if
(
!
mimetype
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"No mimetype is known for stream %d, cannot "
"write an attached picture.
\n
"
,
st
->
index
);
return
AVERROR
(
EINVAL
);
}
/* get the picture type */
e
=
av_dict_get
(
st
->
metadata
,
"comment"
,
NULL
,
0
);
for
(
i
=
0
;
e
&&
i
<
FF_ARRAY_ELEMS
(
ff_id3v2_picture_types
);
i
++
)
{
if
(
strstr
(
ff_id3v2_picture_types
[
i
],
e
->
value
)
==
ff_id3v2_picture_types
[
i
])
{
type
=
i
;
break
;
}
}
/* get the description */
if
((
e
=
av_dict_get
(
st
->
metadata
,
"title"
,
NULL
,
0
)))
desc
=
e
->
value
;
/* start writing */
if
(
avio_open_dyn_buf
(
&
dyn_buf
)
<
0
)
return
AVERROR
(
ENOMEM
);
avio_w8
(
dyn_buf
,
enc
);
avio_put_str
(
dyn_buf
,
mimetype
);
avio_w8
(
dyn_buf
,
type
);
id3v2_encode_string
(
dyn_buf
,
desc
,
enc
);
avio_write
(
dyn_buf
,
pkt
->
data
,
pkt
->
size
);
len
=
avio_close_dyn_buf
(
dyn_buf
,
&
buf
);
avio_wb32
(
s
->
pb
,
MKBETAG
(
'A'
,
'P'
,
'I'
,
'C'
));
if
(
id3
->
version
==
3
)
avio_wb32
(
s
->
pb
,
len
);
else
id3v2_put_size
(
s
->
pb
,
len
);
avio_wb16
(
s
->
pb
,
0
);
avio_write
(
s
->
pb
,
buf
,
len
);
av_freep
(
&
buf
);
id3
->
len
+=
len
+
ID3v2_HEADER_SIZE
;
return
0
;
}
void
ff_id3v2_finish
(
ID3v2EncContext
*
id3
,
AVIOContext
*
pb
)
{
int64_t
cur_pos
=
avio_tell
(
pb
);
...
...
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