mirror of
https://github.com/mpv-player/mpv
synced 2024-12-29 02:22:19 +00:00
04af005c35
With the FFmpeg subtitle decoder used for _all_ non-ASS text subtitle format, this code is simply unused now. Ironically, the FFmpeg subtitle decoder does not handle things correctly in a bunch of cases. Should it turn out they actually matter, they will have to hack back. The extend_event one is a candidate, although even though there were allegedly files which need it, I couldn't get samples from the user who originally reported such files. As such, extend_event was only confirmed to handle trailing events with no (endless) duration like with MicroDVD and LRC, but FFmpeg "fudges" these anyway, so no special handling is needed. This code also had logic to handle seeking with muxed srt subtitles, which made the sub-seek command work. But this has been broken before this commit already. Currently, seeking with muxed srt subs will clear all subtitles, as the broken FFmpeg ASS format output by the libavcodec subtitle converters does not check for duplicates. Since the subtitles are all cleared, ass_step_sub() can not work properly and sub-seek can not seek to already seen subtitles.
82 lines
2.2 KiB
C
82 lines
2.2 KiB
C
#ifndef MPLAYER_SD_H
|
|
#define MPLAYER_SD_H
|
|
|
|
#include "dec_sub.h"
|
|
#include "demux/packet.h"
|
|
|
|
// up to 210 ms overlaps or gaps are removed
|
|
#define SUB_GAP_THRESHOLD 0.210
|
|
// don't change timings if durations are smaller
|
|
#define SUB_GAP_KEEP 0.4
|
|
|
|
struct sd {
|
|
struct mp_log *log;
|
|
struct MPOpts *opts;
|
|
|
|
const struct sd_functions *driver;
|
|
void *priv;
|
|
|
|
const char *codec;
|
|
|
|
// Extra header data passed from demuxer
|
|
char *extradata;
|
|
int extradata_len;
|
|
|
|
struct sh_stream *sh;
|
|
|
|
// Set to !=NULL if the input packets are being converted from another
|
|
// format.
|
|
const char *converted_from;
|
|
|
|
// Video resolution used for subtitle decoding. Doesn't necessarily match
|
|
// the resolution of the VO, nor does it have to be the OSD resolution.
|
|
int sub_video_w, sub_video_h;
|
|
|
|
double video_fps;
|
|
|
|
// Shared renderer for ASS - done to avoid reloading embedded fonts.
|
|
struct ass_library *ass_library;
|
|
struct ass_renderer *ass_renderer;
|
|
pthread_mutex_t *ass_lock;
|
|
|
|
// Set by sub converter
|
|
const char *output_codec;
|
|
char *output_extradata;
|
|
int output_extradata_len;
|
|
|
|
// Internal buffer for sd_conv_* functions
|
|
struct sd_conv_buffer *sd_conv_buffer;
|
|
};
|
|
|
|
struct sd_functions {
|
|
const char *name;
|
|
bool accept_packets_in_advance;
|
|
bool (*supports_format)(const char *format);
|
|
int (*init)(struct sd *sd);
|
|
void (*decode)(struct sd *sd, struct demux_packet *packet);
|
|
void (*reset)(struct sd *sd);
|
|
void (*uninit)(struct sd *sd);
|
|
|
|
bool (*accepts_packet)(struct sd *sd); // implicit default if NULL: true
|
|
void (*fix_events)(struct sd *sd);
|
|
int (*control)(struct sd *sd, enum sd_ctrl cmd, void *arg);
|
|
|
|
// decoder
|
|
void (*get_bitmaps)(struct sd *sd, struct mp_osd_res dim, double pts,
|
|
struct sub_bitmaps *res);
|
|
char *(*get_text)(struct sd *sd, double pts);
|
|
|
|
// converter
|
|
struct demux_packet *(*get_converted)(struct sd *sd);
|
|
};
|
|
|
|
void sd_conv_add_packet(struct sd *sd, void *data, int data_len, double pts,
|
|
double duration);
|
|
struct demux_packet *sd_conv_def_get_converted(struct sd *sd);
|
|
void sd_conv_def_reset(struct sd *sd);
|
|
void sd_conv_def_uninit(struct sd *sd);
|
|
|
|
#define SD_MAX_LINE_LEN 1000
|
|
|
|
#endif
|