ref: 27169ca9d0749d2d93c46fd250136c8d464d3f43
parent: 21b1134aa260c33864853a37335f010ddc6449cc
author: Jean-Marc Valin <[email protected]>
date: Mon May 16 10:10:04 EDT 2011
Addressing all the FIXMEs in the code Includes better error handling in fft/mdct init
--- a/libcelt/celt.c
+++ b/libcelt/celt.c
@@ -671,7 +671,7 @@
*tf_sum += metric[i];
}
/*printf("\n");*/
- /* FIXME: Figure out how to set this */
+ /* TODO: Detect the extreme transients that require tf_select = 1 */
tf_select = 0;
cost0 = 0;
--- a/libcelt/header.c
+++ /dev/null
@@ -1,124 +1,0 @@
-/* Copyright (c) 2007 CSIRO
- Copyright (c) 2007-2009 Xiph.Org Foundation
- Written by Jean-Marc Valin */
-/*
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions
- are met:
-
- - Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- - Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR
- CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "celt_header.h"
-#include "os_support.h"
-#include "modes.h"
-
-static celt_uint32
-_le_32 (celt_uint32 i)
-{
- celt_uint32 ret=i;
-#if !defined(__LITTLE_ENDIAN__) && ( defined(WORDS_BIGENDIAN) || defined(__BIG_ENDIAN__) )
- ret = (i>>24);
- ret += (i>>8) & 0x0000ff00;
- ret += (i<<8) & 0x00ff0000;
- ret += (i<<24);
-#endif
- return ret;
-}
-
-int celt_header_init(CELTHeader *header, const CELTMode *m, int frame_size, int channels)
-{
- if (header==NULL)
- return CELT_BAD_ARG;
-
- CELT_COPY(header->codec_id, "CELT ", 8);
- CELT_COPY(header->codec_version, "experimental ", 20);
-
- /* FIXME: Set that to zero when we freeze */
- header->version_id = 0x80001000;
- header->header_size = 56;
- header->sample_rate = m->Fs;
- header->nb_channels = channels;
- /*FIXME: This won't work for variable frame size */
- header->frame_size = frame_size;
- header->overlap = m->overlap;
- header->bytes_per_packet = -1;
- header->extra_headers = 0;
- return CELT_OK;
-}
-
-int celt_header_to_packet(const CELTHeader *header, unsigned char *packet, celt_uint32 size)
-{
- celt_int32 * h;
-
- if ((size < 56) || (header==NULL) || (packet==NULL))
- return CELT_BAD_ARG; /* FAIL */
-
- CELT_MEMSET(packet, 0, sizeof(*header));
- /* FIXME: Do it in an alignment-safe manner */
-
- /* Copy ident and version */
- CELT_COPY(packet, (unsigned char*)header, 28);
-
- /* Copy the int32 fields */
- h = (celt_int32*)(packet+28);
- *h++ = _le_32 (header->version_id);
- *h++ = _le_32 (header->header_size);
- *h++ = _le_32 (header->sample_rate);
- *h++ = _le_32 (header->nb_channels);
- *h++ = _le_32 (header->frame_size);
- *h++ = _le_32 (header->overlap);
- *h++ = _le_32 (header->bytes_per_packet);
- *h = _le_32 (header->extra_headers);
-
- return sizeof(*header);
-}
-
-int celt_header_from_packet(const unsigned char *packet, celt_uint32 size, CELTHeader *header)
-{
- celt_int32 * h;
-
- if ((size < 56) || (header==NULL) || (packet==NULL))
- return CELT_BAD_ARG; /* FAIL */
-
- CELT_MEMSET((unsigned char*)header, 0, sizeof(*header));
- /* FIXME: Do it in an alignment-safe manner */
-
- /* Copy ident and version */
- CELT_COPY((unsigned char*)header, packet, 28);
-
- /* Copy the int32 fields */
- h = (celt_int32*)(packet+28);
- header->version_id = _le_32(*h++);
- header->header_size = _le_32(*h++);
- header->sample_rate = _le_32(*h++);
- header->nb_channels = _le_32(*h++);
- header->frame_size = _le_32(*h++);
- header->overlap = _le_32(*h++);
- header->bytes_per_packet = _le_32(*h++);
- header->extra_headers = _le_32(*h);
-
- return sizeof(*header);
-}
-
--- a/libcelt/kiss_fft.c
+++ b/libcelt/kiss_fft.c
@@ -616,9 +616,8 @@
st->shift = 0;
while (nfft<<st->shift != base->nfft && st->shift < 32)
st->shift++;
- /* FIXME: Report error and do proper cleanup */
if (st->shift>=32)
- return NULL;
+ goto fail;
} else {
st->twiddles = twiddles = (kiss_twiddle_cpx*)KISS_FFT_MALLOC(sizeof(kiss_twiddle_cpx)*nfft);
compute_twiddles(twiddles, nfft);
@@ -627,14 +626,19 @@
if (!kf_factor(nfft,st->factors))
{
kiss_fft_free(st);
- return NULL;
+ goto fail;
}
/* bitrev */
st->bitrev = bitrev = (celt_int16*)KISS_FFT_MALLOC(sizeof(celt_int16)*nfft);
+ if (st->bitrev==NULL)
+ goto fail;
compute_bitrev_table(0, bitrev, 1,1, st->factors,st);
}
return st;
+fail:
+ kiss_fft_free(st);
+ return NULL;
}
kiss_fft_state *kiss_fft_alloc(int nfft,void * mem,size_t * lenmem )
--- a/libcelt/mdct.c
+++ b/libcelt/mdct.c
@@ -59,7 +59,7 @@
#ifdef CUSTOM_MODES
-void clt_mdct_init(mdct_lookup *l,int N, int maxshift)
+int clt_mdct_init(mdct_lookup *l,int N, int maxshift)
{
int i;
int N4, N2;
@@ -76,12 +76,12 @@
l->kfft[i] = kiss_fft_alloc_twiddles(N>>2>>i, 0, 0, l->kfft[0]);
#ifndef ENABLE_TI_DSPLIB55
if (l->kfft[i]==NULL)
- return;
+ return 0;
#endif
}
l->trig = trig = (kiss_twiddle_scalar*)celt_alloc((N4+1)*sizeof(kiss_twiddle_scalar));
if (l->trig==NULL)
- return;
+ return 0;
/* We have enough points that sine isn't necessary */
#if defined(FIXED_POINT)
for (i=0;i<=N4;i++)
@@ -90,6 +90,7 @@
for (i=0;i<=N4;i++)
trig[i] = (kiss_twiddle_scalar)cos(2*M_PI*i/N);
#endif
+ return 1;
}
void clt_mdct_clear(mdct_lookup *l)
--- a/libcelt/mdct.h
+++ b/libcelt/mdct.h
@@ -52,7 +52,7 @@
const kiss_twiddle_scalar * restrict trig;
} mdct_lookup;
-void clt_mdct_init(mdct_lookup *l,int N, int maxshift);
+int clt_mdct_init(mdct_lookup *l,int N, int maxshift);
void clt_mdct_clear(mdct_lookup *l);
/** Compute a forward MDCT and scale by 4/N */
--- a/libcelt/modes.c
+++ b/libcelt/modes.c
@@ -381,12 +381,8 @@
compute_pulse_cache(mode, mode->maxLM);
- clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts, mode->maxLM);
- if ((mode->mdct.trig==NULL)
-#ifndef ENABLE_TI_DSPLIB55
- || (mode->mdct.kfft==NULL)
-#endif
- )
+ if (clt_mdct_init(&mode->mdct, 2*mode->shortMdctSize*mode->nbShortMdcts,
+ mode->maxLM) == 0)
goto failure;
if (error)
@@ -393,7 +389,7 @@
*error = CELT_OK;
return mode;
-failure:
+failure:
if (error)
*error = CELT_ALLOC_FAIL;
if (mode!=NULL)