mirror of
https://github.com/mpv-player/mpv
synced 2025-01-02 04:42:10 +00:00
46fff8d31a
The main change is with video/hwdec.h. mp_hwdec_info is made opaque (and renamed to mp_hwdec_devices). Its accessors are mainly thread-safe (or documented where not), which makes the whole thing saner and cleaner. In particular, thread-safety rules become less subtle and more obvious. The new internal API makes it easier to support multiple OpenGL interop backends. (Although this is not done yet, and it's not clear whether it ever will.) This also removes all the API-specific fields from mp_hwdec_ctx and replaces them with a "ctx" field. For d3d in particular, we drop the mp_d3d_ctx struct completely, and pass the interfaces directly. Remove the emulation checks from vaapi.c and vdpau.c; they are pointless, and the checks that matter are done on the VO layer. The d3d hardware decoders might slightly change behavior: dxva2-copy will not use the VO device anymore if the VO supports proper interop. This pretty much assumes that any in such cases the VO will not use any form of exclusive mode, which makes using the VO device in copy mode unnecessary. This is a big refactor. Some things may be untested and could be broken.
97 lines
2.8 KiB
C
97 lines
2.8 KiB
C
/*
|
|
* This file is part of mpv.
|
|
*
|
|
* mpv is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* mpv is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with mpv. If not, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
#ifndef MPLAYER_DEC_VIDEO_H
|
|
#define MPLAYER_DEC_VIDEO_H
|
|
|
|
#include <stdbool.h>
|
|
|
|
#include "demux/stheader.h"
|
|
#include "video/hwdec.h"
|
|
#include "video/mp_image.h"
|
|
|
|
struct mp_decoder_list;
|
|
struct vo;
|
|
|
|
struct dec_video {
|
|
struct mp_log *log;
|
|
struct mpv_global *global;
|
|
struct MPOpts *opts;
|
|
const struct vd_functions *vd_driver;
|
|
struct mp_hwdec_devices *hwdec_devs; // video output hwdec handles
|
|
struct sh_stream *header;
|
|
struct mp_codec_params *codec;
|
|
|
|
char *decoder_desc;
|
|
|
|
float fps; // FPS from demuxer or from user override
|
|
|
|
int dropped_frames;
|
|
|
|
// Internal (shared with vd_lavc.c).
|
|
|
|
void *priv; // for free use by vd_driver
|
|
|
|
// Strictly internal (dec_video.c).
|
|
|
|
// Last PTS from decoder (set with each vd_driver->decode() call)
|
|
double codec_pts;
|
|
int num_codec_pts_problems;
|
|
|
|
// Last packet DTS from decoder (passed through from source packets)
|
|
double codec_dts;
|
|
int num_codec_dts_problems;
|
|
|
|
// PTS or DTS of packet first read
|
|
double first_packet_pdts;
|
|
|
|
// There was at least one packet with non-sense timestamps.
|
|
int has_broken_packet_pts; // <0: uninitialized, 0: no problems, 1: broken
|
|
|
|
// Final PTS of previously decoded image
|
|
double decoded_pts;
|
|
|
|
struct mp_image_params last_format, fixed_format;
|
|
float initial_decoder_aspect;
|
|
|
|
double start_pts;
|
|
double start, end;
|
|
struct demux_packet *new_segment;
|
|
struct demux_packet *packet;
|
|
bool framedrop_enabled;
|
|
struct mp_image *cover_art_mpi;
|
|
struct mp_image *current_mpi;
|
|
int current_state;
|
|
};
|
|
|
|
struct mp_decoder_list *video_decoder_list(void);
|
|
|
|
bool video_init_best_codec(struct dec_video *d_video);
|
|
void video_uninit(struct dec_video *d_video);
|
|
|
|
void video_work(struct dec_video *d_video);
|
|
int video_get_frame(struct dec_video *d_video, struct mp_image **out_mpi);
|
|
|
|
void video_set_framedrop(struct dec_video *d_video, bool enabled);
|
|
void video_set_start(struct dec_video *d_video, double start_pts);
|
|
|
|
int video_vd_control(struct dec_video *d_video, int cmd, void *arg);
|
|
void video_reset(struct dec_video *d_video);
|
|
void video_reset_aspect(struct dec_video *d_video);
|
|
|
|
#endif /* MPLAYER_DEC_VIDEO_H */
|