summaryrefslogtreecommitdiffstats
path: root/sub/sd.h
blob: 3b8319798938f56c1ca6e598ab5cb6c175f25fc1 (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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#ifndef MPLAYER_SD_H
#define MPLAYER_SD_H

#include "dec_sub.h"
#include "demux/demux_packet.h"

struct sd {
    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;

    // Make sd_ass use an existing track
    struct ass_track *ass_track;

    // Shared renderer for ASS - done to avoid reloading embedded fonts.
    struct ass_library *ass_library;
    struct ass_renderer *ass_renderer;

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

    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