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
32d05934
Commit
32d05934
authored
Apr 13, 2014
by
Alessandro Ghedini
Committed by
Anton Khirnov
Apr 17, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
mp3dec: decode more data from Info header
Signed-off-by:
Anton Khirnov
<
anton@khirnov.net
>
parent
0983d481
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
101 additions
and
10 deletions
+101
-10
avio_internal.h
libavformat/avio_internal.h
+2
-0
aviobuf.c
libavformat/aviobuf.c
+6
-0
mp3dec.c
libavformat/mp3dec.c
+93
-10
No files found.
libavformat/avio_internal.h
View file @
32d05934
...
...
@@ -94,6 +94,8 @@ void ffio_init_checksum(AVIOContext *s,
unsigned
long
ffio_get_checksum
(
AVIOContext
*
s
);
unsigned
long
ff_crc04C11DB7_update
(
unsigned
long
checksum
,
const
uint8_t
*
buf
,
unsigned
int
len
);
unsigned
long
ff_crcA001_update
(
unsigned
long
checksum
,
const
uint8_t
*
buf
,
unsigned
int
len
);
/**
* Open a write only packetized memory stream with a maximum packet
...
...
libavformat/aviobuf.c
View file @
32d05934
...
...
@@ -414,6 +414,12 @@ unsigned long ff_crc04C11DB7_update(unsigned long checksum, const uint8_t *buf,
return
av_crc
(
av_crc_get_table
(
AV_CRC_32_IEEE
),
checksum
,
buf
,
len
);
}
unsigned
long
ff_crcA001_update
(
unsigned
long
checksum
,
const
uint8_t
*
buf
,
unsigned
int
len
)
{
return
av_crc
(
av_crc_get_table
(
AV_CRC_16_ANSI_LE
),
checksum
,
buf
,
len
);
}
unsigned
long
ffio_get_checksum
(
AVIOContext
*
s
)
{
s
->
checksum
=
s
->
update_checksum
(
s
->
checksum
,
s
->
checksum_ptr
,
...
...
libavformat/mp3dec.c
View file @
32d05934
...
...
@@ -21,10 +21,12 @@
#include "libavutil/avstring.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/crc.h"
#include "libavutil/dict.h"
#include "libavutil/mathematics.h"
#include "avformat.h"
#include "internal.h"
#include "avio_internal.h"
#include "id3v2.h"
#include "id3v1.h"
#include "replaygain.h"
...
...
@@ -128,11 +130,20 @@ static void read_xing_toc(AVFormatContext *s, int64_t filesize, int64_t duration
mp3
->
xing_toc
=
1
;
}
static
void
mp3_parse_info_tag
(
AVFormatContext
*
s
,
AVStream
*
st
,
MPADecodeHeader
*
c
,
uint32_t
spf
)
{
#define LAST_BITS(k, n) ((k) & ((1 << (n)) - 1))
#define MIDDLE_BITS(k, m, n) LAST_BITS((k) >> (m), ((n) - (m)))
uint16_t
crc
;
uint32_t
v
;
char
version
[
10
];
uint32_t
peak
=
0
;
int32_t
r_gain
=
INT32_MIN
,
a_gain
=
INT32_MIN
;
MP3DecContext
*
mp3
=
s
->
priv_data
;
const
int64_t
xing_offtbl
[
2
][
2
]
=
{{
32
,
17
},
{
17
,
9
}};
...
...
@@ -140,17 +151,87 @@ static void mp3_parse_info_tag(AVFormatContext *s, AVStream *st,
avio_skip
(
s
->
pb
,
xing_offtbl
[
c
->
lsf
==
1
][
c
->
nb_channels
==
1
]);
v
=
avio_rb32
(
s
->
pb
);
mp3
->
is_cbr
=
v
==
MKBETAG
(
'I'
,
'n'
,
'f'
,
'o'
);
if
(
v
==
MKBETAG
(
'X'
,
'i'
,
'n'
,
'g'
)
||
mp3
->
is_cbr
)
{
v
=
avio_rb32
(
s
->
pb
);
if
(
v
&
XING_FLAG_FRAMES
)
mp3
->
frames
=
avio_rb32
(
s
->
pb
);
if
(
v
&
XING_FLAG_SIZE
)
mp3
->
size
=
avio_rb32
(
s
->
pb
);
if
(
v
&
XING_FLAG_TOC
&&
mp3
->
frames
)
read_xing_toc
(
s
,
mp3
->
size
,
av_rescale_q
(
mp3
->
frames
,
if
(
v
!=
MKBETAG
(
'X'
,
'i'
,
'n'
,
'g'
)
&&
!
mp3
->
is_cbr
)
return
;
v
=
avio_rb32
(
s
->
pb
);
if
(
v
&
XING_FLAG_FRAMES
)
mp3
->
frames
=
avio_rb32
(
s
->
pb
);
if
(
v
&
XING_FLAG_SIZE
)
mp3
->
size
=
avio_rb32
(
s
->
pb
);
if
(
v
&
XING_FLAG_TOC
&&
mp3
->
frames
)
read_xing_toc
(
s
,
mp3
->
size
,
av_rescale_q
(
mp3
->
frames
,
(
AVRational
){
spf
,
c
->
sample_rate
},
st
->
time_base
));
/* VBR quality */
avio_rb32
(
s
->
pb
);
/* Encoder short version string */
memset
(
version
,
0
,
sizeof
(
version
));
avio_read
(
s
->
pb
,
version
,
9
);
/* Info Tag revision + VBR method */
avio_r8
(
s
->
pb
);
/* Lowpass filter value */
avio_r8
(
s
->
pb
);
/* ReplayGain peak */
v
=
avio_rb32
(
s
->
pb
);
peak
=
av_rescale
(
v
,
100000
,
1
<<
23
);
/* Radio ReplayGain */
v
=
avio_rb16
(
s
->
pb
);
if
(
MIDDLE_BITS
(
v
,
13
,
15
)
==
1
)
{
r_gain
=
MIDDLE_BITS
(
v
,
0
,
8
)
*
10000
;
if
(
v
&
(
1
<<
9
))
r_gain
*=
-
1
;
}
/* Audiophile ReplayGain */
v
=
avio_rb16
(
s
->
pb
);
if
(
MIDDLE_BITS
(
v
,
13
,
15
)
==
2
)
{
a_gain
=
MIDDLE_BITS
(
v
,
0
,
8
)
*
10000
;
if
(
v
&
(
1
<<
9
))
a_gain
*=
-
1
;
}
/* Encoding flags + ATH Type */
avio_r8
(
s
->
pb
);
/* if ABR {specified bitrate} else {minimal bitrate} */
avio_r8
(
s
->
pb
);
/* Encoder delays */
avio_rb24
(
s
->
pb
);
/* Misc */
avio_r8
(
s
->
pb
);
/* MP3 gain */
avio_r8
(
s
->
pb
);
/* Preset and surround info */
avio_rb16
(
s
->
pb
);
/* Music length */
avio_rb32
(
s
->
pb
);
/* Music CRC */
avio_rb16
(
s
->
pb
);
/* Info Tag CRC */
crc
=
ffio_get_checksum
(
s
->
pb
);
v
=
avio_rb16
(
s
->
pb
);
if
(
v
==
crc
)
{
ff_replaygain_export_raw
(
st
,
r_gain
,
peak
,
a_gain
,
0
);
av_dict_set
(
&
st
->
metadata
,
"encoder"
,
version
,
0
);
}
}
...
...
@@ -183,6 +264,8 @@ static int mp3_parse_vbr_tags(AVFormatContext *s, AVStream *st, int64_t base)
int
vbrtag_size
=
0
;
MP3DecContext
*
mp3
=
s
->
priv_data
;
ffio_init_checksum
(
s
->
pb
,
ff_crcA001_update
,
0
);
v
=
avio_rb32
(
s
->
pb
);
if
(
ff_mpa_check_header
(
v
)
<
0
)
return
-
1
;
...
...
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