mfxVideoParam param = { { 0 } };
int ret;
- ret = qsv_init_session(avctx, q, session);
- if (ret < 0) {
- av_log(avctx, AV_LOG_ERROR, "Error initializing an MFX session\n");
- return ret;
+ q->async_fifo = av_fifo_alloc((1 + q->async_depth) *
+ (sizeof(mfxSyncPoint) + sizeof(QSVFrame*)));
+ if (!q->async_fifo)
+ return AVERROR(ENOMEM);
+
+ q->iopattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY;
+
+ if (avctx->hwaccel_context) {
+ AVQSVContext *qsv = avctx->hwaccel_context;
+
+ q->session = qsv->session;
+ q->iopattern = qsv->iopattern;
+ q->ext_buffers = qsv->ext_buffers;
+ q->nb_ext_buffers = qsv->nb_ext_buffers;
}
+ if (!q->session) {
+ ret = ff_qsv_init_internal_session(avctx, &q->internal_qs, NULL);
+ if (ret < 0)
+ return ret;
+ q->session = q->internal_qs.session;
+ }
ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
if (ret < 0)
av_freep(&cur);
cur = q->work_frames;
}
- if (q->internal_session)
- MFXClose(q->internal_session);
+
+ av_fifo_free(q->async_fifo);
+ q->async_fifo = NULL;
+
+ ff_qsv_close_internal_session(&q->internal_qs);
return 0;
}