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