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
84d3ff50
Commit
84d3ff50
authored
May 25, 2013
by
Anton Khirnov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lavc: add a libwavpack encoder wrapper
parent
799f57ac
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
241 additions
and
2 deletions
+241
-2
Changelog
Changelog
+1
-0
configure
configure
+4
-0
encoders.texi
doc/encoders.texi
+29
-0
general.texi
doc/general.texi
+10
-1
Makefile
libavcodec/Makefile
+1
-0
allcodecs.c
libavcodec/allcodecs.c
+1
-0
libwavpackenc.c
libavcodec/libwavpackenc.c
+194
-0
version.h
libavcodec/version.h
+1
-1
No files found.
Changelog
View file @
84d3ff50
...
...
@@ -24,6 +24,7 @@ version 10:
- VC-1 interlaced B-frame support
- support for WavPack muxing (raw and in Matroska)
- Go2Webinar decoder
- WavPack encoding through libwavpack
version 9:
...
...
configure
View file @
84d3ff50
...
...
@@ -200,6 +200,7 @@ External library support:
--enable-libvo-amrwbenc enable AMR-WB encoding via libvo-amrwbenc [no]
--enable-libvorbis enable Vorbis encoding via libvorbis [no]
--enable-libvpx enable VP8 and VP9 de/encoding via libvpx [no]
--enable-libwavpack enable wavpack encoding via libwavpack [no]
--enable-libx264 enable H.264 encoding via x264 [no]
--enable-libxavs enable AVS encoding via xavs [no]
--enable-libxvid enable Xvid encoding via xvidcore,
...
...
@@ -1060,6 +1061,7 @@ EXTERNAL_LIBRARY_LIST="
libvo_amrwbenc
libvorbis
libvpx
libwavpack
libx264
libxavs
libxvid
...
...
@@ -1790,6 +1792,7 @@ libvpx_vp8_decoder_deps="libvpx"
libvpx_vp8_encoder_deps
=
"libvpx"
libvpx_vp9_decoder_deps
=
"libvpx"
libvpx_vp9_encoder_deps
=
"libvpx"
libwavpack_encoder_deps
=
"libwavpack"
libx264_encoder_deps
=
"libx264"
libxavs_encoder_deps
=
"libxavs"
libxvid_encoder_deps
=
"libxvid"
...
...
@@ -3735,6 +3738,7 @@ enabled libvpx && {
die
"ERROR: libvpx encoder version must be >=0.9.6"
;
}
enabled libvpx_vp9_decoder
&&
{
check_lib2
"vpx/vpx_decoder.h vpx/vp8dx.h"
"vpx_codec_vp9_dx"
-lvpx
||
disable libvpx_vp9_decoder
;
}
enabled libvpx_vp9_encoder
&&
{
check_lib2
"vpx/vpx_encoder.h vpx/vp8cx.h"
"vpx_codec_vp9_cx"
-lvpx
||
disable libvpx_vp9_encoder
;
}
}
enabled libwavpack
&&
require libwavpack wavpack/wavpack.h WavpackOpenFileOutput
-lwavpack
enabled libx264
&&
require libx264 x264.h x264_encoder_encode
-lx264
&&
{
check_cpp_condition x264.h
"X264_BUILD >= 118"
||
die
"ERROR: libx264 version must be >= 0.118."
;
}
...
...
doc/encoders.texi
View file @
84d3ff50
...
...
@@ -412,6 +412,35 @@ Selected by Encoder (default)
@end table
@section libwavpack
A wrapper providing WavPack encoding through libwavpack.
Only lossless mode using 32-bit integer samples is supported currently.
The @option{compression_level} option can be used to control speed vs.
compression tradeoff, with the values mapped to libwavpack as follows:
@table @option
@item 0
Fast mode - corresponding to the wavpack @option{-f} option.
@item 1
Normal (default) settings.
@item 2
High quality - corresponding to the wavpack @option{-h} option.
@item 3
Very high quality - corresponding to the wavpack @option{-hh} option.
@item 4-8
Same as 3, but with extra processing enabled - corresponding to the wavpack
@option{-x} option. I.e. 4 is the same as @option{-x2} and 8 is the same as
@option{-x6}.
@end table
@c man end AUDIO ENCODERS
@chapter Video Encoders
...
...
doc/general.texi
View file @
84d3ff50
...
...
@@ -79,6 +79,14 @@ Go to @url{http://www.webmproject.org/} and follow the instructions for
installing the library. Then pass @code
{
--enable-libvpx
}
to configure to
enable it.
@section libwavpack
Libav can make use of the libwavpack library for WavPack encoding.
Go to @url
{
http://www.wavpack.com/
}
and follow the instructions for
installing the library. Then pass @code
{
--enable-libwavpack
}
to configure to
enable it.
@section x264
Libav can make use of the x264 library for H.264 encoding.
...
...
@@ -810,7 +818,8 @@ following image formats are supported:
@item TwinVQ (VQF flavor) @tab @tab X
@item Vorbis @tab E @tab X
@tab A native but very primitive encoder exists.
@item WavPack @tab @tab X
@item WavPack @tab E @tab X
@tab supported through external library libwavpack
@item Westwood Audio (SND1) @tab @tab X
@item Windows Media Audio 1 @tab X @tab X
@item Windows Media Audio 2 @tab X @tab X
...
...
libavcodec/Makefile
View file @
84d3ff50
...
...
@@ -599,6 +599,7 @@ OBJS-$(CONFIG_LIBVPX_VP8_DECODER) += libvpxdec.o
OBJS-$(CONFIG_LIBVPX_VP8_ENCODER)
+=
libvpxenc.o
OBJS-$(CONFIG_LIBVPX_VP9_DECODER)
+=
libvpxdec.o
OBJS-$(CONFIG_LIBVPX_VP9_ENCODER)
+=
libvpxenc.o
OBJS-$(CONFIG_LIBWAVPACK_ENCODER)
+=
libwavpackenc.o
OBJS-$(CONFIG_LIBX264_ENCODER)
+=
libx264.o
OBJS-$(CONFIG_LIBXAVS_ENCODER)
+=
libxavs.o
OBJS-$(CONFIG_LIBXVID_ENCODER)
+=
libxvid.o
...
...
libavcodec/allcodecs.c
View file @
84d3ff50
...
...
@@ -432,6 +432,7 @@ void avcodec_register_all(void)
REGISTER_ENCODER
(
LIBVORBIS
,
libvorbis
);
REGISTER_ENCDEC
(
LIBVPX_VP8
,
libvpx_vp8
);
REGISTER_ENCDEC
(
LIBVPX_VP9
,
libvpx_vp9
);
REGISTER_ENCODER
(
LIBWAVPACK
,
libwavpack
);
REGISTER_ENCODER
(
LIBX264
,
libx264
);
REGISTER_ENCODER
(
LIBXAVS
,
libxavs
);
REGISTER_ENCODER
(
LIBXVID
,
libxvid
);
...
...
libavcodec/libwavpackenc.c
0 → 100644
View file @
84d3ff50
/*
* 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 <wavpack/wavpack.h>
#include <string.h>
#include "libavutil/attributes.h"
#include "libavutil/opt.h"
#include "libavutil/samplefmt.h"
#include "audio_frame_queue.h"
#include "avcodec.h"
#include "internal.h"
#define WV_DEFAULT_BLOCK_SIZE 32768
typedef
struct
LibWavpackContext
{
const
AVClass
*
class
;
WavpackContext
*
wv
;
AudioFrameQueue
afq
;
AVPacket
*
pkt
;
int
user_size
;
int
got_output
;
}
LibWavpackContext
;
static
int
wavpack_encode_frame
(
AVCodecContext
*
avctx
,
AVPacket
*
pkt
,
const
AVFrame
*
frame
,
int
*
got_output
)
{
LibWavpackContext
*
s
=
avctx
->
priv_data
;
int
ret
;
s
->
got_output
=
0
;
s
->
pkt
=
pkt
;
s
->
user_size
=
pkt
->
size
;
if
(
frame
)
{
ret
=
ff_af_queue_add
(
&
s
->
afq
,
frame
);
if
(
ret
<
0
)
return
ret
;
ret
=
WavpackPackSamples
(
s
->
wv
,
(
int32_t
*
)
frame
->
data
[
0
],
frame
->
nb_samples
);
if
(
!
ret
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error encoding a frame: %s
\n
"
,
WavpackGetErrorMessage
(
s
->
wv
));
return
AVERROR_UNKNOWN
;
}
}
if
(
!
s
->
got_output
&&
(
!
frame
||
frame
->
nb_samples
<
avctx
->
frame_size
))
{
ret
=
WavpackFlushSamples
(
s
->
wv
);
if
(
!
ret
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error flushing the encoder: %s
\n
"
,
WavpackGetErrorMessage
(
s
->
wv
));
return
AVERROR_UNKNOWN
;
}
}
if
(
s
->
got_output
)
{
ff_af_queue_remove
(
&
s
->
afq
,
avctx
->
frame_size
,
&
pkt
->
pts
,
&
pkt
->
duration
);
*
got_output
=
1
;
}
return
0
;
}
static
int
encode_callback
(
void
*
id
,
void
*
data
,
int32_t
count
)
{
AVCodecContext
*
avctx
=
id
;
LibWavpackContext
*
s
=
avctx
->
priv_data
;
int
ret
,
offset
=
s
->
pkt
->
size
;
if
(
s
->
user_size
)
{
if
(
s
->
user_size
-
count
<
s
->
pkt
->
size
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Provided packet too small.
\n
"
);
return
0
;
}
s
->
pkt
->
size
+=
count
;
}
else
{
ret
=
av_grow_packet
(
s
->
pkt
,
count
);
if
(
ret
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error allocating output packet.
\n
"
);
return
0
;
}
}
memcpy
(
s
->
pkt
->
data
+
offset
,
data
,
count
);
s
->
got_output
=
1
;
return
1
;
}
static
av_cold
int
wavpack_encode_init
(
AVCodecContext
*
avctx
)
{
LibWavpackContext
*
s
=
avctx
->
priv_data
;
WavpackConfig
config
=
{
0
};
int
ret
;
s
->
wv
=
WavpackOpenFileOutput
(
encode_callback
,
avctx
,
NULL
);
if
(
!
s
->
wv
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error allocating the encoder.
\n
"
);
return
AVERROR
(
ENOMEM
);
}
if
(
!
avctx
->
frame_size
)
avctx
->
frame_size
=
WV_DEFAULT_BLOCK_SIZE
;
config
.
bytes_per_sample
=
4
;
config
.
bits_per_sample
=
32
;
config
.
block_samples
=
avctx
->
frame_size
;
config
.
channel_mask
=
avctx
->
channel_layout
;
config
.
num_channels
=
avctx
->
channels
;
config
.
sample_rate
=
avctx
->
sample_rate
;
if
(
avctx
->
compression_level
!=
FF_COMPRESSION_DEFAULT
)
{
if
(
avctx
->
compression_level
>=
3
)
{
config
.
flags
|=
CONFIG_VERY_HIGH_FLAG
;
if
(
avctx
->
compression_level
>=
8
)
config
.
xmode
=
6
;
else
if
(
avctx
->
compression_level
>=
7
)
config
.
xmode
=
5
;
else
if
(
avctx
->
compression_level
>=
6
)
config
.
xmode
=
4
;
else
if
(
avctx
->
compression_level
>=
5
)
config
.
xmode
=
3
;
else
if
(
avctx
->
compression_level
>=
4
)
config
.
xmode
=
2
;
}
else
if
(
avctx
->
compression_level
>=
2
)
config
.
flags
|=
CONFIG_HIGH_FLAG
;
else
if
(
avctx
->
compression_level
<
1
)
config
.
flags
|=
CONFIG_FAST_FLAG
;
}
ret
=
WavpackSetConfiguration
(
s
->
wv
,
&
config
,
-
1
);
if
(
!
ret
)
goto
fail
;
ret
=
WavpackPackInit
(
s
->
wv
);
if
(
!
ret
)
goto
fail
;
ff_af_queue_init
(
avctx
,
&
s
->
afq
);
return
0
;
fail:
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error configuring the encoder: %s.
\n
"
,
WavpackGetErrorMessage
(
s
->
wv
));
WavpackCloseFile
(
s
->
wv
);
return
AVERROR_UNKNOWN
;
}
static
av_cold
int
wavpack_encode_close
(
AVCodecContext
*
avctx
)
{
LibWavpackContext
*
s
=
avctx
->
priv_data
;
WavpackCloseFile
(
s
->
wv
);
ff_af_queue_close
(
&
s
->
afq
);
return
0
;
}
AVCodec
ff_libwavpack_encoder
=
{
.
name
=
"libwavpack"
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
AV_CODEC_ID_WAVPACK
,
.
priv_data_size
=
sizeof
(
LibWavpackContext
),
.
init
=
wavpack_encode_init
,
.
encode2
=
wavpack_encode_frame
,
.
close
=
wavpack_encode_close
,
.
capabilities
=
CODEC_CAP_DELAY
|
CODEC_CAP_SMALL_LAST_FRAME
,
.
sample_fmts
=
(
const
enum
AVSampleFormat
[]){
AV_SAMPLE_FMT_S32
,
AV_SAMPLE_FMT_NONE
},
};
libavcodec/version.h
View file @
84d3ff50
...
...
@@ -27,7 +27,7 @@
*/
#define LIBAVCODEC_VERSION_MAJOR 55
#define LIBAVCODEC_VERSION_MINOR
8
#define LIBAVCODEC_VERSION_MINOR
9
#define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
...
...
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