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
00d7555f
Commit
00d7555f
authored
Dec 17, 2014
by
Thomas Volkert
Committed by
Michael Niedermayer
Dec 17, 2014
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wavdec: RIFX file format support
Signed-off-by:
Michael Niedermayer
<
michaelni@gmx.at
>
parent
e8714f6f
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
54 additions
and
28 deletions
+54
-28
Changelog
Changelog
+1
-0
act.c
libavformat/act.c
+1
-1
asfdec.c
libavformat/asfdec.c
+1
-1
avidec.c
libavformat/avidec.c
+1
-1
dxa.c
libavformat/dxa.c
+1
-1
matroskadec.c
libavformat/matroskadec.c
+1
-1
mlvdec.c
libavformat/mlvdec.c
+1
-1
mov.c
libavformat/mov.c
+1
-1
riff.h
libavformat/riff.h
+1
-1
riffdec.c
libavformat/riffdec.c
+26
-8
version.h
libavformat/version.h
+1
-1
wavdec.c
libavformat/wavdec.c
+16
-9
wtvdec.c
libavformat/wtvdec.c
+1
-1
xwma.c
libavformat/xwma.c
+1
-1
No files found.
Changelog
View file @
00d7555f
...
...
@@ -5,6 +5,7 @@ version <next>:
- nvenc encoder
- 10bit spp filter
- colorlevels filter
- RIFX format for *.wav files
version 2.5:
...
...
libavformat/act.c
View file @
00d7555f
...
...
@@ -75,7 +75,7 @@ static int read_header(AVFormatContext *s)
avio_skip
(
pb
,
16
);
size
=
avio_rl32
(
pb
);
ff_get_wav_header
(
pb
,
st
->
codec
,
size
);
ff_get_wav_header
(
pb
,
st
->
codec
,
size
,
0
);
/*
8000Hz (Fine-rec) file format has 10 bytes long
...
...
libavformat/asfdec.c
View file @
00d7555f
...
...
@@ -423,7 +423,7 @@ static int asf_read_stream_properties(AVFormatContext *s, int64_t size)
st
->
codec
->
codec_type
=
type
;
if
(
type
==
AVMEDIA_TYPE_AUDIO
)
{
int
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
type_specific_size
);
int
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
type_specific_size
,
0
);
if
(
ret
<
0
)
return
ret
;
if
(
is_dvr_ms_audio
)
{
...
...
libavformat/avidec.c
View file @
00d7555f
...
...
@@ -794,7 +794,7 @@ static int avi_read_header(AVFormatContext *s)
// avio_skip(pb, size - 5 * 4);
break
;
case
AVMEDIA_TYPE_AUDIO
:
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
size
);
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
size
,
0
);
if
(
ret
<
0
)
return
ret
;
ast
->
dshow_block_align
=
st
->
codec
->
block_align
;
...
...
libavformat/dxa.c
View file @
00d7555f
...
...
@@ -106,7 +106,7 @@ static int dxa_read_header(AVFormatContext *s)
ast
=
avformat_new_stream
(
s
,
NULL
);
if
(
!
ast
)
return
AVERROR
(
ENOMEM
);
ret
=
ff_get_wav_header
(
pb
,
ast
->
codec
,
fsize
);
ret
=
ff_get_wav_header
(
pb
,
ast
->
codec
,
fsize
,
0
);
if
(
ret
<
0
)
return
ret
;
if
(
ast
->
codec
->
sample_rate
>
0
)
...
...
libavformat/matroskadec.c
View file @
00d7555f
...
...
@@ -1715,7 +1715,7 @@ static int matroska_parse_tracks(AVFormatContext *s)
ffio_init_context
(
&
b
,
track
->
codec_priv
.
data
,
track
->
codec_priv
.
size
,
0
,
NULL
,
NULL
,
NULL
,
NULL
);
ret
=
ff_get_wav_header
(
&
b
,
st
->
codec
,
track
->
codec_priv
.
size
);
ret
=
ff_get_wav_header
(
&
b
,
st
->
codec
,
track
->
codec_priv
.
size
,
0
);
if
(
ret
<
0
)
return
ret
;
codec_id
=
st
->
codec
->
codec_id
;
...
...
libavformat/mlvdec.c
View file @
00d7555f
...
...
@@ -142,7 +142,7 @@ static int scan_file(AVFormatContext *avctx, AVStream *vst, AVStream *ast, int f
vst
->
codec
->
codec_tag
=
MKTAG
(
'B'
,
'I'
,
'T'
,
16
);
size
-=
164
;
}
else
if
(
ast
&&
type
==
MKTAG
(
'W'
,
'A'
,
'V'
,
'I'
)
&&
size
>=
16
)
{
ret
=
ff_get_wav_header
(
pb
,
ast
->
codec
,
16
);
ret
=
ff_get_wav_header
(
pb
,
ast
->
codec
,
16
,
0
);
if
(
ret
<
0
)
return
ret
;
size
-=
16
;
...
...
libavformat/mov.c
View file @
00d7555f
...
...
@@ -714,7 +714,7 @@ static int mov_read_wfex(MOVContext *c, AVIOContext *pb, MOVAtom atom)
return
0
;
st
=
c
->
fc
->
streams
[
c
->
fc
->
nb_streams
-
1
];
if
((
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
atom
.
size
))
<
0
)
if
((
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
atom
.
size
,
0
))
<
0
)
av_log
(
c
->
fc
,
AV_LOG_WARNING
,
"get_wav_header failed
\n
"
);
return
ret
;
...
...
libavformat/riff.h
View file @
00d7555f
...
...
@@ -62,7 +62,7 @@ void ff_put_bmp_header(AVIOContext *pb, AVCodecContext *enc, const AVCodecTag *t
int
ff_put_wav_header
(
AVIOContext
*
pb
,
AVCodecContext
*
enc
,
int
flags
);
enum
AVCodecID
ff_wav_codec_get_id
(
unsigned
int
tag
,
int
bps
);
int
ff_get_wav_header
(
AVIOContext
*
pb
,
AVCodecContext
*
codec
,
int
size
);
int
ff_get_wav_header
(
AVIOContext
*
pb
,
AVCodecContext
*
codec
,
int
size
,
int
big_endian
);
extern
const
AVCodecTag
ff_codec_bmp_tags
[];
// exposed through avformat_get_riff_video_tags()
extern
const
AVCodecTag
ff_codec_wav_tags
[];
...
...
libavformat/riffdec.c
View file @
00d7555f
...
...
@@ -80,23 +80,37 @@ static void parse_waveformatex(AVIOContext *pb, AVCodecContext *c)
}
}
int
ff_get_wav_header
(
AVIOContext
*
pb
,
AVCodecContext
*
codec
,
int
size
)
/* "big_endian" values are needed for RIFX file format */
int
ff_get_wav_header
(
AVIOContext
*
pb
,
AVCodecContext
*
codec
,
int
size
,
int
big_endian
)
{
int
id
;
if
(
size
<
14
)
avpriv_request_sample
(
codec
,
"wav header size < 14"
);
id
=
avio_rl16
(
pb
);
codec
->
codec_type
=
AVMEDIA_TYPE_AUDIO
;
codec
->
channels
=
avio_rl16
(
pb
);
codec
->
sample_rate
=
avio_rl32
(
pb
);
codec
->
bit_rate
=
avio_rl32
(
pb
)
*
8
;
codec
->
block_align
=
avio_rl16
(
pb
);
if
(
!
big_endian
)
{
id
=
avio_rl16
(
pb
);
codec
->
channels
=
avio_rl16
(
pb
);
codec
->
sample_rate
=
avio_rl32
(
pb
);
codec
->
bit_rate
=
avio_rl32
(
pb
)
*
8
;
codec
->
block_align
=
avio_rl16
(
pb
);
}
else
{
id
=
avio_rb16
(
pb
);
codec
->
channels
=
avio_rb16
(
pb
);
codec
->
sample_rate
=
avio_rb32
(
pb
);
codec
->
bit_rate
=
avio_rb32
(
pb
)
*
8
;
codec
->
block_align
=
avio_rb16
(
pb
);
}
if
(
size
==
14
)
{
/* We're dealing with plain vanilla WAVEFORMAT */
codec
->
bits_per_coded_sample
=
8
;
}
else
codec
->
bits_per_coded_sample
=
avio_rl16
(
pb
);
}
else
{
if
(
!
big_endian
)
{
codec
->
bits_per_coded_sample
=
avio_rl16
(
pb
);
}
else
{
codec
->
bits_per_coded_sample
=
avio_rb16
(
pb
);
}
}
if
(
id
==
0xFFFE
)
{
codec
->
codec_tag
=
0
;
}
else
{
...
...
@@ -106,6 +120,10 @@ int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
}
if
(
size
>=
18
)
{
/* We're obviously dealing with WAVEFORMATEX */
int
cbSize
=
avio_rl16
(
pb
);
/* cbSize */
if
(
big_endian
)
{
avpriv_report_missing_feature
(
codec
,
"WAVEFORMATEX support for RIFX files
\n
"
);
return
AVERROR_PATCHWELCOME
;
}
size
-=
18
;
cbSize
=
FFMIN
(
size
,
cbSize
);
if
(
cbSize
>=
22
&&
id
==
0xfffe
)
{
/* WAVEFORMATEXTENSIBLE */
...
...
libavformat/version.h
View file @
00d7555f
...
...
@@ -31,7 +31,7 @@
#define LIBAVFORMAT_VERSION_MAJOR 56
#define LIBAVFORMAT_VERSION_MINOR 15
#define LIBAVFORMAT_VERSION_MICRO 10
5
#define LIBAVFORMAT_VERSION_MICRO 10
6
#define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
LIBAVFORMAT_VERSION_MINOR, \
...
...
libavformat/wavdec.c
View file @
00d7555f
...
...
@@ -57,14 +57,19 @@ typedef struct WAVDemuxContext {
int
smv_cur_pt
;
int
smv_given_first
;
int
unaligned
;
// e.g. if an odd number of bytes ID3 tag was prepended
int
rifx
;
// RIFX: integer byte order for parameters is big endian
}
WAVDemuxContext
;
#if CONFIG_WAV_DEMUXER
static
int64_t
next_tag
(
AVIOContext
*
pb
,
uint32_t
*
tag
)
static
int64_t
next_tag
(
AVIOContext
*
pb
,
uint32_t
*
tag
,
int
big_endian
)
{
*
tag
=
avio_rl32
(
pb
);
return
avio_rl32
(
pb
);
if
(
!
big_endian
)
{
return
avio_rl32
(
pb
);
}
else
{
return
avio_rb32
(
pb
);
}
}
/* RIFF chunks are always at even offsets relative to where they start. */
...
...
@@ -84,7 +89,7 @@ static int64_t find_tag(WAVDemuxContext * wav, AVIOContext *pb, uint32_t tag1)
for
(;;)
{
if
(
avio_feof
(
pb
))
return
AVERROR_EOF
;
size
=
next_tag
(
pb
,
&
tag
);
size
=
next_tag
(
pb
,
&
tag
,
wav
->
rifx
);
if
(
tag
==
tag1
)
break
;
wav_seek_tag
(
wav
,
pb
,
size
,
SEEK_CUR
);
...
...
@@ -98,7 +103,7 @@ static int wav_probe(AVProbeData *p)
if
(
p
->
buf_size
<=
32
)
return
0
;
if
(
!
memcmp
(
p
->
buf
+
8
,
"WAVE"
,
4
))
{
if
(
!
memcmp
(
p
->
buf
,
"RIFF"
,
4
))
if
(
!
memcmp
(
p
->
buf
,
"RIFF"
,
4
)
||
!
memcmp
(
p
->
buf
,
"RIFX"
,
4
)
)
/* Since the ACT demuxer has a standard WAV header at the top of
* its own, the returned score is decreased to avoid a probe
* conflict between ACT and WAV. */
...
...
@@ -121,6 +126,7 @@ static void handle_stream_probing(AVStream *st)
static
int
wav_parse_fmt_tag
(
AVFormatContext
*
s
,
int64_t
size
,
AVStream
**
st
)
{
AVIOContext
*
pb
=
s
->
pb
;
WAVDemuxContext
*
wav
=
s
->
priv_data
;
int
ret
;
/* parse fmt header */
...
...
@@ -128,7 +134,7 @@ static int wav_parse_fmt_tag(AVFormatContext *s, int64_t size, AVStream **st)
if
(
!*
st
)
return
AVERROR
(
ENOMEM
);
ret
=
ff_get_wav_header
(
pb
,
(
*
st
)
->
codec
,
size
);
ret
=
ff_get_wav_header
(
pb
,
(
*
st
)
->
codec
,
size
,
wav
->
rifx
);
if
(
ret
<
0
)
return
ret
;
handle_stream_probing
(
*
st
);
...
...
@@ -258,7 +264,8 @@ static int wav_read_header(AVFormatContext *s)
tag
=
avio_rl32
(
pb
);
rf64
=
tag
==
MKTAG
(
'R'
,
'F'
,
'6'
,
'4'
);
if
(
!
rf64
&&
tag
!=
MKTAG
(
'R'
,
'I'
,
'F'
,
'F'
))
wav
->
rifx
=
tag
==
MKTAG
(
'R'
,
'I'
,
'F'
,
'X'
);
if
(
!
rf64
&&
!
wav
->
rifx
&&
tag
!=
MKTAG
(
'R'
,
'I'
,
'F'
,
'F'
))
return
AVERROR_INVALIDDATA
;
avio_rl32
(
pb
);
/* file size */
tag
=
avio_rl32
(
pb
);
...
...
@@ -288,7 +295,7 @@ static int wav_read_header(AVFormatContext *s)
for
(;;)
{
AVStream
*
vst
;
size
=
next_tag
(
pb
,
&
tag
);
size
=
next_tag
(
pb
,
&
tag
,
wav
->
rifx
);
next_tag_ofs
=
avio_tell
(
pb
)
+
size
;
if
(
avio_feof
(
pb
))
...
...
@@ -328,7 +335,7 @@ static int wav_read_header(AVFormatContext *s)
break
;
case
MKTAG
(
'f'
,
'a'
,
'c'
,
't'
):
if
(
!
sample_count
)
sample_count
=
avio_rl32
(
pb
);
sample_count
=
(
!
wav
->
rifx
?
avio_rl32
(
pb
)
:
avio_rb32
(
pb
)
);
break
;
case
MKTAG
(
'b'
,
'e'
,
'x'
,
't'
):
if
((
ret
=
wav_parse_bext_tag
(
s
,
size
))
<
0
)
...
...
@@ -662,7 +669,7 @@ static int w64_read_header(AVFormatContext *s)
if
(
!
memcmp
(
guid
,
ff_w64_guid_fmt
,
16
))
{
/* subtract chunk header size - normal wav file doesn't count it */
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
size
-
24
);
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
size
-
24
,
0
);
if
(
ret
<
0
)
return
ret
;
avio_skip
(
pb
,
FFALIGN
(
size
,
INT64_C
(
8
))
-
size
);
...
...
libavformat/wtvdec.c
View file @
00d7555f
...
...
@@ -670,7 +670,7 @@ static AVStream * parse_media_type(AVFormatContext *s, AVStream *st, int sid,
if
(
!
st
)
return
NULL
;
if
(
!
ff_guidcmp
(
formattype
,
ff_format_waveformatex
))
{
int
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
size
);
int
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
size
,
0
);
if
(
ret
<
0
)
return
NULL
;
}
else
{
...
...
libavformat/xwma.c
View file @
00d7555f
...
...
@@ -75,7 +75,7 @@ static int xwma_read_header(AVFormatContext *s)
if
(
!
st
)
return
AVERROR
(
ENOMEM
);
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
size
);
ret
=
ff_get_wav_header
(
pb
,
st
->
codec
,
size
,
0
);
if
(
ret
<
0
)
return
ret
;
st
->
need_parsing
=
AVSTREAM_PARSE_NONE
;
...
...
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