From: Guenter B. <bar...@st...> - 2001-06-27 00:46:36
|
Hi Rich, On Mon, 18 Jun 2001, Richard J Wareham wrote: > I have checked in a small modification as a first step to getting SPU > decoding working. At the moment, the SPU decoder gets the SPU packets from > the demuxer (yay)... then throws them away again (FIXME :)). oki, I hope we can do without that extra-thread soon. > Overlay now works for Xv, I don't know about other output methods. it won't work for xshm/x11 that way because at the moment the subpicture is overlayed blindly over the YUV data at a point where that data has long since been converted to RGB. I think we should come to a clean design here, I propose we introduce subpicture plugins that are able to decode one sort of subtitles. Their decoding function should be called by the current video output plugin and they would provide the subpicture, perhaps in some "generic" form, a bytemap, coordinates and a color palette for example. It would then be the video output plugin's task to do the actual overlay. There could be different subpicture decoders, one for the SPU streams found on DVDs, another that renders SPUs in MicroDVD format (for example). To speak in C, a subpicture decoder plugin would have an interface like typedef struct spu_overlay_s spu_overlay_t ; struct spu_overlay_s { int format; /* do we need this? */ int x,y,width,height; uint8_t *overlay_data; /* one byte per pixel */ uint32_t *palette; /* 256 entries */ spu_overlay_t *next; /* maybe more than one overlay for this frame */ } ; typedef struct spu_decoder_s spu_decoder_t; struct spu_decoder_s { int (*can_handle) (spu_decoder_t *this, int buf_type); void (*init) (spu_decoder_t *this, fifo_buffer_t *spu_fifo); /* decode all spu data from fifo (see init function) with vpts <= frame_vpts */ spu_overlay_t *(*decode_spu_for_frame) (spu_decoder_t *this, uint32_t frame_vpts); void (*close) (spu_decoder_t *this); char* (*get_identifier) (void); }; the plugin would be initiated by something like spu_decoder_t *init_spu_decoder_plugin (int iface_version, config_values_t *cfg, metronom_t *metronom); What do you think? Would that be enough for DVD menues to work, too (spu-related tasks, of course) ? Cheers, Guenter -- time is a funny concept |