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
31c54711
Commit
31c54711
authored
Oct 16, 2012
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavf: split wav muxer and demuxer into separate files.
parent
58b619c8
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
230 additions
and
195 deletions
+230
-195
Makefile
libavformat/Makefile
+3
-3
wavdec.c
libavformat/wavdec.c
+8
-192
wavenc.c
libavformat/wavenc.c
+219
-0
No files found.
libavformat/Makefile
View file @
31c54711
...
...
@@ -321,9 +321,9 @@ OBJS-$(CONFIG_VMD_DEMUXER) += sierravmd.o
OBJS-$(CONFIG_VOC_DEMUXER)
+=
vocdec.o
voc.o
OBJS-$(CONFIG_VOC_MUXER)
+=
vocenc.o
voc.o
OBJS-$(CONFIG_VQF_DEMUXER)
+=
vqf.o
OBJS-$(CONFIG_W64_DEMUXER)
+=
wav.o
pcm.o
OBJS-$(CONFIG_WAV_DEMUXER)
+=
wav.o
pcm.o
OBJS-$(CONFIG_WAV_MUXER)
+=
wav.o
OBJS-$(CONFIG_W64_DEMUXER)
+=
wav
dec
.o
pcm.o
OBJS-$(CONFIG_WAV_DEMUXER)
+=
wav
dec
.o
pcm.o
OBJS-$(CONFIG_WAV_MUXER)
+=
wav
enc
.o
OBJS-$(CONFIG_WC3_DEMUXER)
+=
wc3movie.o
OBJS-$(CONFIG_WEBM_MUXER)
+=
matroskaenc.o
matroska.o
\
isom.o
avc.o
\
...
...
libavformat/wav.c
→
libavformat/wav
dec
.c
View file @
31c54711
/*
* WAV
muxer and
demuxer
* WAV demuxer
* Copyright (c) 2001, 2002 Fabrice Bellard
*
* Sony Wave64 demuxer
...
...
@@ -36,194 +36,10 @@
#include "avio.h"
#include "metadata.h"
typedef
struct
{
const
AVClass
*
class
;
int64_t
data
;
typedef
struct
WAVDemuxContext
{
int64_t
data_end
;
int64_t
minpts
;
int64_t
maxpts
;
int
last_duration
;
int
w64
;
int
write_bext
;
}
WAVContext
;
#if CONFIG_WAV_MUXER
static
inline
void
bwf_write_bext_string
(
AVFormatContext
*
s
,
const
char
*
key
,
int
maxlen
)
{
AVDictionaryEntry
*
tag
;
int
len
=
0
;
if
(
tag
=
av_dict_get
(
s
->
metadata
,
key
,
NULL
,
0
))
{
len
=
strlen
(
tag
->
value
);
len
=
FFMIN
(
len
,
maxlen
);
avio_write
(
s
->
pb
,
tag
->
value
,
len
);
}
ffio_fill
(
s
->
pb
,
0
,
maxlen
-
len
);
}
static
void
bwf_write_bext_chunk
(
AVFormatContext
*
s
)
{
AVDictionaryEntry
*
tmp_tag
;
uint64_t
time_reference
=
0
;
int64_t
bext
=
ff_start_tag
(
s
->
pb
,
"bext"
);
bwf_write_bext_string
(
s
,
"description"
,
256
);
bwf_write_bext_string
(
s
,
"originator"
,
32
);
bwf_write_bext_string
(
s
,
"originator_reference"
,
32
);
bwf_write_bext_string
(
s
,
"origination_date"
,
10
);
bwf_write_bext_string
(
s
,
"origination_time"
,
8
);
if
(
tmp_tag
=
av_dict_get
(
s
->
metadata
,
"time_reference"
,
NULL
,
0
))
time_reference
=
strtoll
(
tmp_tag
->
value
,
NULL
,
10
);
avio_wl64
(
s
->
pb
,
time_reference
);
avio_wl16
(
s
->
pb
,
1
);
// set version to 1
if
(
tmp_tag
=
av_dict_get
(
s
->
metadata
,
"umid"
,
NULL
,
0
))
{
unsigned
char
umidpart_str
[
17
]
=
{
0
};
int
i
;
uint64_t
umidpart
;
int
len
=
strlen
(
tmp_tag
->
value
+
2
);
for
(
i
=
0
;
i
<
len
/
16
;
i
++
)
{
memcpy
(
umidpart_str
,
tmp_tag
->
value
+
2
+
(
i
*
16
),
16
);
umidpart
=
strtoll
(
umidpart_str
,
NULL
,
16
);
avio_wb64
(
s
->
pb
,
umidpart
);
}
ffio_fill
(
s
->
pb
,
0
,
64
-
i
*
8
);
}
else
ffio_fill
(
s
->
pb
,
0
,
64
);
// zero UMID
ffio_fill
(
s
->
pb
,
0
,
190
);
// Reserved
if
(
tmp_tag
=
av_dict_get
(
s
->
metadata
,
"coding_history"
,
NULL
,
0
))
avio_put_str
(
s
->
pb
,
tmp_tag
->
value
);
ff_end_tag
(
s
->
pb
,
bext
);
}
static
int
wav_write_header
(
AVFormatContext
*
s
)
{
WAVContext
*
wav
=
s
->
priv_data
;
AVIOContext
*
pb
=
s
->
pb
;
int64_t
fmt
,
fact
;
ffio_wfourcc
(
pb
,
"RIFF"
);
avio_wl32
(
pb
,
0
);
/* file length */
ffio_wfourcc
(
pb
,
"WAVE"
);
/* format header */
fmt
=
ff_start_tag
(
pb
,
"fmt "
);
if
(
ff_put_wav_header
(
pb
,
s
->
streams
[
0
]
->
codec
)
<
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"%s codec not supported in WAVE format
\n
"
,
s
->
streams
[
0
]
->
codec
->
codec
?
s
->
streams
[
0
]
->
codec
->
codec
->
name
:
"NONE"
);
return
-
1
;
}
ff_end_tag
(
pb
,
fmt
);
if
(
s
->
streams
[
0
]
->
codec
->
codec_tag
!=
0x01
/* hence for all other than PCM */
&&
s
->
pb
->
seekable
)
{
fact
=
ff_start_tag
(
pb
,
"fact"
);
avio_wl32
(
pb
,
0
);
ff_end_tag
(
pb
,
fact
);
}
if
(
wav
->
write_bext
)
bwf_write_bext_chunk
(
s
);
avpriv_set_pts_info
(
s
->
streams
[
0
],
64
,
1
,
s
->
streams
[
0
]
->
codec
->
sample_rate
);
wav
->
maxpts
=
wav
->
last_duration
=
0
;
wav
->
minpts
=
INT64_MAX
;
/* info header */
ff_riff_write_info
(
s
);
/* data header */
wav
->
data
=
ff_start_tag
(
pb
,
"data"
);
avio_flush
(
pb
);
return
0
;
}
static
int
wav_write_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
{
AVIOContext
*
pb
=
s
->
pb
;
WAVContext
*
wav
=
s
->
priv_data
;
avio_write
(
pb
,
pkt
->
data
,
pkt
->
size
);
if
(
pkt
->
pts
!=
AV_NOPTS_VALUE
)
{
wav
->
minpts
=
FFMIN
(
wav
->
minpts
,
pkt
->
pts
);
wav
->
maxpts
=
FFMAX
(
wav
->
maxpts
,
pkt
->
pts
);
wav
->
last_duration
=
pkt
->
duration
;
}
else
av_log
(
s
,
AV_LOG_ERROR
,
"wav_write_packet: NOPTS
\n
"
);
return
0
;
}
static
int
wav_write_trailer
(
AVFormatContext
*
s
)
{
AVIOContext
*
pb
=
s
->
pb
;
WAVContext
*
wav
=
s
->
priv_data
;
int64_t
file_size
;
avio_flush
(
pb
);
if
(
s
->
pb
->
seekable
)
{
ff_end_tag
(
pb
,
wav
->
data
);
/* update file size */
file_size
=
avio_tell
(
pb
);
avio_seek
(
pb
,
4
,
SEEK_SET
);
avio_wl32
(
pb
,
(
uint32_t
)(
file_size
-
8
));
avio_seek
(
pb
,
file_size
,
SEEK_SET
);
avio_flush
(
pb
);
if
(
s
->
streams
[
0
]
->
codec
->
codec_tag
!=
0x01
)
{
/* Update num_samps in fact chunk */
int
number_of_samples
;
number_of_samples
=
av_rescale
(
wav
->
maxpts
-
wav
->
minpts
+
wav
->
last_duration
,
s
->
streams
[
0
]
->
codec
->
sample_rate
*
(
int64_t
)
s
->
streams
[
0
]
->
time_base
.
num
,
s
->
streams
[
0
]
->
time_base
.
den
);
avio_seek
(
pb
,
wav
->
data
-
12
,
SEEK_SET
);
avio_wl32
(
pb
,
number_of_samples
);
avio_seek
(
pb
,
file_size
,
SEEK_SET
);
avio_flush
(
pb
);
}
}
return
0
;
}
#define OFFSET(x) offsetof(WAVContext, x)
#define ENC AV_OPT_FLAG_ENCODING_PARAM
static
const
AVOption
options
[]
=
{
{
"write_bext"
,
"Write BEXT chunk."
,
OFFSET
(
write_bext
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
1
,
ENC
},
{
NULL
},
};
static
const
AVClass
wav_muxer_class
=
{
.
class_name
=
"WAV muxer"
,
.
item_name
=
av_default_item_name
,
.
option
=
options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
AVOutputFormat
ff_wav_muxer
=
{
.
name
=
"wav"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"WAV / WAVE (Waveform Audio)"
),
.
mime_type
=
"audio/x-wav"
,
.
extensions
=
"wav"
,
.
priv_data_size
=
sizeof
(
WAVContext
),
.
audio_codec
=
AV_CODEC_ID_PCM_S16LE
,
.
video_codec
=
AV_CODEC_ID_NONE
,
.
write_header
=
wav_write_header
,
.
write_packet
=
wav_write_packet
,
.
write_trailer
=
wav_write_trailer
,
.
flags
=
AVFMT_TS_NONSTRICT
,
.
codec_tag
=
(
const
AVCodecTag
*
const
[]){
ff_codec_wav_tags
,
0
},
.
priv_class
=
&
wav_muxer_class
,
};
#endif
/* CONFIG_WAV_MUXER */
}
WAVDemuxContext
;
#if CONFIG_WAV_DEMUXER
...
...
@@ -391,7 +207,7 @@ static int wav_read_header(AVFormatContext *s)
uint32_t
tag
,
list_type
;
AVIOContext
*
pb
=
s
->
pb
;
AVStream
*
st
=
NULL
;
WAVContext
*
wav
=
s
->
priv_data
;
WAV
Demux
Context
*
wav
=
s
->
priv_data
;
int
ret
,
got_fmt
=
0
;
int64_t
next_tag_ofs
,
data_ofs
=
-
1
;
...
...
@@ -540,7 +356,7 @@ static int wav_read_packet(AVFormatContext *s,
int
ret
,
size
;
int64_t
left
;
AVStream
*
st
;
WAVContext
*
wav
=
s
->
priv_data
;
WAV
Demux
Context
*
wav
=
s
->
priv_data
;
st
=
s
->
streams
[
0
];
...
...
@@ -592,7 +408,7 @@ static int wav_read_seek(AVFormatContext *s,
AVInputFormat
ff_wav_demuxer
=
{
.
name
=
"wav"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"WAV / WAVE (Waveform Audio)"
),
.
priv_data_size
=
sizeof
(
WAVContext
),
.
priv_data_size
=
sizeof
(
WAV
Demux
Context
),
.
read_probe
=
wav_probe
,
.
read_header
=
wav_read_header
,
.
read_packet
=
wav_read_packet
,
...
...
@@ -628,7 +444,7 @@ static int w64_read_header(AVFormatContext *s)
{
int64_t
size
;
AVIOContext
*
pb
=
s
->
pb
;
WAVContext
*
wav
=
s
->
priv_data
;
WAV
Demux
Context
*
wav
=
s
->
priv_data
;
AVStream
*
st
;
uint8_t
guid
[
16
];
int
ret
;
...
...
@@ -680,7 +496,7 @@ static int w64_read_header(AVFormatContext *s)
AVInputFormat
ff_w64_demuxer
=
{
.
name
=
"w64"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Sony Wave64"
),
.
priv_data_size
=
sizeof
(
WAVContext
),
.
priv_data_size
=
sizeof
(
WAV
Demux
Context
),
.
read_probe
=
w64_probe
,
.
read_header
=
w64_read_header
,
.
read_packet
=
wav_read_packet
,
...
...
libavformat/wavenc.c
0 → 100644
View file @
31c54711
/*
* WAV muxer
* Copyright (c) 2001, 2002 Fabrice Bellard
*
* This file is part of Libav.
*
* Libav is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* Libav is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with Libav; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <stdint.h>
#include <string.h>
#include "libavutil/dict.h"
#include "libavutil/common.h"
#include "libavutil/mathematics.h"
#include "libavutil/opt.h"
#include "avformat.h"
#include "avio.h"
#include "avio_internal.h"
#include "internal.h"
#include "riff.h"
typedef
struct
WAVMuxContext
{
const
AVClass
*
class
;
int64_t
data
;
int64_t
minpts
;
int64_t
maxpts
;
int
last_duration
;
int
write_bext
;
}
WAVMuxContext
;
static
inline
void
bwf_write_bext_string
(
AVFormatContext
*
s
,
const
char
*
key
,
int
maxlen
)
{
AVDictionaryEntry
*
tag
;
int
len
=
0
;
if
(
tag
=
av_dict_get
(
s
->
metadata
,
key
,
NULL
,
0
))
{
len
=
strlen
(
tag
->
value
);
len
=
FFMIN
(
len
,
maxlen
);
avio_write
(
s
->
pb
,
tag
->
value
,
len
);
}
ffio_fill
(
s
->
pb
,
0
,
maxlen
-
len
);
}
static
void
bwf_write_bext_chunk
(
AVFormatContext
*
s
)
{
AVDictionaryEntry
*
tmp_tag
;
uint64_t
time_reference
=
0
;
int64_t
bext
=
ff_start_tag
(
s
->
pb
,
"bext"
);
bwf_write_bext_string
(
s
,
"description"
,
256
);
bwf_write_bext_string
(
s
,
"originator"
,
32
);
bwf_write_bext_string
(
s
,
"originator_reference"
,
32
);
bwf_write_bext_string
(
s
,
"origination_date"
,
10
);
bwf_write_bext_string
(
s
,
"origination_time"
,
8
);
if
(
tmp_tag
=
av_dict_get
(
s
->
metadata
,
"time_reference"
,
NULL
,
0
))
time_reference
=
strtoll
(
tmp_tag
->
value
,
NULL
,
10
);
avio_wl64
(
s
->
pb
,
time_reference
);
avio_wl16
(
s
->
pb
,
1
);
// set version to 1
if
(
tmp_tag
=
av_dict_get
(
s
->
metadata
,
"umid"
,
NULL
,
0
))
{
unsigned
char
umidpart_str
[
17
]
=
{
0
};
int
i
;
uint64_t
umidpart
;
int
len
=
strlen
(
tmp_tag
->
value
+
2
);
for
(
i
=
0
;
i
<
len
/
16
;
i
++
)
{
memcpy
(
umidpart_str
,
tmp_tag
->
value
+
2
+
(
i
*
16
),
16
);
umidpart
=
strtoll
(
umidpart_str
,
NULL
,
16
);
avio_wb64
(
s
->
pb
,
umidpart
);
}
ffio_fill
(
s
->
pb
,
0
,
64
-
i
*
8
);
}
else
ffio_fill
(
s
->
pb
,
0
,
64
);
// zero UMID
ffio_fill
(
s
->
pb
,
0
,
190
);
// Reserved
if
(
tmp_tag
=
av_dict_get
(
s
->
metadata
,
"coding_history"
,
NULL
,
0
))
avio_put_str
(
s
->
pb
,
tmp_tag
->
value
);
ff_end_tag
(
s
->
pb
,
bext
);
}
static
int
wav_write_header
(
AVFormatContext
*
s
)
{
WAVMuxContext
*
wav
=
s
->
priv_data
;
AVIOContext
*
pb
=
s
->
pb
;
int64_t
fmt
,
fact
;
ffio_wfourcc
(
pb
,
"RIFF"
);
avio_wl32
(
pb
,
0
);
/* file length */
ffio_wfourcc
(
pb
,
"WAVE"
);
/* format header */
fmt
=
ff_start_tag
(
pb
,
"fmt "
);
if
(
ff_put_wav_header
(
pb
,
s
->
streams
[
0
]
->
codec
)
<
0
)
{
av_log
(
s
,
AV_LOG_ERROR
,
"%s codec not supported in WAVE format
\n
"
,
s
->
streams
[
0
]
->
codec
->
codec
?
s
->
streams
[
0
]
->
codec
->
codec
->
name
:
"NONE"
);
return
-
1
;
}
ff_end_tag
(
pb
,
fmt
);
if
(
s
->
streams
[
0
]
->
codec
->
codec_tag
!=
0x01
/* hence for all other than PCM */
&&
s
->
pb
->
seekable
)
{
fact
=
ff_start_tag
(
pb
,
"fact"
);
avio_wl32
(
pb
,
0
);
ff_end_tag
(
pb
,
fact
);
}
if
(
wav
->
write_bext
)
bwf_write_bext_chunk
(
s
);
avpriv_set_pts_info
(
s
->
streams
[
0
],
64
,
1
,
s
->
streams
[
0
]
->
codec
->
sample_rate
);
wav
->
maxpts
=
wav
->
last_duration
=
0
;
wav
->
minpts
=
INT64_MAX
;
/* info header */
ff_riff_write_info
(
s
);
/* data header */
wav
->
data
=
ff_start_tag
(
pb
,
"data"
);
avio_flush
(
pb
);
return
0
;
}
static
int
wav_write_packet
(
AVFormatContext
*
s
,
AVPacket
*
pkt
)
{
AVIOContext
*
pb
=
s
->
pb
;
WAVMuxContext
*
wav
=
s
->
priv_data
;
avio_write
(
pb
,
pkt
->
data
,
pkt
->
size
);
if
(
pkt
->
pts
!=
AV_NOPTS_VALUE
)
{
wav
->
minpts
=
FFMIN
(
wav
->
minpts
,
pkt
->
pts
);
wav
->
maxpts
=
FFMAX
(
wav
->
maxpts
,
pkt
->
pts
);
wav
->
last_duration
=
pkt
->
duration
;
}
else
av_log
(
s
,
AV_LOG_ERROR
,
"wav_write_packet: NOPTS
\n
"
);
return
0
;
}
static
int
wav_write_trailer
(
AVFormatContext
*
s
)
{
AVIOContext
*
pb
=
s
->
pb
;
WAVMuxContext
*
wav
=
s
->
priv_data
;
int64_t
file_size
;
avio_flush
(
pb
);
if
(
s
->
pb
->
seekable
)
{
ff_end_tag
(
pb
,
wav
->
data
);
/* update file size */
file_size
=
avio_tell
(
pb
);
avio_seek
(
pb
,
4
,
SEEK_SET
);
avio_wl32
(
pb
,
(
uint32_t
)(
file_size
-
8
));
avio_seek
(
pb
,
file_size
,
SEEK_SET
);
avio_flush
(
pb
);
if
(
s
->
streams
[
0
]
->
codec
->
codec_tag
!=
0x01
)
{
/* Update num_samps in fact chunk */
int
number_of_samples
;
number_of_samples
=
av_rescale
(
wav
->
maxpts
-
wav
->
minpts
+
wav
->
last_duration
,
s
->
streams
[
0
]
->
codec
->
sample_rate
*
(
int64_t
)
s
->
streams
[
0
]
->
time_base
.
num
,
s
->
streams
[
0
]
->
time_base
.
den
);
avio_seek
(
pb
,
wav
->
data
-
12
,
SEEK_SET
);
avio_wl32
(
pb
,
number_of_samples
);
avio_seek
(
pb
,
file_size
,
SEEK_SET
);
avio_flush
(
pb
);
}
}
return
0
;
}
#define OFFSET(x) offsetof(WAVMuxContext, x)
#define ENC AV_OPT_FLAG_ENCODING_PARAM
static
const
AVOption
options
[]
=
{
{
"write_bext"
,
"Write BEXT chunk."
,
OFFSET
(
write_bext
),
AV_OPT_TYPE_INT
,
{
.
i64
=
0
},
0
,
1
,
ENC
},
{
NULL
},
};
static
const
AVClass
wav_muxer_class
=
{
.
class_name
=
"WAV muxer"
,
.
item_name
=
av_default_item_name
,
.
option
=
options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
AVOutputFormat
ff_wav_muxer
=
{
.
name
=
"wav"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"WAV / WAVE (Waveform Audio)"
),
.
mime_type
=
"audio/x-wav"
,
.
extensions
=
"wav"
,
.
priv_data_size
=
sizeof
(
WAVMuxContext
),
.
audio_codec
=
AV_CODEC_ID_PCM_S16LE
,
.
video_codec
=
AV_CODEC_ID_NONE
,
.
write_header
=
wav_write_header
,
.
write_packet
=
wav_write_packet
,
.
write_trailer
=
wav_write_trailer
,
.
flags
=
AVFMT_TS_NONSTRICT
,
.
codec_tag
=
(
const
AVCodecTag
*
const
[]){
ff_codec_wav_tags
,
0
},
.
priv_class
=
&
wav_muxer_class
,
};
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