changeset 5581:1f231091fb54

draft v0.1
author arpi
date Sat, 13 Apr 2002 00:47:54 +0000
parents 6366586083bb
children 21bd4b32abb4
files DOCS/tech/osd.txt
diffstat 1 files changed, 84 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/DOCS/tech/osd.txt	Sat Apr 13 00:47:54 2002 +0000
@@ -0,0 +1,84 @@
+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)
+
+- 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;
+