summaryrefslogtreecommitdiffstats
path: root/sub/sd.h
blob: 2d9207dc48420498a65df1adfa37c9e314e443fd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#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;

    struct sh_stream *sh;

    // 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;
};

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
    int (*control)(struct sd *sd, enum sd_ctrl cmd, void *arg);

    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);
};

struct lavc_conv;
bool lavc_conv_supports_format(const char *format);
struct lavc_conv *lavc_conv_create(struct mp_log *log, const char *codec_name,
                                   char *extradata, int extradata_len);
char *lavc_conv_get_extradata(struct lavc_conv *priv);
char **lavc_conv_decode(struct lavc_conv *priv, struct demux_packet *packet);
void lavc_conv_reset(struct lavc_conv *priv);
void lavc_conv_uninit(struct lavc_conv *priv);

#endif