mirror of
https://github.com/mpv-player/mpv
synced 2024-12-29 02:22:19 +00:00
a2e7642d3c
Until now, feeding packets to the decoder in advance was done for text subtitles only. This was possible because libass buffers all subtitle data anyway (in ASS_Track). sd_lavc, responsible for bitmap subs, does not do this. But it can buffer a small number of subtitle frames ahead. Enable this. Repurpose the sub_accept_packets_in_advance(). Instead of "can take all packets" it means "can take 1 packet" now. (The old meaning is still needed locally in dec_sub.c; keep it there.) It asks the decoder whether there is place for at least 1 subtitle packet. sd_lavc implements it and returns true if its internal fixed-size subtitle queue still has a free slot. (The implementation of this in dec_sub.c isn't entirely clean. For one, decode_chain() ignores this mechanism, so it's implied that bitmap subtitles do not use the subtitle filter chain in any advanced way.) Also fix 2 bugs in the sd_lavc queue handling. Subtitles must be checked in reverse, because the first entry will often have endpts==NOPTS, which would always match. alloc_sub() must cycle the queue buffer, because it reuses memory allocations (like sub.imgs) by design.
77 lines
2.2 KiB
C
77 lines
2.2 KiB
C
#ifndef MPLAYER_SD_H
|
|
#define MPLAYER_SD_H
|
|
|
|
#include "dec_sub.h"
|
|
#include "demux/packet.h"
|
|
|
|
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;
|
|
|
|
// 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;
|
|
|
|
// 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;
|
|
|
|
// If false, try to remove multiple subtitles.
|
|
// (Only for decoders which have accept_packets_in_advance set.)
|
|
bool no_remove_duplicates;
|
|
|
|
// 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
|