<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body style='font-size: 10pt; font-family: Verdana,Geneva,sans-serif'>
<p>I'm having trouble trying to figure out how to read in planar data.  I have a file that has data in the AV_SAMPLE_FMT_FLTP format with two channels.  Below is my attempt to read in the data.  This will crash with a memory problem if I try to read in the second channel (but it will complete if I bypass the second and just read from channel 0).  Am I doing this right?</p>
<p><br /></p>
<p>void AudioReader::loadAudioFrame(AVPacket& packet)<br />{<br />int err = avcodec_send_packet(aCodecCtx, &packet);<br />if (err < 0)<br />{<br />qDebug("Error sending packet to decoder");<br />return;<br />}</p>
<p>int numChannels = aCodecCtx->channels;<br />while (err >= 0)<br />{<br />err = avcodec_receive_frame(aCodecCtx, aFrame);<br />if (err == AVERROR(EAGAIN) || err == AVERROR_EOF)<br />return;</p>
<p>if (err < 0)<br />{<br />qDebug() << "Error decoding packet: " << err;<br />return;<br />}</p>
<p>int bytesPerSample = av_get_bytes_per_sample(aCodecCtx->sample_fmt);<br />if (bytesPerSample < 0) {<br />/* This should not occur, checking just for paranoia */<br />fprintf(stderr, "Failed to calculate data size\n");<br />exit(1);<br />}</p>
<p><br />int bufferSize = av_samples_get_buffer_size(NULL,<br />aCodecCtx->channels,<br />aFrame->nb_samples,<br />aCodecCtx->sample_fmt,<br />1);</p>
<p>switch(aCodecCtx->sample_fmt)<br />{<br />...<br />case AV_SAMPLE_FMT_FLTP:<br />{<br />//Serial format - change to interleaved order<br />for (int i = 0; i < aFrame->nb_samples; i++)<br />{<br />for (int ch = 0; ch < numChannels; ch++)<br />{<br />_audioBytes.append((const char *)aFrame->data[ch] + i * sizeof(float), sizeof(float));<br />}<br />}<br />break;<br />}<br />}<br />}</p>
<p><br /></p>
<div id="signature">
<div class="pre" style="margin: 0; padding: 0; font-family: monospace">---<br /><a href="http://www.kitfox.com" target="_blank" rel="noopener noreferrer">http://www.kitfox.com</a></div>
</div>
</body></html>