VLC 4.0.0-dev
vout_subpictures.c File Reference
Include dependency graph for vout_subpictures.c:

Data Structures

struct  spu_render_entry_t
 
struct  spu_render_vector
 
struct  spu_channel
 
struct  spu_channel_vector
 
struct  spu_prerender_vector
 
struct  spu_private_t
 
struct  spu_scale_t
 
struct  spu_area_t
 A few area functions helpers. More...
 

Macros

#define SPU_CHROMALIST_COUNT   8
 
#define SCALE_UNIT   (10000)
 A few scale functions helpers. More...
 

Functions

static void spu_PrerenderSync (spu_private_t *, const subpicture_t *)
 
static void spu_PrerenderCancel (spu_private_t *, const subpicture_t *)
 
static void spu_channel_Init (struct spu_channel *channel, size_t id, enum vlc_vout_order order, vlc_clock_t *clock)
 
static int spu_channel_Push (struct spu_channel *channel, subpicture_t *subpic, vlc_tick_t orgstart, vlc_tick_t orgstop)
 
static void spu_channel_DeleteAt (struct spu_channel *channel, size_t index)
 
static void spu_channel_Clean (spu_private_t *sys, struct spu_channel *channel)
 
static struct spu_channelspu_GetChannel (spu_t *spu, size_t channel_id)
 
static ssize_t spu_GetFreeChannelId (spu_t *spu, enum vlc_vout_order *order)
 
static void FilterRelease (filter_t *filter)
 
static int spu_get_attachments (filter_t *filter, input_attachment_t ***attachment_ptr, int *attachment_count)
 
static filter_tSpuRenderCreateAndLoadText (spu_t *spu)
 
static filter_tSpuRenderCreateAndLoadScale (vlc_object_t *object, vlc_fourcc_t src_chroma, vlc_fourcc_t dst_chroma, bool require_resize)
 
static int SpuRenderText (spu_t *spu, subpicture_region_t *region, int i_original_width, int i_original_height, const vlc_fourcc_t *chroma_list)
 
static spu_scale_t spu_scale_create (int w, int h)
 
static spu_scale_t spu_scale_unit (void)
 
static spu_scale_t spu_scale_createq (int64_t wn, int64_t wd, int64_t hn, int64_t hd)
 
static int spu_scale_w (int v, const spu_scale_t s)
 
static int spu_scale_h (int v, const spu_scale_t s)
 
static int spu_invscale_w (int v, const spu_scale_t s)
 
static int spu_invscale_h (int v, const spu_scale_t s)
 
static spu_area_t spu_area_create (int x, int y, int w, int h, spu_scale_t s)
 
static spu_area_t spu_area_scaled (spu_area_t a)
 
static spu_area_t spu_area_unscaled (spu_area_t a, spu_scale_t s)
 
static bool spu_area_overlap (spu_area_t a, spu_area_t b)
 
static void SpuAreaFixOverlap (spu_area_t *dst, const spu_area_t *sub_array, size_t sub_count, int align)
 Avoid area overlapping. More...
 
static void SpuAreaFitInside (spu_area_t *area, const spu_area_t *boundary)
 
static void SpuRegionPlace (int *x, int *y, const subpicture_t *subpic, const subpicture_region_t *region, int i_align)
 Place a region. More...
 
static int IntegerCmp (int64_t i0, int64_t i1)
 This function compares two 64 bits integers. More...
 
static int SSizeCmp (ssize_t i0, ssize_t i1)
 
static int SpuRenderCmp (const void *s0, const void *s1)
 This function compares 2 subpictures using the following properties (ordered by priority) More...
 
static size_t spu_channel_UpdateDates (struct spu_channel *channel, vlc_tick_t system_now)
 
static bool spu_render_entry_IsSelected (spu_render_entry_t *render_entry, size_t channel_id, vlc_tick_t render_date, bool ignore_osd)
 
static spu_render_entry_tspu_SelectSubpictures (spu_t *spu, vlc_tick_t system_now, vlc_tick_t render_subtitle_date, bool ignore_osd, size_t *subpicture_count)
 
static void SpuRenderRegion (spu_t *spu, subpicture_region_t **dst_ptr, spu_area_t *dst_area, const spu_render_entry_t *entry, subpicture_region_t *region, const spu_scale_t scale_size, const vlc_fourcc_t *chroma_list, const video_format_t *fmt, int i_original_width, int i_original_height, const spu_area_t *subtitle_area, size_t subtitle_area_count, vlc_tick_t render_date)
 It will transform the provided region into another region suitable for rendering. More...
 
static subpicture_tSpuRenderSubpictures (spu_t *spu, size_t i_subpicture, const spu_render_entry_t *p_entries, const vlc_fourcc_t *chroma_list, const video_format_t *fmt_dst, const video_format_t *fmt_src, vlc_tick_t system_now, vlc_tick_t render_subtitle_date, bool external_scale)
 This function renders all sub picture units in the list. More...
 
