- 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 )
-{
- if (codec != VLC_FOURCC('u','n','d','f')) {
- const char *desc = vlc_fourcc_GetDescription(p_dec->fmt_in.i_cat, codec);
- if (!desc || !*desc)
- desc = N_("No description for this codec");
- msg_Err( p_dec, "Codec `%4.4s' (%s) is not supported.", (char*)&codec, desc );
- dialog_Fatal( p_dec, _("Codec not supported"),
- _("VLC could not decode the format \"%4.4s\" (%s)"),
- (char*)&codec, desc );
- } else {
- msg_Err( p_dec, "could not identify codec" );
- dialog_Fatal( p_dec, _("Unidentified codec"),
- _("VLC could not identify the audio or video codec" ) );
- }
-}
-
-
-/**
- * Create a decoder object
- *
- * \param p_input the input thread
- * \param p_es the es descriptor
- * \param b_packetizer instead of a decoder
- * \return the decoder object
- */
-static decoder_t * CreateDecoder( vlc_object_t *p_parent,
- input_thread_t *p_input,
- const es_format_t *fmt, bool b_packetizer,
- input_resource_t *p_resource,
- sout_instance_t *p_sout )
-{
- decoder_t *p_dec;
- decoder_owner_sys_t *p_owner;
- es_format_t null_es_format;
-
- p_dec = vlc_custom_create( p_parent, sizeof( *p_dec ), "decoder" );
- if( p_dec == NULL )
- return NULL;
-
- p_dec->pf_decode_audio = NULL;
- p_dec->pf_decode_video = NULL;
- p_dec->pf_decode_sub = NULL;
- p_dec->pf_get_cc = NULL;
- p_dec->pf_packetize = NULL;
-
- /* Initialize the decoder */
- p_dec->p_module = NULL;
-
- memset( &null_es_format, 0, sizeof(es_format_t) );
- es_format_Copy( &p_dec->fmt_in, fmt );
- es_format_Copy( &p_dec->fmt_out, &null_es_format );
-
- p_dec->p_description = NULL;
-
- /* Allocate our private structure for the decoder */
- p_dec->p_owner = p_owner = malloc( sizeof( decoder_owner_sys_t ) );
- if( unlikely(p_owner == NULL) )
- {
- vlc_object_release( p_dec );
- return NULL;
- }
- p_owner->i_preroll_end = VLC_TS_INVALID;
- p_owner->i_last_rate = INPUT_RATE_DEFAULT;
- p_owner->p_input = p_input;
- p_owner->p_resource = p_resource;
- p_owner->p_aout = NULL;
- p_owner->p_vout = NULL;
- p_owner->p_spu_vout = NULL;
- p_owner->i_spu_channel = 0;
- p_owner->i_spu_order = 0;
- p_owner->p_sout = p_sout;
- p_owner->p_sout_input = NULL;
- p_owner->p_packetizer = NULL;
- p_owner->b_packetizer = b_packetizer;
- es_format_Init( &p_owner->fmt, UNKNOWN_ES, 0 );
-
- /* decoder fifo */
- p_owner->p_fifo = block_FifoNew();
- if( unlikely(p_owner->p_fifo == NULL) )
- {
- free( p_owner );
- vlc_object_release( p_dec );
- return NULL;
- }
-
- /* Set buffers allocation callbacks for the decoders */
- p_dec->pf_aout_format_update = aout_update_format;
- p_dec->pf_vout_format_update = vout_update_format;
- p_dec->pf_vout_buffer_new = vout_new_buffer;
- p_dec->pf_spu_buffer_new = spu_new_buffer;
- /* */
- p_dec->pf_get_attachments = DecoderGetInputAttachments;
- p_dec->pf_get_display_date = DecoderGetDisplayDate;
- p_dec->pf_get_display_rate = DecoderGetDisplayRate;
-
- /* Find a suitable decoder/packetizer module */
- if( !b_packetizer )
- p_dec->p_module = module_need( p_dec, "decoder", "$codec", false );
- else
- p_dec->p_module = module_need( p_dec, "packetizer", "$packetizer", false );
-
- /* Check if decoder requires already packetized data */
- if( !b_packetizer &&
- p_dec->b_need_packetized && !p_dec->fmt_in.b_packetized )
- {
- p_owner->p_packetizer =
- vlc_custom_create( p_parent, sizeof( decoder_t ), "packetizer" );
- if( p_owner->p_packetizer )
- {
- es_format_Copy( &p_owner->p_packetizer->fmt_in,
- &p_dec->fmt_in );
-
- es_format_Copy( &p_owner->p_packetizer->fmt_out,
- &null_es_format );
-
- p_owner->p_packetizer->p_module =
- module_need( p_owner->p_packetizer,
- "packetizer", "$packetizer", false );
-
- if( !p_owner->p_packetizer->p_module )
- {
- es_format_Clean( &p_owner->p_packetizer->fmt_in );
- vlc_object_release( p_owner->p_packetizer );
- p_owner->p_packetizer = NULL;
- }
- }
- }
-
- /* Copy ourself the input replay gain */
- if( fmt->i_cat == AUDIO_ES )