summaryrefslogtreecommitdiff
path: root/ffmpeg.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2012-03-14 06:12:38 +0100
committerMichael Niedermayer <michaelni@gmx.at>2012-03-14 08:03:29 +0100
commit7230116000988103449a720f254d5437e13b20ff (patch)
tree119c97bc677472f7b83ee884a1dc79a1f0b39cf9 /ffmpeg.c
parent6968a7d1938cc009bad7a971f26d85ed271747ef (diff)
ffmpeg: Fix planar audio input.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'ffmpeg.c')
-rw-r--r--ffmpeg.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/ffmpeg.c b/ffmpeg.c
index 0a2f055ba5..36e30987ef 100644
--- a/ffmpeg.c
+++ b/ffmpeg.c
@@ -1130,9 +1130,16 @@ static void do_audio_out(AVFormatContext *s, OutputStream *ost,
AVCodecContext *dec = ist->st->codec;
int osize = av_get_bytes_per_sample(enc->sample_fmt);
int isize = av_get_bytes_per_sample(dec->sample_fmt);
- uint8_t *buf = decoded_frame->data[0];
+ uint8_t *buf[AV_NUM_DATA_POINTERS];
int size = decoded_frame->nb_samples * dec->channels * isize;
+ int planes = av_sample_fmt_is_planar(dec->sample_fmt) ? dec->channels : 1;
int64_t allocated_for_size = size;
+ int i;
+
+ av_assert0(planes <= AV_NUM_DATA_POINTERS);
+
+ for(i=0; i<planes; i++)
+ buf[i]= decoded_frame->data[i];
need_realloc:
audio_buf_size = (allocated_for_size + isize * dec->channels - 1) / (isize * dec->channels);
@@ -1229,7 +1236,8 @@ need_realloc:
if (byte_delta < 0) {
byte_delta = FFMAX(byte_delta, -size);
size += byte_delta;
- buf -= byte_delta;
+ for (i=0; i<planes; i++)
+ buf[i] -= byte_delta/planes;
av_log(NULL, AV_LOG_VERBOSE, "discarding %d audio samples\n",
-byte_delta / (isize * dec->channels));
if (!size)
@@ -1244,9 +1252,12 @@ need_realloc:
}
ist->is_start = 0;
- generate_silence(input_tmp, dec->sample_fmt, byte_delta);
- memcpy(input_tmp + byte_delta, buf, size);
- buf = input_tmp;
+ for (i=0; i<planes; i++) {
+ uint8_t *t = input_tmp + i*((byte_delta + size)/planes);
+ generate_silence(t, dec->sample_fmt, byte_delta/planes);
+ memcpy(t + byte_delta/planes, buf[i], size/planes);
+ buf[i] = t;
+ }
size += byte_delta;
av_log(NULL, AV_LOG_VERBOSE, "adding %d audio samples of silence\n", idelta);
}
@@ -1266,14 +1277,14 @@ need_realloc:
if (ost->audio_resample || ost->audio_channels_mapped) {
buftmp = audio_buf;
size_out = swr_convert(ost->swr, ( uint8_t*[]){buftmp}, audio_buf_size / (enc->channels * osize),
- (const uint8_t*[]){buf }, size / (dec->channels * isize));
+ buf, size / (dec->channels * isize));
if (size_out < 0) {
av_log(NULL, AV_LOG_FATAL, "swr_convert failed\n");
exit_program(1);
}
size_out = size_out * enc->channels * osize;
} else {
- buftmp = buf;
+ buftmp = buf[0];
size_out = size;
}