static void UpdateSPU (spu_t *spu, const vlc_spu_highlight_t *hl)
 
static subpicture_tsub_new_buffer (filter_t *filter)
 
static int SubSourceInit (filter_t *filter, void *data)
 
static int SubSourceClean (filter_t *filter, void *data)
 
static int RestartSubFilterCallback (vlc_object_t *obj, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data)
 
static int SubFilterAddProxyCallbacks (filter_t *filter, void *opaque)
 
static int SubFilterDelProxyCallbacks (filter_t *filter, void *opaque)
 
static int RestartSubSourceCallback (vlc_object_t *obj, char const *psz_var, vlc_value_t oldval, vlc_value_t newval, void *p_data)
 
static int SubSourceAddProxyCallbacks (filter_t *filter, void *opaque)
 
static int SubSourceDelProxyCallbacks (filter_t *filter, void *opaque)
 
static void spu_PrerenderWake (spu_private_t *sys, const video_format_t *fmt_dst, const video_format_t *fmt_src, const vlc_fourcc_t *chroma_list)
 
static void spu_PrerenderEnqueue (spu_private_t *sys, subpicture_t *p_subpic)
 
static void spu_PrerenderPause (spu_private_t *sys)
 
static void spu_PrerenderText (spu_t *spu, subpicture_t *p_subpic, video_format_t *fmtsrc, video_format_t *fmtdst, vlc_fourcc_t *chroma_list)
 
static void * spu_PrerenderThread (void *priv)
 
static void spu_Cleanup (spu_t *spu)
 
void spu_Destroy (spu_t *spu)
 Destroy the subpicture unit. More...
 
spu_tspu_Create (vlc_object_t *object, vout_thread_t *vout)
 Creates the subpicture unit. More...
 
void spu_Attach (spu_t *spu, input_thread_t *input)
 Attach the SPU to an input. More...
 
void spu_Detach (spu_t *spu)
 Detach the SPU from its attached input. More...
 
void spu_SetClockDelay (spu_t *spu, size_t channel_id, vlc_tick_t delay)
 
void spu_SetClockRate (spu_t *spu, size_t channel_id, float rate)
 
void spu_PutSubpicture (spu_t *spu, subpicture_t *subpic)
 Display a subpicture. More...
 
subpicture_tspu_Render (spu_t *spu, const vlc_fourcc_t *chroma_list, const video_format_t *fmt_dst, const video_format_t *fmt_src, vlc_tick_t system_now, vlc_tick_t render_subtitle_date, bool ignore_osd, bool external_scale)
 This function will return an unique subpicture containing the OSD and subtitles visible at the requested date. More...
 
ssize_t spu_RegisterChannelInternal (spu_t *spu, vlc_clock_t *clock, enum vlc_vout_order *order)
 
ssize_t spu_RegisterChannel (spu_t *spu)
 It registers a new SPU channel. More...
 
static void spu_channel_Clear (spu_private_t *sys, struct spu_channel *channel)
 
void spu_ClearChannel (spu_t *spu, size_t channel_id)
 It clears all subpictures associated to a SPU channel. More...
 
void spu_UnregisterChannel (spu_t *spu, size_t channel_id)
 
void spu_ChangeSources (spu_t *spu, const char *filters)
 It changes the sub sources list. More...
 
void spu_ChangeFilters (spu_t *spu, const char *filters)
 It changes the sub filters list. More...
 
void spu_ChangeChannelOrderMargin (spu_t *spu, enum vlc_vout_order order, int margin)
 
void spu_SetHighlight (spu_t *spu, const vlc_spu_highlight_t *hl)
 

Variables

static const struct filter_subpicture_callbacks sub_cbs
 

Macro Definition Documentation

◆ SCALE_UNIT

#define SCALE_UNIT   (10000)

A few scale functions helpers.

◆ SPU_CHROMALIST_COUNT

#define SPU_CHROMALIST_COUNT   8

Function Documentation

◆ FilterRelease()

static void FilterRelease ( filter_t filter)
static

◆ IntegerCmp()

static int IntegerCmp ( int64_t  i0,
int64_t  i1 
)
static

This function compares two 64 bits integers.

It can be used by qsort.

Referenced by SpuRenderCmp().

◆ RestartSubFilterCallback()

static int RestartSubFilterCallback ( vlc_object_t obj,
char const *  psz_var,
vlc_value_t  oldval,
vlc_value_t  newval,
void *  p_data 
)
static

◆ RestartSubSourceCallback()

static int RestartSubSourceCallback ( vlc_object_t obj,
char const *  psz_var,
vlc_value_t  oldval,
vlc_value_t  newval,
void *  p_data 
)
static

