[vlc-devel] commit: Fixed segfault with decoder_GetInputAttachments/GetDisplayDate/ GetDisplayRate. (Laurent Aimar )
git version control
git at videolan.org
Thu Oct 23 20:31:36 CEST 2008
vlc | branch: master | Laurent Aimar <fenrir at videolan.org> | Thu Oct 23 20:30:35 2008 +0200| [3d98df168373b402f246a9b5702f27cea73fb953] | committer: Laurent Aimar
Fixed segfault with decoder_GetInputAttachments/GetDisplayDate/GetDisplayRate.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=3d98df168373b402f246a9b5702f27cea73fb953
---
include/vlc_codec.h | 23 ++++++++++++-----
src/input/decoder.c | 69 +++++++++++++++++++++++++++++++-------------------
src/libvlccore.sym | 1 -
3 files changed, 59 insertions(+), 34 deletions(-)
diff --git a/include/vlc_codec.h b/include/vlc_codec.h
index d4165a7..a60bc3b 100644
--- a/include/vlc_codec.h
+++ b/include/vlc_codec.h
@@ -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;
};
@@ -148,13 +164,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.
*
* You MUST release the returned values
diff --git a/src/input/decoder.c b/src/input/decoder.c
index 1542858..f0f4d33 100644
--- a/src/input/decoder.c
+++ b/src/input/decoder.c
@@ -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 );
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 8c61949..ef6e2f7 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -79,7 +79,6 @@ date_Move
date_Set
decoder_GetDisplayDate
decoder_GetDisplayRate
-decoder_GetInputAttachment
decoder_GetInputAttachments
decoder_SynchroChoose
decoder_SynchroDate
More information about the vlc-devel
mailing list