xine-lib 1.2.13-20230125hg15249
Data Structures | Macros | Typedefs | Functions | Variables
spudvb_decoder.c File Reference
#include <time.h>
#include <pthread.h>
#include <errno.h>
#include <xine/xine_internal.h>
#include <xine/spu.h>
#include <xine/osd.h>
#include "xine-engine/bswap.h"

Data Structures

struct  sparse_array_entry_t
 
struct  _sparse_array_entry_t
 
struct  sparse_array_t
 
struct  page_t
 
struct  region_t
 
union  clut_union_t
 
struct  dds_t
 
struct  dvbsub_func_t
 
struct  dvbsub_func_t::_lut_group_s
 
struct  dvb_spu_decoder_s
 

Macros

#define LOG_MODULE   "spudvb"
 
#define MAX_REGIONS   16
 
#define SPU_MAX_WIDTH   1920
 
#define SPU_MAX_HEIGHT   1080
 
#define INT64_MAX   ((int64_t)((~(uint64_t)0) >> 1))
 
#define _REGION_FLAG_CHANGED   1
 
#define _REGION_FLAG_FILL   2
 
#define _REGION_FLAG_SHOW   4
 
#define _REGION_FLAG_VISIBLE   8
 

Typedefs

typedef struct dvb_spu_decoder_s dvb_spu_decoder_t
 

Functions

static void sparse_array_new (sparse_array_t *sa)
 
static void sparse_array_clear (sparse_array_t *sa)
 
static void sparse_array_delete (sparse_array_t *sa)
 
static uint32_t _sparse_array_find (sparse_array_t *sa, uint32_t key)
 
static void _sparse_array_sort (sparse_array_t *sa)
 
static int sparse_array_set (sparse_array_t *sa, uint32_t key, uint32_t value)
 
static sparse_array_entry_tsparse_array_get (sparse_array_t *sa, uint32_t key)
 
static void sparse_array_unset (sparse_array_t *sa, uint32_t key, uint32_t mask)
 
static void _region_init (dvbsub_func_t *dvbsub)
 
static void _region_deinit (dvbsub_func_t *dvbsub)
 
static uint32_t _region_find (dvbsub_func_t *dvbsub, uint32_t id, int new)
 
static void _clut_init (dvbsub_func_t *dvbsub)
 
static void _clut_deinit (dvbsub_func_t *dvbsub)
 
static clut_union_t_clut_find (dvbsub_func_t *dvbsub, uint32_t id, int new)
 
static void _clut_reset (dvbsub_func_t *dvbsub)
 
static void update_region (region_t *reg, uint32_t region_id, int32_t region_width, int32_t region_height, int32_t fill_color)
 
static void plot (dvbsub_func_t *dvbsub, int r, uint32_t run_length, uint8_t pixel)
 
static const uint8_t * lookup_lut (const dvbsub_func_t *dvbsub, int r)
 
static unsigned char next_datum (dvbsub_func_t *dvbsub, int width)
 
static void decode_2bit_pixel_code_string (dvbsub_func_t *dvbsub, int r, int n)
 
static void decode_4bit_pixel_code_string (dvbsub_func_t *dvbsub, int r, int n)
 
static void decode_8bit_pixel_code_string (dvbsub_func_t *dvbsub, int r, int n)
 
static void process_alt_CLUT_segment (dvbsub_func_t *dvbsub)
 
static void process_CLUT_definition_segment (dvbsub_func_t *dvbsub)
 
static void process_pixel_data_sub_block (dvbsub_func_t *dvbsub, int r, unsigned int pos, int ofs, int n)
 
static void process_page_composition_segment (dvbsub_func_t *dvbsub)
 
static void process_region_composition_segment (dvbsub_func_t *dvbsub)
 
static void process_object_data_segment (dvbsub_func_t *dvbsub)
 
static void process_display_definition_segment (dvbsub_func_t *dvbsub)
 
static void _hide_overlays (dvb_spu_decoder_t *this)
 
static void update_osd (dvb_spu_decoder_t *this, region_t *reg)
 
static void downscale_region_image (region_t *reg, unsigned char *dest, int dest_width)
 
static void recalculate_trans (dvb_spu_decoder_t *this)
 
static void draw_subtitles (dvb_spu_decoder_t *this)
 
static void spudec_decode_data (spu_decoder_t *this_gen, buf_element_t *buf)
 
static void spudec_reset (spu_decoder_t *this_gen)
 
static void spudec_discontinuity (spu_decoder_t *this_gen)
 
static void spudec_dispose (spu_decoder_t *this_gen)
 
static void _spudvb_set_timeout (void *data, xine_cfg_entry_t *entry)
 
