diff --git a/playback/cacher.cpp b/playback/cacher.cpp index 0b64b02ef..8f804f0e5 100644 --- a/playback/cacher.cpp +++ b/playback/cacher.cpp @@ -117,22 +117,44 @@ void cache_audio_worker(Clip* c, Clip* nest) { ret = retrieve_next_frame(c, c->frame); // reverse it - int frame_bytes = av_samples_get_buffer_size(NULL, c->frame->channels, c->frame->nb_samples, static_cast(c->frame->format), 1); - int half_frame_bytes = frame_bytes >> 1; - int sample_size = c->frame->channels*2; - char* temp_chars = new char[sample_size]; - for (int i=0;iframe->data[0][i+j]; + AVSampleFormat sample_fmt = static_cast(c->frame->format); + if (av_sample_fmt_is_planar(sample_fmt)) { + int sample_size = av_get_bytes_per_sample(sample_fmt); + char* temp_chars = new char[sample_size]; + for (int j=0;jframe->channels;j++) { + int frame_bytes = c->frame->linesize[0]; + int half_frame_bytes = frame_bytes >> 1; + for (int i=0;iframe->data[j][i+k]; + } + for (int k=0;kframe->data[j][i+k] = c->frame->data[j][frame_bytes-i-sample_size+k]; + } + for (int k=0;kframe->data[j][frame_bytes-i-sample_size+k] = temp_chars[k]; + } + } } - for (int j=0;jframe->data[0][i+j] = c->frame->data[0][frame_bytes-i-sample_size+j]; - } - for (int j=0;jframe->data[0][frame_bytes-i-sample_size+j] = temp_chars[j]; + delete [] temp_chars; + } else { + int frame_bytes = av_samples_get_buffer_size(NULL, c->frame->channels, c->frame->nb_samples, sample_fmt, 1); + int half_frame_bytes = frame_bytes >> 1; + int sample_size = c->frame->channels*av_get_bytes_per_sample(sample_fmt); + char* temp_chars = new char[sample_size]; + for (int i=0;iframe->data[0][i+j]; + } + for (int j=0;jframe->data[0][i+j] = c->frame->data[0][frame_bytes-i-sample_size+j]; + } + for (int j=0;jframe->data[0][frame_bytes-i-sample_size+j] = temp_chars[j]; + } } + delete [] temp_chars; } - delete [] temp_chars; } else { ret = retrieve_next_frame(c, c->frame); } diff --git a/ui/timelinewidget.cpp b/ui/timelinewidget.cpp index 2dcb76e2e..a6f18991c 100644 --- a/ui/timelinewidget.cpp +++ b/ui/timelinewidget.cpp @@ -1804,14 +1804,14 @@ void TimelineWidget::redraw_clips() { int waveform_index = qFloor((((clip->clip_in + ((double) i/panel_timeline->zoom))/media_length) * ms->audio_preview.size())/divider)*divider; if (clip->reverse) { - waveform_index = ms->audio_preview.size() - waveform_index; + waveform_index = ms->audio_preview.size() - waveform_index - (ms->audio_channels * 2); } int rectified_height = 0; for (int j=0;jaudio_channels;j++) { - int mid = clip_rect.top()+channel_height*j+(channel_height/2); - int offset = waveform_index+(j*2); + int mid = clip_rect.top()+channel_height*j+(channel_height/2); + int offset = waveform_index+(j*2); if ((offset + 1) < ms->audio_preview.size()) { qint8 min = (double)ms->audio_preview.at(offset) / 128.0 * (channel_height/2);