Commit 3d98df16 authored by Laurent Aimar's avatar Laurent Aimar

Fixed segfault with decoder_GetInputAttachments/GetDisplayDate/GetDisplayRate.

parent a0bc270c
......@@ -99,6 +99,22 @@ struct decoder_t
subpicture_t * ( * pf_spu_buffer_new) ( decoder_t * );
void ( * pf_spu_buffer_del) ( decoder_t *, subpicture_t * );
/*
* Owner fields
*/
/* Input attachments
* XXX use decoder_GetInputAttachments */
int (*pf_get_attachments)( decoder_t *p_dec, input_attachment_t ***ppp_attachment, int *pi_attachment );
/* Display date
* XXX use decoder_GetDisplayDate */
mtime_t (*pf_get_display_date)( decoder_t *, mtime_t );
/* Display rate
* XXX use decoder_GetDisplayRate */
int (*pf_get_display_rate)( decoder_t * );
/* Private structure for the owner of the decoder */
decoder_owner_sys_t *p_owner;
};
......@@ -147,13 +163,6 @@ struct encoder_t
* @}
*/
/**
* This function returns a specific input attachment (using its name).
*
* You MUST release the returned value.
*/
VLC_EXPORT( input_attachment_t *, decoder_GetInputAttachment, ( decoder_t *, const char *psz_name ) LIBVLC_USED );
/**
* This function gives all input attachments at once.
*
......
......@@ -162,50 +162,34 @@ struct decoder_owner_sys_t
* Public functions
*****************************************************************************/
/* decoder_GetInputAttachment:
*/
input_attachment_t *decoder_GetInputAttachment( decoder_t *p_dec,
const char *psz_name )
{
input_attachment_t *p_attachment;
if( input_Control( p_dec->p_owner->p_input, INPUT_GET_ATTACHMENT, &p_attachment, psz_name ) )
return NULL;
return p_attachment;
}
/* decoder_GetInputAttachments:
*/
int decoder_GetInputAttachments( decoder_t *p_dec,
input_attachment_t ***ppp_attachment,
int *pi_attachment )
{
return input_Control( p_dec->p_owner->p_input, INPUT_GET_ATTACHMENTS,
ppp_attachment, pi_attachment );
if( !p_dec->pf_get_attachments )
return VLC_EGENERIC;
return p_dec->pf_get_attachments( p_dec, ppp_attachment, pi_attachment );
}
/* decoder_GetDisplayDate:
*/
mtime_t decoder_GetDisplayDate( decoder_t *p_dec, mtime_t i_ts )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_mutex_lock( &p_owner->lock );
if( p_owner->b_buffering || p_owner->b_paused )
i_ts = 0;
vlc_mutex_unlock( &p_owner->lock );
if( !p_owner->p_clock || !i_ts )
return i_ts;
if( !p_dec->pf_get_display_date )
return 0;
return input_clock_GetTS( p_owner->p_clock, NULL, p_owner->p_input->i_pts_delay, i_ts );
return p_dec->pf_get_display_date( p_dec, i_ts );
}
/* decoder_GetDisplayRate:
*/
int decoder_GetDisplayRate( decoder_t *p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
if( !p_owner->p_clock )
if( !p_dec->pf_get_display_rate )
return INPUT_RATE_DEFAULT;
return input_clock_GetRate( p_owner->p_clock );
return p_dec->pf_get_display_rate( p_dec );
}
/**
......@@ -560,6 +544,35 @@ void input_DecoderFrameNext( decoder_t *p_dec, mtime_t *pi_duration )
/*****************************************************************************
* Internal functions
*****************************************************************************/
static int DecoderGetInputAttachments( decoder_t *p_dec,
input_attachment_t ***ppp_attachment,
int *pi_attachment )
{
return input_Control( p_dec->p_owner->p_input, INPUT_GET_ATTACHMENTS,
ppp_attachment, pi_attachment );
}
static mtime_t DecoderGetDisplayDate( decoder_t *p_dec, mtime_t i_ts )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
vlc_mutex_lock( &p_owner->lock );
if( p_owner->b_buffering || p_owner->b_paused )
i_ts = 0;
vlc_mutex_unlock( &p_owner->lock );
if( !p_owner->p_clock || !i_ts )
return i_ts;
return input_clock_GetTS( p_owner->p_clock, NULL, p_owner->p_input->i_pts_delay, i_ts );
}
static int DecoderGetDisplayRate( decoder_t *p_dec )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
if( !p_owner->p_clock )
return INPUT_RATE_DEFAULT;
return input_clock_GetRate( p_owner->p_clock );
}
/* */
static void DecoderUnsupportedCodec( decoder_t *p_dec, vlc_fourcc_t codec )
......@@ -642,6 +655,10 @@ static decoder_t * CreateDecoder( input_thread_t *p_input,
p_dec->pf_picture_unlink = vout_unlink_picture;
p_dec->pf_spu_buffer_new = spu_new_buffer;
p_dec->pf_spu_buffer_del = spu_del_buffer;
/* */
p_dec->pf_get_attachments = DecoderGetInputAttachments;
p_dec->pf_get_display_date = DecoderGetDisplayDate;
p_dec->pf_get_display_rate = DecoderGetDisplayRate;
vlc_object_attach( p_dec, p_input );
......
......@@ -79,7 +79,6 @@ date_Move
date_Set
decoder_GetDisplayDate
decoder_GetDisplayRate
decoder_GetInputAttachment
decoder_GetInputAttachments
decoder_SynchroChoose
decoder_SynchroDate
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment