diff options
Diffstat (limited to 'block.c')
-rw-r--r-- | block.c | 25 |
1 files changed, 18 insertions, 7 deletions
@@ -161,14 +161,16 @@ static int _vds_init(vorbis_dsp_state *v,vorbis_info *vi){ b->window[1]=_vorbis_window(0,ci->blocksizes[1]/2); /* finish the codebooks */ - if(!ci->fullbooks){ + if(!ci->fullbooks) ci->fullbooks=(codebook *)_ogg_calloc(ci->books,sizeof(*ci->fullbooks)); - for(i=0;i<ci->books;i++){ - vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i]); - /* decode codebooks are now standalone after init */ - vorbis_staticbook_destroy(ci->book_param[i]); - ci->book_param[i]=NULL; - } + for(i=0;i<ci->books;i++){ + if(ci->book_param[i]==NULL) + goto abort_books; + if(vorbis_book_init_decode(ci->fullbooks+i,ci->book_param[i])) + goto abort_books; + /* decode codebooks are now standalone after init */ + vorbis_staticbook_destroy(ci->book_param[i]); + ci->book_param[i]=NULL; } v->pcm_storage=ci->blocksizes[1]; @@ -191,6 +193,15 @@ static int _vds_init(vorbis_dsp_state *v,vorbis_info *vi){ ci->map_param[mapnum]); } return 0; +abort_books: + for(i=0;i<ci->books;i++){ + if(ci->book_param[i]!=NULL){ + vorbis_staticbook_destroy(ci->book_param[i]); + ci->book_param[i]=NULL; + } + } + vorbis_dsp_clear(v); + return -1; } int vorbis_synthesis_restart(vorbis_dsp_state *v){ |