Mercurial > mplayer.hg
view DOCS/tech/osd.txt @ 16784:7a6e909c223e
minor typo
author | diego |
---|---|
date | Mon, 17 Oct 2005 08:50:04 +0000 |
parents | 6e35326c742f |
children | 527c1561a0ad |
line wrap: on
line source
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;