avcodec/bitstream: Avoid allocation when creating VLC tables
Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
		
							parent
							
								
									5e196dac22
								
							
						
					
					
						commit
						d7ad70e33b
					
				@ -285,7 +285,6 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
 | 
			
		||||
    vlc->bits = nb_bits;
 | 
			
		||||
    if (flags & INIT_VLC_USE_NEW_STATIC) {
 | 
			
		||||
        av_assert0(nb_codes + 1 <= FF_ARRAY_ELEMS(localbuf));
 | 
			
		||||
        buf = localbuf;
 | 
			
		||||
        localvlc = *vlc_arg;
 | 
			
		||||
        vlc = &localvlc;
 | 
			
		||||
        vlc->table_size = 0;
 | 
			
		||||
@ -293,11 +292,13 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
 | 
			
		||||
        vlc->table           = NULL;
 | 
			
		||||
        vlc->table_allocated = 0;
 | 
			
		||||
        vlc->table_size      = 0;
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
    if (nb_codes + 1 > FF_ARRAY_ELEMS(localbuf)) {
 | 
			
		||||
        buf = av_malloc_array((nb_codes + 1), sizeof(VLCcode));
 | 
			
		||||
        if (!buf)
 | 
			
		||||
            return AVERROR(ENOMEM);
 | 
			
		||||
    }
 | 
			
		||||
    } else
 | 
			
		||||
        buf = localbuf;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    av_assert0(symbols_size <= 2 || !symbols);
 | 
			
		||||
@ -309,7 +310,7 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
 | 
			
		||||
            continue;                                                       \
 | 
			
		||||
        if (buf[j].bits > 3*nb_bits || buf[j].bits>32) {                    \
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Too long VLC (%d) in init_vlc\n", buf[j].bits);\
 | 
			
		||||
            if (!(flags & INIT_VLC_USE_NEW_STATIC))                         \
 | 
			
		||||
            if (buf != localbuf)                                            \
 | 
			
		||||
                av_free(buf);                                               \
 | 
			
		||||
            return AVERROR(EINVAL);                                         \
 | 
			
		||||
        }                                                                   \
 | 
			
		||||
@ -317,7 +318,7 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
 | 
			
		||||
        if (buf[j].code >= (1LL<<buf[j].bits)) {                            \
 | 
			
		||||
            av_log(NULL, AV_LOG_ERROR, "Invalid code %"PRIx32" for %d in "  \
 | 
			
		||||
                   "init_vlc\n", buf[j].code, i);                           \
 | 
			
		||||
            if (!(flags & INIT_VLC_USE_NEW_STATIC))                         \
 | 
			
		||||
            if (buf != localbuf)                                            \
 | 
			
		||||
                av_free(buf);                                               \
 | 
			
		||||
            return AVERROR(EINVAL);                                         \
 | 
			
		||||
        }                                                                   \
 | 
			
		||||
@ -346,7 +347,8 @@ int ff_init_vlc_sparse(VLC *vlc_arg, int nb_bits, int nb_codes,
 | 
			
		||||
        av_assert0(ret >= 0);
 | 
			
		||||
        *vlc_arg = *vlc;
 | 
			
		||||
    } else {
 | 
			
		||||
        av_free(buf);
 | 
			
		||||
        if (buf != localbuf)
 | 
			
		||||
            av_free(buf);
 | 
			
		||||
        if (ret < 0) {
 | 
			
		||||
            av_freep(&vlc->table);
 | 
			
		||||
            return ret;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user