#include <mfx/mfxvideo.h>
+#include "libavutil/fifo.h"
#include "libavutil/frame.h"
#include "libavutil/pixfmt.h"
#include "avcodec.h"
-
-typedef struct QSVFrame {
- AVFrame *frame;
- mfxFrameSurface1 *surface;
-
- mfxFrameSurface1 surface_internal;
-
- struct QSVFrame *next;
-} QSVFrame;
+#include "qsv_internal.h"
typedef struct QSVContext {
// the session used for decoding
// one
mfxSession internal_session;
+ QSVFramesContext frames_ctx;
+
/**
* a linked list of frames currently being used by QSV
*/
QSVFrame *work_frames;
+ AVFifoBuffer *async_fifo;
+ int zero_consume_run;
+
+ // the internal parser and codec context for parsing the data
+ AVCodecParserContext *parser;
+ AVCodecContext *avctx_internal;
+ enum AVPixelFormat orig_pix_fmt;
+ uint32_t fourcc;
+ mfxFrameInfo frame_info;
+
// options set by the caller
int async_depth;
int iopattern;
+ char *load_plugins;
+
mfxExtBuffer **ext_buffers;
int nb_ext_buffers;
} QSVContext;
-int ff_qsv_map_pixfmt(enum AVPixelFormat format);
-
-int ff_qsv_decode_init(AVCodecContext *s, QSVContext *q, mfxSession session);
+int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q,
+ AVFrame *frame, int *got_frame, AVPacket *pkt);
-int ff_qsv_decode(AVCodecContext *s, QSVContext *q,
- AVFrame *frame, int *got_frame,
- AVPacket *avpkt);
+void ff_qsv_decode_flush(AVCodecContext *avctx, QSVContext *q);
int ff_qsv_decode_close(QSVContext *q);