• mrk501's avatar
    audioringbuffer: Fix wrong memcpy address when reordering channels · 2d8d321a
    mrk501 authored
    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.
    2d8d321a
Name
Last commit
Last update
common @ f0c2dc9a Loading commit data...
docs Loading commit data...
ext Loading commit data...
gst Loading commit data...
gst-libs Loading commit data...
hooks Loading commit data...
m4 Loading commit data...
pkgconfig Loading commit data...
po Loading commit data...
sys Loading commit data...
tests Loading commit data...
tools Loading commit data...
.gitignore Loading commit data...
.gitmodules Loading commit data...
AUTHORS Loading commit data...
COPYING Loading commit data...
COPYING.LIB Loading commit data...
ChangeLog Loading commit data...
MAINTAINERS Loading commit data...
Makefile.am Loading commit data...
NEWS Loading commit data...
README Loading commit data...
README.static-linking Loading commit data...
RELEASE Loading commit data...
REQUIREMENTS Loading commit data...
autogen.sh Loading commit data...
configure.ac Loading commit data...
gst-plugins-base.doap Loading commit data...
meson.build Loading commit data...
meson_options.txt Loading commit data...