summaryrefslogtreecommitdiffstats
path: root/video/decode/vd_lavc.c
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2017-12-01 22:01:54 +0100
committerwm4 <wm4@nowhere>2017-12-01 22:01:54 +0100
commitd891239d723e6197bdbb9bae7daafe593fff34bc (patch)
tree3f7ab9d10fc77595e4103d6cc8ec8f4326130b10 /video/decode/vd_lavc.c
parent076b1d266ea1d432c2ab955a17962f6774506f55 (diff)
downloadmpv-d891239d723e6197bdbb9bae7daafe593fff34bc.tar.bz2
mpv-d891239d723e6197bdbb9bae7daafe593fff34bc.tar.xz
vd_lavc: merge redundant header
This is not needed anymore.
Diffstat (limited to 'video/decode/vd_lavc.c')
-rw-r--r--video/decode/vd_lavc.c81
1 files changed, 77 insertions, 4 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index af7e175db4..3c24c7e246 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -17,12 +17,13 @@
#include <stdio.h>
#include <stdlib.h>
+#include <pthread.h>
#include <assert.h>
-#include <time.h>
#include <stdbool.h>
-#include <sys/types.h>
+#include <libavcodec/avcodec.h>
#include <libavutil/common.h>
+#include <libavutil/hwcontext.h>
#include <libavutil/opt.h>
#include <libavutil/intreadwrite.h>
#include <libavutil/pixdesc.h>
@@ -38,8 +39,11 @@
#include "video/fmt-conversion.h"
#include "vd.h"
+#include "video/hwdec.h"
#include "video/img_format.h"
#include "video/filter/vf.h"
+#include "video/mp_image.h"
+#include "video/mp_image_pool.h"
#include "video/decode/dec_video.h"
#include "demux/demux.h"
#include "demux/stheader.h"
@@ -48,8 +52,6 @@
#include "video/sws_utils.h"
#include "video/out/vo.h"
-#include "lavc.h"
-
#if AVPALETTE_SIZE != MP_PALETTE_SIZE
#error palette too large, adapt video/mp_image.h:MP_PALETTE_SIZE
#endif
@@ -63,6 +65,14 @@ static int get_buffer2_direct(AVCodecContext *avctx, AVFrame *pic, int flags);
static enum AVPixelFormat get_format_hwdec(struct AVCodecContext *avctx,
const enum AVPixelFormat *pix_fmt);
+#define HWDEC_DELAY_QUEUE_COUNT 2
+
+// Maximum number of surfaces the player wants to buffer.
+// This number might require adjustment depending on whatever the player does;
+// for example, if vo_opengl increases the number of reference surfaces for
+// interpolation, this value has to be increased too.
+#define HWDEC_EXTRA_SURFACES 6
+
#define OPT_BASE_STRUCT struct vd_lavc_params
struct vd_lavc_params {
@@ -122,6 +132,69 @@ const struct m_sub_options vd_lavc_conf = {
},
};
+struct hwdec_info {
+ char name[64];
+ char method_name[16]; // non-unique name describing the hwdec method
+ const AVCodec *codec; // implemented by this codec
+ enum AVHWDeviceType lavc_device; // if not NONE, get a hwdevice
+ bool copying; // if true, outputs sw frames, or copy to sw ourselves
+ enum AVPixelFormat pix_fmt; // if not NONE, select in get_format
+ bool use_hw_frames; // set AVCodecContext.hw_frames_ctx
+ bool use_hw_device; // set AVCodecContext.hw_device_ctx
+
+ // for internal sorting
+ int auto_pos;
+ int rank;
+};
+
+typedef struct lavc_ctx {
+ struct mp_log *log;
+ struct MPOpts *opts;
+ AVCodecContext *avctx;
+ AVFrame *pic;
+ bool use_hwdec;
+ struct hwdec_info hwdec; // valid only if use_hwdec==true
+ AVRational codec_timebase;
+ enum AVDiscard skip_frame;
+ bool flushing;
+ const char *decoder;
+ bool hwdec_failed;
+ bool hwdec_notified;
+
+ bool intra_only;
+ int framedrop_flags;
+
+ bool hw_probing;
+ struct demux_packet **sent_packets;
+ int num_sent_packets;
+
+ struct demux_packet **requeue_packets;
+ int num_requeue_packets;
+
+ struct mp_image **delay_queue;
+ int num_delay_queue;
+ int max_delay_queue;
+
+ // From VO
+ struct mp_hwdec_devices *hwdec_devs;
+
+ // Wrapped AVHWDeviceContext* used for decoding.
+ AVBufferRef *hwdec_dev;
+
+ bool hwdec_request_reinit;
+ int hwdec_fail_count;
+
+ struct mp_image_pool *hwdec_swpool;
+
+ AVBufferRef *cached_hw_frames_ctx;
+
+ // --- The following fields are protected by dr_lock.
+ pthread_mutex_t dr_lock;
+ bool dr_failed;
+ struct mp_image_pool *dr_pool;
+ int dr_imgfmt, dr_w, dr_h, dr_stride_align;
+} vd_ffmpeg_ctx;
+
// Things not included in this list will be tried last, in random order.
static const char *const hwdec_autoprobe_order[] = {
"d3d11va",