◆ spu_area_create()

static spu_area_t spu_area_create ( int  x,
int  y,
int  w,
int  h,
spu_scale_t  s 
)
static

References spu_area_t::x.

Referenced by SpuRenderRegion().

◆ spu_area_overlap()

static bool spu_area_overlap ( spu_area_t  a,
spu_area_t  b 
)
static

◆ spu_area_scaled()

◆ spu_area_unscaled()

◆ spu_Attach()

◆ spu_ChangeChannelOrderMargin()

◆ spu_channel_Clean()

◆ spu_channel_Clear()

◆ spu_channel_DeleteAt()

static void spu_channel_DeleteAt ( struct spu_channel channel,
size_t  index 
)
static

◆ spu_channel_Init()

static void spu_channel_Init ( struct spu_channel channel,
size_t  id,
enum vlc_vout_order  order,
vlc_clock_t clock 
)
static

◆ spu_channel_Push()

static int spu_channel_Push ( struct spu_channel channel,
subpicture_t subpic,
vlc_tick_t  orgstart,
vlc_tick_t  orgstop 
)
static

◆ spu_channel_UpdateDates()

◆ spu_Cleanup()

◆ spu_Detach()

void spu_Detach ( spu_t spu)

Detach the SPU from its attached input.

References spu_private_t::input, spu_private_t::lock, spu_t::p, spu_PrerenderPause(), vlc_mutex_lock(), and vlc_mutex_unlock().

Referenced by vout_ReleaseDisplay().

◆ spu_get_attachments()

static int spu_get_attachments ( filter_t filter,
input_attachment_t ***  attachment_ptr,
int *  attachment_count 
)
static

◆ spu_GetChannel()

◆ spu_GetFreeChannelId()

◆ spu_invscale_h()

static int spu_invscale_h ( int  v,
const spu_scale_t  s 
)
static

References spu_scale_t::h, and SCALE_UNIT.

Referenced by spu_area_unscaled(), and SpuRenderRegion().

◆ spu_invscale_w()

static int spu_invscale_w ( int  v,
const spu_scale_t  s 
)
static

References SCALE_UNIT, and spu_scale_t::w.

Referenced by spu_area_unscaled().

◆ spu_PrerenderCancel()

◆ spu_PrerenderEnqueue()

◆ spu_PrerenderPause()

◆ spu_PrerenderSync()

◆ spu_PrerenderText()

◆ spu_PrerenderThread()

◆ spu_PrerenderWake()

◆ spu_RegisterChannelInternal()

◆ spu_render_entry_IsSelected()

static bool spu_render_entry_IsSelected ( spu_render_entry_t render_entry,
size_t  channel_id,
vlc_tick_t  render_date,
bool  ignore_osd 
)
static

◆ spu_scale_create()

static spu_scale_t spu_scale_create ( int  w,
int  h 
)
static

◆ spu_scale_createq()

static spu_scale_t spu_scale_createq ( int64_t  wn,
int64_t  wd,
int64_t  hn,
int64_t  hd 
)
static

References SCALE_UNIT, and spu_scale_create().

Referenced by SpuRenderSubpictures().

◆ spu_scale_h()

static int spu_scale_h ( int  v,
const spu_scale_t  s 
)
static

References spu_scale_t::h, and SCALE_UNIT.

Referenced by spu_area_scaled(), and SpuRenderRegion().

◆ spu_scale_unit()

static spu_scale_t spu_scale_unit ( void  )
static

References SCALE_UNIT, and spu_scale_create().

Referenced by spu_area_scaled(), and SpuRenderRegion().

◆ spu_scale_w()

static int spu_scale_w ( int  v,
const spu_scale_t  s 
)
static

References SCALE_UNIT, and spu_scale_t::w.

Referenced by spu_area_scaled(), and SpuRenderRegion().

◆ spu_SelectSubpictures()

◆ spu_SetClockDelay()

void spu_SetClockDelay ( spu_t spu,
size_t  channel_id,
vlc_tick_t  delay 
)

◆ spu_SetClockRate()

void spu_SetClockRate ( spu_t spu,
size_t  channel_id,
float  rate 
)

◆ spu_SetHighlight()

void spu_SetHighlight ( spu_t spu,
const vlc_spu_highlight_t hl 
)

◆ SpuAreaFitInside()

static void SpuAreaFitInside ( spu_area_t area,
const spu_area_t boundary 
)
static

◆ SpuAreaFixOverlap()

static void SpuAreaFixOverlap ( spu_area_t dst,
const spu_area_t sub_array,
size_t  sub_count,
int  align 
)
static

◆ SpuRegionPlace()

◆ SpuRenderCmp()

static int SpuRenderCmp ( const void *  s0,
const void *  s1 
)
static

