--- a/src/format_vorbis.c +++ b/src/format_vorbis.c @@ -19,7 +19,7 @@ #include #include -#include +#include #include #include @@ -34,6 +34,7 @@ #define CATMODULE "format-vorbis" #include "logging.h" +int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op); typedef struct vorbis_codec_tag { @@ -583,3 +584,91 @@ static refbuf_t *process_vorbis_page (og return NULL; } +/* Some additional functions from vorbis missing from tremore */ + +static void _v_writestring(oggpack_buffer *o,char *s, int bytes) +{ + + while(bytes--){ + oggpack_write(o,*s++,8); + } +} + +static int _vorbis_pack_comment(oggpack_buffer *opb,vorbis_comment *vc) +{ + char temp[]="Xiph.Org libVorbis I 20150104"; + int bytes = strlen(temp); + + /* preamble */ + oggpack_write(opb,0x03,8); + _v_writestring(opb,"vorbis", 6); + + /* vendor */ + oggpack_write(opb,bytes,32); + _v_writestring(opb,temp, bytes); + + /* comments */ + + oggpack_write(opb,vc->comments,32); + if(vc->comments){ + int i; + for(i=0;icomments;i++){ + if(vc->user_comments[i]){ + oggpack_write(opb,vc->comment_lengths[i],32); + _v_writestring(opb,vc->user_comments[i], vc->comment_lengths[i]); + }else{ + oggpack_write(opb,0,32); + } + } + } + oggpack_write(opb,1,1); + + return(0); +} + +void vorbis_comment_add(vorbis_comment *vc,char *comment) +{ + vc->user_comments=_ogg_realloc(vc->user_comments, + (vc->comments+2)*sizeof(*vc->user_comments)); + vc->comment_lengths=_ogg_realloc(vc->comment_lengths, + (vc->comments+2)*sizeof(*vc->comment_lengths)); + vc->comment_lengths[vc->comments]=strlen(comment); + vc->user_comments[vc->comments]=_ogg_malloc(vc->comment_lengths[vc->comments]+1); + strcpy(vc->user_comments[vc->comments], comment); + vc->comments++; + vc->user_comments[vc->comments]=NULL; +} + +void vorbis_comment_add_tag(vorbis_comment *vc, char *tag, char *contents) +{ + char *comment=alloca(strlen(tag)+strlen(contents)+2); /* +2 for = and \0 */ + strcpy(comment, tag); + strcat(comment, "="); + strcat(comment, contents); + vorbis_comment_add(vc, comment); + + return; +} + +int vorbis_commentheader_out(vorbis_comment *vc, ogg_packet *op) +{ + oggpack_buffer opb; + + oggpack_writeinit(&opb); + if(_vorbis_pack_comment(&opb,vc)){ + oggpack_writeclear(&opb); + return OV_EIMPL; + } + + op->packet = _ogg_malloc(oggpack_bytes(&opb)); + memcpy(op->packet, opb.buffer, oggpack_bytes(&opb)); + + op->bytes=oggpack_bytes(&opb); + op->b_o_s=0; + op->e_o_s=0; + op->granulepos=0; + op->packetno=1; + + oggpack_writeclear(&opb); + return 0; +} --- a/m4/vorbis.m4 +++ b/m4/vorbis.m4 @@ -38,9 +38,9 @@ if test "x$vorbis_prefix" != "x$ogg_pref ]) fi -VORBIS_LIBS="-lvorbis" -VORBISFILE_LIBS="-lvorbisfile" -VORBISENC_LIBS="-lvorbisenc" +VORBIS_LIBS="-lvorbisidec" +VORBISFILE_LIBS="-lvorbisidec" +VORBISENC_LIBS="-lvorbisidec" xt_save_LIBS="$LIBS" xt_save_LDFLAGS="$LDFLAGS" @@ -58,18 +58,6 @@ AC_TRY_LINK_FUNC(ogg_stream_init, [xt_li ) ]) -if test "x$xt_lib_vorbis" = "xok"; then -# -# Now check if the installed Vorbis is sufficiently new. -# -AC_COMPILE_IFELSE([AC_LANG_PROGRAM([ -#include -#include - ], [ -struct ovectl_ratemanage_arg a; -])],,[xt_lib_vorbis="old version found"]) -AC_MSG_RESULT([$xt_lib_vorbis]) -fi CPPFLAGS="$xt_save_CPPFLAGS" LIBS="$xt_save_LIBS" LDFLAGS="$xt_save_LDFLAGS" --- a/m4/ogg.m4 +++ b/m4/ogg.m4 @@ -29,7 +29,7 @@ XIPH_GCC_WARNING([-I$ogg_prefix/include] ]) AC_CACHE_CHECK([for libogg], xt_cv_lib_ogg, [dnl -OGG_LIBS="-logg" +OGG_LIBS="-lvorbisidec" # # check if the installed Ogg is sufficiently new.