mirror of
https://github.com/cookiengineer/audacity
synced 2025-09-18 00:50:52 +02:00
fix frame_size=0 export case
Signed-off-by: Michael Niedermayer <michaelni@gmx.at> Signed-off-by: Benjamin Drung <bdrung@debian.org>
This commit is contained in:
parent
73295bbc02
commit
3a56978e17
@ -491,7 +491,7 @@ bool ExportFFmpeg::InitCodecs(AudacityProject *project)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Open the codec.
|
// Open the codec.
|
||||||
if (avcodec_open2(mEncAudioCodecCtx, codec, &options) < 0 || mEncAudioCodecCtx->frame_size == 0)
|
if (avcodec_open2(mEncAudioCodecCtx, codec, &options) < 0)
|
||||||
{
|
{
|
||||||
wxLogError(wxT("FFmpeg : ERROR - Can't open audio codec 0x%x."),mEncAudioCodecCtx->codec_id);
|
wxLogError(wxT("FFmpeg : ERROR - Can't open audio codec 0x%x."),mEncAudioCodecCtx->codec_id);
|
||||||
return false;
|
return false;
|
||||||
@ -539,7 +539,10 @@ static int encode_audio(AVCodecContext *avctx, AVPacket *pkt, int nFifoBytes, in
|
|||||||
frame->format = avctx->sample_fmt;
|
frame->format = avctx->sample_fmt;
|
||||||
frame->channel_layout = avctx->channel_layout;
|
frame->channel_layout = avctx->channel_layout;
|
||||||
|
|
||||||
buffer_size = av_samples_get_buffer_size(NULL, avctx->channels, avctx->frame_size,
|
if (frame->nb_samples == 0)
|
||||||
|
frame->nb_samples = 1024; //arbitrary non zero number of samples
|
||||||
|
|
||||||
|
buffer_size = av_samples_get_buffer_size(NULL, avctx->channels, frame->nb_samples,
|
||||||
avctx->sample_fmt, 0);
|
avctx->sample_fmt, 0);
|
||||||
if (buffer_size < 0) {
|
if (buffer_size < 0) {
|
||||||
wxLogError(wxT("FFmpeg : ERROR - Could not get sample buffer siz"));
|
wxLogError(wxT("FFmpeg : ERROR - Could not get sample buffer siz"));
|
||||||
@ -610,7 +613,7 @@ bool ExportFFmpeg::Finalize()
|
|||||||
|
|
||||||
nEncodedBytes = 0;
|
nEncodedBytes = 0;
|
||||||
int nAudioFrameSizeOut = mEncAudioCodecCtx->frame_size * mEncAudioCodecCtx->channels * sizeof(int16_t);
|
int nAudioFrameSizeOut = mEncAudioCodecCtx->frame_size * mEncAudioCodecCtx->channels * sizeof(int16_t);
|
||||||
if (mEncAudioCodecCtx->frame_size == 1) nAudioFrameSizeOut = mEncAudioEncodedBufSiz;
|
if (mEncAudioCodecCtx->frame_size <= 1) nAudioFrameSizeOut = mEncAudioEncodedBufSiz;
|
||||||
|
|
||||||
if (nAudioFrameSizeOut > mEncAudioFifoOutBufSiz || nFifoBytes > mEncAudioFifoOutBufSiz) {
|
if (nAudioFrameSizeOut > mEncAudioFifoOutBufSiz || nFifoBytes > mEncAudioFifoOutBufSiz) {
|
||||||
wxLogError(wxT("FFmpeg : ERROR - Too much remaining data."));
|
wxLogError(wxT("FFmpeg : ERROR - Too much remaining data."));
|
||||||
@ -634,7 +637,7 @@ bool ExportFFmpeg::Finalize()
|
|||||||
// Or if user configured the exporter to pad with silence, then we'll send audio + silence as a frame.
|
// Or if user configured the exporter to pad with silence, then we'll send audio + silence as a frame.
|
||||||
if ((codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)
|
if ((codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)
|
||||||
|| codec->id == CODEC_ID_FLAC
|
|| codec->id == CODEC_ID_FLAC
|
||||||
|| mEncAudioCodecCtx->frame_size == 1
|
|| mEncAudioCodecCtx->frame_size <= 1
|
||||||
|| gPrefs->Read(wxT("/FileFormats/OverrideSmallLastFrame"), true)
|
|| gPrefs->Read(wxT("/FileFormats/OverrideSmallLastFrame"), true)
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -642,7 +645,7 @@ bool ExportFFmpeg::Finalize()
|
|||||||
|
|
||||||
// The last frame is going to contain a smaller than usual number of samples.
|
// The last frame is going to contain a smaller than usual number of samples.
|
||||||
// For codecs without CODEC_CAP_SMALL_LAST_FRAME use normal frame size
|
// For codecs without CODEC_CAP_SMALL_LAST_FRAME use normal frame size
|
||||||
if (mEncAudioCodecCtx->frame_size != 1 && codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)
|
if (mEncAudioCodecCtx->frame_size > 1 && codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME)
|
||||||
mEncAudioCodecCtx->frame_size = nFifoBytes / (mEncAudioCodecCtx->channels * sizeof(int16_t));
|
mEncAudioCodecCtx->frame_size = nFifoBytes / (mEncAudioCodecCtx->channels * sizeof(int16_t));
|
||||||
|
|
||||||
wxLogDebug(wxT("FFmpeg : Audio FIFO still contains %d bytes, writing %d sample frame ..."),
|
wxLogDebug(wxT("FFmpeg : Audio FIFO still contains %d bytes, writing %d sample frame ..."),
|
||||||
@ -655,7 +658,7 @@ bool ExportFFmpeg::Finalize()
|
|||||||
if (av_fifo_generic_read(mEncAudioFifo, nFifoBytes, NULL, mEncAudioFifoOutBuf) == 0)
|
if (av_fifo_generic_read(mEncAudioFifo, nFifoBytes, NULL, mEncAudioFifoOutBuf) == 0)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (mEncAudioCodecCtx->frame_size != 1)
|
if (mEncAudioCodecCtx->frame_size > 1)
|
||||||
nEncodedBytes = encode_audio(mEncAudioCodecCtx, &pkt, mEncAudioEncodedBufSiz, (int16_t*)mEncAudioFifoOutBuf);
|
nEncodedBytes = encode_audio(mEncAudioCodecCtx, &pkt, mEncAudioEncodedBufSiz, (int16_t*)mEncAudioFifoOutBuf);
|
||||||
else
|
else
|
||||||
nEncodedBytes = encode_audio(mEncAudioCodecCtx, &pkt, nFifoBytes, (int16_t*)mEncAudioFifoOutBuf);
|
nEncodedBytes = encode_audio(mEncAudioCodecCtx, &pkt, nFifoBytes, (int16_t*)mEncAudioFifoOutBuf);
|
||||||
@ -726,7 +729,7 @@ bool ExportFFmpeg::EncodeAudioFrame(int16_t *pFrame, int frameSize)
|
|||||||
int nBytesToWrite = 0;
|
int nBytesToWrite = 0;
|
||||||
uint8_t * pRawSamples = NULL;
|
uint8_t * pRawSamples = NULL;
|
||||||
int nAudioFrameSizeOut = mEncAudioCodecCtx->frame_size * mEncAudioCodecCtx->channels * sizeof(int16_t);
|
int nAudioFrameSizeOut = mEncAudioCodecCtx->frame_size * mEncAudioCodecCtx->channels * sizeof(int16_t);
|
||||||
if (mEncAudioCodecCtx->frame_size == 1) nAudioFrameSizeOut = mEncAudioEncodedBufSiz;
|
if (mEncAudioCodecCtx->frame_size <= 1) nAudioFrameSizeOut = mEncAudioEncodedBufSiz;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
nBytesToWrite = frameSize;
|
nBytesToWrite = frameSize;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user