diff options
author | wm4 <wm4@nowhere> | 2012-11-01 02:12:47 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-11-01 02:12:47 +0100 |
commit | 84829a4ea1903e5db5782b72861fabc503a589cb (patch) | |
tree | 26b4acbaf6dd4b255278dcc67f28bd83357c3b86 /sub/sub.h | |
parent | e45dd051c304dec189d0d4d792a89c2988c3fa71 (diff) | |
parent | f4069259cf7ffd24ac2a5b64e26a386185e94c7b (diff) | |
download | mpv-84829a4ea1903e5db5782b72861fabc503a589cb.tar.bz2 mpv-84829a4ea1903e5db5782b72861fabc503a589cb.tar.xz |
Merge branch 'osd_changes' into master
Conflicts:
DOCS/man/en/options.rst
Diffstat (limited to 'sub/sub.h')
-rw-r--r-- | sub/sub.h | 262 |
1 files changed, 152 insertions, 110 deletions
@@ -19,161 +19,203 @@ #ifndef MPLAYER_SUB_H #define MPLAYER_SUB_H +#include <stddef.h> #include <stdbool.h> +#include <stdint.h> -#include "subreader.h" -#include "dec_sub.h" - -typedef struct mp_osd_bbox_s { - int x1,y1,x2,y2; -} mp_osd_bbox_t; - -#define OSDTYPE_OSD 1 -#define OSDTYPE_SUBTITLE 2 -#define OSDTYPE_PROGBAR 3 -#define OSDTYPE_SPU 4 - -#define OSDFLAG_VISIBLE 1 -#define OSDFLAG_CHANGED 2 -#define OSDFLAG_BBOX 4 -#define OSDFLAG_OLD_BBOX 8 -#define OSDFLAG_FORCE_UPDATE 16 - -#define MAX_UCS 1600 -#define MAX_UCSLINES 16 - -typedef struct mp_osd_obj_s { - struct mp_osd_obj_s* next; - unsigned char type; - unsigned short flags; - int x,y; - int dxs,dys; - mp_osd_bbox_t bbox; // bounding box - mp_osd_bbox_t old_bbox; // the renderer will save bbox here +// NOTE: VOs must support at least SUBBITMAP_LIBASS and SUBBITMAP_RGBA. +enum sub_bitmap_format { + SUBBITMAP_EMPTY = 0,// no bitmaps; always has num_parts==0 + SUBBITMAP_LIBASS, // A8, with a per-surface blend color (libass.color) + SUBBITMAP_RGBA, // B8G8R8A8 (MSB=A, LSB=B), scaled, premultiplied alpha + SUBBITMAP_INDEXED, // scaled, bitmap points to osd_bmp_indexed + + SUBBITMAP_COUNT +}; + +// For SUBBITMAP_INDEXED +struct osd_bmp_indexed { + uint8_t *bitmap; + // Each entry is like a pixel in SUBBITMAP_RGBA format, but using straight + // alpha. + uint32_t palette[256]; +}; + +struct sub_bitmap { + void *bitmap; int stride; + // Note: not clipped, going outside the screen area is allowed + // (except for SUBBITMAP_LIBASS, which is always clipped) + int w, h; + int x, y; + int dw, dh; + + union { + struct { + uint32_t color; + } libass; + }; +}; + +struct sub_bitmaps { + // For VO cache state (limited by MAX_OSD_PARTS) + int render_index; + + enum sub_bitmap_format format; + + // If false, dw==w && dh==h. + // SUBBITMAP_LIBASS is never scaled. + bool scaled; + + struct sub_bitmap *parts; + int num_parts; + + // Incremented on each change + int bitmap_id, bitmap_pos_id; +}; + +struct mp_osd_res { + int w, h; // screen dimensions, including black borders + int mt, mb, ml, mr; // borders (top, bottom, left, right) + double display_par; + double video_par; // PAR of the original video (for some sub decoders) +}; + +enum mp_osdtype { + OSDTYPE_SUB, + OSDTYPE_OSD, + OSDTYPE_SUBTITLE, + OSDTYPE_PROGBAR, + OSDTYPE_SPU, + + MAX_OSD_PARTS +}; + +#define OSD_CONV_CACHE_MAX 3 + +struct osd_object { + int type; // OSDTYPE_* + bool is_sub; + + bool force_redraw; - int allocated; - unsigned char *alpha_buffer; - unsigned char *bitmap_buffer; + // caches for OSD conversion (internal to render_object()) + struct osd_conv_cache *cache[OSD_CONV_CACHE_MAX]; + struct sub_bitmaps cached; + // VO cache state + int vo_bitmap_id; + int vo_bitmap_pos_id; + struct mp_osd_res vo_res; + + // Internally used by osd_libass.c struct ass_track *osd_track; -} mp_osd_obj_t; + struct sub_bitmap *parts_cache; +}; struct osd_state { + struct osd_object *objs[MAX_OSD_PARTS]; + struct ass_library *ass_library; struct ass_renderer *ass_renderer; struct sh_sub *sh_sub; - int bitmap_id; - int bitmap_pos_id; - double sub_pts; double sub_offset; - struct mp_eosd_res dim; - double normal_scale; - double vsfilter_scale; - bool unscaled; - bool support_rgba; + double vo_pts; - struct ass_renderer *osd_render; - struct ass_library *osd_ass_library; - char *osd_text; - int w, h; + bool render_subs_in_filter; + + bool want_redraw; + + char *osd_text; // OSDTYPE_OSD + int progbar_type, progbar_value; // OSDTYPE_PROGBAR + + int switch_sub_id; struct MPOpts *opts; -}; -extern subtitle* vo_sub; + // Internal to sub.c + struct mp_draw_sub_cache *draw_cache; -extern int vo_osd_progbar_type; -extern int vo_osd_progbar_value; // 0..255 + // Internally used by osd_libass.c + struct ass_renderer *osd_render; + struct ass_library *osd_ass_library; +}; + +extern struct subtitle* vo_sub; extern void* vo_spudec; extern void* vo_vobsub; -#define OSD_PLAY 0x01 -#define OSD_PAUSE 0x02 -#define OSD_STOP 0x03 -#define OSD_REW 0x04 -#define OSD_FFW 0x05 -#define OSD_CLOCK 0x06 -#define OSD_CONTRAST 0x07 -#define OSD_SATURATION 0x08 -#define OSD_VOLUME 0x09 -#define OSD_BRIGHTNESS 0x0A -#define OSD_HUE 0x0B -#define OSD_BALANCE 0x0C -#define OSD_PANSCAN 0x50 - -#define OSD_PB_START 0x10 -#define OSD_PB_0 0x11 -#define OSD_PB_END 0x12 -#define OSD_PB_1 0x13 +// Start of OSD symbols in osd_font.pfb +#define OSD_CODEPOINTS 0xE000 + +// OSD symbols. osd_font.pfb has them starting from codepoint OSD_CODEPOINTS. +// Symbols with a value >= 32 are normal unicode codepoints. +enum mp_osd_font_codepoints { + OSD_PLAY = 0x01, + OSD_PAUSE = 0x02, + OSD_STOP = 0x03, + OSD_REW = 0x04, + OSD_FFW = 0x05, + OSD_CLOCK = 0x06, + OSD_CONTRAST = 0x07, + OSD_SATURATION = 0x08, + OSD_VOLUME = 0x09, + OSD_BRIGHTNESS = 0x0A, + OSD_HUE = 0x0B, + OSD_BALANCE = 0x0C, + OSD_PANSCAN = 0x50, + + OSD_PB_START = 0x10, + OSD_PB_0 = 0x11, + OSD_PB_END = 0x12, + OSD_PB_1 = 0x13, +}; /* now in textform */ extern char * const sub_osd_names[]; extern char * const sub_osd_names_short[]; -extern int sub_unicode; extern int sub_utf8; extern char *sub_cp; extern int sub_pos; -extern int sub_width_p; -extern int sub_bg_color; /* subtitles background color */ -extern int sub_bg_alpha; -extern int spu_alignment; -extern int spu_aamode; -extern float spu_gaussvar; - -extern char *subtitle_font_encoding; + extern float text_font_scale_factor; -extern float osd_font_scale_factor; -extern float subtitle_font_radius; -extern float subtitle_font_thickness; -extern int subtitle_autoscale; extern char *font_name; extern char *sub_font_name; -extern float font_factor; extern float sub_delay; extern float sub_fps; -extern int sub_justify; - -void osd_draw_text(struct osd_state *osd, int dxs, int dys, - void (*draw_alpha)(void *ctx, int x0, int y0, int w, int h, - unsigned char* src, unsigned char *srca, - int stride), - void *ctx); -void osd_draw_text_ext(struct osd_state *osd, int dxs, int dys, - int left_border, int top_border, int right_border, - int bottom_border, int orig_w, int orig_h, - void (*draw_alpha)(void *ctx, int x0, int y0, int w, - int h, unsigned char* src, - unsigned char *srca, - int stride), - void *ctx); struct osd_state *osd_create(struct MPOpts *opts, struct ass_library *asslib); void osd_set_text(struct osd_state *osd, const char *text); -int osd_update(struct osd_state *osd, int dxs, int dys); void vo_osd_changed(int new_value); -void vo_osd_reset_changed(void); -bool vo_osd_has_changed(struct osd_state *osd); -void vo_osd_resized(void); -int vo_osd_check_range_update(int,int,int,int); void osd_free(struct osd_state *osd); -// used only by osd_ft.c or osd_libass.c -void osd_alloc_buf(mp_osd_obj_t* obj); -void vo_draw_text_from_buffer(mp_osd_obj_t* obj,void (*draw_alpha)(void *ctx, int x0,int y0, int w,int h, unsigned char* src, unsigned char *srca, int stride), void *ctx); +enum mp_osd_draw_flags { + OSD_DRAW_SUB_FILTER = (1 << 0), + OSD_DRAW_SUB_ONLY = (1 << 1), +}; + +void osd_draw(struct osd_state *osd, struct mp_osd_res res, + double video_pts, int draw_flags, + const bool formats[SUBBITMAP_COUNT], + void (*cb)(void *ctx, struct sub_bitmaps *imgs), void *cb_ctx); + +struct mp_image; +bool osd_draw_on_image(struct osd_state *osd, struct mp_osd_res res, + double video_pts, int draw_flags, struct mp_image *dest); + +struct mp_rect; +bool sub_bitmaps_bb(struct sub_bitmaps *imgs, struct mp_rect *out_bb); + +// defined in osd_libass.c and osd_dummy.c -// defined in osd_ft.c or osd_libass.c -void vo_update_text_osd(struct osd_state *osd, mp_osd_obj_t *obj); -void vo_update_text_progbar(struct osd_state *osd, mp_osd_obj_t *obj); -void vo_update_text_sub(struct osd_state *osd, mp_osd_obj_t *obj); +void osd_object_get_bitmaps(struct osd_state *osd, struct osd_object *obj, + struct sub_bitmaps *out_imgs); void osd_get_function_sym(char *buffer, size_t buffer_size, int osd_function); -void osd_font_invalidate(void); -void osd_font_load(struct osd_state *osd); void osd_init_backend(struct osd_state *osd); void osd_destroy_backend(struct osd_state *osd); |