mirror of
https://github.com/nyanmisaka/ffmpeg-rockchip.git
synced 2025-11-02 23:24:01 +08:00
Merge remote-tracking branch 'qatar/master'
* qatar/master: aac_latm: reconfigure decoder on audio specific config changes latmdec: fix audio specific config parsing Add avcodec_decode_audio4(). avcodec: change number of plane pointers from 4 to 8 at next major bump. Update developers documentation with coding conventions. svq1dec: avoid undefined get_bits(0) call ARM: h264dsp_neon cosmetics ARM: make some NEON macros reusable Do not memcpy raw video frames when using null muxer fate: update asf seektest vp8: flush buffers on size changes. doc: improve general documentation for MacOSX asf: use packet dts as approximation of pts asf: do not call av_read_frame rtsp: Initialize the media_type_mask in the rtp guessing demuxer Cleaned up alacenc.c Conflicts: doc/APIchanges doc/developer.texi libavcodec/8svx.c libavcodec/aacdec.c libavcodec/ac3dec.c libavcodec/avcodec.h libavcodec/nellymoserdec.c libavcodec/tta.c libavcodec/utils.c libavcodec/version.h libavcodec/wmadec.c libavformat/asfdec.c tests/ref/seek/lavf_asf Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -192,6 +192,7 @@ static int pcm_encode_frame(AVCodecContext *avctx,
|
||||
}
|
||||
|
||||
typedef struct PCMDecode {
|
||||
AVFrame frame;
|
||||
short table[256];
|
||||
} PCMDecode;
|
||||
|
||||
@@ -223,6 +224,9 @@ static av_cold int pcm_decode_init(AVCodecContext * avctx)
|
||||
if (avctx->sample_fmt == AV_SAMPLE_FMT_S32)
|
||||
avctx->bits_per_raw_sample = av_get_bits_per_sample(avctx->codec->id);
|
||||
|
||||
avcodec_get_frame_defaults(&s->frame);
|
||||
avctx->coded_frame = &s->frame;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -243,22 +247,20 @@ static av_cold int pcm_decode_init(AVCodecContext * avctx)
|
||||
dst += size / 8; \
|
||||
}
|
||||
|
||||
static int pcm_decode_frame(AVCodecContext *avctx,
|
||||
void *data, int *data_size,
|
||||
AVPacket *avpkt)
|
||||
static int pcm_decode_frame(AVCodecContext *avctx, void *data,
|
||||
int *got_frame_ptr, AVPacket *avpkt)
|
||||
{
|
||||
const uint8_t *src = avpkt->data;
|
||||
int buf_size = avpkt->size;
|
||||
PCMDecode *s = avctx->priv_data;
|
||||
int sample_size, c, n, out_size;
|
||||
int sample_size, c, n, ret, samples_per_block;
|
||||
uint8_t *samples;
|
||||
int32_t *dst_int32_t;
|
||||
|
||||
samples = data;
|
||||
|
||||
sample_size = av_get_bits_per_sample(avctx->codec_id)/8;
|
||||
|
||||
/* av_get_bits_per_sample returns 0 for CODEC_ID_PCM_DVD */
|
||||
samples_per_block = 1;
|
||||
if (CODEC_ID_PCM_DVD == avctx->codec_id) {
|
||||
if (avctx->bits_per_coded_sample != 20 &&
|
||||
avctx->bits_per_coded_sample != 24) {
|
||||
@@ -268,10 +270,13 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
||||
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 == CODEC_ID_PCM_LXF)
|
||||
} else if (avctx->codec_id == CODEC_ID_PCM_LXF) {
|
||||
/* we process 40-bit blocks per channel for LXF */
|
||||
samples_per_block = 2;
|
||||
sample_size = 5;
|
||||
}
|
||||
|
||||
if (sample_size == 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Invalid sample_size\n");
|
||||
@@ -290,14 +295,13 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
||||
|
||||
n = buf_size/sample_size;
|
||||
|
||||
out_size = n * av_get_bytes_per_sample(avctx->sample_fmt);
|
||||
if (avctx->codec_id == CODEC_ID_PCM_DVD ||
|
||||
avctx->codec_id == CODEC_ID_PCM_LXF)
|
||||
out_size *= 2;
|
||||
if (*data_size < out_size) {
|
||||
av_log(avctx, AV_LOG_ERROR, "output buffer too small\n");
|
||||
return AVERROR(EINVAL);
|
||||
/* get output buffer */
|
||||
s->frame.nb_samples = n * samples_per_block / avctx->channels;
|
||||
if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
|
||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||
return ret;
|
||||
}
|
||||
samples = s->frame.data[0];
|
||||
|
||||
switch(avctx->codec->id) {
|
||||
case CODEC_ID_PCM_U32LE:
|
||||
@@ -403,7 +407,7 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
||||
case CODEC_ID_PCM_DVD:
|
||||
{
|
||||
const uint8_t *src8;
|
||||
dst_int32_t = data;
|
||||
dst_int32_t = (int32_t *)s->frame.data[0];
|
||||
n /= avctx->channels;
|
||||
switch (avctx->bits_per_coded_sample) {
|
||||
case 20:
|
||||
@@ -435,7 +439,7 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
||||
{
|
||||
int i;
|
||||
const uint8_t *src8;
|
||||
dst_int32_t = data;
|
||||
dst_int32_t = (int32_t *)s->frame.data[0];
|
||||
n /= avctx->channels;
|
||||
//unpack and de-planerize
|
||||
for (i = 0; i < n; i++) {
|
||||
@@ -456,7 +460,10 @@ static int pcm_decode_frame(AVCodecContext *avctx,
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
*data_size = out_size;
|
||||
|
||||
*got_frame_ptr = 1;
|
||||
*(AVFrame *)data = s->frame;
|
||||
|
||||
return buf_size;
|
||||
}
|
||||
|
||||
@@ -485,6 +492,7 @@ AVCodec ff_ ## name_ ## _decoder = { \
|
||||
.priv_data_size = sizeof(PCMDecode), \
|
||||
.init = pcm_decode_init, \
|
||||
.decode = pcm_decode_frame, \
|
||||
.capabilities = CODEC_CAP_DR1, \
|
||||
.sample_fmts = (const enum AVSampleFormat[]){sample_fmt_,AV_SAMPLE_FMT_NONE}, \
|
||||
.long_name = NULL_IF_CONFIG_SMALL(long_name_), \
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user