FFmpeg
4.0
libavcodec
dsd.c
Go to the documentation of this file.
1
/*
2
* Direct Stream Digital (DSD) decoder
3
* based on BSD licensed dsd2pcm by Sebastian Gesemann
4
* Copyright (c) 2009, 2011 Sebastian Gesemann. All rights reserved.
5
* Copyright (c) 2014 Peter Ross
6
*
7
* This file is part of FFmpeg.
8
*
9
* FFmpeg is free software; you can redistribute it and/or
10
* modify it under the terms of the GNU Lesser General Public
11
* License as published by the Free Software Foundation; either
12
* version 2.1 of the License, or (at your option) any later version.
13
*
14
* FFmpeg is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
* Lesser General Public License for more details.
18
*
19
* You should have received a copy of the GNU Lesser General Public
20
* License along with FFmpeg; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
*/
23
24
#include "
libavcodec/internal.h
"
25
#include "
libavcodec/mathops.h
"
26
#include "
avcodec.h
"
27
#include "
dsd_tablegen.h
"
28
#include "
dsd.h
"
29
30
static
av_cold
void
dsd_ctables_tableinit
(
void
)
31
{
32
int
t, e, m, sign;
33
double
acc
[
CTABLES
];
34
for
(e = 0; e < 256; ++e) {
35
memset(acc, 0,
sizeof
(acc));
36
for
(m = 0; m < 8; ++m) {
37
sign = (((e >> (7 - m)) & 1) * 2 - 1);
38
for
(t = 0; t <
CTABLES
; ++t)
39
acc[t] += sign *
htaps
[t * 8 + m];
40
}
41
for
(t = 0; t <
CTABLES
; ++t)
42
ctables
[CTABLES - 1 - t][e] = acc[t];
43
}
44
}
45
46
av_cold
void
ff_init_dsd_data
(
void
)
47
{
48
static
int
done = 0;
49
if
(done)
50
return
;
51
dsd_ctables_tableinit
();
52
done = 1;
53
}
54
55
void
ff_dsd2pcm_translate
(
DSDContext
*
s
,
size_t
samples,
int
lsbf,
56
const
unsigned
char
*
src
, ptrdiff_t src_stride,
57
float
*dst, ptrdiff_t dst_stride)
58
{
59
unsigned
pos, i;
60
unsigned
char
* p;
61
double
sum;
62
63
pos = s->
pos
;
64
65
while
(samples-- > 0) {
66
s->
buf
[pos] = lsbf ?
ff_reverse
[*
src
] : *
src
;
67
src += src_stride;
68
69
p = s->
buf
+ ((pos -
CTABLES
) &
FIFOMASK
);
70
*p =
ff_reverse
[*p];
71
72
sum = 0.0;
73
for
(i = 0; i <
CTABLES
; i++) {
74
unsigned
char
a
= s->
buf
[(pos - i) &
FIFOMASK
];
75
unsigned
char
b
= s->
buf
[(pos - (CTABLES*2 - 1) + i) &
FIFOMASK
];
76
sum +=
ctables
[i][
a
] +
ctables
[i][
b
];
77
}
78
79
*dst = (float)sum;
80
dst += dst_stride;
81
82
pos = (pos + 1) &
FIFOMASK
;
83
}
84
85
s->
pos
= pos;
86
}
s
const char * s
Definition:
avisynth_c.h:768
CTABLES
#define CTABLES
Definition:
dsd_tablegen.h:31
htaps
static const double htaps[HTAPS]
The 2nd half (48 coeffs) of a 96-tap symmetric lowpass filter.
Definition:
dsd_tablegen.h:55
acc
int acc
Definition:
yuv2rgb.c:554
ff_reverse
const uint8_t ff_reverse[256]
Definition:
reverse.c:23
b
const char * b
Definition:
vf_curves.c:113
ff_init_dsd_data
av_cold void ff_init_dsd_data(void)
Definition:
dsd.c:46
src
#define src
Definition:
vp8dsp.c:254
FIFOMASK
#define FIFOMASK
Definition:
dsd.h:33
dsd_ctables_tableinit
static av_cold void dsd_ctables_tableinit(void)
Definition:
dsd.c:30
av_cold
#define av_cold
Definition:
attributes.h:82
dsd.h
ctables
static float ctables[CTABLES][256]
Definition:
dsd_tablegen.h:74
mathops.h
DSDContext
Per-channel buffer.
Definition:
dsd.h:42
ff_dsd2pcm_translate
void ff_dsd2pcm_translate(DSDContext *s, size_t samples, int lsbf, const unsigned char *src, ptrdiff_t src_stride, float *dst, ptrdiff_t dst_stride)
Definition:
dsd.c:55
avcodec.h
Libavcodec external API header.
DSDContext::buf
unsigned char buf[FIFOSIZE]
Definition:
dsd.h:43
DSDContext::pos
unsigned pos
Definition:
dsd.h:44
internal.h
common internal api header.
dsd_tablegen.h
a
a
Definition:
h264pred_template.c:468
Generated on Tue May 22 2018 07:06:30 for FFmpeg by
1.8.13