This function compares 2 subpictures using the following properties (ordered by priority)

  1. absolute positioning
  2. start time (display time)
  3. creation order (per channel)

It can be used by qsort.

XXX spu_RenderSubpictures depends heavily on this order.

References subpicture_t::b_absolute, subpicture_t::i_channel, subpicture_t::i_order, subpicture_t::i_start, IntegerCmp(), SSizeCmp(), and spu_render_entry_t::subpic.

Referenced by spu_Render().

◆ SpuRenderCreateAndLoadScale()

◆ SpuRenderCreateAndLoadText()

◆ SpuRenderRegion()

static void SpuRenderRegion ( spu_t spu,
subpicture_region_t **  dst_ptr,
spu_area_t dst_area,
const spu_render_entry_t entry,
subpicture_region_t region,
const spu_scale_t  scale_size,
const vlc_fourcc_t chroma_list,
const video_format_t fmt,
int  i_original_width,
int  i_original_height,
const spu_area_t subtitle_area,
size_t  subtitle_area_count,
vlc_tick_t  render_date 
)
static

It will transform the provided region into another region suitable for rendering.

References subpicture_t::b_absolute, subpicture_t::b_fade, subpicture_t::b_subtitle, spu_private_t::crop, vlc_filter_operations::filter_video, subpicture_region_t::fmt, subpicture_region_private_t::fmt, filter_t::fmt_in, filter_t::fmt_out, spu_private_t::force_crop, picture_t::format, spu_scale_t::h, spu_private_t::height, subpicture_region_t::i_align, subpicture_region_t::i_alpha, subpicture_t::i_alpha, video_format_t::i_chroma, es_format_t::i_codec, video_palette_t::i_entries, video_format_t::i_height, subpicture_region_t::i_max_height, subpicture_region_t::i_max_width, subpicture_t::i_start, subpicture_t::i_stop, video_format_t::i_visible_height, video_format_t::i_visible_width, video_format_t::i_width, subpicture_region_t::i_x, video_format_t::i_x_offset, subpicture_region_t::i_y, video_format_t::i_y_offset, spu_private_t::margin, msg_Err, msg_Warn, filter_t::ops, spu_t::p, video_format_t::p_palette, subpicture_region_t::p_picture, subpicture_region_private_t::p_picture, subpicture_region_t::p_private, video_palette_t::palette, spu_private_t::palette, picture_HasChainedPics(), picture_Hold(), picture_Release(), spu_private_t::scale, spu_area_t::scale, SCALE_UNIT, spu_private_t::scale_yuvp, spu_private_t::secondary_alignment, spu_private_t::secondary_margin, spu_area_create(), spu_invscale_h(), spu_scale_h(), spu_scale_unit(), spu_scale_w(), SpuAreaFitInside(), SpuAreaFixOverlap(), SpuRegionPlace(), SpuRenderText(), subpicture_region_NewInternal(), subpicture_region_private_Delete(), subpicture_region_private_New(), es_format_t::video, video_format_AdjustColorSpace(), VLC_CODEC_TEXT, VLC_CODEC_YUVP, VLC_SUCCESS, VLC_VOUT_ORDER_SECONDARY, spu_scale_t::w, spu_private_t::width, spu_private_t::x, spu_area_t::x, spu_private_t::y, and spu_area_t::y.

Referenced by SpuRenderSubpictures().

◆ SpuRenderSubpictures()

◆ SpuRenderText()

◆ SSizeCmp()

static int SSizeCmp ( ssize_t  i0,
ssize_t  i1 
)
static

Referenced by SpuRenderCmp().

◆ sub_new_buffer()

static subpicture_t * sub_new_buffer ( filter_t filter)
static

◆ SubFilterAddProxyCallbacks()

static int SubFilterAddProxyCallbacks ( filter_t filter,
void *  opaque 
)
static

◆ SubFilterDelProxyCallbacks()

static int SubFilterDelProxyCallbacks ( filter_t filter,
void *  opaque 
)
static

◆ SubSourceAddProxyCallbacks()

static int SubSourceAddProxyCallbacks ( filter_t filter,
void *  opaque 
)
static

◆ SubSourceClean()

static int SubSourceClean ( filter_t filter,
void *  data 
)
static

◆ SubSourceDelProxyCallbacks()

static int SubSourceDelProxyCallbacks ( filter_t filter,
void *  opaque 
)
static

◆ SubSourceInit()

static int SubSourceInit ( filter_t filter,
void *  data 
)
static

◆ UpdateSPU()

Variable Documentation

◆ sub_cbs

const struct filter_subpicture_callbacks sub_cbs
static
Initial value:
= {
}
static subpicture_t * sub_new_buffer(filter_t *filter)
Definition: vout_subpictures.c:1324

Referenced by SubSourceInit().