X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fvoc.c;h=9fe503c3fcedae5710f966dd1148f3c8ea9c1b36;hb=38de02fe5c4102351436c7f058db297486f5b03f;hp=aa9ca8cb831ac0db4d55119824cc716fe45451b4;hpb=e00e93c3bc2d9cf60404ac71060d26c3447782c4;p=vlc diff --git a/modules/demux/voc.c b/modules/demux/voc.c index aa9ca8cb83..9fe503c3fc 100644 --- a/modules/demux/voc.c +++ b/modules/demux/voc.c @@ -6,19 +6,19 @@ * * Authors: Rémi Denis-Courmont * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + * You should have received a copy of the GNU Lesser General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ /***************************************************************************** @@ -32,7 +32,6 @@ #include #include #include -#include /***************************************************************************** * Module descriptor @@ -283,7 +282,7 @@ static int ReadBlockHeader( demux_t *p_demux ) /* read subsequent block 1 */ if( stream_Read( p_demux->s, buf, 4 ) < 4 ) return VLC_EGENERIC; /* EOF */ - + i_block_size = GetDWLE( buf ) >> 8; msg_Dbg( p_demux, "new block: type: %u, size: %u", (unsigned)*buf, i_block_size ); @@ -358,6 +357,12 @@ static int ReadBlockHeader( demux_t *p_demux ) return VLC_EGENERIC; } + if( new_fmt.audio.i_channels == 0 ) + { + msg_Err( p_demux, "0 channels detected" ); + return VLC_EGENERIC; + } + new_fmt.audio.i_bytes_per_frame = new_fmt.audio.i_channels * (new_fmt.audio.i_bitspersample / 8); new_fmt.audio.i_frame_length = 1; @@ -422,17 +427,18 @@ static int Demux( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; block_t *p_block; - int64_t i_offset, i; - - i_offset = stream_Tell( p_demux->s ); - - while( ( i_offset >= p_sys->i_block_end ) - && ( p_sys->i_silence_countdown == 0 ) ) - if( ReadBlockHeader( p_demux ) != VLC_SUCCESS ) - return 0; + int64_t i; if( p_sys->i_silence_countdown == 0 ) { + int64_t i_offset = stream_Tell( p_demux->s ); + if( i_offset >= p_sys->i_block_end ) + { + if( ReadBlockHeader( p_demux ) != VLC_SUCCESS ) + return 0; + return 1; + } + i = ( p_sys->i_block_end - i_offset ) / p_sys->fmt.audio.i_bytes_per_frame; if( i > SAMPLES_BUFFER ) @@ -452,7 +458,7 @@ static int Demux( demux_t *p_demux ) if( i > SAMPLES_BUFFER ) i = SAMPLES_BUFFER; - p_block = block_New( p_demux, i ); + p_block = block_Alloc( i ); if( p_block == NULL ) return VLC_ENOMEM;