Skip to content
Snippets Groups Projects
Commit bedaeebc authored by Silas Della Contrada's avatar Silas Della Contrada
Browse files

Some VAAPI encoder cleanup

parent 0b75d27a
No related branches found
No related tags found
No related merge requests found
...@@ -235,6 +235,7 @@ namespace AVQt { ...@@ -235,6 +235,7 @@ namespace AVQt {
while (d->m_running.load()) { while (d->m_running.load()) {
if (!d->m_paused.load() && d->m_inputQueue.size() > 5) { if (!d->m_paused.load() && d->m_inputQueue.size() > 5) {
bool shouldBe = true; bool shouldBe = true;
// Encoder init is only possible with frame parameters
if (d->m_firstFrame.compare_exchange_strong(shouldBe, false)) { if (d->m_firstFrame.compare_exchange_strong(shouldBe, false)) {
auto frame = d->m_inputQueue.first().first; auto frame = d->m_inputQueue.first().first;
...@@ -244,27 +245,6 @@ namespace AVQt { ...@@ -244,27 +245,6 @@ namespace AVQt {
} }
d->m_pCodecCtx->width = frame->width; d->m_pCodecCtx->width = frame->width;
d->m_pCodecCtx->height = frame->height; d->m_pCodecCtx->height = frame->height;
// if (frame->hw_frames_ctx) {
// qDebug("Creating derived HW context...");
// d->m_pDeviceCtx = av_hwdevice_ctx_alloc(AV_HWDEVICE_TYPE_VAAPI);
// ret = av_hwdevice_ctx_create(&d->m_pDeviceCtx, AV_HWDEVICE_TYPE_VAAPI, "/dev/dri/renderD128", nullptr, 0);
// if (ret < 0) {
// qFatal("%i: Unable to create derived AVHWDeviceContext: %s", ret, av_make_error_string(strBuf, strBufSize, ret));
// } else if (!d->m_pDeviceCtx) {
// qFatal("Unable to create derived AVHWDeviceContext");
// }
//
// d->m_pCodecCtx->sw_pix_fmt = reinterpret_cast<AVHWFramesContext*>(frame->hw_frames_ctx->data)->sw_format;
// ret = av_hwframe_ctx_create_derived(&d->m_pFramesCtx, d->m_pCodecCtx->sw_pix_fmt, d->m_pDeviceCtx, frame->hw_frames_ctx, 0);
// if (ret < 0) {
// qFatal("%i: Unable to create derived AVHWFramesContext: %s", ret, av_make_error_string(strBuf, strBufSize, ret));
// } else if (!d->m_pDeviceCtx) {
// qFatal("Unable to create derived AVHWFramesContext");
// }
// d->m_pCodecCtx->pix_fmt = reinterpret_cast<AVHWFramesContext*>(d->m_pFramesCtx->data)->format;
// d->m_pCodecCtx->hw_device_ctx = av_buffer_ref(d->m_pDeviceCtx);
// d->m_pCodecCtx->hw_frames_ctx = av_buffer_ref(d->m_pFramesCtx);
// } else {
qDebug("Creating new HW context..."); qDebug("Creating new HW context...");
ret = av_hwdevice_ctx_create(&d->m_pDeviceCtx, AV_HWDEVICE_TYPE_VAAPI, "/dev/dri/renderD128", nullptr, 0); ret = av_hwdevice_ctx_create(&d->m_pDeviceCtx, AV_HWDEVICE_TYPE_VAAPI, "/dev/dri/renderD128", nullptr, 0);
if (ret < 0) { if (ret < 0) {
...@@ -296,24 +276,24 @@ namespace AVQt { ...@@ -296,24 +276,24 @@ namespace AVQt {
d->m_pCodecCtx->hw_device_ctx = av_buffer_ref(d->m_pDeviceCtx); d->m_pCodecCtx->hw_device_ctx = av_buffer_ref(d->m_pDeviceCtx);
d->m_pCodecCtx->hw_frames_ctx = av_buffer_ref(d->m_pFramesCtx); d->m_pCodecCtx->hw_frames_ctx = av_buffer_ref(d->m_pFramesCtx);
d->m_pCodecCtx->bit_rate = 50000000; d->m_pCodecCtx->bit_rate = 5000000;
d->m_pCodecCtx->rc_min_rate = 30000000; d->m_pCodecCtx->rc_min_rate = 4500000;
d->m_pCodecCtx->rc_max_rate = 50000000; d->m_pCodecCtx->rc_max_rate = 6000000;
d->m_pCodecCtx->rc_buffer_size = 100000000; d->m_pCodecCtx->rc_buffer_size = 10000000;
d->m_pCodecCtx->gop_size = 20; d->m_pCodecCtx->gop_size = 20;
d->m_pCodecCtx->color_primaries = AVCOL_PRI_BT2020; d->m_pCodecCtx->color_primaries = AVCOL_PRI_BT2020;
d->m_pCodecCtx->color_trc = AVCOL_TRC_SMPTE2084; d->m_pCodecCtx->color_trc = AVCOL_TRC_SMPTE2084;
d->m_pCodecCtx->colorspace = AVCOL_SPC_BT2020_NCL; d->m_pCodecCtx->colorspace = AVCOL_SPC_BT2020_NCL;
// } // Timestamps from frame sources are always microseconds, trying to use this timebase for the encoder too
d->m_pCodecCtx->time_base = av_make_q(1, 1000000);
// d->m_pCodecCtx->pix_fmt = AV_PIX_FMT_VAAPI;
d->m_pCodecCtx->time_base = av_make_q(1, 1000000); // Timestamps from frame sources are always microseconds
ret = avcodec_open2(d->m_pCodecCtx, d->m_pCodec, nullptr); ret = avcodec_open2(d->m_pCodecCtx, d->m_pCodec, nullptr);
if (ret < 0) { if (ret < 0) {
qFatal("%i: Unable to open VAAPI encoder: %s", ret, av_make_error_string(strBuf, strBufSize, ret)); qFatal("%i: Unable to open VAAPI encoder: %s", ret, av_make_error_string(strBuf, strBufSize, ret));
} }
qDebug("[AVQt::EncoderVAAPI] Encoder timebase: %d/%d", d->m_pCodecCtx->time_base.num, d->m_pCodecCtx->time_base.den); qDebug("[AVQt::EncoderVAAPI] Encoder timebase: %d/%d", d->m_pCodecCtx->time_base.num, d->m_pCodecCtx->time_base.den);
// Preallocating frame on gpu
d->m_pHWFrame = av_frame_alloc(); d->m_pHWFrame = av_frame_alloc();
ret = av_hwframe_get_buffer(d->m_pFramesCtx, d->m_pHWFrame, 0); ret = av_hwframe_get_buffer(d->m_pFramesCtx, d->m_pHWFrame, 0);
if (ret != 0) { if (ret != 0) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment