#include <stdint.h>
#include <string.h>
#include <sys/types.h>
#include <mfx/mfxvideo.h>
#include "libavutil/common.h"
#include "libavutil/fifo.h"
#include "libavutil/frame.h"
#include "libavutil/hwcontext.h"
#include "libavutil/hwcontext_qsv.h"
#include "libavutil/mem.h"
#include "libavutil/log.h"
#include "libavutil/opt.h"
#include "libavutil/pixfmt.h"
#include "libavutil/time.h"
#include "libavutil/imgutils.h"
#include "avcodec.h"
#include "internal.h"
#include "decode.h"
#include "hwconfig.h"
#include "qsv.h"
#include "qsv_internal.h"
Go to the source code of this file.
|
#define | PTS_TO_MFX_PTS(pts, pts_tb) |
|
#define | MFX_PTS_TO_PTS(mfx_pts, pts_tb) |
|
#define | OFFSET(x) offsetof(QSVDecContext, x) |
|
#define | VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM |
|
#define | DEFINE_QSV_DECODER_WITH_OPTION(x, X, bsf_name, opt) |
|
#define | DEFINE_QSV_DECODER(x, X, bsf_name) DEFINE_QSV_DECODER_WITH_OPTION(x, X, bsf_name, options) |
|
|
static int | qsv_get_continuous_buffer (AVCodecContext *avctx, AVFrame *frame, AVBufferPool *pool) |
|
static int | qsv_init_session (AVCodecContext *avctx, QSVContext *q, mfxSession session, AVBufferRef *hw_frames_ref, AVBufferRef *hw_device_ref) |
|
static unsigned int | qsv_fifo_item_size (void) |
|
static unsigned int | qsv_fifo_size (const AVFifoBuffer *fifo) |
|
static int | qsv_decode_preinit (AVCodecContext *avctx, QSVContext *q, enum AVPixelFormat pix_fmt, mfxVideoParam *param) |
|
static int | qsv_decode_init_context (AVCodecContext *avctx, QSVContext *q, mfxVideoParam *param) |
|
static int | qsv_decode_header (AVCodecContext *avctx, QSVContext *q, const AVPacket *avpkt, enum AVPixelFormat pix_fmt, mfxVideoParam *param) |
|
static int | alloc_frame (AVCodecContext *avctx, QSVContext *q, QSVFrame *frame) |
|
static void | qsv_clear_unused_frames (QSVContext *q) |
|
static int | get_surface (AVCodecContext *avctx, QSVContext *q, mfxFrameSurface1 **surf) |
|
static QSVFrame * | find_frame (QSVContext *q, mfxFrameSurface1 *surf) |
|
static int | qsv_decode (AVCodecContext *avctx, QSVContext *q, AVFrame *frame, int *got_frame, const AVPacket *avpkt) |
|
static void | qsv_decode_close_qsvcontext (QSVContext *q) |
|
static int | qsv_process_data (AVCodecContext *avctx, QSVContext *q, AVFrame *frame, int *got_frame, const AVPacket *pkt) |
|
static void | qsv_clear_buffers (QSVDecContext *s) |
|
static av_cold int | qsv_decode_close (AVCodecContext *avctx) |
|
static av_cold int | qsv_decode_init (AVCodecContext *avctx) |
|
static int | qsv_decode_frame (AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt) |
|
static void | qsv_decode_flush (AVCodecContext *avctx) |
|
◆ PTS_TO_MFX_PTS
#define PTS_TO_MFX_PTS |
( |
|
pts, |
|
|
|
pts_tb |
|
) |
| |
Value:
MFX_TIMESTAMP_UNKNOWN : pts_tb.num ? \
Definition at line 51 of file qsvdec.c.
◆ MFX_PTS_TO_PTS
#define MFX_PTS_TO_PTS |
( |
|
mfx_pts, |
|
|
|
pts_tb |
|
) |
| |
Value: ((mfx_pts) == MFX_TIMESTAMP_UNKNOWN ? \
Definition at line 55 of file qsvdec.c.
◆ OFFSET
◆ VD
◆ DEFINE_QSV_DECODER_WITH_OPTION
#define DEFINE_QSV_DECODER_WITH_OPTION |
( |
|
x, |
|
|
|
X, |
|
|
|
bsf_name, |
|
|
|
opt |
|
) |
| |
Value:static const AVClass x##_qsv_class = { \
.option = opt, \
}; \
const
AVCodec ff_##x##_qsv_decoder = { \
.bsfs = bsf_name, \
.priv_class = &x##_qsv_class, \
AV_PIX_FMT_P010, \
AV_PIX_FMT_QSV, \
AV_PIX_FMT_NONE }, \
.wrapper_name = "qsv", \
}; \
Definition at line 885 of file qsvdec.c.
◆ DEFINE_QSV_DECODER
◆ LoadPlugin
Enumerator |
---|
LOAD_PLUGIN_NONE | |
LOAD_PLUGIN_HEVC_SW | |
LOAD_PLUGIN_HEVC_HW | |
LOAD_PLUGIN_NONE | |
LOAD_PLUGIN_HEVC_SW | |
LOAD_PLUGIN_HEVC_HW | |
Definition at line 725 of file qsvdec.c.
◆ qsv_get_continuous_buffer()
◆ qsv_init_session()
◆ qsv_fifo_item_size()
static unsigned int qsv_fifo_item_size |
( |
void |
| ) |
|
|
inlinestatic |
◆ qsv_fifo_size()
◆ qsv_decode_preinit()
◆ qsv_decode_init_context()
◆ qsv_decode_header()
◆ alloc_frame()
◆ qsv_clear_unused_frames()
static void qsv_clear_unused_frames |
( |
QSVContext * |
q | ) |
|
|
static |
◆ get_surface()
◆ find_frame()
◆ qsv_decode()
◆ qsv_decode_close_qsvcontext()
static void qsv_decode_close_qsvcontext |
( |
QSVContext * |
q | ) |
|
|
static |
◆ qsv_process_data()
◆ qsv_clear_buffers()
◆ qsv_decode_close()
◆ qsv_decode_init()
◆ qsv_decode_frame()
◆ qsv_decode_flush()
◆ mfx_tb
◆ qsv_hw_configs
Initial value:
Definition at line 97 of file qsvdec.c.
◆ options
Initial value:= {
{
"gpu_copy",
"A GPU-accelerated copy between video and system memory",
OFFSET(qsv.gpu_copy),
AV_OPT_TYPE_INT, { .i64 = MFX_GPUCOPY_DEFAULT }, MFX_GPUCOPY_DEFAULT, MFX_GPUCOPY_OFF,
VD,
"gpu_copy"},
}
Definition at line 936 of file qsvdec.c.
AVPixelFormat
Pixel format.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
static const AVRational mfx_tb
#define ASYNC_DEPTH_DEFAULT
@ AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX
The codec supports this format via the hw_frames_ctx interface.
static void decode(AVCodecContext *dec_ctx, AVPacket *pkt, AVFrame *frame, FILE *outfile)
static av_cold int qsv_decode_init(AVCodecContext *avctx)
static int qsv_decode_frame(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
static enum AVPixelFormat pix_fmts[]
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
#define LIBAVUTIL_VERSION_INT
Describe the class of an AVClass context structure.
static void flush(AVCodecContext *avctx)
@ AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX
The codec supports this format via the hw_device_ctx interface.
const char * av_default_item_name(void *ptr)
Return the context name.
@ AV_PIX_FMT_QSV
HW acceleration through QSV, data[3] contains a pointer to the mfxFrameSurface1 structure.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() or get_encode_buffer() for allocating buffers and supports custom allocators.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
#define AV_NOPTS_VALUE
Undefined timestamp value.
static av_cold int qsv_decode_close(AVCodecContext *avctx)
const char * name
Name of the codec implementation.
@ AV_PIX_FMT_NV12
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define AV_CODEC_CAP_HYBRID
Codec is potentially backed by a hardware implementation, but not necessarily.
#define AV_CODEC_CAP_AVOID_PROBING
Decoder is not a preferred choice for probing.
static void qsv_decode_flush(AVCodecContext *avctx)
static const AVCodecHWConfigInternal *const qsv_hw_configs[]