#include <vlc_sout.h>
#include <vlc_codec.h>
#include <vlc_osd.h>
+#include <vlc_meta.h>
#include <vlc_interface.h>
#include "audio_output/aout_internal.h"
/* */
bool b_fmt_description;
es_format_t fmt_description;
+ vlc_meta_t *p_description;
/* fifo */
block_fifo_t *p_fifo;
vlc_mutex_unlock( &p_owner->lock );
}
-bool input_DecoderHasFormatChanged( decoder_t *p_dec, es_format_t *p_fmt )
+bool input_DecoderHasFormatChanged( decoder_t *p_dec, es_format_t *p_fmt, vlc_meta_t **pp_meta )
{
decoder_owner_sys_t *p_owner = p_dec->p_owner;
bool b_changed;
{
if( p_fmt )
es_format_Copy( p_fmt, &p_owner->fmt_description );
+
+ if( pp_meta )
+ {
+ *pp_meta = NULL;
+ if( p_owner->p_description )
+ {
+ *pp_meta = vlc_meta_New();
+ if( *pp_meta )
+ vlc_meta_Merge( *pp_meta, p_owner->p_description );
+ }
+ }
p_owner->b_fmt_description = false;
}
vlc_mutex_unlock( &p_owner->lock );
p_owner->b_fmt_description = false;
es_format_Init( &p_owner->fmt_description, UNKNOWN_ES, 0 );
+ p_owner->p_description = NULL;
p_owner->b_paused = false;
p_owner->pause.i_date = 0;
if( p_dec->p_description )
vlc_meta_Delete( p_dec->p_description );
es_format_Clean( &p_owner->fmt_description );
+ if( p_owner->p_description )
+ vlc_meta_Delete( p_owner->p_description );
if( p_owner->p_packetizer )
{
vlc_assert_locked( &p_owner->lock );
- es_format_Clean( &p_owner->fmt_description );
-
p_owner->b_fmt_description = true;
+
+ /* Copy es_format */
+ es_format_Clean( &p_owner->fmt_description );
es_format_Copy( &p_owner->fmt_description, &p_dec->fmt_out );
+
+ /* Move p_description */
+ if( p_owner->p_description && p_dec->p_description )
+ vlc_meta_Delete( p_owner->p_description );
+ p_owner->p_description = p_dec->p_description;
+ p_dec->p_description = NULL;
}
static vout_thread_t *aout_request_vout( void *p_private,
vout_thread_t *p_vout, video_format_t *p_fmt )
void input_DecoderFrameNext( decoder_t *p_dec, mtime_t *pi_duration );
/**
- * This function will return true if the ES format has changed since the last call
- * and will do a copy of the current es_format_t if p_fmt is not NULL. This copy
- * MUST be free by es_format_Clean.
- * Otherwise it will return false and will not initialize p_fmt.
+ * This function will return true if the ES format or meta data have changed since
+ * the last call. In which case, it will do a copy of the current es_format_t if p_fmt
+ * is not NULL and will do a copy of the current description if pp_meta is non NULL.
+ * The es_format_t MUST be freed by es_format_Clean and *pp_meta MUST be freed by
+ * vlc_meta_Delete.
+ * Otherwise it will return false and will not initialize p_fmt and *pp_meta.
*/
-bool input_DecoderHasFormatChanged( decoder_t *p_dec, es_format_t *p_fmt );
+bool input_DecoderHasFormatChanged( decoder_t *p_dec, es_format_t *p_fmt, vlc_meta_t **pp_meta );
#endif
static void EsOutDelete ( es_out_t * );
static void EsOutSelect( es_out_t *, es_out_id_t *es, bool b_force );
-static void EsOutUpdateInfo( es_out_t *, es_out_id_t *es, const es_format_t * );
+static void EsOutUpdateInfo( es_out_t *, es_out_id_t *es, const es_format_t *, const vlc_meta_t * );
static int EsOutSetRecord( es_out_t *, bool b_record );
static bool EsIsSelected( es_out_id_t *es );
break;
}
- EsOutUpdateInfo( out, es, &es->fmt );
+ EsOutUpdateInfo( out, es, &es->fmt, NULL );
vlc_mutex_unlock( &p_sys->lock );
input_DecoderDecode( es->p_dec, p_block );
es_format_t fmt_dsc;
- if( input_DecoderHasFormatChanged( es->p_dec, &fmt_dsc ) )
+ vlc_meta_t *p_meta_dsc;
+ if( input_DecoderHasFormatChanged( es->p_dec, &fmt_dsc, &p_meta_dsc ) )
{
- EsOutUpdateInfo( out, es, &fmt_dsc );
+ EsOutUpdateInfo( out, es, &fmt_dsc, p_meta_dsc );
+
es_format_Clean( &fmt_dsc );
+ if( p_meta_dsc )
+ vlc_meta_Delete( p_meta_dsc );
}
/* Check CC status */
* EsOutUpdateInfo:
* - add meta info to the playlist item
****************************************************************************/
-static void EsOutUpdateInfo( es_out_t *out, es_out_id_t *es, const es_format_t *fmt )
+static void EsOutUpdateInfo( es_out_t *out, es_out_id_t *es, const es_format_t *fmt, const vlc_meta_t *p_meta )
{
es_out_sys_t *p_sys = out->p_sys;
input_thread_t *p_input = p_sys->p_input;
break;
}
+ /* Append generic meta */
+ if( p_meta )
+ {
+ char **ppsz_all_keys = vlc_dictionary_all_keys( &p_meta->extra_tags );
+ for( int i = 0; ppsz_all_keys && ppsz_all_keys[i]; i++ )
+ {
+ char *psz_key = ppsz_all_keys[i];
+ char *psz_value = vlc_dictionary_value_for_key( &p_meta->extra_tags, psz_key );
+
+ if( psz_value )
+ input_Control( p_input, INPUT_ADD_INFO, psz_cat, _(psz_key), _(psz_value) );
+ free( psz_key );
+ }
+ free( ppsz_all_keys );
+ }
+
free( psz_cat );
}