mirror of https://github.com/mpv-player/mpv
88 lines
2.7 KiB
Plaintext
88 lines
2.7 KiB
Plaintext
some draft of new osd engine:
|
|
=============================
|
|
written by A'rpi
|
|
including ideas from maillist from Jiri Svoboda, Tobias Diedrich, Artur Zaprzala
|
|
Michael Niedermayer, Felix Buenemann, LGB
|
|
|
|
requirements:
|
|
- be able to do partial rendering, within a given bounding box
|
|
usefull, when parts of osd are outside of teh image and has to be
|
|
updated only when osd changes, or even has different colorspace
|
|
|
|
- text should be rendered in 2-pass way: 1. alpha 2. pixels
|
|
so char's alpha won't overwrite previous char, and may be faster
|
|
|
|
- osd elements should be cached - so rendering once into the cache and
|
|
reuse this while it's unchanged
|
|
|
|
- colors support (csp could be YA, YUVA, RGB )
|
|
|
|
- change brightness, saturation, hue of chars ???
|
|
|
|
- way to disable alphablending, and use black outline (FAST_OSD now)
|
|
|
|
- respect movie and monitor aspect, so osd is rendered/scaled correctly
|
|
eg. for svcd/anamorphic dvd with hardware scaling (now OSD is squashed)
|
|
|
|
- develop some text-based apps: osdterm, osdzilla etc ;)
|
|
|
|
Ok. The basic idea of my design is using 'osd objects', a data structure
|
|
in a 1 (or 2?) way linked list.
|
|
There would be different object types, sharing type-dependent data in an
|
|
union. The basic types: box, text, symbol, progressbar, group.
|
|
|
|
Group would be a special type, grouping other osd objects together,
|
|
with a common x,y and boundingbox. usefull for grouping symbol+progrbar
|
|
or multiline subtitle text.
|
|
|
|
Each obj could have flags, for example:
|
|
- visible (set if we should display it)
|
|
- color (set if it's YUVA not YA)
|
|
- cached (set when there is a cached rendered variant)
|
|
- bbox updated (should be set when recalc bbox, reset when change params)
|
|
- several flags to control positioning. for example, x;y could be
|
|
absolute coord, or percent. flags to set left/center/right alignment...
|
|
- start and end timestamp, to automagically set/reset visible flag
|
|
|
|
ok, my first draft:
|
|
|
|
typedef struct mp_osd_obj_s {
|
|
struct mp_osd_obj_s* next;
|
|
unsigned char type;
|
|
unsigned char alignment; // 2 bits: x;y percents, 2 bits: x;y relative to parent; 2 bits: alignment left/right/center
|
|
unsigned short flags;
|
|
int x,y; // coords
|
|
unsigned char color[4]; // YUVA
|
|
mp_osd_bbox_t bbox; // bounding box
|
|
unsigned int start,duration; // PTS
|
|
union {
|
|
struct {
|
|
int x1,y1,x2,y2;
|
|
} line;
|
|
struct {
|
|
int x,y,w,h;
|
|
} rect;
|
|
struct {
|
|
char* text;
|
|
mp_font_t* font;
|
|
} text;
|
|
struct {
|
|
int symbol; // unicode
|
|
mp_font_t* font;
|
|
} symbol;
|
|
struct {
|
|
float value;
|
|
mp_font_t* font;
|
|
} pbar;
|
|
struct {
|
|
int w,h;
|
|
unsigned char* image;
|
|
unsigned int* palette;
|
|
} spu; // FIXME!
|
|
struct {
|
|
struct mp_osd_obj_s* children;
|
|
} group;
|
|
} params;
|
|
} mp_osd_obj_t;
|
|
|