Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
RapidASR
Commits
83ff3a7f
Commit
83ff3a7f
authored
Feb 25, 2023
by
mayong
Browse files
Add cpp_onnxruntime
parent
5f46ad1c
Changes
77
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
1849 additions
and
0 deletions
+1849
-0
cpp_onnx/third_party/webrtc/common_audio/vad/vad_filterbank.h
...onnx/third_party/webrtc/common_audio/vad/vad_filterbank.h
+45
-0
cpp_onnx/third_party/webrtc/common_audio/vad/vad_gmm.c
cpp_onnx/third_party/webrtc/common_audio/vad/vad_gmm.c
+82
-0
cpp_onnx/third_party/webrtc/common_audio/vad/vad_gmm.h
cpp_onnx/third_party/webrtc/common_audio/vad/vad_gmm.h
+39
-0
cpp_onnx/third_party/webrtc/common_audio/vad/vad_sp.c
cpp_onnx/third_party/webrtc/common_audio/vad/vad_sp.c
+176
-0
cpp_onnx/third_party/webrtc/common_audio/vad/vad_sp.h
cpp_onnx/third_party/webrtc/common_audio/vad/vad_sp.h
+54
-0
cpp_onnx/third_party/webrtc/common_audio/vad/webrtc_vad.c
cpp_onnx/third_party/webrtc/common_audio/vad/webrtc_vad.c
+115
-0
cpp_onnx/third_party/webrtc/rtc_base/checks.cc
cpp_onnx/third_party/webrtc/rtc_base/checks.cc
+167
-0
cpp_onnx/third_party/webrtc/rtc_base/checks.h
cpp_onnx/third_party/webrtc/rtc_base/checks.h
+400
-0
cpp_onnx/third_party/webrtc/rtc_base/compile_assert_c.h
cpp_onnx/third_party/webrtc/rtc_base/compile_assert_c.h
+25
-0
cpp_onnx/third_party/webrtc/rtc_base/numerics/safe_compare.h
cpp_onnx/third_party/webrtc/rtc_base/numerics/safe_compare.h
+176
-0
cpp_onnx/third_party/webrtc/rtc_base/sanitizer.h
cpp_onnx/third_party/webrtc/rtc_base/sanitizer.h
+144
-0
cpp_onnx/third_party/webrtc/rtc_base/system/arch.h
cpp_onnx/third_party/webrtc/rtc_base/system/arch.h
+58
-0
cpp_onnx/third_party/webrtc/rtc_base/system/inline.h
cpp_onnx/third_party/webrtc/rtc_base/system/inline.h
+31
-0
cpp_onnx/third_party/webrtc/rtc_base/type_traits.h
cpp_onnx/third_party/webrtc/rtc_base/type_traits.h
+140
-0
cpp_onnx/third_party/webrtc/system_wrappers/include/cpu_features_wrapper.h
...rty/webrtc/system_wrappers/include/cpu_features_wrapper.h
+48
-0
cpp_onnx/third_party/webrtc/typedefs.h
cpp_onnx/third_party/webrtc/typedefs.h
+149
-0
cpp_onnx/wave/long.wav
cpp_onnx/wave/long.wav
+0
-0
cpp_onnx/wave/short.wav
cpp_onnx/wave/short.wav
+0
-0
cpp_onnx/win/bin/x64/libfftw3-3.dll
cpp_onnx/win/bin/x64/libfftw3-3.dll
+0
-0
cpp_onnx/win/bin/x64/libfftw3f-3.dll
cpp_onnx/win/bin/x64/libfftw3f-3.dll
+0
-0
No files found.
cpp_onnx/third_party/webrtc/common_audio/vad/vad_filterbank.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
/*
* This file includes feature calculating functionality used in vad_core.c.
*/
#ifndef COMMON_AUDIO_VAD_VAD_FILTERBANK_H_
#define COMMON_AUDIO_VAD_VAD_FILTERBANK_H_
#include "webrtc/common_audio/vad/vad_core.h"
// Takes |data_length| samples of |data_in| and calculates the logarithm of the
// energy of each of the |kNumChannels| = 6 frequency bands used by the VAD:
// 80 Hz - 250 Hz
// 250 Hz - 500 Hz
// 500 Hz - 1000 Hz
// 1000 Hz - 2000 Hz
// 2000 Hz - 3000 Hz
// 3000 Hz - 4000 Hz
//
// The values are given in Q4 and written to |features|. Further, an approximate
// overall energy is returned. The return value is used in
// WebRtcVad_GmmProbability() as a signal indicator, hence it is arbitrary above
// the threshold |kMinEnergy|.
//
// - self [i/o] : State information of the VAD.
// - data_in [i] : Input audio data, for feature extraction.
// - data_length [i] : Audio data size, in number of samples.
// - features [o] : 10 * log10(energy in each frequency band), Q4.
// - returns : Total energy of the signal (NOTE! This value is not
// exact. It is only used in a comparison.)
int16_t
WebRtcVad_CalculateFeatures
(
VadInstT
*
self
,
const
int16_t
*
data_in
,
size_t
data_length
,
int16_t
*
features
);
#endif // COMMON_AUDIO_VAD_VAD_FILTERBANK_H_
cpp_onnx/third_party/webrtc/common_audio/vad/vad_gmm.c
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/common_audio/vad/vad_gmm.h"
#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
static
const
int32_t
kCompVar
=
22005
;
static
const
int16_t
kLog2Exp
=
5909
;
// log2(exp(1)) in Q12.
// For a normal distribution, the probability of |input| is calculated and
// returned (in Q20). The formula for normal distributed probability is
//
// 1 / s * exp(-(x - m)^2 / (2 * s^2))
//
// where the parameters are given in the following Q domains:
// m = |mean| (Q7)
// s = |std| (Q7)
// x = |input| (Q4)
// in addition to the probability we output |delta| (in Q11) used when updating
// the noise/speech model.
int32_t
WebRtcVad_GaussianProbability
(
int16_t
input
,
int16_t
mean
,
int16_t
std
,
int16_t
*
delta
)
{
int16_t
tmp16
,
inv_std
,
inv_std2
,
exp_value
=
0
;
int32_t
tmp32
;
// Calculate |inv_std| = 1 / s, in Q10.
// 131072 = 1 in Q17, and (|std| >> 1) is for rounding instead of truncation.
// Q-domain: Q17 / Q7 = Q10.
tmp32
=
(
int32_t
)
131072
+
(
int32_t
)
(
std
>>
1
);
inv_std
=
(
int16_t
)
WebRtcSpl_DivW32W16
(
tmp32
,
std
);
// Calculate |inv_std2| = 1 / s^2, in Q14.
tmp16
=
(
inv_std
>>
2
);
// Q10 -> Q8.
// Q-domain: (Q8 * Q8) >> 2 = Q14.
inv_std2
=
(
int16_t
)((
tmp16
*
tmp16
)
>>
2
);
// TODO(bjornv): Investigate if changing to
// inv_std2 = (int16_t)((inv_std * inv_std) >> 6);
// gives better accuracy.
tmp16
=
(
input
<<
3
);
// Q4 -> Q7
tmp16
=
tmp16
-
mean
;
// Q7 - Q7 = Q7
// To be used later, when updating noise/speech model.
// |delta| = (x - m) / s^2, in Q11.
// Q-domain: (Q14 * Q7) >> 10 = Q11.
*
delta
=
(
int16_t
)((
inv_std2
*
tmp16
)
>>
10
);
// Calculate the exponent |tmp32| = (x - m)^2 / (2 * s^2), in Q10. Replacing
// division by two with one shift.
// Q-domain: (Q11 * Q7) >> 8 = Q10.
tmp32
=
(
*
delta
*
tmp16
)
>>
9
;
// If the exponent is small enough to give a non-zero probability we calculate
// |exp_value| ~= exp(-(x - m)^2 / (2 * s^2))
// ~= exp2(-log2(exp(1)) * |tmp32|).
if
(
tmp32
<
kCompVar
)
{
// Calculate |tmp16| = log2(exp(1)) * |tmp32|, in Q10.
// Q-domain: (Q12 * Q10) >> 12 = Q10.
tmp16
=
(
int16_t
)((
kLog2Exp
*
tmp32
)
>>
12
);
tmp16
=
-
tmp16
;
exp_value
=
(
0x0400
|
(
tmp16
&
0x03FF
));
tmp16
^=
0xFFFF
;
tmp16
>>=
10
;
tmp16
+=
1
;
// Get |exp_value| = exp(-|tmp32|) in Q10.
exp_value
>>=
tmp16
;
}
// Calculate and return (1 / s) * exp(-(x - m)^2 / (2 * s^2)), in Q20.
// Q-domain: Q10 * Q10 = Q20.
return
inv_std
*
exp_value
;
}
cpp_onnx/third_party/webrtc/common_audio/vad/vad_gmm.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
// Gaussian probability calculations internally used in vad_core.c.
#ifndef COMMON_AUDIO_VAD_VAD_GMM_H_
#define COMMON_AUDIO_VAD_VAD_GMM_H_
#include <stdint.h>
// Calculates the probability for |input|, given that |input| comes from a
// normal distribution with mean and standard deviation (|mean|, |std|).
//
// Inputs:
// - input : input sample in Q4.
// - mean : mean input in the statistical model, Q7.
// - std : standard deviation, Q7.
//
// Output:
//
// - delta : input used when updating the model, Q11.
// |delta| = (|input| - |mean|) / |std|^2.
//
// Return:
// (probability for |input|) =
// 1 / |std| * exp(-(|input| - |mean|)^2 / (2 * |std|^2));
int32_t
WebRtcVad_GaussianProbability
(
int16_t
input
,
int16_t
mean
,
int16_t
std
,
int16_t
*
delta
);
#endif // COMMON_AUDIO_VAD_VAD_GMM_H_
cpp_onnx/third_party/webrtc/common_audio/vad/vad_sp.c
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/common_audio/vad/vad_sp.h"
#include "webrtc/rtc_base/checks.h"
#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
#include "webrtc/common_audio/vad/vad_core.h"
// Allpass filter coefficients, upper and lower, in Q13.
// Upper: 0.64, Lower: 0.17.
static
const
int16_t
kAllPassCoefsQ13
[
2
]
=
{
5243
,
1392
};
// Q13.
static
const
int16_t
kSmoothingDown
=
6553
;
// 0.2 in Q15.
static
const
int16_t
kSmoothingUp
=
32439
;
// 0.99 in Q15.
// TODO(bjornv): Move this function to vad_filterbank.c.
// Downsampling filter based on splitting filter and allpass functions.
void
WebRtcVad_Downsampling
(
const
int16_t
*
signal_in
,
int16_t
*
signal_out
,
int32_t
*
filter_state
,
size_t
in_length
)
{
int16_t
tmp16_1
=
0
,
tmp16_2
=
0
;
int32_t
tmp32_1
=
filter_state
[
0
];
int32_t
tmp32_2
=
filter_state
[
1
];
size_t
n
=
0
;
// Downsampling by 2 gives half length.
size_t
half_length
=
(
in_length
>>
1
);
// Filter coefficients in Q13, filter state in Q0.
for
(
n
=
0
;
n
<
half_length
;
n
++
)
{
// All-pass filtering upper branch.
tmp16_1
=
(
int16_t
)
((
tmp32_1
>>
1
)
+
((
kAllPassCoefsQ13
[
0
]
*
*
signal_in
)
>>
14
));
*
signal_out
=
tmp16_1
;
tmp32_1
=
(
int32_t
)(
*
signal_in
++
)
-
((
kAllPassCoefsQ13
[
0
]
*
tmp16_1
)
>>
12
);
// All-pass filtering lower branch.
tmp16_2
=
(
int16_t
)
((
tmp32_2
>>
1
)
+
((
kAllPassCoefsQ13
[
1
]
*
*
signal_in
)
>>
14
));
*
signal_out
++
+=
tmp16_2
;
tmp32_2
=
(
int32_t
)(
*
signal_in
++
)
-
((
kAllPassCoefsQ13
[
1
]
*
tmp16_2
)
>>
12
);
}
// Store the filter states.
filter_state
[
0
]
=
tmp32_1
;
filter_state
[
1
]
=
tmp32_2
;
}
// Inserts |feature_value| into |low_value_vector|, if it is one of the 16
// smallest values the last 100 frames. Then calculates and returns the median
// of the five smallest values.
int16_t
WebRtcVad_FindMinimum
(
VadInstT
*
self
,
int16_t
feature_value
,
int
channel
)
{
int
i
=
0
,
j
=
0
;
int
position
=
-
1
;
// Offset to beginning of the 16 minimum values in memory.
const
int
offset
=
(
channel
<<
4
);
int16_t
current_median
=
1600
;
int16_t
alpha
=
0
;
int32_t
tmp32
=
0
;
// Pointer to memory for the 16 minimum values and the age of each value of
// the |channel|.
int16_t
*
age
=
&
self
->
index_vector
[
offset
];
int16_t
*
smallest_values
=
&
self
->
low_value_vector
[
offset
];
RTC_DCHECK_LT
(
channel
,
kNumChannels
);
// Each value in |smallest_values| is getting 1 loop older. Update |age|, and
// remove old values.
for
(
i
=
0
;
i
<
16
;
i
++
)
{
if
(
age
[
i
]
!=
100
)
{
age
[
i
]
++
;
}
else
{
// Too old value. Remove from memory and shift larger values downwards.
for
(
j
=
i
;
j
<
15
;
j
++
)
{
smallest_values
[
j
]
=
smallest_values
[
j
+
1
];
age
[
j
]
=
age
[
j
+
1
];
}
age
[
15
]
=
101
;
smallest_values
[
15
]
=
10000
;
}
}
// Check if |feature_value| is smaller than any of the values in
// |smallest_values|. If so, find the |position| where to insert the new value
// (|feature_value|).
if
(
feature_value
<
smallest_values
[
7
])
{
if
(
feature_value
<
smallest_values
[
3
])
{
if
(
feature_value
<
smallest_values
[
1
])
{
if
(
feature_value
<
smallest_values
[
0
])
{
position
=
0
;
}
else
{
position
=
1
;
}
}
else
if
(
feature_value
<
smallest_values
[
2
])
{
position
=
2
;
}
else
{
position
=
3
;
}
}
else
if
(
feature_value
<
smallest_values
[
5
])
{
if
(
feature_value
<
smallest_values
[
4
])
{
position
=
4
;
}
else
{
position
=
5
;
}
}
else
if
(
feature_value
<
smallest_values
[
6
])
{
position
=
6
;
}
else
{
position
=
7
;
}
}
else
if
(
feature_value
<
smallest_values
[
15
])
{
if
(
feature_value
<
smallest_values
[
11
])
{
if
(
feature_value
<
smallest_values
[
9
])
{
if
(
feature_value
<
smallest_values
[
8
])
{
position
=
8
;
}
else
{
position
=
9
;
}
}
else
if
(
feature_value
<
smallest_values
[
10
])
{
position
=
10
;
}
else
{
position
=
11
;
}
}
else
if
(
feature_value
<
smallest_values
[
13
])
{
if
(
feature_value
<
smallest_values
[
12
])
{
position
=
12
;
}
else
{
position
=
13
;
}
}
else
if
(
feature_value
<
smallest_values
[
14
])
{
position
=
14
;
}
else
{
position
=
15
;
}
}
// If we have detected a new small value, insert it at the correct position
// and shift larger values up.
if
(
position
>
-
1
)
{
for
(
i
=
15
;
i
>
position
;
i
--
)
{
smallest_values
[
i
]
=
smallest_values
[
i
-
1
];
age
[
i
]
=
age
[
i
-
1
];
}
smallest_values
[
position
]
=
feature_value
;
age
[
position
]
=
1
;
}
// Get |current_median|.
if
(
self
->
frame_counter
>
2
)
{
current_median
=
smallest_values
[
2
];
}
else
if
(
self
->
frame_counter
>
0
)
{
current_median
=
smallest_values
[
0
];
}
// Smooth the median value.
if
(
self
->
frame_counter
>
0
)
{
if
(
current_median
<
self
->
mean_value
[
channel
])
{
alpha
=
kSmoothingDown
;
// 0.2 in Q15.
}
else
{
alpha
=
kSmoothingUp
;
// 0.99 in Q15.
}
}
tmp32
=
(
alpha
+
1
)
*
self
->
mean_value
[
channel
];
tmp32
+=
(
WEBRTC_SPL_WORD16_MAX
-
alpha
)
*
current_median
;
tmp32
+=
16384
;
self
->
mean_value
[
channel
]
=
(
int16_t
)
(
tmp32
>>
15
);
return
self
->
mean_value
[
channel
];
}
cpp_onnx/third_party/webrtc/common_audio/vad/vad_sp.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
// This file includes specific signal processing tools used in vad_core.c.
#ifndef COMMON_AUDIO_VAD_VAD_SP_H_
#define COMMON_AUDIO_VAD_VAD_SP_H_
#include "webrtc/common_audio/vad/vad_core.h"
// Downsamples the signal by a factor 2, eg. 32->16 or 16->8.
//
// Inputs:
// - signal_in : Input signal.
// - in_length : Length of input signal in samples.
//
// Input & Output:
// - filter_state : Current filter states of the two all-pass filters. The
// |filter_state| is updated after all samples have been
// processed.
//
// Output:
// - signal_out : Downsampled signal (of length |in_length| / 2).
void
WebRtcVad_Downsampling
(
const
int16_t
*
signal_in
,
int16_t
*
signal_out
,
int32_t
*
filter_state
,
size_t
in_length
);
// Updates and returns the smoothed feature minimum. As minimum we use the
// median of the five smallest feature values in a 100 frames long window.
// As long as |handle->frame_counter| is zero, that is, we haven't received any
// "valid" data, FindMinimum() outputs the default value of 1600.
//
// Inputs:
// - feature_value : New feature value to update with.
// - channel : Channel number.
//
// Input & Output:
// - handle : State information of the VAD.
//
// Returns:
// : Smoothed minimum value for a moving window.
int16_t
WebRtcVad_FindMinimum
(
VadInstT
*
handle
,
int16_t
feature_value
,
int
channel
);
#endif // COMMON_AUDIO_VAD_VAD_SP_H_
cpp_onnx/third_party/webrtc/common_audio/vad/webrtc_vad.c
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include "webrtc/common_audio/vad/include/webrtc_vad.h"
#include <stdlib.h>
#include <string.h>
#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
#include "webrtc/common_audio/vad/vad_core.h"
static
const
int
kInitCheck
=
42
;
static
const
int
kValidRates
[]
=
{
8000
,
16000
,
32000
,
48000
};
static
const
size_t
kRatesSize
=
sizeof
(
kValidRates
)
/
sizeof
(
*
kValidRates
);
static
const
int
kMaxFrameLengthMs
=
30
;
VadInst
*
WebRtcVad_Create
()
{
VadInstT
*
self
=
(
VadInstT
*
)
malloc
(
sizeof
(
VadInstT
));
WebRtcSpl_Init
();
self
->
init_flag
=
0
;
return
(
VadInst
*
)
self
;
}
void
WebRtcVad_Free
(
VadInst
*
handle
)
{
free
(
handle
);
}
// TODO(bjornv): Move WebRtcVad_InitCore() code here.
int
WebRtcVad_Init
(
VadInst
*
handle
)
{
// Initialize the core VAD component.
return
WebRtcVad_InitCore
((
VadInstT
*
)
handle
);
}
// TODO(bjornv): Move WebRtcVad_set_mode_core() code here.
int
WebRtcVad_set_mode
(
VadInst
*
handle
,
int
mode
)
{
VadInstT
*
self
=
(
VadInstT
*
)
handle
;
if
(
handle
==
NULL
)
{
return
-
1
;
}
if
(
self
->
init_flag
!=
kInitCheck
)
{
return
-
1
;
}
return
WebRtcVad_set_mode_core
(
self
,
mode
);
}
int
WebRtcVad_Process
(
VadInst
*
handle
,
int
fs
,
const
int16_t
*
audio_frame
,
size_t
frame_length
)
{
int
vad
=
-
1
;
VadInstT
*
self
=
(
VadInstT
*
)
handle
;
if
(
handle
==
NULL
)
{
return
-
1
;
}
if
(
self
->
init_flag
!=
kInitCheck
)
{
return
-
1
;
}
if
(
audio_frame
==
NULL
)
{
return
-
1
;
}
if
(
WebRtcVad_ValidRateAndFrameLength
(
fs
,
frame_length
)
!=
0
)
{
return
-
1
;
}
if
(
fs
==
48000
)
{
vad
=
WebRtcVad_CalcVad48khz
(
self
,
audio_frame
,
frame_length
);
}
else
if
(
fs
==
32000
)
{
vad
=
WebRtcVad_CalcVad32khz
(
self
,
audio_frame
,
frame_length
);
}
else
if
(
fs
==
16000
)
{
vad
=
WebRtcVad_CalcVad16khz
(
self
,
audio_frame
,
frame_length
);
}
else
if
(
fs
==
8000
)
{
vad
=
WebRtcVad_CalcVad8khz
(
self
,
audio_frame
,
frame_length
);
}
if
(
vad
>
0
)
{
vad
=
1
;
}
return
vad
;
}
int
WebRtcVad_ValidRateAndFrameLength
(
int
rate
,
size_t
frame_length
)
{
int
return_value
=
-
1
;
size_t
i
;
int
valid_length_ms
;
size_t
valid_length
;
// We only allow 10, 20 or 30 ms frames. Loop through valid frame rates and
// see if we have a matching pair.
for
(
i
=
0
;
i
<
kRatesSize
;
i
++
)
{
if
(
kValidRates
[
i
]
==
rate
)
{
for
(
valid_length_ms
=
10
;
valid_length_ms
<=
kMaxFrameLengthMs
;
valid_length_ms
+=
10
)
{
valid_length
=
(
size_t
)(
kValidRates
[
i
]
/
1000
*
valid_length_ms
);
if
(
frame_length
==
valid_length
)
{
return_value
=
0
;
break
;
}
}
break
;
}
}
return
return_value
;
}
cpp_onnx/third_party/webrtc/rtc_base/checks.cc
0 → 100644
View file @
83ff3a7f
/*
* Copyright 2006 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
// Most of this was borrowed (with minor modifications) from V8's and Chromium's
// src/base/logging.cc.
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#if defined(WEBRTC_ANDROID)
#define RTC_LOG_TAG_ANDROID "rtc"
#include <android/log.h> // NOLINT
#endif
#if defined(WEBRTC_WIN)
#include <windows.h>
#endif
#if defined(WEBRTC_WIN)
#define LAST_SYSTEM_ERROR (::GetLastError())
#elif defined(__native_client__) && __native_client__
#define LAST_SYSTEM_ERROR (0)
#elif defined(WEBRTC_POSIX)
#include <errno.h>
#define LAST_SYSTEM_ERROR (errno)
#endif // WEBRTC_WIN
#include "webrtc/rtc_base/checks.h"
namespace
{
#if defined(__GNUC__)
__attribute__
((
__format__
(
__printf__
,
2
,
3
)))
#endif
void
AppendFormat
(
std
::
string
*
s
,
const
char
*
fmt
,
...)
{
va_list
args
,
copy
;
va_start
(
args
,
fmt
);
va_copy
(
copy
,
args
);
const
int
predicted_length
=
std
::
vsnprintf
(
nullptr
,
0
,
fmt
,
copy
);
va_end
(
copy
);
if
(
predicted_length
>
0
)
{
const
size_t
size
=
s
->
size
();
s
->
resize
(
size
+
predicted_length
);
// Pass "+ 1" to vsnprintf to include space for the '\0'.
std
::
vsnprintf
(
&
((
*
s
)[
size
]),
predicted_length
+
1
,
fmt
,
args
);
}
va_end
(
args
);
}
}
namespace
rtc
{
namespace
webrtc_checks_impl
{
// Reads one argument from args, appends it to s and advances fmt.
// Returns true iff an argument was sucessfully parsed.
bool
ParseArg
(
va_list
*
args
,
const
CheckArgType
**
fmt
,
std
::
string
*
s
)
{
if
(
**
fmt
==
CheckArgType
::
kEnd
)
return
false
;
switch
(
**
fmt
)
{
case
CheckArgType
::
kInt
:
AppendFormat
(
s
,
"%d"
,
va_arg
(
*
args
,
int
));
break
;
case
CheckArgType
::
kLong
:
AppendFormat
(
s
,
"%ld"
,
va_arg
(
*
args
,
long
));
break
;
case
CheckArgType
::
kLongLong
:
AppendFormat
(
s
,
"%lld"
,
va_arg
(
*
args
,
long
long
));
break
;
case
CheckArgType
::
kUInt
:
AppendFormat
(
s
,
"%u"
,
va_arg
(
*
args
,
unsigned
));
break
;
case
CheckArgType
::
kULong
:
AppendFormat
(
s
,
"%lu"
,
va_arg
(
*
args
,
unsigned
long
));
break
;
case
CheckArgType
::
kULongLong
:
AppendFormat
(
s
,
"%llu"
,
va_arg
(
*
args
,
unsigned
long
long
));
break
;
case
CheckArgType
::
kDouble
:
AppendFormat
(
s
,
"%g"
,
va_arg
(
*
args
,
double
));
break
;
case
CheckArgType
::
kLongDouble
:
AppendFormat
(
s
,
"%Lg"
,
va_arg
(
*
args
,
long
double
));
break
;
case
CheckArgType
::
kCharP
:
s
->
append
(
va_arg
(
*
args
,
const
char
*
));
break
;
case
CheckArgType
::
kStdString
:
s
->
append
(
*
va_arg
(
*
args
,
const
std
::
string
*
));
break
;
case
CheckArgType
::
kVoidP
:
AppendFormat
(
s
,
"%p"
,
va_arg
(
*
args
,
const
void
*
));
break
;
default:
s
->
append
(
"[Invalid CheckArgType]"
);
return
false
;
}
(
*
fmt
)
++
;
return
true
;
}
RTC_NORETURN
void
FatalLog
(
const
char
*
file
,
int
line
,
const
char
*
message
,
const
CheckArgType
*
fmt
,
...)
{
va_list
args
;
va_start
(
args
,
fmt
);
std
::
string
s
;
AppendFormat
(
&
s
,
"
\n\n
"
"#
\n
"
"# Fatal error in: %s, line %d
\n
"
"# last system error: %u
\n
"
"# Check failed: %s"
,
file
,
line
,
LAST_SYSTEM_ERROR
,
message
);
if
(
*
fmt
==
CheckArgType
::
kCheckOp
)
{
// This log message was generated by RTC_CHECK_OP, so we have to complete
// the error message using the operands that have been passed as the first
// two arguments.
fmt
++
;
std
::
string
s1
,
s2
;
if
(
ParseArg
(
&
args
,
&
fmt
,
&
s1
)
&&
ParseArg
(
&
args
,
&
fmt
,
&
s2
))
AppendFormat
(
&
s
,
" (%s vs. %s)
\n
# "
,
s1
.
c_str
(),
s2
.
c_str
());
}
else
{
s
.
append
(
"
\n
# "
);
}
// Append all the user-supplied arguments to the message.
while
(
ParseArg
(
&
args
,
&
fmt
,
&
s
))
;
va_end
(
args
);
const
char
*
output
=
s
.
c_str
();
#if defined(WEBRTC_ANDROID)
__android_log_print
(
ANDROID_LOG_ERROR
,
RTC_LOG_TAG_ANDROID
,
"%s
\n
"
,
output
);
#endif
fflush
(
stdout
);
fprintf
(
stderr
,
"%s"
,
output
);
fflush
(
stderr
);
abort
();
}
}
// namespace webrtc_checks_impl
}
// namespace rtc
// Function to call from the C version of the RTC_CHECK and RTC_DCHECK macros.
RTC_NORETURN
void
rtc_FatalMessage
(
const
char
*
file
,
int
line
,
const
char
*
msg
)
{
static
constexpr
rtc
::
webrtc_checks_impl
::
CheckArgType
t
[]
=
{
rtc
::
webrtc_checks_impl
::
CheckArgType
::
kEnd
};
FatalLog
(
file
,
line
,
msg
,
t
);
}
cpp_onnx/third_party/webrtc/rtc_base/checks.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright 2006 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef RTC_BASE_CHECKS_H_
#define RTC_BASE_CHECKS_H_
// If you for some reson need to know if DCHECKs are on, test the value of
// RTC_DCHECK_IS_ON. (Test its value, not if it's defined; it'll always be
// defined, to either a true or a false value.)
#if !defined(NDEBUG) || defined(DCHECK_ALWAYS_ON)
#define RTC_DCHECK_IS_ON 1
#else
#define RTC_DCHECK_IS_ON 0
#endif
// Annotate a function that will not return control flow to the caller.
#if defined(_MSC_VER)
#define RTC_NORETURN __declspec(noreturn)
#elif defined(__GNUC__)
#define RTC_NORETURN __attribute__ ((__noreturn__))
#else
#define RTC_NORETURN
#endif
#ifdef __cplusplus
extern
"C"
{
#endif
RTC_NORETURN
void
rtc_FatalMessage
(
const
char
*
file
,
int
line
,
const
char
*
msg
);
#ifdef __cplusplus
}
// extern "C"
#endif
#ifdef __cplusplus
// C++ version.
#include <string>
#include "webrtc/rtc_base/numerics/safe_compare.h"
#include "webrtc/rtc_base/system/inline.h"
// The macros here print a message to stderr and abort under various
// conditions. All will accept additional stream messages. For example:
// RTC_DCHECK_EQ(foo, bar) << "I'm printed when foo != bar.";
//
// - RTC_CHECK(x) is an assertion that x is always true, and that if it isn't,
// it's better to terminate the process than to continue. During development,
// the reason that it's better to terminate might simply be that the error
// handling code isn't in place yet; in production, the reason might be that
// the author of the code truly believes that x will always be true, but that
// she recognizes that if she is wrong, abrupt and unpleasant process
// termination is still better than carrying on with the assumption violated.
//
// RTC_CHECK always evaluates its argument, so it's OK for x to have side
// effects.
//
// - RTC_DCHECK(x) is the same as RTC_CHECK(x)---an assertion that x is always
// true---except that x will only be evaluated in debug builds; in production
// builds, x is simply assumed to be true. This is useful if evaluating x is
// expensive and the expected cost of failing to detect the violated
// assumption is acceptable. You should not handle cases where a production
// build fails to spot a violated condition, even those that would result in
// crashes. If the code needs to cope with the error, make it cope, but don't
// call RTC_DCHECK; if the condition really can't occur, but you'd sleep
// better at night knowing that the process will suicide instead of carrying
// on in case you were wrong, use RTC_CHECK instead of RTC_DCHECK.
//
// RTC_DCHECK only evaluates its argument in debug builds, so if x has visible
// side effects, you need to write e.g.
// bool w = x; RTC_DCHECK(w);
//
// - RTC_CHECK_EQ, _NE, _GT, ..., and RTC_DCHECK_EQ, _NE, _GT, ... are
// specialized variants of RTC_CHECK and RTC_DCHECK that print prettier
// messages if the condition doesn't hold. Prefer them to raw RTC_CHECK and
// RTC_DCHECK.
//
// - FATAL() aborts unconditionally.
//
// TODO(ajm): Ideally, checks.h would be combined with logging.h, but
// consolidation with system_wrappers/logging.h should happen first.
namespace
rtc
{
namespace
webrtc_checks_impl
{
enum
class
CheckArgType
:
int8_t
{
kEnd
=
0
,
kInt
,
kLong
,
kLongLong
,
kUInt
,
kULong
,
kULongLong
,
kDouble
,
kLongDouble
,
kCharP
,
kStdString
,
kVoidP
,
// kCheckOp doesn't represent an argument type. Instead, it is sent as the
// first argument from RTC_CHECK_OP to make FatalLog use the next two
// arguments to build the special CHECK_OP error message
// (the "a == b (1 vs. 2)" bit).
kCheckOp
,
};
RTC_NORETURN
void
FatalLog
(
const
char
*
file
,
int
line
,
const
char
*
message
,
const
CheckArgType
*
fmt
,
...);
// Wrapper for log arguments. Only ever make values of this type with the
// MakeVal() functions.
template
<
CheckArgType
N
,
typename
T
>
struct
Val
{
static
constexpr
CheckArgType
Type
()
{
return
N
;
}
T
GetVal
()
const
{
return
val
;
}
T
val
;
};
inline
Val
<
CheckArgType
::
kInt
,
int
>
MakeVal
(
int
x
)
{
return
{
x
};
}
inline
Val
<
CheckArgType
::
kLong
,
long
>
MakeVal
(
long
x
)
{
return
{
x
};
}
inline
Val
<
CheckArgType
::
kLongLong
,
long
long
>
MakeVal
(
long
long
x
)
{
return
{
x
};
}
inline
Val
<
CheckArgType
::
kUInt
,
unsigned
int
>
MakeVal
(
unsigned
int
x
)
{
return
{
x
};
}
inline
Val
<
CheckArgType
::
kULong
,
unsigned
long
>
MakeVal
(
unsigned
long
x
)
{
return
{
x
};
}
inline
Val
<
CheckArgType
::
kULongLong
,
unsigned
long
long
>
MakeVal
(
unsigned
long
long
x
)
{
return
{
x
};
}
inline
Val
<
CheckArgType
::
kDouble
,
double
>
MakeVal
(
double
x
)
{
return
{
x
};
}
inline
Val
<
CheckArgType
::
kLongDouble
,
long
double
>
MakeVal
(
long
double
x
)
{
return
{
x
};
}
inline
Val
<
CheckArgType
::
kCharP
,
const
char
*>
MakeVal
(
const
char
*
x
)
{
return
{
x
};
}
inline
Val
<
CheckArgType
::
kStdString
,
const
std
::
string
*>
MakeVal
(
const
std
::
string
&
x
)
{
return
{
&
x
};
}
inline
Val
<
CheckArgType
::
kVoidP
,
const
void
*>
MakeVal
(
const
void
*
x
)
{
return
{
x
};
}
// Ephemeral type that represents the result of the logging << operator.
template
<
typename
...
Ts
>
class
LogStreamer
;
// Base case: Before the first << argument.
template
<
>
class
LogStreamer
<>
final
{
public:
template
<
typename
U
,
typename
std
::
enable_if
<
std
::
is_arithmetic
<
U
>
::
value
>::
type
*
=
nullptr
>
RTC_FORCE_INLINE
LogStreamer
<
decltype
(
MakeVal
(
std
::
declval
<
U
>
()))
>
operator
<<
(
U
arg
)
const
{
return
LogStreamer
<
decltype
(
MakeVal
(
std
::
declval
<
U
>
()))
>
(
MakeVal
(
arg
),
this
);
}
template
<
typename
U
,
typename
std
::
enable_if
<!
std
::
is_arithmetic
<
U
>
::
value
>::
type
*
=
nullptr
>
RTC_FORCE_INLINE
LogStreamer
<
decltype
(
MakeVal
(
std
::
declval
<
U
>
()))
>
operator
<<
(
const
U
&
arg
)
const
{
return
LogStreamer
<
decltype
(
MakeVal
(
std
::
declval
<
U
>
()))
>
(
MakeVal
(
arg
),
this
);
}
template
<
typename
...
Us
>
RTC_NORETURN
RTC_FORCE_INLINE
static
void
Call
(
const
char
*
file
,
const
int
line
,
const
char
*
message
,
const
Us
&
...
args
)
{
static
constexpr
CheckArgType
t
[]
=
{
Us
::
Type
()...,
CheckArgType
::
kEnd
};
FatalLog
(
file
,
line
,
message
,
t
,
args
.
GetVal
()...);
}
template
<
typename
...
Us
>
RTC_NORETURN
RTC_FORCE_INLINE
static
void
CallCheckOp
(
const
char
*
file
,
const
int
line
,
const
char
*
message
,
const
Us
&
...
args
)
{
static
constexpr
CheckArgType
t
[]
=
{
CheckArgType
::
kCheckOp
,
Us
::
Type
()...,
CheckArgType
::
kEnd
};
FatalLog
(
file
,
line
,
message
,
t
,
args
.
GetVal
()...);
}
};
// Inductive case: We've already seen at least one << argument. The most recent
// one had type `T`, and the earlier ones had types `Ts`.
template
<
typename
T
,
typename
...
Ts
>
class
LogStreamer
<
T
,
Ts
...
>
final
{
public:
RTC_FORCE_INLINE
LogStreamer
(
T
arg
,
const
LogStreamer
<
Ts
...
>*
prior
)
:
arg_
(
arg
),
prior_
(
prior
)
{}
template
<
typename
U
,
typename
std
::
enable_if
<
std
::
is_arithmetic
<
U
>
::
value
>::
type
*
=
nullptr
>
RTC_FORCE_INLINE
LogStreamer
<
decltype
(
MakeVal
(
std
::
declval
<
U
>
())),
T
,
Ts
...
>
operator
<<
(
U
arg
)
const
{
return
LogStreamer
<
decltype
(
MakeVal
(
std
::
declval
<
U
>
())),
T
,
Ts
...
>
(
MakeVal
(
arg
),
this
);
}
template
<
typename
U
,
typename
std
::
enable_if
<!
std
::
is_arithmetic
<
U
>
::
value
>::
type
*
=
nullptr
>
RTC_FORCE_INLINE
LogStreamer
<
decltype
(
MakeVal
(
std
::
declval
<
U
>
())),
T
,
Ts
...
>
operator
<<
(
const
U
&
arg
)
const
{
return
LogStreamer
<
decltype
(
MakeVal
(
std
::
declval
<
U
>
())),
T
,
Ts
...
>
(
MakeVal
(
arg
),
this
);
}
template
<
typename
...
Us
>
RTC_NORETURN
RTC_FORCE_INLINE
void
Call
(
const
char
*
file
,
const
int
line
,
const
char
*
message
,
const
Us
&
...
args
)
const
{
prior_
->
Call
(
file
,
line
,
message
,
arg_
,
args
...);
}
template
<
typename
...
Us
>
RTC_NORETURN
RTC_FORCE_INLINE
void
CallCheckOp
(
const
char
*
file
,
const
int
line
,
const
char
*
message
,
const
Us
&
...
args
)
const
{
prior_
->
CallCheckOp
(
file
,
line
,
message
,
arg_
,
args
...);
}
private:
// The most recent argument.
T
arg_
;
// Earlier arguments.
const
LogStreamer
<
Ts
...
>*
prior_
;
};
template
<
bool
isCheckOp
>
class
FatalLogCall
final
{
public:
FatalLogCall
(
const
char
*
file
,
int
line
,
const
char
*
message
)
:
file_
(
file
),
line_
(
line
),
message_
(
message
)
{}
// This can be any binary operator with precedence lower than <<.
template
<
typename
...
Ts
>
RTC_NORETURN
RTC_FORCE_INLINE
void
operator
&
(
const
LogStreamer
<
Ts
...
>&
streamer
)
{
isCheckOp
?
streamer
.
CallCheckOp
(
file_
,
line_
,
message_
)
:
streamer
.
Call
(
file_
,
line_
,
message_
);
}
private:
const
char
*
file_
;
int
line_
;
const
char
*
message_
;
};
}
// namespace webrtc_checks_impl
// The actual stream used isn't important. We reference |ignored| in the code
// but don't evaluate it; this is to avoid "unused variable" warnings (we do so
// in a particularly convoluted way with an extra ?: because that appears to be
// the simplest construct that keeps Visual Studio from complaining about
// condition being unused).
#define RTC_EAT_STREAM_PARAMETERS(ignored) \
(true ? true : ((void)(ignored), true)) \
? static_cast<void>(0) \
: rtc::webrtc_checks_impl::FatalLogCall<false>("", 0, "") & \
rtc::webrtc_checks_impl::LogStreamer<>()
// Call RTC_EAT_STREAM_PARAMETERS with an argument that fails to compile if
// values of the same types as |a| and |b| can't be compared with the given
// operation, and that would evaluate |a| and |b| if evaluated.
#define RTC_EAT_STREAM_PARAMETERS_OP(op, a, b) \
RTC_EAT_STREAM_PARAMETERS(((void)rtc::Safe##op(a, b)))
// RTC_CHECK dies with a fatal error if condition is not true. It is *not*
// controlled by NDEBUG or anything else, so the check will be executed
// regardless of compilation mode.
//
// We make sure RTC_CHECK et al. always evaluates |condition|, as
// doing RTC_CHECK(FunctionWithSideEffect()) is a common idiom.
#define RTC_CHECK(condition) \
while (!(condition)) \
rtc::webrtc_checks_impl::FatalLogCall<false>(__FILE__, __LINE__, \
#condition) & \
rtc::webrtc_checks_impl::LogStreamer<>()
// Helper macro for binary operators.
// Don't use this macro directly in your code, use RTC_CHECK_EQ et al below.
#define RTC_CHECK_OP(name, op, val1, val2) \
while (!rtc::Safe##name((val1), (val2))) \
rtc::webrtc_checks_impl::FatalLogCall<true>(__FILE__, __LINE__, \
#val1 " " #op " " #val2) & \
rtc::webrtc_checks_impl::LogStreamer<>() << (val1) << (val2)
#define RTC_CHECK_EQ(val1, val2) RTC_CHECK_OP(Eq, ==, val1, val2)
#define RTC_CHECK_NE(val1, val2) RTC_CHECK_OP(Ne, !=, val1, val2)
#define RTC_CHECK_LE(val1, val2) RTC_CHECK_OP(Le, <=, val1, val2)
#define RTC_CHECK_LT(val1, val2) RTC_CHECK_OP(Lt, <, val1, val2)
#define RTC_CHECK_GE(val1, val2) RTC_CHECK_OP(Ge, >=, val1, val2)
#define RTC_CHECK_GT(val1, val2) RTC_CHECK_OP(Gt, >, val1, val2)
// The RTC_DCHECK macro is equivalent to RTC_CHECK except that it only generates
// code in debug builds. It does reference the condition parameter in all cases,
// though, so callers won't risk getting warnings about unused variables.
#if RTC_DCHECK_IS_ON
#define RTC_DCHECK(condition) RTC_CHECK(condition)
#define RTC_DCHECK_EQ(v1, v2) RTC_CHECK_EQ(v1, v2)
#define RTC_DCHECK_NE(v1, v2) RTC_CHECK_NE(v1, v2)
#define RTC_DCHECK_LE(v1, v2) RTC_CHECK_LE(v1, v2)
#define RTC_DCHECK_LT(v1, v2) RTC_CHECK_LT(v1, v2)
#define RTC_DCHECK_GE(v1, v2) RTC_CHECK_GE(v1, v2)
#define RTC_DCHECK_GT(v1, v2) RTC_CHECK_GT(v1, v2)
#else
#define RTC_DCHECK(condition) RTC_EAT_STREAM_PARAMETERS(condition)
#define RTC_DCHECK_EQ(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Eq, v1, v2)
#define RTC_DCHECK_NE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Ne, v1, v2)
#define RTC_DCHECK_LE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Le, v1, v2)
#define RTC_DCHECK_LT(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Lt, v1, v2)
#define RTC_DCHECK_GE(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Ge, v1, v2)
#define RTC_DCHECK_GT(v1, v2) RTC_EAT_STREAM_PARAMETERS_OP(Gt, v1, v2)
#endif
#define RTC_UNREACHABLE_CODE_HIT false
#define RTC_NOTREACHED() RTC_DCHECK(RTC_UNREACHABLE_CODE_HIT)
// TODO(bugs.webrtc.org/8454): Add an RTC_ prefix or rename differently.
#define FATAL() \
rtc::webrtc_checks_impl::FatalLogCall<false>(__FILE__, __LINE__, \
"FATAL()") & \
rtc::webrtc_checks_impl::LogStreamer<>()
// Performs the integer division a/b and returns the result. CHECKs that the
// remainder is zero.
template
<
typename
T
>
inline
T
CheckedDivExact
(
T
a
,
T
b
)
{
RTC_CHECK_EQ
(
a
%
b
,
0
)
<<
a
<<
" is not evenly divisible by "
<<
b
;
return
a
/
b
;
}
}
// namespace rtc
#else // __cplusplus not defined
// C version. Lacks many features compared to the C++ version, but usage
// guidelines are the same.
#define RTC_CHECK(condition) \
do { \
if (!(condition)) { \
rtc_FatalMessage(__FILE__, __LINE__, "CHECK failed: " #condition); \
} \
} while (0)
#define RTC_CHECK_EQ(a, b) RTC_CHECK((a) == (b))
#define RTC_CHECK_NE(a, b) RTC_CHECK((a) != (b))
#define RTC_CHECK_LE(a, b) RTC_CHECK((a) <= (b))
#define RTC_CHECK_LT(a, b) RTC_CHECK((a) < (b))
#define RTC_CHECK_GE(a, b) RTC_CHECK((a) >= (b))
#define RTC_CHECK_GT(a, b) RTC_CHECK((a) > (b))
#define RTC_DCHECK(condition) \
do { \
if (RTC_DCHECK_IS_ON && !(condition)) { \
rtc_FatalMessage(__FILE__, __LINE__, "DCHECK failed: " #condition); \
} \
} while (0)
#define RTC_DCHECK_EQ(a, b) RTC_DCHECK((a) == (b))
#define RTC_DCHECK_NE(a, b) RTC_DCHECK((a) != (b))
#define RTC_DCHECK_LE(a, b) RTC_DCHECK((a) <= (b))
#define RTC_DCHECK_LT(a, b) RTC_DCHECK((a) < (b))
#define RTC_DCHECK_GE(a, b) RTC_DCHECK((a) >= (b))
#define RTC_DCHECK_GT(a, b) RTC_DCHECK((a) > (b))
#endif // __cplusplus
#endif // RTC_BASE_CHECKS_H_
cpp_onnx/third_party/webrtc/rtc_base/compile_assert_c.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef RTC_BASE_COMPILE_ASSERT_C_H_
#define RTC_BASE_COMPILE_ASSERT_C_H_
// Use this macro to verify at compile time that certain restrictions are met.
// The argument is the boolean expression to evaluate.
// Example:
// RTC_COMPILE_ASSERT(sizeof(foo) < 128);
// Note: In C++, use static_assert instead!
#define RTC_COMPILE_ASSERT(expression) \
switch (0) { \
case 0: \
case expression:; \
}
#endif // RTC_BASE_COMPILE_ASSERT_C_H_
cpp_onnx/third_party/webrtc/rtc_base/numerics/safe_compare.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright 2016 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
// This file defines six constexpr functions:
//
// rtc::SafeEq // ==
// rtc::SafeNe // !=
// rtc::SafeLt // <
// rtc::SafeLe // <=
// rtc::SafeGt // >
// rtc::SafeGe // >=
//
// They each accept two arguments of arbitrary types, and in almost all cases,
// they simply call the appropriate comparison operator. However, if both
// arguments are integers, they don't compare them using C++'s quirky rules,
// but instead adhere to the true mathematical definitions. It is as if the
// arguments were first converted to infinite-range signed integers, and then
// compared, although of course nothing expensive like that actually takes
// place. In practice, for signed/signed and unsigned/unsigned comparisons and
// some mixed-signed comparisons with a compile-time constant, the overhead is
// zero; in the remaining cases, it is just a few machine instructions (no
// branches).
#ifndef RTC_BASE_NUMERICS_SAFE_COMPARE_H_
#define RTC_BASE_NUMERICS_SAFE_COMPARE_H_
#include <stddef.h>
#include <stdint.h>
#include <type_traits>
#include <utility>
#include "webrtc/rtc_base/type_traits.h"
namespace
rtc
{
namespace
safe_cmp_impl
{
template
<
size_t
N
>
struct
LargerIntImpl
:
std
::
false_type
{};
template
<
>
struct
LargerIntImpl
<
sizeof
(
int8_t
)
>
:
std
::
true_type
{
using
type
=
int16_t
;
};
template
<
>
struct
LargerIntImpl
<
sizeof
(
int16_t
)
>
:
std
::
true_type
{
using
type
=
int32_t
;
};
template
<
>
struct
LargerIntImpl
<
sizeof
(
int32_t
)
>
:
std
::
true_type
{
using
type
=
int64_t
;
};
// LargerInt<T1, T2>::value is true iff there's a signed type that's larger
// than T1 (and no larger than the larger of T2 and int*, for performance
// reasons); and if there is such a type, LargerInt<T1, T2>::type is an alias
// for it.
template
<
typename
T1
,
typename
T2
>
struct
LargerInt
:
LargerIntImpl
<
sizeof
(
T1
)
<
sizeof
(
T2
)
||
sizeof
(
T1
)
<
sizeof
(
int
*
)
?
sizeof
(
T1
)
:
0
>
{};
template
<
typename
T
>
constexpr
typename
std
::
make_unsigned
<
T
>::
type
MakeUnsigned
(
T
a
)
{
return
static_cast
<
typename
std
::
make_unsigned
<
T
>::
type
>
(
a
);
}
// Overload for when both T1 and T2 have the same signedness.
template
<
typename
Op
,
typename
T1
,
typename
T2
,
typename
std
::
enable_if
<
std
::
is_signed
<
T1
>
::
value
==
std
::
is_signed
<
T2
>::
value
>::
type
*
=
nullptr
>
constexpr
bool
Cmp
(
T1
a
,
T2
b
)
{
return
Op
::
Op
(
a
,
b
);
}
// Overload for signed - unsigned comparison that can be promoted to a bigger
// signed type.
template
<
typename
Op
,
typename
T1
,
typename
T2
,
typename
std
::
enable_if
<
std
::
is_signed
<
T1
>
::
value
&&
std
::
is_unsigned
<
T2
>::
value
&&
LargerInt
<
T2
,
T1
>::
value
>::
type
*
=
nullptr
>
constexpr
bool
Cmp
(
T1
a
,
T2
b
)
{
return
Op
::
Op
(
a
,
static_cast
<
typename
LargerInt
<
T2
,
T1
>::
type
>
(
b
));
}
// Overload for unsigned - signed comparison that can be promoted to a bigger
// signed type.
template
<
typename
Op
,
typename
T1
,
typename
T2
,
typename
std
::
enable_if
<
std
::
is_unsigned
<
T1
>
::
value
&&
std
::
is_signed
<
T2
>::
value
&&
LargerInt
<
T1
,
T2
>::
value
>::
type
*
=
nullptr
>
constexpr
bool
Cmp
(
T1
a
,
T2
b
)
{
return
Op
::
Op
(
static_cast
<
typename
LargerInt
<
T1
,
T2
>::
type
>
(
a
),
b
);
}
// Overload for signed - unsigned comparison that can't be promoted to a bigger
// signed type.
template
<
typename
Op
,
typename
T1
,
typename
T2
,
typename
std
::
enable_if
<
std
::
is_signed
<
T1
>
::
value
&&
std
::
is_unsigned
<
T2
>::
value
&&
!
LargerInt
<
T2
,
T1
>::
value
>::
type
*
=
nullptr
>
constexpr
bool
Cmp
(
T1
a
,
T2
b
)
{
return
a
<
0
?
Op
::
Op
(
-
1
,
0
)
:
Op
::
Op
(
safe_cmp_impl
::
MakeUnsigned
(
a
),
b
);
}
// Overload for unsigned - signed comparison that can't be promoted to a bigger
// signed type.
template
<
typename
Op
,
typename
T1
,
typename
T2
,
typename
std
::
enable_if
<
std
::
is_unsigned
<
T1
>
::
value
&&
std
::
is_signed
<
T2
>::
value
&&
!
LargerInt
<
T1
,
T2
>::
value
>::
type
*
=
nullptr
>
constexpr
bool
Cmp
(
T1
a
,
T2
b
)
{
return
b
<
0
?
Op
::
Op
(
0
,
-
1
)
:
Op
::
Op
(
a
,
safe_cmp_impl
::
MakeUnsigned
(
b
));
}
#define RTC_SAFECMP_MAKE_OP(name, op) \
struct name { \
template <typename T1, typename T2> \
static constexpr bool Op(T1 a, T2 b) { \
return a op b; \
} \
};
RTC_SAFECMP_MAKE_OP
(
EqOp
,
==
)
RTC_SAFECMP_MAKE_OP
(
NeOp
,
!=
)
RTC_SAFECMP_MAKE_OP
(
LtOp
,
<
)
RTC_SAFECMP_MAKE_OP
(
LeOp
,
<=
)
RTC_SAFECMP_MAKE_OP
(
GtOp
,
>
)
RTC_SAFECMP_MAKE_OP
(
GeOp
,
>=
)
#undef RTC_SAFECMP_MAKE_OP
}
// namespace safe_cmp_impl
#define RTC_SAFECMP_MAKE_FUN(name) \
template <typename T1, typename T2> \
constexpr \
typename std::enable_if<IsIntlike<T1>::value && IsIntlike<T2>::value, \
bool>::type Safe##name(T1 a, T2 b) { \
/* Unary plus here turns enums into real integral types. */
\
return safe_cmp_impl::Cmp<safe_cmp_impl::name##Op>(+a, +b); \
} \
template <typename T1, typename T2> \
constexpr \
typename std::enable_if<!IsIntlike<T1>::value || !IsIntlike<T2>::value, \
bool>::type Safe##name(const T1& a, \
const T2& b) { \
return safe_cmp_impl::name##Op::Op(a, b); \
}
RTC_SAFECMP_MAKE_FUN
(
Eq
)
RTC_SAFECMP_MAKE_FUN
(
Ne
)
RTC_SAFECMP_MAKE_FUN
(
Lt
)
RTC_SAFECMP_MAKE_FUN
(
Le
)
RTC_SAFECMP_MAKE_FUN
(
Gt
)
RTC_SAFECMP_MAKE_FUN
(
Ge
)
#undef RTC_SAFECMP_MAKE_FUN
}
// namespace rtc
#endif // RTC_BASE_NUMERICS_SAFE_COMPARE_H_
cpp_onnx/third_party/webrtc/rtc_base/sanitizer.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright 2016 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef RTC_BASE_SANITIZER_H_
#define RTC_BASE_SANITIZER_H_
#include <stddef.h> // For size_t.
#ifdef __cplusplus
#include <type_traits>
#endif
#if defined(__has_feature)
#if __has_feature(address_sanitizer)
#define RTC_HAS_ASAN 1
#endif
#if __has_feature(memory_sanitizer)
#define RTC_HAS_MSAN 1
#endif
#endif
#ifndef RTC_HAS_ASAN
#define RTC_HAS_ASAN 0
#endif
#ifndef RTC_HAS_MSAN
#define RTC_HAS_MSAN 0
#endif
#if RTC_HAS_ASAN
#include <sanitizer/asan_interface.h>
#endif
#if RTC_HAS_MSAN
#include <sanitizer/msan_interface.h>
#endif
#ifdef __has_attribute
#if __has_attribute(no_sanitize)
#define RTC_NO_SANITIZE(what) __attribute__((no_sanitize(what)))
#endif
#endif
#ifndef RTC_NO_SANITIZE
#define RTC_NO_SANITIZE(what)
#endif
// Ask ASan to mark the memory range [ptr, ptr + element_size * num_elements)
// as being unaddressable, so that reads and writes are not allowed. ASan may
// narrow the range to the nearest alignment boundaries.
static
inline
void
rtc_AsanPoison
(
const
volatile
void
*
ptr
,
size_t
element_size
,
size_t
num_elements
)
{
#if RTC_HAS_ASAN
ASAN_POISON_MEMORY_REGION
(
ptr
,
element_size
*
num_elements
);
#endif
}
// Ask ASan to mark the memory range [ptr, ptr + element_size * num_elements)
// as being addressable, so that reads and writes are allowed. ASan may widen
// the range to the nearest alignment boundaries.
static
inline
void
rtc_AsanUnpoison
(
const
volatile
void
*
ptr
,
size_t
element_size
,
size_t
num_elements
)
{
#if RTC_HAS_ASAN
ASAN_UNPOISON_MEMORY_REGION
(
ptr
,
element_size
*
num_elements
);
#endif
}
// Ask MSan to mark the memory range [ptr, ptr + element_size * num_elements)
// as being uninitialized.
static
inline
void
rtc_MsanMarkUninitialized
(
const
volatile
void
*
ptr
,
size_t
element_size
,
size_t
num_elements
)
{
#if RTC_HAS_MSAN
__msan_poison
(
ptr
,
element_size
*
num_elements
);
#endif
}
// Force an MSan check (if any bits in the memory range [ptr, ptr +
// element_size * num_elements) are uninitialized the call will crash with an
// MSan report).
static
inline
void
rtc_MsanCheckInitialized
(
const
volatile
void
*
ptr
,
size_t
element_size
,
size_t
num_elements
)
{
#if RTC_HAS_MSAN
__msan_check_mem_is_initialized
(
ptr
,
element_size
*
num_elements
);
#endif
}
#ifdef __cplusplus
namespace
rtc
{
namespace
sanitizer_impl
{
template
<
typename
T
>
constexpr
bool
IsTriviallyCopyable
()
{
return
static_cast
<
bool
>
(
std
::
is_trivially_copy_constructible
<
T
>::
value
&&
(
std
::
is_trivially_copy_assignable
<
T
>::
value
||
!
std
::
is_copy_assignable
<
T
>::
value
)
&&
std
::
is_trivially_destructible
<
T
>::
value
);
}
}
// namespace sanitizer_impl
template
<
typename
T
>
inline
void
AsanPoison
(
const
T
&
mem
)
{
rtc_AsanPoison
(
mem
.
data
(),
sizeof
(
mem
.
data
()[
0
]),
mem
.
size
());
}
template
<
typename
T
>
inline
void
AsanUnpoison
(
const
T
&
mem
)
{
rtc_AsanUnpoison
(
mem
.
data
(),
sizeof
(
mem
.
data
()[
0
]),
mem
.
size
());
}
template
<
typename
T
>
inline
void
MsanMarkUninitialized
(
const
T
&
mem
)
{
rtc_MsanMarkUninitialized
(
mem
.
data
(),
sizeof
(
mem
.
data
()[
0
]),
mem
.
size
());
}
template
<
typename
T
>
inline
T
MsanUninitialized
(
T
t
)
{
#if RTC_HAS_MSAN
// TODO(bugs.webrtc.org/8762): Switch to std::is_trivially_copyable when it
// becomes available in downstream projects.
static_assert
(
sanitizer_impl
::
IsTriviallyCopyable
<
T
>
(),
""
);
#endif
rtc_MsanMarkUninitialized
(
&
t
,
sizeof
(
T
),
1
);
return
t
;
}
template
<
typename
T
>
inline
void
MsanCheckInitialized
(
const
T
&
mem
)
{
rtc_MsanCheckInitialized
(
mem
.
data
(),
sizeof
(
mem
.
data
()[
0
]),
mem
.
size
());
}
}
// namespace rtc
#endif // __cplusplus
#endif // RTC_BASE_SANITIZER_H_
cpp_onnx/third_party/webrtc/rtc_base/system/arch.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
// This file contains platform-specific typedefs and defines.
// Much of it is derived from Chromium's build/build_config.h.
#ifndef RTC_BASE_SYSTEM_ARCH_H_
#define RTC_BASE_SYSTEM_ARCH_H_
// Processor architecture detection. For more info on what's defined, see:
// http://msdn.microsoft.com/en-us/library/b0084kay.aspx
// http://www.agner.org/optimize/calling_conventions.pdf
// or with gcc, run: "echo | gcc -E -dM -"
#if defined(_M_X64) || defined(__x86_64__)
#define WEBRTC_ARCH_X86_FAMILY
#define WEBRTC_ARCH_X86_64
#define WEBRTC_ARCH_64_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(__aarch64__)
#define WEBRTC_ARCH_ARM_FAMILY
#define WEBRTC_ARCH_64_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(_M_IX86) || defined(__i386__)
#define WEBRTC_ARCH_X86_FAMILY
#define WEBRTC_ARCH_X86
#define WEBRTC_ARCH_32_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(__ARMEL__)
#define WEBRTC_ARCH_ARM_FAMILY
#define WEBRTC_ARCH_32_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(__MIPSEL__)
#define WEBRTC_ARCH_MIPS_FAMILY
#if defined(__LP64__)
#define WEBRTC_ARCH_64_BITS
#else
#define WEBRTC_ARCH_32_BITS
#endif
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(__pnacl__)
#define WEBRTC_ARCH_32_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#else
#error Please add support for your architecture in typedefs.h
#endif
#if !(defined(WEBRTC_ARCH_LITTLE_ENDIAN) ^ defined(WEBRTC_ARCH_BIG_ENDIAN))
#error Define either WEBRTC_ARCH_LITTLE_ENDIAN or WEBRTC_ARCH_BIG_ENDIAN
#endif
#endif // RTC_BASE_SYSTEM_ARCH_H_
cpp_onnx/third_party/webrtc/rtc_base/system/inline.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef RTC_BASE_SYSTEM_INLINE_H_
#define RTC_BASE_SYSTEM_INLINE_H_
#if defined(_MSC_VER)
#define RTC_FORCE_INLINE __forceinline
#define RTC_NO_INLINE __declspec(noinline)
#elif defined(__GNUC__)
#define RTC_FORCE_INLINE __attribute__((__always_inline__))
#define RTC_NO_INLINE __attribute__((__noinline__))
#else
#define RTC_FORCE_INLINE
#define RTC_NO_INLINE
#endif
#endif // RTC_BASE_SYSTEM_INLINE_H_
cpp_onnx/third_party/webrtc/rtc_base/type_traits.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright 2016 The WebRTC Project Authors. All rights reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef RTC_BASE_TYPE_TRAITS_H_
#define RTC_BASE_TYPE_TRAITS_H_
#include <cstddef>
#include <type_traits>
namespace
rtc
{
// Determines if the given class has zero-argument .data() and .size() methods
// whose return values are convertible to T* and size_t, respectively.
template
<
typename
DS
,
typename
T
>
class
HasDataAndSize
{
private:
template
<
typename
C
,
typename
std
::
enable_if
<
std
::
is_convertible
<
decltype
(
std
::
declval
<
C
>().
data
()),
T
*>::
value
&&
std
::
is_convertible
<
decltype
(
std
::
declval
<
C
>
().
size
()),
std
::
size_t
>::
value
>::
type
*
=
nullptr
>
static
int
Test
(
int
);
template
<
typename
>
static
char
Test
(...);
public:
static
constexpr
bool
value
=
std
::
is_same
<
decltype
(
Test
<
DS
>
(
0
)),
int
>::
value
;
};
namespace
test_has_data_and_size
{
template
<
typename
DR
,
typename
SR
>
struct
Test1
{
DR
data
();
SR
size
();
};
static_assert
(
HasDataAndSize
<
Test1
<
int
*
,
int
>
,
int
>::
value
,
""
);
static_assert
(
HasDataAndSize
<
Test1
<
int
*
,
int
>
,
const
int
>::
value
,
""
);
static_assert
(
HasDataAndSize
<
Test1
<
const
int
*
,
int
>
,
const
int
>::
value
,
""
);
static_assert
(
!
HasDataAndSize
<
Test1
<
const
int
*
,
int
>
,
int
>::
value
,
"implicit cast of const int* to int*"
);
static_assert
(
!
HasDataAndSize
<
Test1
<
char
*
,
size_t
>
,
int
>::
value
,
"implicit cast of char* to int*"
);
struct
Test2
{
int
*
data
;
size_t
size
;
};
static_assert
(
!
HasDataAndSize
<
Test2
,
int
>::
value
,
".data and .size aren't functions"
);
struct
Test3
{
int
*
data
();
};
static_assert
(
!
HasDataAndSize
<
Test3
,
int
>::
value
,
".size() is missing"
);
class
Test4
{
int
*
data
();
size_t
size
();
};
static_assert
(
!
HasDataAndSize
<
Test4
,
int
>::
value
,
".data() and .size() are private"
);
}
// namespace test_has_data_and_size
namespace
type_traits_impl
{
// Determines if the given type is an enum that converts implicitly to
// an integral type.
template
<
typename
T
>
struct
IsIntEnum
{
private:
// This overload is used if the type is an enum, and unary plus
// compiles and turns it into an integral type.
template
<
typename
X
,
typename
std
::
enable_if
<
std
::
is_enum
<
X
>
::
value
&&
std
::
is_integral
<
decltype
(
+
std
::
declval
<
X
>
())
>::
value
>::
type
*
=
nullptr
>
static
int
Test
(
int
);
// Otherwise, this overload is used.
template
<
typename
>
static
char
Test
(...);
public:
static
constexpr
bool
value
=
std
::
is_same
<
decltype
(
Test
<
typename
std
::
remove_reference
<
T
>::
type
>
(
0
)),
int
>::
value
;
};
}
// namespace type_traits_impl
// Determines if the given type is integral, or an enum that
// converts implicitly to an integral type.
template
<
typename
T
>
struct
IsIntlike
{
private:
using
X
=
typename
std
::
remove_reference
<
T
>::
type
;
public:
static
constexpr
bool
value
=
std
::
is_integral
<
X
>::
value
||
type_traits_impl
::
IsIntEnum
<
X
>::
value
;
};
namespace
test_enum_intlike
{
enum
E1
{
e1
};
enum
{
e2
};
enum
class
E3
{
e3
};
struct
S
{};
static_assert
(
type_traits_impl
::
IsIntEnum
<
E1
>::
value
,
""
);
static_assert
(
type_traits_impl
::
IsIntEnum
<
decltype
(
e2
)
>::
value
,
""
);
static_assert
(
!
type_traits_impl
::
IsIntEnum
<
E3
>::
value
,
""
);
static_assert
(
!
type_traits_impl
::
IsIntEnum
<
int
>::
value
,
""
);
static_assert
(
!
type_traits_impl
::
IsIntEnum
<
float
>::
value
,
""
);
static_assert
(
!
type_traits_impl
::
IsIntEnum
<
S
>::
value
,
""
);
static_assert
(
IsIntlike
<
E1
>::
value
,
""
);
static_assert
(
IsIntlike
<
decltype
(
e2
)
>::
value
,
""
);
static_assert
(
!
IsIntlike
<
E3
>::
value
,
""
);
static_assert
(
IsIntlike
<
int
>::
value
,
""
);
static_assert
(
!
IsIntlike
<
float
>::
value
,
""
);
static_assert
(
!
IsIntlike
<
S
>::
value
,
""
);
}
// namespace test_enum_intlike
}
// namespace rtc
#endif // RTC_BASE_TYPE_TRAITS_H_
cpp_onnx/third_party/webrtc/system_wrappers/include/cpu_features_wrapper.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef SYSTEM_WRAPPERS_INCLUDE_CPU_FEATURES_WRAPPER_H_
#define SYSTEM_WRAPPERS_INCLUDE_CPU_FEATURES_WRAPPER_H_
#include <stdint.h>
#if defined(__cplusplus) || defined(c_plusplus)
extern
"C"
{
#endif
// List of features in x86.
typedef
enum
{
kSSE2
,
kSSE3
}
CPUFeature
;
// List of features in ARM.
enum
{
kCPUFeatureARMv7
=
(
1
<<
0
),
kCPUFeatureVFPv3
=
(
1
<<
1
),
kCPUFeatureNEON
=
(
1
<<
2
),
kCPUFeatureLDREXSTREX
=
(
1
<<
3
)
};
typedef
int
(
*
WebRtc_CPUInfo
)(
CPUFeature
feature
);
// Returns true if the CPU supports the feature.
extern
WebRtc_CPUInfo
WebRtc_GetCPUInfo
;
// No CPU feature is available => straight C path.
extern
WebRtc_CPUInfo
WebRtc_GetCPUInfoNoASM
;
// Return the features in an ARM device.
// It detects the features in the hardware platform, and returns supported
// values in the above enum definition as a bitmask.
extern
uint64_t
WebRtc_GetCPUFeaturesARM
(
void
);
#if defined(__cplusplus) || defined(c_plusplus)
}
// extern "C"
#endif
#endif // SYSTEM_WRAPPERS_INCLUDE_CPU_FEATURES_WRAPPER_H_
cpp_onnx/third_party/webrtc/typedefs.h
0 → 100644
View file @
83ff3a7f
/*
* Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
// This file contains platform-specific typedefs and defines.
// Much of it is derived from Chromium's build/build_config.h.
#ifndef WEBRTC_TYPEDEFS_H_
#define WEBRTC_TYPEDEFS_H_
// Processor architecture detection. For more info on what's defined, see:
// http://msdn.microsoft.com/en-us/library/b0084kay.aspx
// http://www.agner.org/optimize/calling_conventions.pdf
// or with gcc, run: "echo | gcc -E -dM -"
#if defined(_M_X64) || defined(__x86_64__)
#define WEBRTC_ARCH_X86_FAMILY
#define WEBRTC_ARCH_X86_64
#define WEBRTC_ARCH_64_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(__aarch64__)
#define WEBRTC_ARCH_64_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(_M_IX86) || defined(__i386__)
#define WEBRTC_ARCH_X86_FAMILY
#define WEBRTC_ARCH_X86
#define WEBRTC_ARCH_32_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(__ARMEL__)
// TODO(ajm): We'd prefer to control platform defines here, but this is
// currently provided by the Android makefiles. Commented to avoid duplicate
// definition warnings.
//#define WEBRTC_ARCH_ARM
// TODO(ajm): Chromium uses the following two defines. Should we switch?
//#define WEBRTC_ARCH_ARM_FAMILY
//#define WEBRTC_ARCH_ARMEL
#define WEBRTC_ARCH_32_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(__MIPSEL__)
#define WEBRTC_ARCH_32_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(__pnacl__)
#define WEBRTC_ARCH_32_BITS
#define WEBRTC_ARCH_LITTLE_ENDIAN
#elif defined(__PPC__)
#if defined(__PPC64__)
#define WEBRTC_ARCH_64_BITS
#else
#define WEBRTC_ARCH_32_BITS
#endif
#define WEBRTC_ARCH_BIG_ENDIAN
#else
#error Please add support for your architecture in typedefs.h
#endif
#if !(defined(WEBRTC_ARCH_LITTLE_ENDIAN) ^ defined(WEBRTC_ARCH_BIG_ENDIAN))
#error Define either WEBRTC_ARCH_LITTLE_ENDIAN or WEBRTC_ARCH_BIG_ENDIAN
#endif
#if (defined(WEBRTC_ARCH_X86_FAMILY) && !defined(__SSE2__)) || \
(defined(WEBRTC_ARCH_ARM_V7) && !defined(WEBRTC_ARCH_ARM_NEON))
#define WEBRTC_CPU_DETECTION
#endif
#if !defined(_MSC_VER)
#include <stdint.h>
#else
// Define C99 equivalent types, since pre-2010 MSVC doesn't provide stdint.h.
typedef
signed
char
int8_t
;
typedef
signed
short
int16_t
;
typedef
signed
int
int32_t
;
typedef
__int64
int64_t
;
typedef
unsigned
char
uint8_t
;
typedef
unsigned
short
uint16_t
;
typedef
unsigned
int
uint32_t
;
typedef
unsigned
__int64
uint64_t
;
#endif
// Borrowed from Chromium's base/compiler_specific.h.
// Annotate a virtual method indicating it must be overriding a virtual
// method in the parent class.
// Use like:
// virtual void foo() OVERRIDE;
#if defined(_MSC_VER)
#define OVERRIDE override
#elif defined(__clang__)
// Clang defaults to C++03 and warns about using override. Squelch that.
// Intentionally no push/pop here so all users of OVERRIDE ignore the warning
// too. This is like passing -Wno-c++11-extensions, except that GCC won't die
// (because it won't see this pragma).
#pragma clang diagnostic ignored "-Wc++11-extensions"
#define OVERRIDE override
#elif defined(__GNUC__) && __cplusplus >= 201103 && \
(__GNUC__ * 10000 + __GNUC_MINOR__ * 100) >= 40700
// GCC 4.7 supports explicit virtual overrides when C++11 support is enabled.
#define OVERRIDE override
#else
#define OVERRIDE
#endif
// Annotate a function indicating the caller must examine the return value.
// Use like:
// int foo() WARN_UNUSED_RESULT;
// TODO(ajm): Hack to avoid multiple definitions until the base/ of webrtc and
// libjingle are merged.
#if !defined(WARN_UNUSED_RESULT)
#if defined(__GNUC__)
#define WARN_UNUSED_RESULT __attribute__((warn_unused_result))
#else
#define WARN_UNUSED_RESULT
#endif
#endif // WARN_UNUSED_RESULT
// Put after a variable that might not be used, to prevent compiler warnings:
// int result ATTRIBUTE_UNUSED = DoSomething();
// assert(result == 17);
#ifndef ATTRIBUTE_UNUSED
#if defined(__GNUC__) || defined(__clang__)
#define ATTRIBUTE_UNUSED __attribute__((unused))
#else
#define ATTRIBUTE_UNUSED
#endif
#endif
// Macro to be used for switch-case fallthrough (required for enabling
// -Wimplicit-fallthrough warning on Clang).
#ifndef FALLTHROUGH
#if defined(__clang__)
#define FALLTHROUGH() [[clang::fallthrough]]
#else
#define FALLTHROUGH() do { } while (0)
#endif
#endif
// Annotate a function that will not return control flow to the caller.
#if defined(_MSC_VER)
#define NO_RETURN __declspec(noreturn)
#elif defined(__GNUC__)
#define NO_RETURN __attribute__((noreturn))
#else
#define NO_RETURN
#endif
#endif // WEBRTC_TYPEDEFS_H_
cpp_onnx/wave/long.wav
0 → 100644
View file @
83ff3a7f
File added
cpp_onnx/wave/short.wav
0 → 100644
View file @
83ff3a7f
File added
cpp_onnx/win/bin/x64/libfftw3-3.dll
0 → 100644
View file @
83ff3a7f
File added
cpp_onnx/win/bin/x64/libfftw3f-3.dll
0 → 100644
View file @
83ff3a7f
File added
Prev
1
2
3
4
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment