mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-28 03:00:35 +00:00
361835979e
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. |
||
---|---|---|
.. | ||
.gitignore | ||
audio-buffer.c | ||
audio-buffer.h | ||
audio-channel-mixer.c | ||
audio-channel-mixer.h | ||
audio-channels.c | ||
audio-channels.h | ||
audio-converter.c | ||
audio-converter.h | ||
audio-format.c | ||
audio-format.h | ||
audio-info.c | ||
audio-info.h | ||
audio-prelude.h | ||
audio-quantize.c | ||
audio-quantize.h | ||
audio-resampler-macros.h | ||
audio-resampler-neon.h | ||
audio-resampler-private.h | ||
audio-resampler-x86-sse.c | ||
audio-resampler-x86-sse.h | ||
audio-resampler-x86-sse2.c | ||
audio-resampler-x86-sse2.h | ||
audio-resampler-x86-sse41.c | ||
audio-resampler-x86-sse41.h | ||
audio-resampler-x86.h | ||
audio-resampler.c | ||
audio-resampler.h | ||
audio.c | ||
audio.h | ||
dbesi0.c | ||
gstaudioaggregator.c | ||
gstaudioaggregator.h | ||
gstaudiobasesink.c | ||
gstaudiobasesink.h | ||
gstaudiobasesrc.c | ||
gstaudiobasesrc.h | ||
gstaudiocdsrc.c | ||
gstaudiocdsrc.h | ||
gstaudioclock.c | ||
gstaudioclock.h | ||
gstaudiodecoder.c | ||
gstaudiodecoder.h | ||
gstaudioencoder.c | ||
gstaudioencoder.h | ||
gstaudiofilter.c | ||
gstaudiofilter.h | ||
gstaudioiec61937.c | ||
gstaudioiec61937.h | ||
gstaudiometa.c | ||
gstaudiometa.h | ||
gstaudiopack-dist.c | ||
gstaudiopack-dist.h | ||
gstaudiopack.orc | ||
gstaudioringbuffer.c | ||
gstaudioringbuffer.h | ||
gstaudiosink.c | ||
gstaudiosink.h | ||
gstaudiosrc.c | ||
gstaudiosrc.h | ||
gstaudiostreamalign.c | ||
gstaudiostreamalign.h | ||
gstaudioutilsprivate.c | ||
gstaudioutilsprivate.h | ||
Makefile.am | ||
meson.build | ||
streamvolume.c | ||
streamvolume.h | ||
TODO |