[Libav-user] Encoding an AVFrame with MP3 Encoder over libav

aisnote com aisnote at gmail.com
Mon Oct 3 07:34:12 EEST 2022


Which parameter caused the crash?

assume  *_AVFifo is initialized.*

   *int ret = av_audio_fifo_read(_AVFifo, (void **)output_frame->data,
frame_size); * <- Here it crashes

can you upload all the source code including your test file? Maybe I can
help to debug it.

On Sun, Oct 2, 2022 at 4:07 PM Dr. Sven Alisch <svenali at t-online.de> wrote:

> Dear developers,
>
> My original material is a PCM stream (WAV) which I want to encode to MP3.
> I reformat it with swr_convert from AV_SAMPLE_FMT_S16 to AV_SAMPLE_FMT_FLTP
> and copy it to a AVFifo, because the frame sizes are different. In my
> encoding Function I read out my samples from that Fifo and want to send it
> to the encoder. I use a similar code like the code from tanscode_aac.c. It
> seems to work fine, but I can not read from Fifo and store the data in to
> output_frame->data. My program crashes. If I use a self created structure
> (a buffer I prepared of my own), than it works.
> Also strange for me is, that the linesize-parameter after the
> av_frame_get_buffer(output_frame, 0); is always for linesize[0] set. Why? I
> thought, that the FLTP (Planar) mode creates a line size for each channel?
>
> Here my code:
>
>     AVFrame *output_frame = av_frame_alloc();
>     if (!output_frame)
>     {
>         cerr << "Could not allocate output frame" << endl;
>         return;
>     }
>     const int frame_size = FFMIN(av_audio_fifo_size(_AVFifo),
> _CodecContext->frame_size);
>     output_frame->nb_samples = frame_size;
>     output_frame->format = _CodecContext->sample_fmt;
>     output_frame->sample_rate = _CodecContext->sample_rate;
>     output_frame->channel_layout = _CodecContext->channel_layout;
>
>     error = av_frame_get_buffer(output_frame, 0);
>     if (error < 0)
>     {
>         cerr << "Could not allocate output frame samples: " <<
> av_err2str(error) << endl;
>         av_frame_free(&output_frame);
>         return;
>     }
>
>     AVPacket *output_packet = av_packet_alloc();
>     if (!output_packet)
>     {
>         cerr << "could not allocate the packet!" << endl;
>         return;
>     }
>
>     int ret = av_audio_fifo_read(_AVFifo, (void **)output_frame->data,
> frame_size);  <- Here it crashes
>     if (ret < frame_size)
>     {
>         cerr << "Could not read data from FIFO" << endl;
>         av_frame_free(&output_frame);
>         return;
>     }
>     cout << ret * sizeof(float) << " readed Bytes from AV Fifo." << endl;
>
>     output_frame->pts = _pts;
>     _pts += output_frame->nb_samples;
>
>     ret = avcodec_send_frame(_CodecContext, output_frame);
>     if (ret < 0)
>     {
>         cerr << "Error sending the frame to the encoder! Answer: " << ret
> << endl;
>     }
>
>     while (ret >= 0)
>     {
>         ret = avcodec_receive_packet(_CodecContext, output_packet);
>
>         if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
>         {
>             cerr << "Error encoding audio frame ... need more DATA ..." <<
> endl;
>             return;
>         }
>         else if (ret < 0)
>         {
>             cerr << "Error encoding audio frame!" << endl;
>             return;
>         }
>
>         fwrite(output_packet->data, 1, output_packet->size, f);
>
>         av_packet_unref(output_packet);
>
> Thank you for help!
>
> Regards,
> Sven
> _______________________________________________
> Libav-user mailing list
> Libav-user at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/libav-user
>
> To unsubscribe, visit link above, or email
> libav-user-request at ffmpeg.org with subject "unsubscribe".
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://ffmpeg.org/pipermail/libav-user/attachments/20221002/e34258e8/attachment.htm>


More information about the Libav-user mailing list