summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormrk501 <mrk501e@outlook.com>2019-01-27 12:35:12 +0900
committerTim-Philipp Müller <tim@centricular.com>2019-05-01 19:08:12 +0100
commit2d8d321ab178f43d52232a1de4bd14a5457fa022 (patch)
tree8e6b720eb0200a4572b2e8430ed35509d592e017
parent90835573fba2eac392880f2c60271f0ede59c0d9 (diff)
downloadgstreamer-plugins-base-2d8d321ab178f43d52232a1de4bd14a5457fa022.tar.gz
audioringbuffer: Fix wrong memcpy address when reordering channels
When using multichannel audio data and being needed to reorder channels, audio data is not copied correctly because destination address of memcpy is wrong. For example, the following command $ gst-launch-1.0 pulsesrc ! audio/x-raw,channels=6,format=S16LE ! filesink location=test.raw will reproduce this issue if there is 6-ch audio input device. This commit fixes that. The detailed process of this issue is as follows: 1. gst-launch-1.0 calls gst_pulsesrc_prepare (gst-plugins-good/ext/pulse/pulsesrc.c) 1466 gst_pulsesrc_prepare (GstAudioSrc * asrc, GstAudioRingBufferSpec * spec) 1467 { (skip...) 1480 { 1481 GstAudioRingBufferSpec s = *spec; 1482 const pa_channel_map *m; 1483 1484 m = pa_stream_get_channel_map (pulsesrc->stream); 1485 gst_pulse_channel_map_to_gst (m, &s); 1486 gst_audio_ring_buffer_set_channel_positions (GST_AUDIO_BASE_SRC 1487 (pulsesrc)->ringbuffer, s.info.position); 1488 } In my environment, after line 1485 is processed, position of spec and s are spec->info.position[0] = 0 spec->info.position[1] = 1 spec->info.position[2] = 2 spec->info.position[3] = 6 spec->info.position[4] = 7 spec->info.position[5] = 8 s.info.position[0] = 0 s.info.position[1] = 6 s.info.position[2] = 2 s.info.position[3] = 1 s.info.position[4] = 7 s.info.position[5] = 8 The values of spec->info.positions equal GST_AUDIO_BASE_SRC(pulsesrc)->ringbuffer->spec->info.positions. 2. gst_audio_ring_buffer_set_channel_positions calls gst_audio_get_channel_reorder_map. 3. Arguments of gst_audio_get_channel_reorder_map are from = s.info.position to = GST_AUDIO_BASE_SRC(pulsesrc)->ringbuffer->spec->info.positions At the end of this function, reorder_map is set to reorder_map[0] = 0 reorder_map[1] = 3 reorder_map[2] = 2 reorder_map[3] = 1 reorder_map[4] = 4 reorder_map[5] = 5 4. Go back to gst_audio_ring_buffer_set_channel_positions and 2065 buf->need_reorder = TRUE; is processed. 5. Finally, in gst_audio_ring_buffer_read, 1821 if (need_reorder) { (skip...) 1829 memcpy (data + i * bpf + reorder_map[j] * bps, ptr + j * bps, bps); is processed and makes this issue.
-rw-r--r--gst-libs/gst/audio/gstaudioringbuffer.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/gst-libs/gst/audio/gstaudioringbuffer.c b/gst-libs/gst/audio/gstaudioringbuffer.c
index 991b774f3..14fee015c 100644
--- a/gst-libs/gst/audio/gstaudioringbuffer.c
+++ b/gst-libs/gst/audio/gstaudioringbuffer.c
@@ -1823,7 +1823,7 @@ gst_audio_ring_buffer_read (GstAudioRingBuffer * buf, guint64 sample,
/* Reorder from device order to GStreamer order */
for (i = 0; i < sampleslen; i++) {
for (j = 0; j < channels; j++) {
- memcpy (data + reorder_map[j] * bps, ptr + j * bps, bps);
+ memcpy (data + i * bpf + reorder_map[j] * bps, ptr + j * bps, bps);
}
ptr += bpf;
}