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;
};
* @}
*/
-/**
- * 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.
*
* 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 );
}
/**
/*****************************************************************************
* 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 )
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 );