static spu_decoder_tdvb_spu_class_open_plugin (spu_decoder_class_t *class_gen, xine_stream_t *stream)
 
static void * init_spu_decoder_plugin (xine_t *xine, const void *data)
 

Variables

static const uint32_t supported_types [] = { BUF_SPU_DVB, 0 }
 
static const decoder_info_t spudec_info
 
const plugin_info_t xine_plugin_info[] EXPORTED
 

Macro Definition Documentation

◆ _REGION_FLAG_CHANGED

#define _REGION_FLAG_CHANGED   1

◆ _REGION_FLAG_FILL

#define _REGION_FLAG_FILL   2

Referenced by draw_subtitles(), and update_region().

◆ _REGION_FLAG_SHOW

#define _REGION_FLAG_SHOW   4

◆ _REGION_FLAG_VISIBLE

#define _REGION_FLAG_VISIBLE   8

Referenced by draw_subtitles().

◆ INT64_MAX

#define INT64_MAX   ((int64_t)((~(uint64_t)0) >> 1))

◆ LOG_MODULE

#define LOG_MODULE   "spudvb"

◆ MAX_REGIONS

#define MAX_REGIONS   16

◆ SPU_MAX_HEIGHT

#define SPU_MAX_HEIGHT   1080

Referenced by update_region().

◆ SPU_MAX_WIDTH

#define SPU_MAX_WIDTH   1920

Referenced by update_region().

Typedef Documentation

◆ dvb_spu_decoder_t

Function Documentation

◆ _clut_deinit()

static void _clut_deinit ( dvbsub_func_t * dvbsub)
static

Referenced by spudec_dispose().

◆ _clut_find()

static clut_union_t * _clut_find ( dvbsub_func_t * dvbsub,
uint32_t id,
int new )
static

◆ _clut_init()

static void _clut_init ( dvbsub_func_t * dvbsub)
static

◆ _clut_reset()

static void _clut_reset ( dvbsub_func_t * dvbsub)
static

look at the output of $ gcc -DGEN_DEFAULT_CLUT -o ~/bin/default_clut spudvb_decoder.c $ default_clut $ rm ~/bin/default_clut

References _clut_init(), dvbsub_func_t::clut_cm, dvbsub_func_t::clut_gen, dvbsub_func_t::colours, default_clut, dvbsub_func_t::lut, and MAX_REGIONS.

Referenced by dvb_spu_class_open_plugin().

◆ _hide_overlays()

static void _hide_overlays ( dvb_spu_decoder_t * this)
static

Referenced by spudec_decode_data(), and spudec_reset().

◆ _region_deinit()

static void _region_deinit ( dvbsub_func_t * dvbsub)
static

Referenced by spudec_dispose().

◆ _region_find()

static uint32_t _region_find ( dvbsub_func_t * dvbsub,
uint32_t id,
int new )
static

◆ _region_init()

static void _region_init ( dvbsub_func_t * dvbsub)
static

◆ _sparse_array_find()

static uint32_t _sparse_array_find ( sparse_array_t * sa,
uint32_t key )
static

◆ _sparse_array_sort()

static void _sparse_array_sort ( sparse_array_t * sa)
static

◆ _spudvb_set_timeout()

static void _spudvb_set_timeout ( void * data,
xine_cfg_entry_t * entry )
static

◆ decode_2bit_pixel_code_string()

static void decode_2bit_pixel_code_string ( dvbsub_func_t * dvbsub,
int r,
int n )
static

◆ decode_4bit_pixel_code_string()

static void decode_4bit_pixel_code_string ( dvbsub_func_t * dvbsub,
int r,
int n )
static

◆ decode_8bit_pixel_code_string()

static void decode_8bit_pixel_code_string ( dvbsub_func_t * dvbsub,
int r,
int n )
static

◆ downscale_region_image()

static void downscale_region_image ( region_t * reg,
unsigned char * dest,
int dest_width )
static

◆ draw_subtitles()

static void draw_subtitles ( dvb_spu_decoder_t * this)
static

f***ing complex timing rule:

  1. When user_timeout == 0, do exactly what the stream says. This often leads to very hectic flicker. There will be gaps between parts of the same sentece, and short texts will disappear right when viewer starts reading them.
  2. When user_timeout > 0, use stream hide time or user timeout, whatever is later. When new regions appear, hide all earlier regions whose stream hide time has roughly expired. This will close gaps, and it will still allow stream intended overlaps.

