avctx->bits_per_coded_sample = av_get_bits_per_sample(avctx->codec->id);
avctx->block_align = avctx->channels * avctx->bits_per_coded_sample / 8;
avctx->bit_rate = avctx->block_align * avctx->sample_rate * 8;
- avctx->coded_frame = avcodec_alloc_frame();
+ avctx->coded_frame = av_frame_alloc();
if (!avctx->coded_frame)
return AVERROR(ENOMEM);
dst += size / 8; \
}
+#if HAVE_BIGENDIAN
+#define DECODE_PLANAR(size, endian, src, dst, n, shift, offset) \
+ { \
+ int av_unused n2; \
+ n /= avctx->channels; \
+ for (c = 0; c < avctx->channels; c++) { \
+ samples = frame->extended_data[c]; \
+ n2 = n; \
+ DECODE(size, endian, src, samples, n2, 0, 0) \
+ } \
+ }
+#else
+#define DECODE_PLANAR(size, endian, src, dst, n, shift, offset) \
+ { \
+ int av_unused n2; \
+ n /= avctx->channels; \
+ for (c = 0; c < avctx->channels; c++) { \
+ samples = frame->extended_data[c]; \
+ memcpy(samples, src, n * size / 8); \
+ src += n * size / 8; \
+ } \
+ }
+#endif /* HAVE_BIGENDIAN */
+
static int pcm_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
/* av_get_bits_per_sample returns 0 for AV_CODEC_ID_PCM_DVD */
samples_per_block = 1;
- if (AV_CODEC_ID_PCM_DVD == avctx->codec_id) {
- if (avctx->bits_per_coded_sample != 20 &&
- avctx->bits_per_coded_sample != 24) {
- av_log(avctx, AV_LOG_ERROR, "PCM DVD unsupported sample depth\n");
- return AVERROR(EINVAL);
- }
- /* 2 samples are interleaved per block in PCM_DVD */
- samples_per_block = 2;
- sample_size = avctx->bits_per_coded_sample * 2 / 8;
- } else if (avctx->codec_id == AV_CODEC_ID_PCM_LXF) {
+ if (avctx->codec_id == AV_CODEC_ID_PCM_LXF) {
/* we process 40-bit blocks per channel for LXF */
samples_per_block = 2;
sample_size = 5;
/* get output buffer */
frame->nb_samples = n * samples_per_block / avctx->channels;
- if ((ret = ff_get_buffer(avctx, frame)) < 0) {
+ if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
return ret;
}
}
break;
case AV_CODEC_ID_PCM_S16LE_PLANAR:
- {
- int av_unused n2;
- n /= avctx->channels;
- for (c = 0; c < avctx->channels; c++) {
- samples = frame->extended_data[c];
-#if HAVE_BIGENDIAN
- n2 = n;
- DECODE(16, le16, src, samples, n2, 0, 0)
-#else
- memcpy(samples, src, n * 2);
- src += n * 2;
-#endif
- }
+ 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;
samples += 2;
}
break;
- case AV_CODEC_ID_PCM_DVD:
- {
- const uint8_t *src8;
- dst_int32_t = (int32_t *)frame->data[0];
- n /= avctx->channels;
- switch (avctx->bits_per_coded_sample) {
- case 20:
- while (n--) {
- c = avctx->channels;
- src8 = src + 4 * c;
- while (c--) {
- *dst_int32_t++ = (bytestream_get_be16(&src) << 16) + ((*src8 & 0xf0) << 8);
- *dst_int32_t++ = (bytestream_get_be16(&src) << 16) + ((*src8++ & 0x0f) << 12);
- }
- src = src8;
- }
- break;
- case 24:
- while (n--) {
- c = avctx->channels;
- src8 = src + 4 * c;
- while (c--) {
- *dst_int32_t++ = (bytestream_get_be16(&src) << 16) + ((*src8++) << 8);
- *dst_int32_t++ = (bytestream_get_be16(&src) << 16) + ((*src8++) << 8);
- }
- src = src8;
- }
- break;
- }
- break;
- }
case AV_CODEC_ID_PCM_LXF:
{
int i;
#define PCM_ENCODER_1(id_, sample_fmt_, name_, long_name_) \
AVCodec ff_ ## name_ ## _encoder = { \
.name = #name_, \
+ .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
.type = AVMEDIA_TYPE_AUDIO, \
.id = AV_CODEC_ID_ ## id_, \
.init = pcm_encode_init, \
.capabilities = CODEC_CAP_VARIABLE_FRAME_SIZE, \
.sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \
AV_SAMPLE_FMT_NONE }, \
- .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
}
#define PCM_ENCODER_2(cf, id, sample_fmt, name, long_name) \
#define PCM_DECODER_1(id_, sample_fmt_, name_, long_name_) \
AVCodec ff_ ## name_ ## _decoder = { \
.name = #name_, \
+ .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
.type = AVMEDIA_TYPE_AUDIO, \
.id = AV_CODEC_ID_ ## id_, \
.priv_data_size = sizeof(PCMDecode), \
.capabilities = CODEC_CAP_DR1, \
.sample_fmts = (const enum AVSampleFormat[]){ sample_fmt_, \
AV_SAMPLE_FMT_NONE }, \
- .long_name = NULL_IF_CONFIG_SMALL(long_name_), \
}
#define PCM_DECODER_2(cf, id, sample_fmt, name, long_name) \
/* Note: Do not forget to add new entries to the Makefile as well. */
PCM_CODEC (PCM_ALAW, AV_SAMPLE_FMT_S16, pcm_alaw, "PCM A-law");
-PCM_DECODER(PCM_DVD, AV_SAMPLE_FMT_S32, pcm_dvd, "PCM signed 20|24-bit big-endian");
PCM_CODEC (PCM_F32BE, AV_SAMPLE_FMT_FLT, pcm_f32be, "PCM 32-bit floating point big-endian");
PCM_CODEC (PCM_F32LE, AV_SAMPLE_FMT_FLT, pcm_f32le, "PCM 32-bit floating point little-endian");
PCM_CODEC (PCM_F64BE, AV_SAMPLE_FMT_DBL, pcm_f64be, "PCM 64-bit floating point big-endian");
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");