diff options
author | Paul B Mahol <onemda@gmail.com> | 2012-11-16 16:00:04 +0000 |
---|---|---|
committer | Paul B Mahol <onemda@gmail.com> | 2012-11-17 19:09:43 +0000 |
commit | 467dfd5dfae7cc435a2b2e7cf012a0de2fea5848 (patch) | |
tree | aa7581531324f864a14f2f8fd4df1a64b9004913 | |
parent | ee2d6fbc92e6d55dda319fa56234c5be9a476728 (diff) | |
download | ffmpeg-467dfd5dfae7cc435a2b2e7cf012a0de2fea5848.tar.gz |
PCM signed 24-bit/32-bit little-endian planar decoder
Signed-off-by: Paul B Mahol <onemda@gmail.com>
-rw-r--r-- | doc/general.texi | 4 | ||||
-rw-r--r-- | libavcodec/Makefile | 2 | ||||
-rw-r--r-- | libavcodec/allcodecs.c | 2 | ||||
-rw-r--r-- | libavcodec/avcodec.h | 2 | ||||
-rw-r--r-- | libavcodec/codec_desc.c | 14 | ||||
-rw-r--r-- | libavcodec/pcm.c | 33 | ||||
-rw-r--r-- | libavcodec/utils.c | 2 | ||||
-rw-r--r-- | libavcodec/version.h | 2 | ||||
-rw-r--r-- | libavformat/nut.c | 2 |
9 files changed, 50 insertions, 13 deletions
diff --git a/doc/general.texi b/doc/general.texi index 97683399eb..be8a63485a 100644 --- a/doc/general.texi +++ b/doc/general.texi @@ -826,7 +826,9 @@ following image formats are supported: @tab supported through external library libopus @item PCM A-law @tab X @tab X @item PCM mu-law @tab X @tab X -@item PCM 16-bit little-endian planar @tab @tab X +@item PCM signed 16-bit little-endian planar @tab @tab X +@item PCM signed 24-bit little-endian planar @tab @tab X +@item PCM signed 32-bit little-endian planar @tab @tab X @item PCM 32-bit floating point big-endian @tab X @tab X @item PCM 32-bit floating point little-endian @tab X @tab X @item PCM 64-bit floating point big-endian @tab X @tab X diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 5f8776da0a..c7724e8e12 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -533,10 +533,12 @@ OBJS-$(CONFIG_PCM_S24DAUD_DECODER) += pcm.o OBJS-$(CONFIG_PCM_S24DAUD_ENCODER) += pcm.o OBJS-$(CONFIG_PCM_S24LE_DECODER) += pcm.o OBJS-$(CONFIG_PCM_S24LE_ENCODER) += pcm.o +OBJS-$(CONFIG_PCM_S24LE_PLANAR_DECODER) += pcm.o OBJS-$(CONFIG_PCM_S32BE_DECODER) += pcm.o OBJS-$(CONFIG_PCM_S32BE_ENCODER) += pcm.o OBJS-$(CONFIG_PCM_S32LE_DECODER) += pcm.o OBJS-$(CONFIG_PCM_S32LE_ENCODER) += pcm.o +OBJS-$(CONFIG_PCM_S32LE_PLANAR_DECODER) += pcm.o OBJS-$(CONFIG_PCM_U8_DECODER) += pcm.o OBJS-$(CONFIG_PCM_U8_ENCODER) += pcm.o OBJS-$(CONFIG_PCM_U16BE_DECODER) += pcm.o diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c index 6bad573617..efefbfdc12 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -363,8 +363,10 @@ void avcodec_register_all(void) REGISTER_ENCDEC (PCM_S24BE, pcm_s24be); REGISTER_ENCDEC (PCM_S24DAUD, pcm_s24daud); REGISTER_ENCDEC (PCM_S24LE, pcm_s24le); + REGISTER_DECODER (PCM_S24LE_PLANAR, pcm_s24le_planar); REGISTER_ENCDEC (PCM_S32BE, pcm_s32be); REGISTER_ENCDEC (PCM_S32LE, pcm_s32le); + REGISTER_DECODER (PCM_S32LE_PLANAR, pcm_s32le_planar); REGISTER_ENCDEC (PCM_U8, pcm_u8); REGISTER_ENCDEC (PCM_U16BE, pcm_u16be); REGISTER_ENCDEC (PCM_U16LE, pcm_u16le); diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index 368f2c4db6..a59e7f8fa5 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -315,6 +315,8 @@ enum AVCodecID { AV_CODEC_ID_PCM_LXF, AV_CODEC_ID_S302M, AV_CODEC_ID_PCM_S8_PLANAR, + AV_CODEC_ID_PCM_S24LE_PLANAR = MKBETAG(24,'P','S','P'), + AV_CODEC_ID_PCM_S32LE_PLANAR = MKBETAG(32,'P','S','P'), /* various ADPCM codecs */ AV_CODEC_ID_ADPCM_IMA_QT = 0x11000, diff --git a/libavcodec/codec_desc.c b/libavcodec/codec_desc.c index 45432bceb9..0d1f740adc 100644 --- a/libavcodec/codec_desc.c +++ b/libavcodec/codec_desc.c @@ -1455,6 +1455,20 @@ static const AVCodecDescriptor codec_descriptors[] = { .props = AV_CODEC_PROP_LOSSLESS, }, { + .id = AV_CODEC_ID_PCM_S24LE_PLANAR, + .type = AVMEDIA_TYPE_AUDIO, + .name = "pcm_s24le_planar", + .long_name = NULL_IF_CONFIG_SMALL("PCM signed 24-bit little-endian planar"), + .props = AV_CODEC_PROP_LOSSLESS, + }, + { + .id = AV_CODEC_ID_PCM_S32LE_PLANAR, + .type = AVMEDIA_TYPE_AUDIO, + .name = "pcm_s32le_planar", + .long_name = NULL_IF_CONFIG_SMALL("PCM signed 32-bit little-endian planar"), + .props = AV_CODEC_PROP_LOSSLESS, + }, + { .id = AV_CODEC_ID_PCM_DVD, .type = AVMEDIA_TYPE_AUDIO, .name = "pcm_dvd", diff --git a/libavcodec/pcm.c b/libavcodec/pcm.c index 70fa63823e..f024775aa9 100644 --- a/libavcodec/pcm.c +++ b/libavcodec/pcm.c @@ -252,6 +252,19 @@ static av_cold int pcm_decode_init(AVCodecContext *avctx) dst += size / 8; \ } +#define DECODE_PLANAR(size, endian, src, dst, n, shift, offset) { \ + int i; \ + n /= avctx->channels; \ + for (c = 0; c < avctx->channels; c++) { \ + dst = s->frame.extended_data[c]; \ + for (i = n; i > 0; i--) { \ + uint ## size ## _t v = bytestream_get_ ## endian(&src); \ + AV_WN ## size ## A(dst, (v - offset) << shift); \ + dst += size / 8; \ + } \ + } \ +} + static int pcm_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt) { @@ -344,18 +357,14 @@ static int pcm_decode_frame(AVCodecContext *avctx, void *data, } break; case AV_CODEC_ID_PCM_S16LE_PLANAR: - { - int i; - n /= avctx->channels; - for (c = 0; c < avctx->channels; c++) { - samples = s->frame.extended_data[c]; - for (i = n; i > 0; i--) { - AV_WN16A(samples, bytestream_get_le16(&src)); - samples += 2; - } - } + DECODE_PLANAR(16, le16, src, samples, n, 0, 0); + break; + case AV_CODEC_ID_PCM_S24LE_PLANAR: + DECODE_PLANAR(32, le24, src, samples, n, 8, 0); + break; + case AV_CODEC_ID_PCM_S32LE_PLANAR: + DECODE_PLANAR(32, le32, src, samples, n, 0, 0); break; - } case AV_CODEC_ID_PCM_U16LE: DECODE(16, le16, src, samples, n, 0, 0x8000) break; @@ -544,8 +553,10 @@ PCM_DECODER(PCM_S16LE_PLANAR, AV_SAMPLE_FMT_S16P,pcm_s16le_planar, "PCM signed 1 PCM_CODEC (PCM_S24BE, AV_SAMPLE_FMT_S32, pcm_s24be, "PCM signed 24-bit big-endian"); PCM_CODEC (PCM_S24DAUD, AV_SAMPLE_FMT_S16, pcm_s24daud, "PCM D-Cinema audio signed 24-bit"); PCM_CODEC (PCM_S24LE, AV_SAMPLE_FMT_S32, pcm_s24le, "PCM signed 24-bit little-endian"); +PCM_DECODER(PCM_S24LE_PLANAR, AV_SAMPLE_FMT_S32P,pcm_s24le_planar, "PCM signed 24-bit little-endian planar"); PCM_CODEC (PCM_S32BE, AV_SAMPLE_FMT_S32, pcm_s32be, "PCM signed 32-bit big-endian"); PCM_CODEC (PCM_S32LE, AV_SAMPLE_FMT_S32, pcm_s32le, "PCM signed 32-bit little-endian"); +PCM_DECODER(PCM_S32LE_PLANAR, AV_SAMPLE_FMT_S32P,pcm_s32le_planar, "PCM signed 32-bit little-endian planar"); PCM_CODEC (PCM_U8, AV_SAMPLE_FMT_U8, pcm_u8, "PCM unsigned 8-bit"); PCM_CODEC (PCM_U16BE, AV_SAMPLE_FMT_S16, pcm_u16be, "PCM unsigned 16-bit big-endian"); PCM_CODEC (PCM_U16LE, AV_SAMPLE_FMT_S16, pcm_u16le, "PCM unsigned 16-bit little-endian"); diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 364ce0f0ae..bce5a09265 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -2319,11 +2319,13 @@ int av_get_exact_bits_per_sample(enum AVCodecID codec_id) case AV_CODEC_ID_PCM_S24DAUD: case AV_CODEC_ID_PCM_S24BE: case AV_CODEC_ID_PCM_S24LE: + case AV_CODEC_ID_PCM_S24LE_PLANAR: case AV_CODEC_ID_PCM_U24BE: case AV_CODEC_ID_PCM_U24LE: return 24; case AV_CODEC_ID_PCM_S32BE: case AV_CODEC_ID_PCM_S32LE: + case AV_CODEC_ID_PCM_S32LE_PLANAR: case AV_CODEC_ID_PCM_U32BE: case AV_CODEC_ID_PCM_U32LE: case AV_CODEC_ID_PCM_F32BE: diff --git a/libavcodec/version.h b/libavcodec/version.h index ec874f4721..006e8f16c5 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -29,7 +29,7 @@ #include "libavutil/avutil.h" #define LIBAVCODEC_VERSION_MAJOR 54 -#define LIBAVCODEC_VERSION_MINOR 71 +#define LIBAVCODEC_VERSION_MINOR 72 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ diff --git a/libavformat/nut.c b/libavformat/nut.c index 13f0091ca1..7a400f8fa0 100644 --- a/libavformat/nut.c +++ b/libavformat/nut.c @@ -168,6 +168,8 @@ const AVCodecTag ff_nut_audio_tags[] = { { AV_CODEC_ID_PCM_U32LE, MKTAG('P', 'U', 'D', 32 ) }, { AV_CODEC_ID_PCM_U8, MKTAG('P', 'U', 'D', 8 ) }, { AV_CODEC_ID_PCM_S16LE_PLANAR, MKTAG('P', 'S', 'P', 16 ) }, + { AV_CODEC_ID_PCM_S24LE_PLANAR, MKTAG('P', 'S', 'P', 24 ) }, + { AV_CODEC_ID_PCM_S32LE_PLANAR, MKTAG('P', 'S', 'P', 32 ) }, { AV_CODEC_ID_NONE, 0 } }; |