if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) {
av_packet_unref(avpkt);
- av_init_packet(avpkt);
return 0;
}
goto end;
}
} else if (!(avctx->codec->capabilities & AV_CODEC_CAP_VARIABLE_FRAME_SIZE)) {
- if (frame->nb_samples < avctx->frame_size &&
- !avctx->internal->last_audio_frame) {
+ /* if we already got an undersized frame, that must have been the last */
+ if (avctx->internal->last_audio_frame) {
+ av_log(avctx, AV_LOG_ERROR, "frame_size (%d) was not respected for a non-last frame (avcodec_encode_audio2)\n", avctx->frame_size);
+ ret = AVERROR(EINVAL);
+ goto end;
+ }
+
+ if (frame->nb_samples < avctx->frame_size) {
ret = pad_last_frame(avctx, &padded_frame, frame);
if (ret < 0)
goto end;
if (ret >= 0)
avpkt->data = avpkt->buf->data;
}
-
- avctx->frame_number++;
+ if (frame)
+ avctx->frame_number++;
}
if (ret < 0 || !*got_packet_ptr) {
av_packet_unref(avpkt);
- av_init_packet(avpkt);
goto end;
}
if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) {
av_packet_unref(avpkt);
- av_init_packet(avpkt);
- avpkt->size = 0;
return 0;
}
avpkt->data = avpkt->buf->data;
}
- avctx->frame_number++;
+ if (frame)
+ avctx->frame_number++;
}
if (ret < 0 || !*got_packet_ptr)