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
f958f431
Commit
f958f431
authored
Aug 08, 2017
by
Tomas Härdin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add libcodec2 en/decoder
parent
28924f4b
Show whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
415 additions
and
2 deletions
+415
-2
Changelog
Changelog
+1
-0
configure
configure
+5
-0
general.texi
doc/general.texi
+20
-0
Makefile
libavcodec/Makefile
+2
-0
allcodecs.c
libavcodec/allcodecs.c
+2
-0
avcodec.h
libavcodec/avcodec.h
+1
-0
codec2utils.c
libavcodec/codec2utils.c
+80
-0
codec2utils.h
libavcodec/codec2utils.h
+82
-0
codec_desc.c
libavcodec/codec_desc.c
+7
-0
libcodec2.c
libavcodec/libcodec2.c
+213
-0
version.h
libavcodec/version.h
+2
-2
No files found.
Changelog
View file @
f958f431
...
@@ -40,6 +40,7 @@ version <next>:
...
@@ -40,6 +40,7 @@ version <next>:
- VideoToolbox HEVC encoder and hwaccel
- VideoToolbox HEVC encoder and hwaccel
- VAAPI-accelerated ProcAmp (color balance), denoise and sharpness filters
- VAAPI-accelerated ProcAmp (color balance), denoise and sharpness filters
- Add android_camera indev
- Add android_camera indev
- codec2 en/decoding via libcodec2
version 3.4:
version 3.4:
...
...
configure
View file @
f958f431
...
@@ -224,6 +224,7 @@ External library support:
...
@@ -224,6 +224,7 @@ External library support:
--enable-libcaca enable textual display using libcaca [no]
--enable-libcaca enable textual display using libcaca [no]
--enable-libcelt enable CELT decoding via libcelt [no]
--enable-libcelt enable CELT decoding via libcelt [no]
--enable-libcdio enable audio CD grabbing with libcdio [no]
--enable-libcdio enable audio CD grabbing with libcdio [no]
--enable-libcodec2 enable codec2 en/decoding using libcodec2 [no]
--enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
--enable-libdc1394 enable IIDC-1394 grabbing using libdc1394
and libraw1394 [no]
and libraw1394 [no]
--enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no]
--enable-libfdk-aac enable AAC de/encoding via libfdk-aac [no]
...
@@ -1603,6 +1604,7 @@ EXTERNAL_LIBRARY_LIST="
...
@@ -1603,6 +1604,7 @@ EXTERNAL_LIBRARY_LIST="
libbs2b
libbs2b
libcaca
libcaca
libcelt
libcelt
libcodec2
libdc1394
libdc1394
libdrm
libdrm
libflite
libflite
...
@@ -2944,6 +2946,8 @@ h264_videotoolbox_encoder_select="videotoolbox_encoder"
...
@@ -2944,6 +2946,8 @@ h264_videotoolbox_encoder_select="videotoolbox_encoder"
hevc_videotoolbox_encoder_deps
=
"pthreads"
hevc_videotoolbox_encoder_deps
=
"pthreads"
hevc_videotoolbox_encoder_select
=
"videotoolbox_encoder"
hevc_videotoolbox_encoder_select
=
"videotoolbox_encoder"
libcelt_decoder_deps
=
"libcelt"
libcelt_decoder_deps
=
"libcelt"
libcodec2_decoder_deps
=
"libcodec2"
libcodec2_encoder_deps
=
"libcodec2"
libfdk_aac_decoder_deps
=
"libfdk_aac"
libfdk_aac_decoder_deps
=
"libfdk_aac"
libfdk_aac_encoder_deps
=
"libfdk_aac"
libfdk_aac_encoder_deps
=
"libfdk_aac"
libfdk_aac_encoder_select
=
"audio_frame_queue"
libfdk_aac_encoder_select
=
"audio_frame_queue"
...
@@ -5891,6 +5895,7 @@ enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 &&
...
@@ -5891,6 +5895,7 @@ enabled libcelt && require libcelt celt/celt.h celt_decode -lcelt0 &&
{
check_lib libcelt celt/celt.h celt_decoder_create_custom
-lcelt0
||
{
check_lib libcelt celt/celt.h celt_decoder_create_custom
-lcelt0
||
die
"ERROR: libcelt must be installed and version must be >= 0.11.0."
;
}
die
"ERROR: libcelt must be installed and version must be >= 0.11.0."
;
}
enabled libcaca
&&
require_pkg_config libcaca caca caca.h caca_create_canvas
enabled libcaca
&&
require_pkg_config libcaca caca caca.h caca_create_canvas
enabled libcodec2
&&
require libcodec2 codec2/codec2.h codec2_create
-lcodec2
enabled libdc1394
&&
require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
enabled libdc1394
&&
require_pkg_config libdc1394 libdc1394-2 dc1394/dc1394.h dc1394_new
enabled libdrm
&&
require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
enabled libdrm
&&
require_pkg_config libdrm libdrm xf86drm.h drmGetVersion
enabled libfdk_aac
&&
{
check_pkg_config libfdk_aac fdk-aac
"fdk-aac/aacenc_lib.h"
aacEncOpen
||
enabled libfdk_aac
&&
{
check_pkg_config libfdk_aac fdk-aac
"fdk-aac/aacenc_lib.h"
aacEncOpen
||
...
...
doc/general.texi
View file @
f958f431
...
@@ -85,6 +85,24 @@ Go to @url{http://www.twolame.org/} and follow the
...
@@ -85,6 +85,24 @@ Go to @url{http://www.twolame.org/} and follow the
instructions for installing the library.
instructions for installing the library.
Then pass @code
{
--enable-libtwolame
}
to configure to enable it.
Then pass @code
{
--enable-libtwolame
}
to configure to enable it.
@section libcodec2 / codec2 general
FFmpeg can make use of libcodec2 for codec2 encoding and decoding.
There is currently no native decoder, so libcodec2 must be used for decoding.
Go to @url
{
http://freedv.org/
}
, download "Codec 2 source archive".
Build and install using CMake. Debian users can install the libcodec2-dev package instead.
Once libcodec2 is installed you can pass @code
{
--enable-libcodec2
}
to configure to enable it.
The easiest way to use codec2 is with .c2 files, since they contain the mode information required for decoding.
To encode such a file, use a .c2 file extension and give the libcodec2 encoder the -mode option:
@code
{
ffmpeg -i input.wav -mode 700C output.c2
}
.
Playback is as simple as @code
{
ffplay output.c2
}
.
For a list of supported modes, run @code
{
ffmpeg -h encoder=libcodec2
}
.
Raw codec2 files are also supported.
To make sense of them the mode in use needs to be specified as a format option:
@code
{
ffmpeg -f codec2raw -mode 1300 -i input.raw output.wav
}
.
@section libvpx
@section libvpx
FFmpeg can make use of the libvpx library for VP8/VP9 encoding.
FFmpeg can make use of the libvpx library for VP8/VP9 encoding.
...
@@ -1019,6 +1037,8 @@ following image formats are supported:
...
@@ -1019,6 +1037,8 @@ following image formats are supported:
@tab Used in Bink and Smacker files in many games.
@tab Used in Bink and Smacker files in many games.
@item CELT @tab @tab E
@item CELT @tab @tab E
@tab decoding supported through external library libcelt
@tab decoding supported through external library libcelt
@item codec2 @tab E @tab E
@tab en/decoding supported through external library libcodec2
@item Delphine Software International CIN audio @tab @tab X
@item Delphine Software International CIN audio @tab @tab X
@tab Codec used in Delphine Software International games.
@tab Codec used in Delphine Software International games.
@item Digital Speech Standard - Standard Play mode (DSS SP) @tab @tab X
@item Digital Speech Standard - Standard Play mode (DSS SP) @tab @tab X
...
...
libavcodec/Makefile
View file @
f958f431
...
@@ -935,6 +935,8 @@ OBJS-$(CONFIG_ILBC_AT_ENCODER) += audiotoolboxenc.o
...
@@ -935,6 +935,8 @@ OBJS-$(CONFIG_ILBC_AT_ENCODER) += audiotoolboxenc.o
OBJS-$(CONFIG_PCM_ALAW_AT_ENCODER)
+=
audiotoolboxenc.o
OBJS-$(CONFIG_PCM_ALAW_AT_ENCODER)
+=
audiotoolboxenc.o
OBJS-$(CONFIG_PCM_MULAW_AT_ENCODER)
+=
audiotoolboxenc.o
OBJS-$(CONFIG_PCM_MULAW_AT_ENCODER)
+=
audiotoolboxenc.o
OBJS-$(CONFIG_LIBCELT_DECODER)
+=
libcelt_dec.o
OBJS-$(CONFIG_LIBCELT_DECODER)
+=
libcelt_dec.o
OBJS-$(CONFIG_LIBCODEC2_DECODER)
+=
libcodec2.o
codec2utils.o
OBJS-$(CONFIG_LIBCODEC2_ENCODER)
+=
libcodec2.o
codec2utils.o
OBJS-$(CONFIG_LIBFDK_AAC_DECODER)
+=
libfdk-aacdec.o
OBJS-$(CONFIG_LIBFDK_AAC_DECODER)
+=
libfdk-aacdec.o
OBJS-$(CONFIG_LIBFDK_AAC_ENCODER)
+=
libfdk-aacenc.o
OBJS-$(CONFIG_LIBFDK_AAC_ENCODER)
+=
libfdk-aacenc.o
OBJS-$(CONFIG_LIBGSM_DECODER)
+=
libgsmdec.o
OBJS-$(CONFIG_LIBGSM_DECODER)
+=
libgsmdec.o
...
...
libavcodec/allcodecs.c
View file @
f958f431
...
@@ -662,6 +662,8 @@ extern AVCodec ff_pcm_mulaw_at_decoder;
...
@@ -662,6 +662,8 @@ extern AVCodec ff_pcm_mulaw_at_decoder;
extern
AVCodec
ff_qdmc_at_decoder
;
extern
AVCodec
ff_qdmc_at_decoder
;
extern
AVCodec
ff_qdm2_at_decoder
;
extern
AVCodec
ff_qdm2_at_decoder
;
extern
AVCodec
ff_libcelt_decoder
;
extern
AVCodec
ff_libcelt_decoder
;
extern
AVCodec
ff_libcodec2_encoder
;
extern
AVCodec
ff_libcodec2_decoder
;
extern
AVCodec
ff_libfdk_aac_encoder
;
extern
AVCodec
ff_libfdk_aac_encoder
;
extern
AVCodec
ff_libfdk_aac_decoder
;
extern
AVCodec
ff_libfdk_aac_decoder
;
extern
AVCodec
ff_libgsm_encoder
;
extern
AVCodec
ff_libgsm_encoder
;
...
...
libavcodec/avcodec.h
View file @
f958f431
...
@@ -615,6 +615,7 @@ enum AVCodecID {
...
@@ -615,6 +615,7 @@ enum AVCodecID {
AV_CODEC_ID_PAF_AUDIO
,
AV_CODEC_ID_PAF_AUDIO
,
AV_CODEC_ID_ON2AVC
,
AV_CODEC_ID_ON2AVC
,
AV_CODEC_ID_DSS_SP
,
AV_CODEC_ID_DSS_SP
,
AV_CODEC_ID_CODEC2
,
AV_CODEC_ID_FFWAVESYNTH
=
0x15800
,
AV_CODEC_ID_FFWAVESYNTH
=
0x15800
,
AV_CODEC_ID_SONIC
,
AV_CODEC_ID_SONIC
,
...
...
libavcodec/codec2utils.c
0 → 100644
View file @
f958f431
/*
* codec2 utility functions
* Copyright (c) 2017 Tomas Härdin
*
* This file is part of FFmpeg.
*
* FFmpeg 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.
*
* FFmpeg 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <string.h>
#include "internal.h"
#include "libavcodec/codec2utils.h"
int
avpriv_codec2_mode_bit_rate
(
void
*
logctx
,
int
mode
)
{
int
frame_size
=
avpriv_codec2_mode_frame_size
(
logctx
,
mode
);
int
block_align
=
avpriv_codec2_mode_block_align
(
logctx
,
mode
);
if
(
frame_size
<=
0
||
block_align
<=
0
)
{
return
0
;
}
return
8
*
8000
*
block_align
/
frame_size
;
}
int
avpriv_codec2_mode_frame_size
(
void
*
logctx
,
int
mode
)
{
int
frame_size_table
[
AVPRIV_CODEC2_MODE_MAX
+
1
]
=
{
160
,
// 3200
160
,
// 2400
320
,
// 1600
320
,
// 1400
320
,
// 1300
320
,
// 1200
320
,
// 700
320
,
// 700B
320
,
// 700C
};
if
(
mode
<
0
||
mode
>
AVPRIV_CODEC2_MODE_MAX
)
{
av_log
(
logctx
,
AV_LOG_ERROR
,
"unknown codec2 mode %i, can't find frame_size
\n
"
,
mode
);
return
0
;
}
else
{
return
frame_size_table
[
mode
];
}
}
int
avpriv_codec2_mode_block_align
(
void
*
logctx
,
int
mode
)
{
int
block_align_table
[
AVPRIV_CODEC2_MODE_MAX
+
1
]
=
{
8
,
// 3200
6
,
// 2400
8
,
// 1600
7
,
// 1400
7
,
// 1300
6
,
// 1200
4
,
// 700
4
,
// 700B
4
,
// 700C
};
if
(
mode
<
0
||
mode
>
AVPRIV_CODEC2_MODE_MAX
)
{
av_log
(
logctx
,
AV_LOG_ERROR
,
"unknown codec2 mode %i, can't find block_align
\n
"
,
mode
);
return
0
;
}
else
{
return
block_align_table
[
mode
];
}
}
libavcodec/codec2utils.h
0 → 100644
View file @
f958f431
/*
* codec2 utility functions
* Copyright (c) 2017 Tomas Härdin
*
* This file is part of FFmpeg.
*
* FFmpeg 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.
*
* FFmpeg 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef AVCODEC_CODEC2UTILS_H
#define AVCODEC_CODEC2UTILS_H
#include <stdint.h>
//Highest mode we're willing to use.
//Don't want to let users accidentally produce files that can't be decoded in the future.
//CODEC2_MODE_WB (9) is experimental/unstable as of 2017-11-23.
#define AVPRIV_CODEC2_MODE_MAX 8 //CODEC2_MODE_700C
//Used by both codec2raw demuxer and libcodec2 encoder.
//The integers match the values in codec2.h, so "3200" -> CODEC2_MODE_3000 = 0 and so on.
//It is possible that we're linked to a version of libcodec2 that lacks some of these modes.
//For example Debian stretch ships with libcodec2.so.0.4 which lacks CODEC2_MODE_700C.
#define AVPRIV_CODEC2_AVOPTIONS(desc, classname, min_val, default_val, option_flags) \
{ "mode", desc, offsetof(classname, mode), AV_OPT_TYPE_INT, {.i64 = default_val}, min_val, AVPRIV_CODEC2_MODE_MAX, .flags=option_flags, .unit="codec2_mode"},\
{ "3200", "3200", 0, AV_OPT_TYPE_CONST, {.i64 = 0}, .flags=option_flags, .unit="codec2_mode"},\
{ "2400", "2400", 0, AV_OPT_TYPE_CONST, {.i64 = 1}, .flags=option_flags, .unit="codec2_mode"},\
{ "1600", "1600", 0, AV_OPT_TYPE_CONST, {.i64 = 2}, .flags=option_flags, .unit="codec2_mode"},\
{ "1400", "1400", 0, AV_OPT_TYPE_CONST, {.i64 = 3}, .flags=option_flags, .unit="codec2_mode"},\
{ "1300", "1300", 0, AV_OPT_TYPE_CONST, {.i64 = 4}, .flags=option_flags, .unit="codec2_mode"},\
{ "1200", "1200", 0, AV_OPT_TYPE_CONST, {.i64 = 5}, .flags=option_flags, .unit="codec2_mode"},\
{ "700", "700", 0, AV_OPT_TYPE_CONST, {.i64 = 6}, .flags=option_flags, .unit="codec2_mode"},\
{ "700B", "700B", 0, AV_OPT_TYPE_CONST, {.i64 = 7}, .flags=option_flags, .unit="codec2_mode"},\
{ "700C", "700C", 0, AV_OPT_TYPE_CONST, {.i64 = 8}, .flags=option_flags, .unit="codec2_mode"}
//The three following functions are here to avoid needing libavformat/codec2.c to depend on libcodec2
//Computes bitrate from mode, with frames rounded up to the nearest octet.
//So 700 bit/s (28 bits/frame) becomes 800 bits/s (32 bits/frame).
//logctx is used for av_log()
//Returns <0 if mode is invalid
int
avpriv_codec2_mode_bit_rate
(
void
*
logctx
,
int
mode
);
//Mimics codec2_samples_per_frame()
int
avpriv_codec2_mode_frame_size
(
void
*
logctx
,
int
mode
);
//Mimics (codec2_bits_per_frame()+7)/8
int
avpriv_codec2_mode_block_align
(
void
*
logctx
,
int
mode
);
#define AVPRIV_CODEC2_EXTRADATA_SIZE 4
//Used in codec2raw demuxer and libcodec2 encoder
static
inline
void
avpriv_codec2_make_extradata
(
uint8_t
*
ptr
,
int
mode
)
{
//version 0.8 as of 2017-12-23 (r3386)
ptr
[
0
]
=
0
;
//major
ptr
[
1
]
=
8
;
//minor
ptr
[
2
]
=
mode
;
//mode
ptr
[
3
]
=
0
;
//flags
}
//Returns version as a 16-bit value. 0.8 -> 0x0008
static
inline
uint16_t
avpriv_codec2_version_from_extradata
(
uint8_t
*
ptr
)
{
return
(
ptr
[
0
]
<<
8
)
+
ptr
[
1
];
}
static
inline
uint8_t
avpriv_codec2_mode_from_extradata
(
uint8_t
*
ptr
)
{
return
ptr
[
2
];
}
#endif
/* AVCODEC_CODEC2UTILS_H */
libavcodec/codec_desc.c
View file @
f958f431
...
@@ -2733,6 +2733,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
...
@@ -2733,6 +2733,13 @@ static const AVCodecDescriptor codec_descriptors[] = {
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Digital Speech Standard - Standard Play mode (DSS SP)"
),
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"Digital Speech Standard - Standard Play mode (DSS SP)"
),
.
props
=
AV_CODEC_PROP_LOSSY
,
.
props
=
AV_CODEC_PROP_LOSSY
,
},
},
{
.
id
=
AV_CODEC_ID_CODEC2
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
name
=
"codec2"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"codec2 (very low bitrate speech codec)"
),
.
props
=
AV_CODEC_PROP_LOSSY
,
},
{
{
.
id
=
AV_CODEC_ID_FFWAVESYNTH
,
.
id
=
AV_CODEC_ID_FFWAVESYNTH
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
type
=
AVMEDIA_TYPE_AUDIO
,
...
...
libavcodec/libcodec2.c
0 → 100644
View file @
f958f431
/*
* codec2 encoder/decoder using libcodec2
* Copyright (c) 2017 Tomas Härdin
*
* This file is part of FFmpeg.
*
* FFmpeg 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.
*
* FFmpeg 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 FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <codec2/codec2.h>
#include "avcodec.h"
#include "libavutil/opt.h"
#include "internal.h"
#include "codec2utils.h"
typedef
struct
{
const
AVClass
*
class
;
struct
CODEC2
*
codec
;
int
mode
;
}
LibCodec2Context
;
static
const
AVOption
options
[]
=
{
//not AV_OPT_FLAG_DECODING_PARAM since mode should come from the demuxer
//1300 (aka FreeDV 1600) is the most common mode on-the-air, default to it here as well
AVPRIV_CODEC2_AVOPTIONS
(
"codec2 mode"
,
LibCodec2Context
,
0
,
4
/*CODEC2_MODE_1300*/
,
AV_OPT_FLAG_AUDIO_PARAM
|
AV_OPT_FLAG_ENCODING_PARAM
),
{
NULL
},
};
static
const
AVClass
libcodec2_enc_class
=
{
.
class_name
=
"libcodec2 encoder"
,
.
item_name
=
av_default_item_name
,
.
option
=
options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
static
const
AVClass
libcodec2_dec_class
=
{
.
class_name
=
"libcodec2 decoder"
,
.
item_name
=
av_default_item_name
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
static
av_cold
int
libcodec2_init_common
(
AVCodecContext
*
avctx
,
int
mode
)
{
LibCodec2Context
*
c2
=
avctx
->
priv_data
;
//Grab mode name from options, unless it's some weird number.
const
char
*
modename
=
mode
>=
0
&&
mode
<=
AVPRIV_CODEC2_MODE_MAX
?
options
[
mode
+
1
].
name
:
"?"
;
c2
->
codec
=
codec2_create
(
mode
);
if
(
!
c2
->
codec
)
{
//Out of memory or unsupported mode. The latter seems most likely,
//but we can't tell for sure with the current API.
goto
libcodec2_init_common_error
;
}
avctx
->
frame_size
=
codec2_samples_per_frame
(
c2
->
codec
);
avctx
->
block_align
=
(
codec2_bits_per_frame
(
c2
->
codec
)
+
7
)
/
8
;
if
(
avctx
->
frame_size
<=
0
||
avctx
->
block_align
<=
0
)
{
//codec2_create() may succeed for some modes but still fail at codec2_samples_per_frame()
//example is -mode 700C on libcodec2 0.4
codec2_destroy
(
c2
->
codec
);
c2
->
codec
=
NULL
;
goto
libcodec2_init_common_error
;
}
codec2_set_natural_or_gray
(
c2
->
codec
,
1
);
return
0
;
libcodec2_init_common_error:
av_log
(
avctx
,
AV_LOG_ERROR
,
"Mode %i (%s) not supported with the linked version of libcodec2
\n
"
,
mode
,
modename
);
return
AVERROR
(
EINVAL
);
}
static
av_cold
int
libcodec2_init_decoder
(
AVCodecContext
*
avctx
)
{
avctx
->
sample_rate
=
8000
;
avctx
->
channels
=
1
;
avctx
->
sample_fmt
=
AV_SAMPLE_FMT_S16
;
avctx
->
channel_layout
=
AV_CH_LAYOUT_MONO
;
if
(
avctx
->
extradata_size
!=
AVPRIV_CODEC2_EXTRADATA_SIZE
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"must have exactly %i bytes of extradata (got %i)
\n
"
,
AVPRIV_CODEC2_EXTRADATA_SIZE
,
avctx
->
extradata_size
);
return
AVERROR_INVALIDDATA
;
}
return
libcodec2_init_common
(
avctx
,
avpriv_codec2_mode_from_extradata
(
avctx
->
extradata
));
}
static
av_cold
int
libcodec2_init_encoder
(
AVCodecContext
*
avctx
)
{
LibCodec2Context
*
c2
=
avctx
->
priv_data
;
//will need to be smarter once we get wideband support
if
(
avctx
->
sample_rate
!=
8000
||
avctx
->
channels
!=
1
||
avctx
->
sample_fmt
!=
AV_SAMPLE_FMT_S16
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"only 8 kHz 16-bit mono allowed
\n
"
);
return
AVERROR
(
EINVAL
);
}
avctx
->
extradata
=
av_mallocz
(
AVPRIV_CODEC2_EXTRADATA_SIZE
+
AV_INPUT_BUFFER_PADDING_SIZE
);
if
(
!
avctx
->
extradata
)
{
return
AVERROR
(
ENOMEM
);
}
avctx
->
extradata_size
=
AVPRIV_CODEC2_EXTRADATA_SIZE
;
avpriv_codec2_make_extradata
(
avctx
->
extradata
,
c2
->
mode
);
return
libcodec2_init_common
(
avctx
,
c2
->
mode
);
}
static
av_cold
int
libcodec2_close
(
AVCodecContext
*
avctx
)
{
LibCodec2Context
*
c2
=
avctx
->
priv_data
;
codec2_destroy
(
c2
->
codec
);
return
0
;
}
static
int
libcodec2_decode
(
AVCodecContext
*
avctx
,
void
*
data
,
int
*
got_frame_ptr
,
AVPacket
*
pkt
)
{
LibCodec2Context
*
c2
=
avctx
->
priv_data
;
AVFrame
*
frame
=
data
;
int
ret
,
nframes
,
i
;
uint8_t
*
input
;
int16_t
*
output
;
nframes
=
pkt
->
size
/
avctx
->
block_align
;
frame
->
nb_samples
=
avctx
->
frame_size
*
nframes
;
ret
=
ff_get_buffer
(
avctx
,
frame
,
0
);
if
(
ret
<
0
)
{
return
ret
;
}
input
=
pkt
->
data
;
output
=
(
int16_t
*
)
frame
->
data
[
0
];
for
(
i
=
0
;
i
<
nframes
;
i
++
)
{
codec2_decode
(
c2
->
codec
,
output
,
input
);
input
+=
avctx
->
block_align
;
output
+=
avctx
->
frame_size
;
}
*
got_frame_ptr
=
nframes
>
0
;
return
nframes
*
avctx
->
block_align
;
}
static
int
libcodec2_encode
(
AVCodecContext
*
avctx
,
AVPacket
*
avpkt
,
const
AVFrame
*
frame
,
int
*
got_packet_ptr
)
{
LibCodec2Context
*
c2
=
avctx
->
priv_data
;
int16_t
*
samples
=
(
int16_t
*
)
frame
->
data
[
0
];
int
ret
=
ff_alloc_packet2
(
avctx
,
avpkt
,
avctx
->
block_align
,
0
);
if
(
ret
<
0
)
{
return
ret
;
}
codec2_encode
(
c2
->
codec
,
avpkt
->
data
,
samples
);
*
got_packet_ptr
=
1
;
return
0
;
}
AVCodec
ff_libcodec2_decoder
=
{
.
name
=
"libcodec2"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"codec2 decoder using libcodec2"
),
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
AV_CODEC_ID_CODEC2
,
.
priv_data_size
=
sizeof
(
LibCodec2Context
),
.
init
=
libcodec2_init_decoder
,
.
close
=
libcodec2_close
,
.
decode
=
libcodec2_decode
,
.
capabilities
=
0
,
.
supported_samplerates
=
(
const
int
[]){
8000
,
0
},
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_S16
,
AV_SAMPLE_FMT_NONE
},
.
channel_layouts
=
(
const
uint64_t
[])
{
AV_CH_LAYOUT_MONO
,
0
},
.
priv_class
=
&
libcodec2_dec_class
,
};
AVCodec
ff_libcodec2_encoder
=
{
.
name
=
"libcodec2"
,
.
long_name
=
NULL_IF_CONFIG_SMALL
(
"codec2 encoder using libcodec2"
),
.
type
=
AVMEDIA_TYPE_AUDIO
,
.
id
=
AV_CODEC_ID_CODEC2
,
.
priv_data_size
=
sizeof
(
LibCodec2Context
),
.
init
=
libcodec2_init_encoder
,
.
close
=
libcodec2_close
,
.
encode2
=
libcodec2_encode
,
.
capabilities
=
0
,
.
supported_samplerates
=
(
const
int
[]){
8000
,
0
},
.
sample_fmts
=
(
const
enum
AVSampleFormat
[])
{
AV_SAMPLE_FMT_S16
,
AV_SAMPLE_FMT_NONE
},
.
channel_layouts
=
(
const
uint64_t
[])
{
AV_CH_LAYOUT_MONO
,
0
},
.
priv_class
=
&
libcodec2_enc_class
,
};
libavcodec/version.h
View file @
f958f431
...
@@ -28,8 +28,8 @@
...
@@ -28,8 +28,8 @@
#include "libavutil/version.h"
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MINOR 1
2
#define LIBAVCODEC_VERSION_MINOR 1
3
#define LIBAVCODEC_VERSION_MICRO 10
2
#define LIBAVCODEC_VERSION_MICRO 10
0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
LIBAVCODEC_VERSION_MINOR, \
LIBAVCODEC_VERSION_MINOR, \
...
...
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