FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libswresample
dither.c
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2012 Michael Niedermayer (michaelni@gmx.at)
3
*
4
* This file is part of libswresample
5
*
6
* libswresample is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* libswresample is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with libswresample; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#include "
libavutil/avassert.h
"
22
#include "
swresample_internal.h
"
23
24
void
swri_get_dither
(
SwrContext
*s,
void
*
dst
,
int
len
,
unsigned
seed
,
enum
AVSampleFormat
out_fmt,
enum
AVSampleFormat
in_fmt) {
25
double
scale
= 0;
26
#define TMP_EXTRA 2
27
double
*tmp =
av_malloc
((len +
TMP_EXTRA
) *
sizeof
(
double
));
28
int
i;
29
30
out_fmt =
av_get_packed_sample_fmt
(out_fmt);
31
in_fmt =
av_get_packed_sample_fmt
( in_fmt);
32
33
if
(in_fmt ==
AV_SAMPLE_FMT_FLT
|| in_fmt ==
AV_SAMPLE_FMT_DBL
){
34
if
(out_fmt ==
AV_SAMPLE_FMT_S32
) scale = 1.0/(1
L
<<31);
35
if
(out_fmt ==
AV_SAMPLE_FMT_S16
) scale = 1.0/(1
L
<<15);
36
if
(out_fmt ==
AV_SAMPLE_FMT_U8
) scale = 1.0/(1
L
<< 7);
37
}
38
if
(in_fmt ==
AV_SAMPLE_FMT_S32
&& out_fmt ==
AV_SAMPLE_FMT_S16
) scale = 1
L
<<16;
39
if
(in_fmt ==
AV_SAMPLE_FMT_S32
&& out_fmt ==
AV_SAMPLE_FMT_U8
) scale = 1
L
<<24;
40
if
(in_fmt ==
AV_SAMPLE_FMT_S16
&& out_fmt ==
AV_SAMPLE_FMT_U8
) scale = 1
L
<<8;
41
42
scale *= s->
dither_scale
;
43
44
for
(i=0; i<len +
TMP_EXTRA
; i++){
45
double
v;
46
seed = seed* 1664525 + 1013904223;
47
48
switch
(s->
dither_method
){
49
case
SWR_DITHER_RECTANGULAR
: v= ((double)seed) / UINT_MAX - 0.5;
break
;
50
case
SWR_DITHER_TRIANGULAR
:
51
case
SWR_DITHER_TRIANGULAR_HIGHPASS
:
52
v = ((double)seed) / UINT_MAX;
53
seed = seed*1664525 + 1013904223;
54
v-= ((double)seed) / UINT_MAX;
55
break
;
56
default
:
av_assert0
(0);
57
}
58
tmp[i] = v;
59
}
60
61
for
(i=0; i<
len
; i++){
62
double
v;
63
64
switch
(s->
dither_method
){
65
case
SWR_DITHER_RECTANGULAR
:
66
case
SWR_DITHER_TRIANGULAR
:
67
v = tmp[i];
68
break
;
69
case
SWR_DITHER_TRIANGULAR_HIGHPASS
:
70
v = (- tmp[i] + 2*tmp[i+1] - tmp[i+2]) / sqrt(6);
71
break
;
72
default
:
av_assert0
(0);
73
}
74
75
v*=
scale
;
76
77
switch
(in_fmt){
78
case
AV_SAMPLE_FMT_S16
: ((int16_t*)dst)[i] = v;
break
;
79
case
AV_SAMPLE_FMT_S32
: ((
int32_t
*)dst)[i] = v;
break
;
80
case
AV_SAMPLE_FMT_FLT
: ((
float
*)dst)[i] = v;
break
;
81
case
AV_SAMPLE_FMT_DBL
: ((
double
*)dst)[i] = v;
break
;
82
default
:
av_assert0
(0);
83
}
84
}
85
86
av_free
(tmp);
87
}
Generated on Sat May 25 2013 03:58:49 for FFmpeg by
1.8.2