mirror of
https://github.com/mpv-player/mpv
synced 2025-01-27 10:03:32 +00:00
642e963c86
"Almost" because this might contain copyright by michael, who agreed with LGPL, but only once the core is LGPL. This is preparation for that to happen. Apart from that, the usual remarks apply. In particular, dec_video.c started out quite chaotic with no modularization, but was later basically gutted, and in general rewritten a bunch of times. Not going to give a history lesson. Special attention needs to be given to 3 patches by cehosos, who did not agree to the relicensing:240b743ebd
: --field-dominancee32cbbf7dc
: reinit VO if aspect ratio changes306f6243fd
: use container aspect if codec aspect unset (?) The first patch is pretty clearly still in the current code, and needs to be disabled for LGPL. The functionality of the second patch is still active, but implemented completely different, and as part of general frame parameter changes (at the time of the patch, MPlayer already reinitialized the VO on frame size and pixel format changes - all this was merged into a single check for changing image parameters). The third patch makes me a bit more uncomfortable. It appears the code was moved to dec_video.c inde68b8f23c
, and further changed in82f0d373
,0a0bb905
, andbf13bd0d
. You could claim that cehoyos' copyright still sticks. Fortunately, we implement alternative aspect detection, which is simpler and probably preferable, and which arguably contains none of the original code and logic, and thus should be fully safe. While I don't know if cehoyos' copyright actually still applies, I'm more comfortable with making the code GPL-only for now. Also change the default to use the (in future) plain LGPL code, and deprecate the one associated with the GPL code, so we can eventually remove the GPL code. But it's also possible we decide that the copyright doesn't apply, and undo the deprecation and GPL guards. I expect that users won't notice anything. If you ask me, the old aspect method was probably an accidental bug instead of intentional behavior. Although, the new aspect method was broken too, so I had to fix it.
103 lines
2.9 KiB
C
103 lines
2.9 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/>.
|
|
*
|
|
* Almost LGPL.
|
|
*/
|
|
|
|
#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;
|
|
|
|
struct mp_recorder_sink *recorder_sink;
|
|
|
|
// 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
|
|
|
|
int has_broken_decoded_pts;
|
|
|
|
// Final PTS of previously decoded image
|
|
double decoded_pts;
|
|
|
|
struct mp_image_params dec_format, 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 *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_params(struct dec_video *d_video);
|
|
void video_get_dec_params(struct dec_video *d_video, struct mp_image_params *p);
|
|
|
|
#endif /* MPLAYER_DEC_VIDEO_H */
|