summaryrefslogtreecommitdiffstats
path: root/DOCS/tech/osd.txt
blob: 2927ecfa2e6dcbd6a240a326194b4a7beaaba728 (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
77
78
79
80
81
82
83
84
85
86
87
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 percentages, 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;