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 ...@@ -99,6 +99,22 @@ struct decoder_t
subpicture_t * ( * pf_spu_buffer_new) ( decoder_t * ); subpicture_t * ( * pf_spu_buffer_new) ( decoder_t * );
void ( * pf_spu_buffer_del) ( decoder_t *, subpicture_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 */ /* Private structure for the owner of the decoder */
decoder_owner_sys_t *p_owner; decoder_owner_sys_t *p_owner;
}; };
...@@ -147,13 +163,6 @@ struct encoder_t ...@@ -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. * This function gives all input attachments at once.
* *
......
...@@ -162,50 +162,34 @@ struct decoder_owner_sys_t ...@@ -162,50 +162,34 @@ struct decoder_owner_sys_t
* Public functions * 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: /* decoder_GetInputAttachments:
*/ */
int decoder_GetInputAttachments( decoder_t *p_dec, int decoder_GetInputAttachments( decoder_t *p_dec,
input_attachment_t ***ppp_attachment, input_attachment_t ***ppp_attachment,
int *pi_attachment ) int *pi_attachment )
{ {
return input_Control( p_dec->p_owner->p_input, INPUT_GET_ATTACHMENTS, if( !p_dec->pf_get_attachments )
ppp_attachment, pi_attachment ); return VLC_EGENERIC;
return p_dec->pf_get_attachments( p_dec, ppp_attachment, pi_attachment );
} }
/* decoder_GetDisplayDate: /* decoder_GetDisplayDate:
*/ */
mtime_t decoder_GetDisplayDate( decoder_t *p_dec, mtime_t i_ts ) mtime_t decoder_GetDisplayDate( decoder_t *p_dec, mtime_t i_ts )
{ {
decoder_owner_sys_t *p_owner = p_dec->p_owner; if( !p_dec->pf_get_display_date )
return 0;
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 ); return p_dec->pf_get_display_date( p_dec, i_ts );
} }
/* decoder_GetDisplayRate: /* decoder_GetDisplayRate:
*/ */
int decoder_GetDisplayRate( decoder_t *p_dec ) int decoder_GetDisplayRate( decoder_t *p_dec )
{ {
decoder_owner_sys_t *p_owner = p_dec->p_owner; if( !p_dec->pf_get_display_rate )
if( !p_owner->p_clock )
return INPUT_RATE_DEFAULT; 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 ) ...@@ -560,6 +544,35 @@ void input_DecoderFrameNext( decoder_t *p_dec, mtime_t *pi_duration )
/***************************************************************************** /*****************************************************************************
* Internal functions * 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 ) static void DecoderUnsupportedCodec( decoder_t *p_dec, vlc_fourcc_t codec )
...@@ -642,6 +655,10 @@ static decoder_t * CreateDecoder( input_thread_t *p_input, ...@@ -642,6 +655,10 @@ static decoder_t * CreateDecoder( input_thread_t *p_input,
p_dec->pf_picture_unlink = vout_unlink_picture; p_dec->pf_picture_unlink = vout_unlink_picture;
p_dec->pf_spu_buffer_new = spu_new_buffer; p_dec->pf_spu_buffer_new = spu_new_buffer;
p_dec->pf_spu_buffer_del = spu_del_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 ); vlc_object_attach( p_dec, p_input );
......
...@@ -79,7 +79,6 @@ date_Move ...@@ -79,7 +79,6 @@ date_Move
date_Set date_Set
decoder_GetDisplayDate decoder_GetDisplayDate
decoder_GetDisplayRate decoder_GetDisplayRate
decoder_GetInputAttachment
decoder_GetInputAttachments decoder_GetInputAttachments
decoder_SynchroChoose decoder_SynchroChoose
decoder_SynchroDate 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