From: Laurent Aimar Date: Fri, 29 Aug 2003 19:49:33 +0000 (+0000) Subject: * asf: you can now add 'title', 'author', 'copyright', 'comment, 'rating' X-Git-Tag: 0.7.0~1009 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;ds=sidebyside;h=ecc97852f9a6cc897b7cda59771d7c2cc0234498;p=vlc * asf: you can now add 'title', 'author', 'copyright', 'comment, 'rating' meta data to your file. (use asf{title="my title"} for example) * standard: do not trash access/mux arguments when fixing. --- diff --git a/modules/mux/asf.c b/modules/mux/asf.c index 71f7908561..bcb0c6c489 100644 --- a/modules/mux/asf.c +++ b/modules/mux/asf.c @@ -2,7 +2,7 @@ * asf.c ***************************************************************************** * Copyright (C) 2003 VideoLAN - * $Id: asf.c,v 1.6 2003/08/29 01:11:43 fenrir Exp $ + * $Id: asf.c,v 1.7 2003/08/29 19:49:33 fenrir Exp $ * * Authors: Laurent Aimar * @@ -99,6 +99,13 @@ struct sout_mux_sys_t vlc_bool_t b_asf_http; int i_seq; + + /* meta data */ + char *psz_title; + char *psz_author; + char *psz_copyright; + char *psz_comment; + char *psz_rating; }; static int MuxGetStream( sout_mux_t *, int *pi_stream, mtime_t *pi_dts ); @@ -167,7 +174,36 @@ static int Open( vlc_object_t *p_this ) { p_sys->fid.v4[i] = ( (uint64_t)rand() << 8 ) / RAND_MAX; } - + /* meta data */ + p_sys->psz_title = sout_cfg_find_value( p_mux->p_cfg, "title" ); + p_sys->psz_author = sout_cfg_find_value( p_mux->p_cfg, "author" ); + p_sys->psz_copyright= sout_cfg_find_value( p_mux->p_cfg, "copyright" ); + p_sys->psz_comment = sout_cfg_find_value( p_mux->p_cfg, "comment" ); + p_sys->psz_rating = sout_cfg_find_value( p_mux->p_cfg, "rating" ); + if( p_sys->psz_title == NULL ) + { + p_sys->psz_title = ""; + } + if( p_sys->psz_author == NULL ) + { + p_sys->psz_author = ""; + } + if( p_sys->psz_copyright == NULL ) + { + p_sys->psz_copyright = ""; + } + if( p_sys->psz_comment == NULL ) + { + p_sys->psz_comment = ""; + } + if( p_sys->psz_rating == NULL ) + { + p_sys->psz_rating = ""; + } + msg_Dbg( p_mux, + "meta data: title='%s' author='%s' copyright='%s' comment='%s' rating='%s'", + p_sys->psz_title, p_sys->psz_author, p_sys->psz_copyright, + p_sys->psz_comment, p_sys->psz_rating ); return VLC_SUCCESS; } @@ -616,6 +652,21 @@ static void bo_addle_str16( bo_t *bo, char *str ) } } +static void bo_addle_str16_nosize( bo_t *bo, char *str ) +{ + for( ;; ) + { + uint16_t c; + + c = (uint8_t)*str++; + bo_addle_u16( bo, c ); + if( c == '\0' ) + { + break; + } + } +} + /**************************************************************************** * guid ****************************************************************************/ @@ -707,20 +758,27 @@ static const guid_t asf_guid_reserved_1 = 0x11cf, { 0x8E, 0xE6,0x00, 0xC0, 0x0C ,0x20, 0x53, 0x65 } }; -static const guid_t asf_object_comment_guid = +static const guid_t asf_object_codec_comment_guid = { 0x86D15240, 0x311D, 0x11D0, { 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 } }; -static const guid_t asf_object_comment_reserved_guid = +static const guid_t asf_object_codec_comment_reserved_guid = { 0x86D15241, 0x311D, 0x11D0, { 0xA3, 0xA4, 0x00, 0xA0, 0xC9, 0x03, 0x48, 0xF6 } }; +static const guid_t asf_object_content_description_guid = +{ + 0x75B22633, + 0x668E, + 0x11CF, + { 0xa6, 0xd9, 0x00, 0xaa, 0x00, 0x62, 0xce, 0x6c } +}; static void asf_chunk_add( bo_t *bo, int i_type, int i_len, int i_flags, int i_seq ) @@ -741,6 +799,7 @@ static sout_buffer_t *asf_header_create( sout_mux_t *p_mux, mtime_t i_duration = 0; int i_size; int i_ci_size; + int i_cd_size = 0; sout_buffer_t *out; bo_t bo; int i; @@ -770,8 +829,17 @@ static sout_buffer_t *asf_header_create( sout_mux_t *p_mux, i_ci_size += 6; } } + if( *p_sys->psz_title || *p_sys->psz_author || *p_sys->psz_copyright || + *p_sys->psz_comment || *p_sys->psz_rating ) + { + i_cd_size = 34 + 2 * ( strlen( p_sys->psz_title ) + 1 + + strlen( p_sys->psz_author ) + 1 + + strlen( p_sys->psz_copyright ) + 1 + + strlen( p_sys->psz_comment ) + 1 + + strlen( p_sys->psz_rating ) + 1 ); + } - i_size += i_ci_size; + i_size += i_ci_size + i_cd_size; if( p_sys->b_asf_http ) { @@ -816,6 +884,24 @@ static sout_buffer_t *asf_header_create( sout_mux_t *p_mux, bo_addle_u16( &bo, 6 ); bo_addle_u32( &bo, 0 ); + /* content description header */ + if( i_cd_size > 0 ) + { + bo_add_guid ( &bo, &asf_object_content_description_guid ); + bo_addle_u64( &bo, i_cd_size ); + bo_addle_u16( &bo, 2 * strlen( p_sys->psz_title ) + 2 ); + bo_addle_u16( &bo, 2 * strlen( p_sys->psz_author ) + 2 ); + bo_addle_u16( &bo, 2 * strlen( p_sys->psz_copyright ) + 2 ); + bo_addle_u16( &bo, 2 * strlen( p_sys->psz_comment ) + 2 ); + bo_addle_u16( &bo, 2 * strlen( p_sys->psz_rating ) + 2 ); + + bo_addle_str16_nosize( &bo, p_sys->psz_title ); + bo_addle_str16_nosize( &bo, p_sys->psz_author ); + bo_addle_str16_nosize( &bo, p_sys->psz_copyright ); + bo_addle_str16_nosize( &bo, p_sys->psz_comment ); + bo_addle_str16_nosize( &bo, p_sys->psz_rating ); + } + /* stream properties */ for( i = 1; i < p_sys->i_track; i++ ) { @@ -842,9 +928,9 @@ static sout_buffer_t *asf_header_create( sout_mux_t *p_mux, } /* Codec Infos */ - bo_add_guid ( &bo, &asf_object_comment_guid ); + bo_add_guid ( &bo, &asf_object_codec_comment_guid ); bo_addle_u64( &bo, i_ci_size ); - bo_add_guid ( &bo, &asf_object_comment_reserved_guid ); + bo_add_guid ( &bo, &asf_object_codec_comment_reserved_guid ); bo_addle_u32( &bo, p_sys->i_track - 1 ); for( i = 1; i < p_sys->i_track; i++ ) { diff --git a/modules/stream_out/standard.c b/modules/stream_out/standard.c index e002beef80..68fea3571f 100644 --- a/modules/stream_out/standard.c +++ b/modules/stream_out/standard.c @@ -2,7 +2,7 @@ * standard.c ***************************************************************************** * Copyright (C) 2001, 2002 VideoLAN - * $Id: standard.c,v 1.13 2003/08/28 21:02:14 fenrir Exp $ + * $Id: standard.c,v 1.14 2003/08/29 19:49:33 fenrir Exp $ * * Authors: Laurent Aimar * @@ -153,11 +153,11 @@ static int Open( vlc_object_t *p_this ) ( psz_mux == NULL || *psz_mux == '\0' ) ) { /* access given, no mux */ - if( !strcmp( psz_access, "mmsh" ) ) + if( !strncmp( psz_access, "mmsh", 4 ) ) { psz_mux = "asfh"; } - else if( !strcmp( psz_access, "udp" ) ) + else if( !strncmp( psz_access, "udp", 3 ) ) { psz_mux = "ts"; } @@ -170,7 +170,7 @@ static int Open( vlc_object_t *p_this ) ( psz_access == NULL || *psz_access == '\0' ) ) { /* mux given, no access */ - if( !strcmp( psz_mux, "asfh" ) ) + if( !strncmp( psz_mux, "asfh", 4 ) ) { psz_access = "mmsh"; } @@ -184,19 +184,31 @@ static int Open( vlc_object_t *p_this ) /* fix or warm of incompatible couple */ if( psz_mux && *psz_mux && psz_access && *psz_access ) { - if( !strcmp( psz_access, "mmsh" ) && strcmp( psz_mux, "asfh" ) ) + if( !strncmp( psz_access, "mmsh", 4 ) && strncmp( psz_mux, "asfh", 4 ) ) { + char *p = strchr( psz_mux,'{' ); + msg_Warn( p_stream, "fixing to mmsh/asfh" ); - psz_mux = "asfh"; + if( p ) + { + /* -> a little memleak but ... */ + psz_mux = malloc( strlen( "asfh" ) + strlen( p ) + 1); + sprintf( psz_mux, "asfh%s", p ); + } + else + { + psz_mux = "asfh"; + } } - else if( ( !strcmp( psz_access, "rtp" ) || - !strcmp( psz_access, "udp" ) ) && + else if( ( !strncmp( psz_access, "rtp", 3 ) || + !strncmp( psz_access, "udp", 3 ) ) && strncmp( psz_mux, "ts", 2 ) ) { msg_Err( p_stream, "for now udp and rtp are only valid with TS" ); } - else if( strcmp( psz_access, "file" ) && - ( !strcmp( psz_mux, "mov" ) || !strcmp( psz_mux, "mp4" ) ) ) + else if( strncmp( psz_access, "file", 4 ) && + ( !strncmp( psz_mux, "mov", 3 ) || + !strncmp( psz_mux, "mp4", 3 ) ) ) { msg_Err( p_stream, "mov and mp4 work only with file output" ); }