int ff_qsv_decode_close(QSVContext *q) { QSVFrame *cur = q->work_frames; while (cur) { q->work_frames = cur->next; av_frame_free(&cur->frame); av_freep(&cur); cur = q->work_frames; } av_fifo_free(q->async_fifo); q->async_fifo = NULL; MFXVideoDECODE_Close(q->session); q->session = NULL; ff_qsv_close_internal_session(&q->internal_qs); return 0; }
static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession session) { if (!session) { if (!q->internal_session) { mfxIMPL impl = MFX_IMPL_AUTO_ANY; mfxVersion ver = { { QSV_VERSION_MINOR, QSV_VERSION_MAJOR } }; const char *desc; int ret; ret = MFXInit(impl, &ver, &q->internal_session); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "Error initializing an internal MFX session\n"); return ff_qsv_error(ret); } MFXQueryIMPL(q->internal_session, &impl); if (impl & MFX_IMPL_SOFTWARE) desc = "software"; else if (impl & MFX_IMPL_HARDWARE) desc = "hardware accelerated"; else desc = "unknown"; av_log(avctx, AV_LOG_VERBOSE, "Initialized an internal MFX session using %s implementation\n", desc); } q->session = q->internal_session; } else { q->session = session; } /* make sure the decoder is uninitialized */ MFXVideoDECODE_Close(q->session); return 0; }
int ff_qsv_decode_close(QSVContext *q) { QSVFrame *cur = q->work_frames; if (q->session) MFXVideoDECODE_Close(q->session); while (q->async_fifo && av_fifo_size(q->async_fifo)) { QSVFrame *out_frame; mfxSyncPoint *sync; av_fifo_generic_read(q->async_fifo, &out_frame, sizeof(out_frame), NULL); av_fifo_generic_read(q->async_fifo, &sync, sizeof(sync), NULL); av_freep(&sync); } while (cur) { q->work_frames = cur->next; av_frame_free(&cur->frame); av_freep(&cur); cur = q->work_frames; } av_fifo_free(q->async_fifo); q->async_fifo = NULL; av_parser_close(q->parser); avcodec_free_context(&q->avctx_internal); if (q->internal_session) MFXClose(q->internal_session); av_buffer_unref(&q->frames_ctx.hw_frames_ctx); av_freep(&q->frames_ctx.mids); q->frames_ctx.nb_mids = 0; return 0; }
void CDecMSDKMVC::DestroyDecoder(bool bFull) { if (m_bDecodeReady) { MFXVideoDECODE_Close(m_mfxSession); m_bDecodeReady = FALSE; } { CAutoLock lock(&m_BufferCritSec); for (int i = 0; i < ASYNC_QUEUE_SIZE; i++) { ReleaseBuffer(&m_pOutputQueue[i]->surface); } memset(m_pOutputQueue, 0, sizeof(m_pOutputQueue)); for (auto it = m_BufferQueue.begin(); it != m_BufferQueue.end(); it++) { if (!(*it)->queued) { av_freep(&(*it)->surface.Data.Y); delete (*it); } } m_BufferQueue.clear(); } // delete MVC sequence buffers SAFE_DELETE(m_mfxExtMVCSeq.View); SAFE_DELETE(m_mfxExtMVCSeq.ViewId); SAFE_DELETE(m_mfxExtMVCSeq.OP); SAFE_DELETE(m_pAnnexBConverter); if (bFull) { if (m_mfxSession) { MFXClose(m_mfxSession); m_mfxSession = nullptr; } } }