References _clut_find(), _REGION_FLAG_CHANGED, _REGION_FLAG_FILL, _REGION_FLAG_SHOW, _REGION_FLAG_VISIBLE, _X_SET_CLUT_CM, region_t::CLUT_id, downscale_region_image(), region_t::flags, region_t::height, region_t::hide_vpts, region_t::img, LOG_MODULE, lprintf, mode(), NULL, region_t::osd, region_t::show_vpts, region_t::stream_hide_vpts, clut_union_t::u32, update_osd(), VO_CAP_CUSTOM_EXTENT_OVERLAY, osd_object_s::width, region_t::width, XINE_VERBOSITY_DEBUG, and xprintf.

Referenced by spudec_decode_data().

◆ dvb_spu_class_open_plugin()

static spu_decoder_t * dvb_spu_class_open_plugin ( spu_decoder_class_t * class_gen,
xine_stream_t * stream )
static

◆ init_spu_decoder_plugin()

static void * init_spu_decoder_plugin ( xine_t * xine,
const void * data )
static

◆ lookup_lut()

static const uint8_t * lookup_lut ( const dvbsub_func_t * dvbsub,
int r )
static

◆ next_datum()

static unsigned char next_datum ( dvbsub_func_t * dvbsub,
int width )
static

◆ plot()

static void plot ( dvbsub_func_t * dvbsub,
int r,
uint32_t run_length,
uint8_t pixel )
static

◆ process_alt_CLUT_segment()

static void process_alt_CLUT_segment ( dvbsub_func_t * dvbsub)
static

◆ process_CLUT_definition_segment()

static void process_CLUT_definition_segment ( dvbsub_func_t * dvbsub)
static

◆ process_display_definition_segment()

static void process_display_definition_segment ( dvbsub_func_t * dvbsub)
static

◆ process_object_data_segment()

static void process_object_data_segment ( dvbsub_func_t * dvbsub)
static

◆ process_page_composition_segment()

static void process_page_composition_segment ( dvbsub_func_t * dvbsub)
static

◆ process_pixel_data_sub_block()

static void process_pixel_data_sub_block ( dvbsub_func_t * dvbsub,
int r,
unsigned int pos,
int ofs,
int n )
static

◆ process_region_composition_segment()

static void process_region_composition_segment ( dvbsub_func_t * dvbsub)
static

◆ recalculate_trans()

static void recalculate_trans ( dvb_spu_decoder_t * this)
static

References _x_spu_dvb_opacity(), MAX_REGIONS, and v.

Referenced by spudec_decode_data().

◆ sparse_array_clear()

static void sparse_array_clear ( sparse_array_t * sa)
static

◆ sparse_array_delete()

static void sparse_array_delete ( sparse_array_t * sa)
static

◆ sparse_array_get()

static sparse_array_entry_t * sparse_array_get ( sparse_array_t * sa,
uint32_t key )
static

◆ sparse_array_new()

static void sparse_array_new ( sparse_array_t * sa)
static

◆ sparse_array_set()

static int sparse_array_set ( sparse_array_t * sa,
uint32_t key,
uint32_t value )
static

◆ sparse_array_unset()

static void sparse_array_unset ( sparse_array_t * sa,
uint32_t key,
uint32_t mask )
static

◆ spudec_decode_data()

static void spudec_decode_data ( spu_decoder_t * this_gen,
buf_element_t * buf )
static

◆ spudec_discontinuity()

static void spudec_discontinuity ( spu_decoder_t * this_gen)
static

◆ spudec_dispose()

static void spudec_dispose ( spu_decoder_t * this_gen)
static

◆ spudec_reset()

static void spudec_reset ( spu_decoder_t * this_gen)
static

◆ update_osd()

static void update_osd ( dvb_spu_decoder_t * this,
region_t * reg )
static

◆ update_region()

static void update_region ( region_t * reg,
uint32_t region_id,
int32_t region_width,
int32_t region_height,
int32_t fill_color )
static

Variable Documentation

◆ EXPORTED

const plugin_info_t xine_plugin_info [] EXPORTED
Initial value:
= {
}
static void * init_spu_decoder_plugin(xine_t *xine, const void *data)
Definition spudvb_decoder.c:1802
static const decoder_info_t spudec_info
Definition spudvb_decoder.c:1831
#define XINE_VERSION_CODE
Definition xine_internal.h:57
NULL
Definition xine_plugin.c:78
#define PLUGIN_NONE
Definition xine_plugin.h:29
#define PLUGIN_SPU_DECODER
Definition xine_plugin.h:34

◆ spudec_info

const decoder_info_t spudec_info
static
Initial value:
= {
.supported_types = supported_types,
.priority = 1,
}
static const uint32_t supported_types[]
Definition spudvb_decoder.c:1829

◆ supported_types

const uint32_t supported_types[] = { BUF_SPU_DVB, 0 }
static