summaryrefslogtreecommitdiffstats
path: root/video/decode/lavc.h
diff options
context:
space:
mode:
Diffstat (limited to 'video/decode/lavc.h')
-rw-r--r--video/decode/lavc.h32
1 files changed, 28 insertions, 4 deletions
diff --git a/video/decode/lavc.h b/video/decode/lavc.h
index 3611530400..94973cb2d8 100644
--- a/video/decode/lavc.h
+++ b/video/decode/lavc.h
@@ -10,10 +10,19 @@
#include "demux/stheader.h"
#include "video/mp_image.h"
+// keep in sync with --hwdec option
+enum hwdec_type {
+ HWDEC_AUTO = -1,
+ HWDEC_NONE = 0,
+ HWDEC_VDPAU = 1,
+ HWDEC_VDA = 2,
+ HWDEC_CRYSTALHD = 3,
+};
+
typedef struct lavc_ctx {
AVCodecContext *avctx;
AVFrame *pic;
- struct hwdec *hwdec;
+ struct vd_lavc_hwdec *hwdec;
enum PixelFormat pix_fmt;
int do_hw_dr1;
int vo_initialized;
@@ -35,16 +44,31 @@ typedef struct lavc_ctx {
struct mp_image_pool *non_dr1_pool;
} vd_ffmpeg_ctx;
-struct vd_lavc_hwdec_functions {
- // If not-NULL, a 0 terminated list of IMGFMT_ formats. Only one of these
- // formats is accepted when handling the libavcodec get_format callback.
+struct vd_lavc_hwdec {
+ enum hwdec_type type;
+ // If non-NULL: lists pairs software and hardware decoders. If the current
+ // codec is not one of the listed software decoders, probing fails.
+ // Otherwise, the AVCodecContext is initialized with the associated
+ // hardware decoder.
+ // Useful only if hw decoding requires a special codec, instead of using
+ // the libavcodec hwaccel infrastructure.
+ const char **codec_pairs;
+ // If not-NULL: a 0 terminated list of IMGFMT_ formats, and only one of
+ // these formats is accepted in the libavcodec get_format callback.
const int *image_formats;
+ int (*probe)(struct vd_lavc_hwdec *hwdec, struct mp_hwdec_info *info,
+ const char *decoder);
int (*init)(struct lavc_ctx *ctx);
void (*uninit)(struct lavc_ctx *ctx);
struct mp_image *(*allocate_image)(struct lavc_ctx *ctx, AVFrame *frame);
void (*fix_image)(struct lavc_ctx *ctx, struct mp_image *img);
};
+enum {
+ HWDEC_ERR_NO_CTX = -2,
+ HWDEC_ERR_NO_CODEC = -3,
+};
+
// lavc_dr1.c
int mp_codec_get_buffer(AVCodecContext *s, AVFrame *frame);
void mp_codec_release_buffer(AVCodecContext *s, AVFrame *frame);