Signed-off-by: Cameron Cawley <ccawley2011@gmail.com>tags/n4.1
@@ -40,6 +40,7 @@ version <next>: | |||||
- vibrance filter | - vibrance filter | ||||
- decoding S12M timecode in h264 | - decoding S12M timecode in h264 | ||||
- xstack filter | - xstack filter | ||||
- pcm vidc decoder and encoder | |||||
version 4.0: | version 4.0: | ||||
@@ -545,6 +545,7 @@ library: | |||||
@item raw VC-1 @tab X @tab X | @item raw VC-1 @tab X @tab X | ||||
@item raw PCM A-law @tab X @tab X | @item raw PCM A-law @tab X @tab X | ||||
@item raw PCM mu-law @tab X @tab X | @item raw PCM mu-law @tab X @tab X | ||||
@item raw PCM Archimedes VIDC @tab X @tab X | |||||
@item raw PCM signed 8 bit @tab X @tab X | @item raw PCM signed 8 bit @tab X @tab X | ||||
@item raw PCM signed 16 bit big-endian @tab X @tab X | @item raw PCM signed 16 bit big-endian @tab X @tab X | ||||
@item raw PCM signed 16 bit little-endian @tab X @tab X | @item raw PCM signed 16 bit little-endian @tab X @tab X | ||||
@@ -1147,6 +1148,7 @@ following image formats are supported: | |||||
@tab encoding supported through external library libopus | @tab encoding supported through external library libopus | ||||
@item PCM A-law @tab X @tab X | @item PCM A-law @tab X @tab X | ||||
@item PCM mu-law @tab X @tab X | @item PCM mu-law @tab X @tab X | ||||
@item PCM Archimedes VIDC @tab X @tab X | |||||
@item PCM signed 8-bit planar @tab X @tab X | @item PCM signed 8-bit planar @tab X @tab X | ||||
@item PCM signed 16-bit big-endian planar @tab X @tab X | @item PCM signed 16-bit big-endian planar @tab X @tab X | ||||
@item PCM signed 16-bit little-endian planar @tab X @tab X | @item PCM signed 16-bit little-endian planar @tab X @tab X | ||||
@@ -794,6 +794,8 @@ OBJS-$(CONFIG_PCM_U32BE_DECODER) += pcm.o | |||||
OBJS-$(CONFIG_PCM_U32BE_ENCODER) += pcm.o | OBJS-$(CONFIG_PCM_U32BE_ENCODER) += pcm.o | ||||
OBJS-$(CONFIG_PCM_U32LE_DECODER) += pcm.o | OBJS-$(CONFIG_PCM_U32LE_DECODER) += pcm.o | ||||
OBJS-$(CONFIG_PCM_U32LE_ENCODER) += pcm.o | OBJS-$(CONFIG_PCM_U32LE_ENCODER) += pcm.o | ||||
OBJS-$(CONFIG_PCM_VIDC_DECODER) += pcm.o | |||||
OBJS-$(CONFIG_PCM_VIDC_ENCODER) += pcm.o | |||||
OBJS-$(CONFIG_PCM_ZORK_DECODER) += pcm.o | OBJS-$(CONFIG_PCM_ZORK_DECODER) += pcm.o | ||||
OBJS-$(CONFIG_ADPCM_4XM_DECODER) += adpcm.o adpcm_data.o | OBJS-$(CONFIG_ADPCM_4XM_DECODER) += adpcm.o adpcm_data.o | ||||
@@ -552,6 +552,8 @@ extern AVCodec ff_pcm_u32be_encoder; | |||||
extern AVCodec ff_pcm_u32be_decoder; | extern AVCodec ff_pcm_u32be_decoder; | ||||
extern AVCodec ff_pcm_u32le_encoder; | extern AVCodec ff_pcm_u32le_encoder; | ||||
extern AVCodec ff_pcm_u32le_decoder; | extern AVCodec ff_pcm_u32le_decoder; | ||||
extern AVCodec ff_pcm_vidc_encoder; | |||||
extern AVCodec ff_pcm_vidc_decoder; | |||||
extern AVCodec ff_pcm_zork_decoder; | extern AVCodec ff_pcm_zork_decoder; | ||||
/* DPCM codecs */ | /* DPCM codecs */ | ||||
@@ -491,6 +491,7 @@ enum AVCodecID { | |||||
AV_CODEC_ID_PCM_S64BE, | AV_CODEC_ID_PCM_S64BE, | ||||
AV_CODEC_ID_PCM_F16LE, | AV_CODEC_ID_PCM_F16LE, | ||||
AV_CODEC_ID_PCM_F24LE, | AV_CODEC_ID_PCM_F24LE, | ||||
AV_CODEC_ID_PCM_VIDC, | |||||
/* various ADPCM codecs */ | /* various ADPCM codecs */ | ||||
AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, | AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, | ||||
@@ -1936,6 +1936,13 @@ static const AVCodecDescriptor codec_descriptors[] = { | |||||
.long_name = NULL_IF_CONFIG_SMALL("PCM 24.0 floating point little-endian"), | .long_name = NULL_IF_CONFIG_SMALL("PCM 24.0 floating point little-endian"), | ||||
.props = AV_CODEC_PROP_LOSSLESS, | .props = AV_CODEC_PROP_LOSSLESS, | ||||
}, | }, | ||||
{ | |||||
.id = AV_CODEC_ID_PCM_VIDC, | |||||
.type = AVMEDIA_TYPE_AUDIO, | |||||
.name = "pcm_vidc", | |||||
.long_name = NULL_IF_CONFIG_SMALL("PCM Archimedes VIDC"), | |||||
.props = AV_CODEC_PROP_LOSSY, | |||||
}, | |||||
/* various ADPCM codecs */ | /* various ADPCM codecs */ | ||||
{ | { | ||||
@@ -42,6 +42,9 @@ static av_cold int pcm_encode_init(AVCodecContext *avctx) | |||||
case AV_CODEC_ID_PCM_MULAW: | case AV_CODEC_ID_PCM_MULAW: | ||||
pcm_ulaw_tableinit(); | pcm_ulaw_tableinit(); | ||||
break; | break; | ||||
case AV_CODEC_ID_PCM_VIDC: | |||||
pcm_vidc_tableinit(); | |||||
break; | |||||
default: | default: | ||||
break; | break; | ||||
} | } | ||||
@@ -216,6 +219,12 @@ static int pcm_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, | |||||
*dst++ = linear_to_ulaw[(v + 32768) >> 2]; | *dst++ = linear_to_ulaw[(v + 32768) >> 2]; | ||||
} | } | ||||
break; | break; | ||||
case AV_CODEC_ID_PCM_VIDC: | |||||
for (; n > 0; n--) { | |||||
v = *samples++; | |||||
*dst++ = linear_to_vidc[(v + 32768) >> 2]; | |||||
} | |||||
break; | |||||
default: | default: | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -249,6 +258,10 @@ static av_cold int pcm_decode_init(AVCodecContext *avctx) | |||||
for (i = 0; i < 256; i++) | for (i = 0; i < 256; i++) | ||||
s->table[i] = ulaw2linear(i); | s->table[i] = ulaw2linear(i); | ||||
break; | break; | ||||
case AV_CODEC_ID_PCM_VIDC: | |||||
for (i = 0; i < 256; i++) | |||||
s->table[i] = vidc2linear(i); | |||||
break; | |||||
case AV_CODEC_ID_PCM_F16LE: | case AV_CODEC_ID_PCM_F16LE: | ||||
case AV_CODEC_ID_PCM_F24LE: | case AV_CODEC_ID_PCM_F24LE: | ||||
s->scale = 1. / (1 << (avctx->bits_per_coded_sample - 1)); | s->scale = 1. / (1 << (avctx->bits_per_coded_sample - 1)); | ||||
@@ -485,6 +498,7 @@ static int pcm_decode_frame(AVCodecContext *avctx, void *data, | |||||
break; | break; | ||||
case AV_CODEC_ID_PCM_ALAW: | case AV_CODEC_ID_PCM_ALAW: | ||||
case AV_CODEC_ID_PCM_MULAW: | case AV_CODEC_ID_PCM_MULAW: | ||||
case AV_CODEC_ID_PCM_VIDC: | |||||
for (; n > 0; n--) { | for (; n > 0; n--) { | ||||
AV_WN16A(samples, s->table[*src++]); | AV_WN16A(samples, s->table[*src++]); | ||||
samples += 2; | samples += 2; | ||||
@@ -612,3 +626,4 @@ PCM_CODEC (PCM_U32LE, AV_SAMPLE_FMT_S32, pcm_u32le, "PCM unsigned | |||||
PCM_DECODER(PCM_ZORK, AV_SAMPLE_FMT_U8, pcm_zork, "PCM Zork"); | PCM_DECODER(PCM_ZORK, AV_SAMPLE_FMT_U8, pcm_zork, "PCM Zork"); | ||||
PCM_CODEC (PCM_S64BE, AV_SAMPLE_FMT_S64, pcm_s64be, "PCM signed 64-bit big-endian"); | PCM_CODEC (PCM_S64BE, AV_SAMPLE_FMT_S64, pcm_s64be, "PCM signed 64-bit big-endian"); | ||||
PCM_CODEC (PCM_S64LE, AV_SAMPLE_FMT_S64, pcm_s64le, "PCM signed 64-bit little-endian"); | PCM_CODEC (PCM_S64LE, AV_SAMPLE_FMT_S64, pcm_s64le, "PCM signed 64-bit little-endian"); | ||||
PCM_CODEC (PCM_VIDC, AV_SAMPLE_FMT_S16, pcm_vidc, "PCM Archimedes VIDC"); |
@@ -29,11 +29,13 @@ int main(void) | |||||
{ | { | ||||
pcm_alaw_tableinit(); | pcm_alaw_tableinit(); | ||||
pcm_ulaw_tableinit(); | pcm_ulaw_tableinit(); | ||||
pcm_vidc_tableinit(); | |||||
write_fileheader(); | write_fileheader(); | ||||
WRITE_ARRAY("static const", uint8_t, linear_to_alaw); | WRITE_ARRAY("static const", uint8_t, linear_to_alaw); | ||||
WRITE_ARRAY("static const", uint8_t, linear_to_ulaw); | WRITE_ARRAY("static const", uint8_t, linear_to_ulaw); | ||||
WRITE_ARRAY("static const", uint8_t, linear_to_vidc); | |||||
return 0; | return 0; | ||||
} | } |
@@ -36,6 +36,12 @@ | |||||
#define BIAS (0x84) /* Bias for linear code. */ | #define BIAS (0x84) /* Bias for linear code. */ | ||||
#define VIDC_SIGN_BIT (1) | |||||
#define VIDC_QUANT_MASK (0x1E) | |||||
#define VIDC_QUANT_SHIFT (1) | |||||
#define VIDC_SEG_SHIFT (5) | |||||
#define VIDC_SEG_MASK (0xE0) | |||||
/* alaw2linear() - Convert an A-law value to 16-bit linear PCM */ | /* alaw2linear() - Convert an A-law value to 16-bit linear PCM */ | ||||
static av_cold int alaw2linear(unsigned char a_val) | static av_cold int alaw2linear(unsigned char a_val) | ||||
{ | { | ||||
@@ -69,14 +75,30 @@ static av_cold int ulaw2linear(unsigned char u_val) | |||||
return (u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS); | return (u_val & SIGN_BIT) ? (BIAS - t) : (t - BIAS); | ||||
} | } | ||||
static av_cold int vidc2linear(unsigned char u_val) | |||||
{ | |||||
int t; | |||||
/* | |||||
* Extract and bias the quantization bits. Then | |||||
* shift up by the segment number and subtract out the bias. | |||||
*/ | |||||
t = (((u_val & VIDC_QUANT_MASK) >> VIDC_QUANT_SHIFT) << 3) + BIAS; | |||||
t <<= ((unsigned)u_val & VIDC_SEG_MASK) >> VIDC_SEG_SHIFT; | |||||
return (u_val & VIDC_SIGN_BIT) ? (BIAS - t) : (t - BIAS); | |||||
} | |||||
#if CONFIG_HARDCODED_TABLES | #if CONFIG_HARDCODED_TABLES | ||||
#define pcm_alaw_tableinit() | #define pcm_alaw_tableinit() | ||||
#define pcm_ulaw_tableinit() | #define pcm_ulaw_tableinit() | ||||
#define pcm_vidc_tableinit() | |||||
#include "libavcodec/pcm_tables.h" | #include "libavcodec/pcm_tables.h" | ||||
#else | #else | ||||
/* 16384 entries per table */ | /* 16384 entries per table */ | ||||
static uint8_t linear_to_alaw[16384]; | static uint8_t linear_to_alaw[16384]; | ||||
static uint8_t linear_to_ulaw[16384]; | static uint8_t linear_to_ulaw[16384]; | ||||
static uint8_t linear_to_vidc[16384]; | |||||
static av_cold void build_xlaw_table(uint8_t *linear_to_xlaw, | static av_cold void build_xlaw_table(uint8_t *linear_to_xlaw, | ||||
int (*xlaw2linear)(unsigned char), | int (*xlaw2linear)(unsigned char), | ||||
@@ -111,6 +133,11 @@ static void pcm_ulaw_tableinit(void) | |||||
{ | { | ||||
build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff); | build_xlaw_table(linear_to_ulaw, ulaw2linear, 0xff); | ||||
} | } | ||||
static void pcm_vidc_tableinit(void) | |||||
{ | |||||
build_xlaw_table(linear_to_vidc, vidc2linear, 0xff); | |||||
} | |||||
#endif /* CONFIG_HARDCODED_TABLES */ | #endif /* CONFIG_HARDCODED_TABLES */ | ||||
#endif /* AVCODEC_PCM_TABLEGEN_H */ | #endif /* AVCODEC_PCM_TABLEGEN_H */ |
@@ -1438,6 +1438,7 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id) | |||||
case AV_CODEC_ID_DSD_MSBF_PLANAR: | case AV_CODEC_ID_DSD_MSBF_PLANAR: | ||||
case AV_CODEC_ID_PCM_ALAW: | case AV_CODEC_ID_PCM_ALAW: | ||||
case AV_CODEC_ID_PCM_MULAW: | case AV_CODEC_ID_PCM_MULAW: | ||||
case AV_CODEC_ID_PCM_VIDC: | |||||
case AV_CODEC_ID_PCM_S8: | case AV_CODEC_ID_PCM_S8: | ||||
case AV_CODEC_ID_PCM_S8_PLANAR: | case AV_CODEC_ID_PCM_S8_PLANAR: | ||||
case AV_CODEC_ID_PCM_U8: | case AV_CODEC_ID_PCM_U8: | ||||
@@ -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 33 | |||||
#define LIBAVCODEC_VERSION_MICRO 102 | |||||
#define LIBAVCODEC_VERSION_MINOR 34 | |||||
#define LIBAVCODEC_VERSION_MICRO 100 | |||||
#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, \ | ||||
@@ -411,6 +411,8 @@ OBJS-$(CONFIG_PCM_U32LE_DEMUXER) += pcmdec.o pcm.o | |||||
OBJS-$(CONFIG_PCM_U32LE_MUXER) += pcmenc.o rawenc.o | OBJS-$(CONFIG_PCM_U32LE_MUXER) += pcmenc.o rawenc.o | ||||
OBJS-$(CONFIG_PCM_U8_DEMUXER) += pcmdec.o pcm.o | OBJS-$(CONFIG_PCM_U8_DEMUXER) += pcmdec.o pcm.o | ||||
OBJS-$(CONFIG_PCM_U8_MUXER) += pcmenc.o rawenc.o | OBJS-$(CONFIG_PCM_U8_MUXER) += pcmenc.o rawenc.o | ||||
OBJS-$(CONFIG_PCM_VIDC_DEMUXER) += pcmdec.o pcm.o | |||||
OBJS-$(CONFIG_PCM_VIDC_MUXER) += pcmenc.o rawenc.o | |||||
OBJS-$(CONFIG_PJS_DEMUXER) += pjsdec.o subtitles.o | OBJS-$(CONFIG_PJS_DEMUXER) += pjsdec.o subtitles.o | ||||
OBJS-$(CONFIG_PMP_DEMUXER) += pmpdec.o | OBJS-$(CONFIG_PMP_DEMUXER) += pmpdec.o | ||||
OBJS-$(CONFIG_PVA_DEMUXER) += pva.o | OBJS-$(CONFIG_PVA_DEMUXER) += pva.o | ||||
@@ -289,6 +289,8 @@ extern AVInputFormat ff_pcm_alaw_demuxer; | |||||
extern AVOutputFormat ff_pcm_alaw_muxer; | extern AVOutputFormat ff_pcm_alaw_muxer; | ||||
extern AVInputFormat ff_pcm_mulaw_demuxer; | extern AVInputFormat ff_pcm_mulaw_demuxer; | ||||
extern AVOutputFormat ff_pcm_mulaw_muxer; | extern AVOutputFormat ff_pcm_mulaw_muxer; | ||||
extern AVInputFormat ff_pcm_vidc_demuxer; | |||||
extern AVOutputFormat ff_pcm_vidc_muxer; | |||||
extern AVInputFormat ff_pcm_f64be_demuxer; | extern AVInputFormat ff_pcm_f64be_demuxer; | ||||
extern AVOutputFormat ff_pcm_f64be_muxer; | extern AVOutputFormat ff_pcm_f64be_muxer; | ||||
extern AVInputFormat ff_pcm_f64le_demuxer; | extern AVInputFormat ff_pcm_f64le_demuxer; | ||||
@@ -177,6 +177,9 @@ PCMDEF(alaw, "PCM A-law", | |||||
PCMDEF(mulaw, "PCM mu-law", | PCMDEF(mulaw, "PCM mu-law", | ||||
"ul", AV_CODEC_ID_PCM_MULAW) | "ul", AV_CODEC_ID_PCM_MULAW) | ||||
PCMDEF(vidc, "PCM Archimedes VIDC", | |||||
NULL, AV_CODEC_ID_PCM_VIDC) | |||||
static const AVOption sln_options[] = { | static const AVOption sln_options[] = { | ||||
{ "sample_rate", "", offsetof(PCMAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 8000}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | { "sample_rate", "", offsetof(PCMAudioDemuxerContext, sample_rate), AV_OPT_TYPE_INT, {.i64 = 8000}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | ||||
{ "channels", "", offsetof(PCMAudioDemuxerContext, channels), AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | { "channels", "", offsetof(PCMAudioDemuxerContext, channels), AV_OPT_TYPE_INT, {.i64 = 1}, 0, INT_MAX, AV_OPT_FLAG_DECODING_PARAM }, | ||||
@@ -92,3 +92,6 @@ PCMDEF(alaw, "PCM A-law", | |||||
PCMDEF(mulaw, "PCM mu-law", | PCMDEF(mulaw, "PCM mu-law", | ||||
"ul", AV_CODEC_ID_PCM_MULAW) | "ul", AV_CODEC_ID_PCM_MULAW) | ||||
PCMDEF(vidc, "PCM Archimedes VIDC", | |||||
NULL, AV_CODEC_ID_PCM_VIDC) |