/* This function resets decoder and corresponded buffers before seek operation */ void ff_qsv_decode_reset(AVCodecContext *avctx, QSVContext *q) { QSVFrame *cur; AVPacket pkt; int ret = 0; mfxVideoParam param = { { 0 } }; if (q->reinit_pending) { close_decoder(q); } else if (q->engine_ready) { ret = MFXVideoDECODE_GetVideoParam(q->session, ¶m); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "MFX decode get param error %d\n", ret); } ret = MFXVideoDECODE_Reset(q->session, ¶m); if (ret < 0) { av_log(avctx, AV_LOG_ERROR, "MFX decode reset error %d\n", ret); } /* Free all frames*/ cur = q->work_frames; while (cur) { q->work_frames = cur->next; av_frame_free(&cur->frame); av_freep(&cur); cur = q->work_frames; } } /* Reset output surfaces */ av_fifo_reset(q->async_fifo); /* Reset input packets fifo */ while (av_fifo_size(q->pkt_fifo)) { av_fifo_generic_read(q->pkt_fifo, &pkt, sizeof(pkt), NULL); av_packet_unref(&pkt); } /* Reset input bitstream fifo */ av_fifo_reset(q->input_fifo); }
STDMETHODIMP CDecMSDKMVC::Flush() { m_buff.Clear(); if (m_mfxSession) { if (m_bDecodeReady) MFXVideoDECODE_Reset(m_mfxSession, &m_mfxVideoParams); // TODO: decode sequence data for (int i = 0; i < ASYNC_QUEUE_SIZE; i++) { ReleaseBuffer(&m_pOutputQueue[i]->surface); } memset(m_pOutputQueue, 0, sizeof(m_pOutputQueue)); } m_GOPs.clear(); memset(&m_PrevOffset, 0, sizeof(m_PrevOffset)); return __super::Flush(); }