mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 05:06:17 +00:00
audio-converter: make a copy if we can't write in unpack
If we don't have writable memory, make sure to make a copy of the input samples into a temporary (writable) buffer, even if we are dealing with a native intermediate format that we don't need to call the unpack function for. Fixes https://bugzilla.gnome.org/show_bug.cgi?id=761655
This commit is contained in:
parent
681b2b8d81
commit
5cef3f31ad
1 changed files with 13 additions and 6 deletions
|
@ -387,7 +387,8 @@ get_temp_samples (AudioChain * chain, gsize num_samples, gpointer user_data)
|
||||||
* for alignement */
|
* for alignement */
|
||||||
gsize needed = (stride + sizeof (gpointer)) * chain->blocks + ALIGN;
|
gsize needed = (stride + sizeof (gpointer)) * chain->blocks + ALIGN;
|
||||||
|
|
||||||
GST_DEBUG ("alloc samples %" G_GSIZE_FORMAT, needed);
|
GST_DEBUG ("alloc samples %d %" G_GSIZE_FORMAT " %" G_GSIZE_FORMAT,
|
||||||
|
chain->stride, num_samples, needed);
|
||||||
chain->tmp = g_realloc (chain->tmp, needed);
|
chain->tmp = g_realloc (chain->tmp, needed);
|
||||||
chain->allocated_samples = num_samples;
|
chain->allocated_samples = num_samples;
|
||||||
|
|
||||||
|
@ -427,11 +428,17 @@ do_unpack (AudioChain * chain, gpointer user_data)
|
||||||
|
|
||||||
if (convert->in_data) {
|
if (convert->in_data) {
|
||||||
for (i = 0; i < chain->blocks; i++) {
|
for (i = 0; i < chain->blocks; i++) {
|
||||||
GST_LOG ("unpack %p, %p, %" G_GSIZE_FORMAT, tmp[i], convert->in_data[i],
|
if (convert->in_default) {
|
||||||
num_samples);
|
GST_LOG ("copy %p, %p, %" G_GSIZE_FORMAT, tmp[i], convert->in_data[i],
|
||||||
convert->in.finfo->unpack_func (convert->in.finfo,
|
num_samples);
|
||||||
GST_AUDIO_PACK_FLAG_TRUNCATE_RANGE, tmp[i], convert->in_data[i],
|
memcpy (tmp[i], convert->in_data[i], num_samples * chain->stride);
|
||||||
num_samples * chain->inc);
|
} else {
|
||||||
|
GST_LOG ("unpack %p, %p, %" G_GSIZE_FORMAT, tmp[i],
|
||||||
|
convert->in_data[i], num_samples);
|
||||||
|
convert->in.finfo->unpack_func (convert->in.finfo,
|
||||||
|
GST_AUDIO_PACK_FLAG_TRUNCATE_RANGE, tmp[i], convert->in_data[i],
|
||||||
|
num_samples * chain->inc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < chain->blocks; i++) {
|
for (i = 0; i < chain->blocks; i++) {
|
||||||
|
|
Loading…
Reference in a new issue