h264-encoder: Set async_depth=1

This fixes stalling during encoding. The FFmpeg devs seem to think that it's
normal to change the default behaviour or their code, so this needs to be
fixed here instead.

Fixes #73
v0.5
Andri Yngvason 2022-09-10 15:48:13 +00:00
parent 29ce32732f
commit 5c5a696910
1 changed files with 13 additions and 3 deletions

View File

@ -34,6 +34,7 @@
#include <libavutil/hwcontext.h> #include <libavutil/hwcontext.h>
#include <libavutil/hwcontext_drm.h> #include <libavutil/hwcontext_drm.h>
#include <libavutil/pixdesc.h> #include <libavutil/pixdesc.h>
#include <libavutil/dict.h>
#include <libavfilter/avfilter.h> #include <libavfilter/avfilter.h>
#include <libavfilter/buffersink.h> #include <libavfilter/buffersink.h>
#include <libavfilter/buffersrc.h> #include <libavfilter/buffersrc.h>
@ -417,7 +418,9 @@ static void h264_encoder__do_work(void* handle)
int rc = h264_encoder__encode(self, frame); int rc = h264_encoder__encode(self, frame);
if (rc != 0) { if (rc != 0) {
// TODO: log failure char err[256];
av_strerror(rc, err, sizeof(err));
nvnc_log(NVNC_LOG_ERROR, "Failed to encode packet: %s", err);
goto failure; goto failure;
} }
@ -443,8 +446,10 @@ static void h264_encoder__on_work_done(void* handle)
return; return;
} }
if (self->current_packet.len == 0) if (self->current_packet.len == 0) {
nvnc_log(NVNC_LOG_WARNING, "Whoops, encoded packet length is 0");
return; return;
}
void* userdata = self->userdata; void* userdata = self->userdata;
@ -536,7 +541,12 @@ struct h264_encoder* h264_encoder_create(uint32_t width, uint32_t height,
self->codec_ctx->hw_frames_ctx = self->codec_ctx->hw_frames_ctx =
av_buffer_ref(self->filter_out->inputs[0]->hw_frames_ctx); av_buffer_ref(self->filter_out->inputs[0]->hw_frames_ctx);
rc = avcodec_open2(self->codec_ctx, codec, NULL); AVDictionary *opts = NULL;
av_dict_set_int(&opts, "async_depth", 1, 0);
rc = avcodec_open2(self->codec_ctx, codec, &opts);
av_dict_free(&opts);
if (rc != 0) if (rc != 0)
goto avcodec_open_failure; goto avcodec_open_failure;