On 17/04/14 20:15, Anton Khirnov wrote:
> 
> On Wed, 16 Apr 2014 16:13:19 +0200, Luca Barbato <[email protected]> wrote:
>> diff --git a/libavcodec/dsddec.c b/libavcodec/dsddec.c
>> new file mode 100644
>> index 0000000..6876f16
>> --- /dev/null
>> +++ b/libavcodec/dsddec.c
>> @@ -0,0 +1,185 @@
>> +/*
>> + * Direct Stream Digital (DSD) decoder
>> + * based on BSD licensed dsd2pcm by Sebastian Gesemann
>> + * Copyright (c) 2009, 2011 Sebastian Gesemann. All rights reserved.
>> + * Copyright (c) 2014 Peter Ross
>> + *
>> + * This file is part of Libav.
>> + *
>> + * Libav 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.
>> + *
>> + * Libav 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
>> + * Lesser General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU Lesser General Public
>> + * License along with Libav; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 
>> USA
>> + */
>> +
>> +/**
>> + * @file
>> + * Direct Stream Digital (DSD) decoder
>> + */
>> +
>> +#include "libavcodec/internal.h"
>> +#include "libavcodec/mathops.h"
>> +#include "avcodec.h"
>> +#include "dsd_tablegen.h"
>> +
>> +#define FIFOSIZE 16              /** must be a power of two */
>> +#define FIFOMASK (FIFOSIZE - 1)  /** bit mask for FIFO offsets */
>> +
>> +#if FIFOSIZE * 8 < HTAPS * 2
>> +#error "FIFOSIZE too small"
>> +#endif
>> +
>> +/*
>> + * Per-channel buffer
>> + */
>> +typedef struct {
>> +    unsigned char buf[FIFOSIZE];
>> +    unsigned pos;
>> +} DSDContext;
>> +
>> +static void dsd2pcm_translate(DSDContext* s, size_t samples, int lsbf,
>> +                              const uint8_t *src, ptrdiff_t src_stride,
>> +                              float *dst, ptrdiff_t dst_stride)
>> +{
>> +    unsigned int pos, i;
>> +    uint8_t *p;
>> +    double sum;
>> +
>> +    pos = s->pos;
>> +
>> +    while (samples-- > 0) {
>> +        s->buf[pos] = lsbf ? ff_reverse[*src] : *src;
>> +        src += src_stride;
>> +
>> +        p = s->buf + ((pos - CTABLES) & FIFOMASK);
>> +        *p = ff_reverse[*p];
>> +
>> +        sum = 0.0;
>> +        for (i = 0; i < CTABLES; i++) {
>> +            const uint8_t a = s->buf[(pos                     - i) & 
>> FIFOMASK];
>> +            const uint8_t b = s->buf[(pos - (CTABLES * 2 - 1) + i) & 
>> FIFOMASK];
>> +            sum += ctables[i][a] + ctables[i][b];
>> +        }
>> +
>> +        *dst = (float)sum;
>> +        dst += dst_stride;
>> +
>> +        pos = (pos + 1) & FIFOMASK;
>> +    }
>> +
>> +    s->pos = pos;
>> +}
>> +
>> +static av_cold void dsd_init_static_data(AVCodec *unused)
>> +{
>> +    dsd_ctables_tableinit();
>> +}
>> +
>> +static av_cold int dsd_decode_init(AVCodecContext *avctx)
>> +{
>> +    DSDContext * s;
>> +    int i;
>> +
>> +    s = av_malloc(sizeof(DSDContext) * avctx->channels);
> 
> Eeeew.
> This looks really horrible, please change it to something sane.

It looks mildly strange, Probably having

struct {
uint8_t *buf;
int pos;
} DSDChannel;

struct {
DSDChannel *c;
int nb_channels;
}

might be nicer and prevent us from getting the channel count changed
midstream at demuxer level. (OMGsecurity)

lu

> Missing DR cap.
> 

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to