mirror of
https://gitlab.com/ecodis/exhale.git
synced 2025-03-11 16:50:09 +01:00
clean up new code
This commit is contained in:
parent
0bde366c7f
commit
5bfcbaca3e
@ -16,7 +16,7 @@ if("${CMAKE_CURRENT_SOURCE_DIR}" STREQUAL "${CMAKE_CURRENT_BINARY_DIR}")
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|
||||||
project(exhale VERSION 1.1.3 LANGUAGES CXX)
|
project(exhale VERSION 1.1.4 LANGUAGES CXX)
|
||||||
|
|
||||||
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
||||||
set(CMAKE_BUILD_TYPE Release
|
set(CMAKE_BUILD_TYPE Release
|
||||||
|
@ -33,7 +33,7 @@ exhale is being made available under an open-source license which is
|
|||||||
based on the 3-clause BSD license but modified to address particular
|
based on the 3-clause BSD license but modified to address particular
|
||||||
aspects dictated by the nature and the output of this application.
|
aspects dictated by the nature and the output of this application.
|
||||||
|
|
||||||
The license text and release notes for the current version 1.1.3 can
|
The license text and release notes for the current version 1.1.4 can
|
||||||
be found in the `include` subdirectory of the exhale distribution.
|
be found in the `include` subdirectory of the exhale distribution.
|
||||||
|
|
||||||
|
|
||||||
|
@ -25,9 +25,14 @@
|
|||||||
<td valign="top">
|
<td valign="top">
|
||||||
|
|
||||||
<h1><br><span class="pink">exhale</span> - <span class="pink">e</span>codis e<span class="pink">x</span>tended <span class="pink">h</span>igh-efficiency <span class="pink">a</span>nd <span class="pink">l</span>ow-complexity <span class="pink">e</span>ncoder<br><span class="gray"><sup><br>Software Release Notes, Version History, Known Issues, Upcoming Feature Roadmap</sup></span><br><br></h1>
|
<h1><br><span class="pink">exhale</span> - <span class="pink">e</span>codis e<span class="pink">x</span>tended <span class="pink">h</span>igh-efficiency <span class="pink">a</span>nd <span class="pink">l</span>ow-complexity <span class="pink">e</span>ncoder<br><span class="gray"><sup><br>Software Release Notes, Version History, Known Issues, Upcoming Feature Roadmap</sup></span><br><br></h1>
|
||||||
<h3> The version of this distribution of the «exhale» software release is <b>1.1.3</b> (official pub­lic minor release) from February 2021. Please check <a href="http://www.ecodis.de/audio.htm#mpeg">www.ecodis.de</a> regularly for new versions of this software. A summary of each version up to this release, a list of known issues with this release, and a roadmap of additional functionality are provided below.</h3>
|
<h3> The version of this distribution of the «exhale» software release is <b>1.1.4</b> (official pub­lic minor release) from March 2021. Please check <a href="http://www.ecodis.de/audio.htm#mpeg">www.ecodis.de</a> regularly for new versions of this software. A summary of each version up to this release, a list of known issues with this release, and a roadmap of additional functionality are provided below.</h3>
|
||||||
<h3><br><b>Chronological Version History</b></h3>
|
<h3><br><b>Chronological Version History</b></h3>
|
||||||
<h3> Version <b>1.1.3 <span class="gray"> Feb. 2021, this release</span></b></h3>
|
<h3> Version <b>1.1.4 <span class="gray"> Mar. 2021, this release</span></b></h3>
|
||||||
|
<ul>
|
||||||
|
<li><h3>exhaleApp: removed LUFS/dBFS command arguments again, code now automatic</h3></li>
|
||||||
|
<li><h3>exhaleLib: very minor tuning of transient coding especially on male speech signals</h3></li>
|
||||||
|
</ul>
|
||||||
|
<h3> Version <b>1.1.3 <span class="gray"> Feb. 2021</span></b></h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li><h3>exhaleApp: allow specifying loudness (LUFS) and peak sample (dBFS) after preset</h3></li>
|
<li><h3>exhaleApp: allow specifying loudness (LUFS) and peak sample (dBFS) after preset</h3></li>
|
||||||
<li><h3>exhaleLib: write UsacConfig in immediate playout frames (increases compatibility)</h3></li>
|
<li><h3>exhaleLib: write UsacConfig in immediate playout frames (increases compatibility)</h3></li>
|
||||||
@ -133,7 +138,7 @@
|
|||||||
<li><h3>exhaleLib: speed-ups and further quality tuning for difficult signals, as necessary.</h3></li>
|
<li><h3>exhaleLib: speed-ups and further quality tuning for difficult signals, as necessary.</h3></li>
|
||||||
</ul>
|
</ul>
|
||||||
<h3><br></h3>
|
<h3><br></h3>
|
||||||
<h4><span class="gray">Written by C. R. Helmrich for exhale 1.1.3, Feb. 2021. Available at www.ecodis.de/exhale/release.htm.</span><br><br></h4>
|
<h4><span class="gray">Written by C. R. Helmrich for exhale 1.1.4, Mar. 2021. Available at www.ecodis.de/exhale/release.htm.</span><br><br></h4>
|
||||||
|
|
||||||
</td>
|
</td>
|
||||||
<td valign="top" colspan="2">
|
<td valign="top" colspan="2">
|
||||||
|
@ -15,5 +15,5 @@
|
|||||||
# define EXHALELIB_VERSION_MINOR "1"
|
# define EXHALELIB_VERSION_MINOR "1"
|
||||||
#endif
|
#endif
|
||||||
#ifndef EXHALELIB_VERSION_BUGFIX
|
#ifndef EXHALELIB_VERSION_BUGFIX
|
||||||
# define EXHALELIB_VERSION_BUGFIX ".3" // "RC" or ".0", ".1", ...
|
# define EXHALELIB_VERSION_BUGFIX ".4" // "RC" or ".0", ".1", ...
|
||||||
#endif
|
#endif
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
// constants, experimental macros
|
// constants, experimental macros
|
||||||
#if LE_ACCURATE_CALC
|
#if LE_ACCURATE_CALC
|
||||||
#define EA_LOUD_INIT 16384u // for methodDefinition = program loudness
|
#define EA_LOUD_INIT 16384u // bsSamplePeakLevel = 0 & methodValue = 0
|
||||||
#else
|
#else
|
||||||
#define EA_LOUD_INIT 16399u // bsSamplePeakLevel = 0 & methodValue = 0
|
#define EA_LOUD_INIT 16399u // bsSamplePeakLevel = 0 & methodValue = 0
|
||||||
#endif
|
#endif
|
||||||
@ -230,33 +230,6 @@ static void eaApplyDownsampler (int32_t* const pcmBuffer, int32_t* const resampl
|
|||||||
}
|
}
|
||||||
#endif // ENABLE_RESAMPLING
|
#endif // ENABLE_RESAMPLING
|
||||||
|
|
||||||
static uint32_t eaInitLoudnessInfo (const uint32_t defaultLoudStats, const bool loudnessInfoProvided,
|
|
||||||
#ifdef EXHALE_APP_WCHAR
|
|
||||||
const wchar_t* const strings[])
|
|
||||||
#else
|
|
||||||
const char* const strings[])
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
float loudnessInfo[2];
|
|
||||||
uint32_t qLoud, qPeak;
|
|
||||||
|
|
||||||
if (!loudnessInfoProvided) return defaultLoudStats;
|
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++)
|
|
||||||
{
|
|
||||||
char cString[8];
|
|
||||||
|
|
||||||
for (int c = 0; c < 8; c++) cString[c] = char (strings[i][c]); // make sure string is of type char
|
|
||||||
cString[7] = '\0';
|
|
||||||
loudnessInfo[i] = (float) atof (cString);
|
|
||||||
}
|
|
||||||
|
|
||||||
qLoud = uint32_t (4.0f * __max (0.0f, __min (63.75f, 57.75f + loudnessInfo[0])) + 0.5f); // 8b LUFS
|
|
||||||
qPeak = uint32_t (32.f * __max (0.0f, __min (127.97f, 20.0f - loudnessInfo[1])) + 0.5f); // 12b dBFS
|
|
||||||
|
|
||||||
return EA_LOUD_INIT | (qPeak << 18) | (qLoud << 6) | 11u; // measurementSystem = 2, reliability = 3
|
|
||||||
}
|
|
||||||
|
|
||||||
// main routine
|
// main routine
|
||||||
#ifdef EXHALE_APP_WCHAR
|
#ifdef EXHALE_APP_WCHAR
|
||||||
# ifdef __MINGW32__
|
# ifdef __MINGW32__
|
||||||
@ -269,7 +242,7 @@ int main (const int argc, char* argv[])
|
|||||||
{
|
{
|
||||||
if (argc <= 0) return argc; // for safety
|
if (argc <= 0) return argc; // for safety
|
||||||
|
|
||||||
const bool readStdin = (argc == 3 || argc == 5);
|
const bool readStdin = (argc == 3);
|
||||||
BasicWavReader wavReader;
|
BasicWavReader wavReader;
|
||||||
int32_t* inPcmData = nullptr; // 24-bit WAVE audio input buffer
|
int32_t* inPcmData = nullptr; // 24-bit WAVE audio input buffer
|
||||||
#if ENABLE_RESAMPLING
|
#if ENABLE_RESAMPLING
|
||||||
@ -387,7 +360,7 @@ int main (const int argc, char* argv[])
|
|||||||
fprintf_s (stdout, " ---------------------------------------------------------------------\n\n");
|
fprintf_s (stdout, " ---------------------------------------------------------------------\n\n");
|
||||||
|
|
||||||
// check arg. list, print usage if needed
|
// check arg. list, print usage if needed
|
||||||
if ((argc < 3) || (argc > 6) || (argc > 1 && argv[1][1] != 0))
|
if ((argc < 3) || (argc > 4) || (argc > 1 && argv[1][1] != 0))
|
||||||
{
|
{
|
||||||
fprintf_s (stdout, " Copyright 2018-2021 C.R.Helmrich, project ecodis. See License.htm for details.\n\n");
|
fprintf_s (stdout, " Copyright 2018-2021 C.R.Helmrich, project ecodis. See License.htm for details.\n\n");
|
||||||
|
|
||||||
@ -401,9 +374,9 @@ int main (const int argc, char* argv[])
|
|||||||
fprintf_s (stdout, EXHALE_TEXT_BLUE " Usage:\t" EXHALE_TEXT_INIT);
|
fprintf_s (stdout, EXHALE_TEXT_BLUE " Usage:\t" EXHALE_TEXT_INIT);
|
||||||
#endif
|
#endif
|
||||||
#ifdef EXHALE_APP_WCHAR
|
#ifdef EXHALE_APP_WCHAR
|
||||||
fwprintf_s (stdout, L"%s preset [LUFS dBFS] [inputWaveFile.wav] outputMP4File.m4a\n\n where\n\n", exeFileName);
|
fwprintf_s (stdout, L"%s preset [inputWaveFile.wav] outputMP4File.m4a\n\n where\n\n", exeFileName);
|
||||||
#else
|
#else
|
||||||
fprintf_s (stdout, "%s preset [LUFS dBFS] [inputWaveFile.wav] outputMP4File.m4a\n\n where\n\n", exeFileName);
|
fprintf_s (stdout, "%s preset [inputWaveFile.wav] outputMP4File.m4a\n\n where\n\n", exeFileName);
|
||||||
#endif
|
#endif
|
||||||
#if defined (_WIN32) || defined (WIN32) || defined (_WIN64) || defined (WIN64)
|
#if defined (_WIN32) || defined (WIN32) || defined (_WIN64) || defined (WIN64)
|
||||||
fprintf_s (stdout, " preset\t= # (0-9) low-complexity standard compliant xHE-AAC at 16ú#+48 kbit/s\n");
|
fprintf_s (stdout, " preset\t= # (0-9) low-complexity standard compliant xHE-AAC at 16ú#+48 kbit/s\n");
|
||||||
@ -420,8 +393,6 @@ int main (const int argc, char* argv[])
|
|||||||
fprintf_s (stdout, " \t (a-g) low-complexity compliant xHE-AAC with SBR at 12*#+36 kbit/s\n");
|
fprintf_s (stdout, " \t (a-g) low-complexity compliant xHE-AAC with SBR at 12*#+36 kbit/s\n");
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
fprintf_s (stdout, "\n LUFS BS.1770 program loudness level in range -57.75..6, optional\n");
|
|
||||||
fprintf_s (stdout, "\n dBFS sample (not true) peak level in range -107.97..20, optional\n");
|
|
||||||
fprintf_s (stdout, "\n inputWaveFile.wav lossless WAVE audio input, read from stdin if not specified\n\n");
|
fprintf_s (stdout, "\n inputWaveFile.wav lossless WAVE audio input, read from stdin if not specified\n\n");
|
||||||
fprintf_s (stdout, " outputMP4File.m4a encoded MPEG-4 bit-stream, extension should be .m4a or .mp4\n\n\n");
|
fprintf_s (stdout, " outputMP4File.m4a encoded MPEG-4 bit-stream, extension should be .m4a or .mp4\n\n\n");
|
||||||
#if defined (_WIN32) || defined (WIN32) || defined (_WIN64) || defined (WIN64)
|
#if defined (_WIN32) || defined (WIN32) || defined (_WIN64) || defined (WIN64)
|
||||||
@ -510,7 +481,7 @@ int main (const int argc, char* argv[])
|
|||||||
inFileHandle = fileno (stdin);
|
inFileHandle = fileno (stdin);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else // argc = 4/6, open WAV file
|
else // argc = 4, open input file
|
||||||
{
|
{
|
||||||
#ifdef EXHALE_APP_WCHAR
|
#ifdef EXHALE_APP_WCHAR
|
||||||
const wchar_t* inFileName = argv[argc - 2];
|
const wchar_t* inFileName = argv[argc - 2];
|
||||||
@ -744,7 +715,7 @@ int main (const int argc, char* argv[])
|
|||||||
#endif
|
#endif
|
||||||
const unsigned indepPeriod = (sampleRate < 48000 ? (sampleRate - 320) / frameLength : 45 /*for 50-Hz video, use 50 for 60-Hz video*/);
|
const unsigned indepPeriod = (sampleRate < 48000 ? (sampleRate - 320) / frameLength : 45 /*for 50-Hz video, use 50 for 60-Hz video*/);
|
||||||
const unsigned mod3Percent = unsigned ((expectLength * (3 + (coreSbrFrameLengthIndex & 3))) >> 17);
|
const unsigned mod3Percent = unsigned ((expectLength * (3 + (coreSbrFrameLengthIndex & 3))) >> 17);
|
||||||
uint32_t byteCount = 0, bw = (numChannels < 7 ? eaInitLoudnessInfo (loudStats, argc > 4, &argv[2]) : 0);
|
uint32_t byteCount = 0, bw = (numChannels < 7 ? loudStats : 0);
|
||||||
uint32_t br, bwMax = 0; // br will be used to hold bytes read and/or bit-rate
|
uint32_t br, bwMax = 0; // br will be used to hold bytes read and/or bit-rate
|
||||||
uint32_t headerRes = 0;
|
uint32_t headerRes = 0;
|
||||||
// initialize LoudnessEstimator object
|
// initialize LoudnessEstimator object
|
||||||
@ -767,7 +738,6 @@ int main (const int argc, char* argv[])
|
|||||||
// init encoder, generate UsacConfig()
|
// init encoder, generate UsacConfig()
|
||||||
memset (outAuData, 0, 108 * sizeof (uint8_t)); // max. allowed ASC + UC size
|
memset (outAuData, 0, 108 * sizeof (uint8_t)); // max. allowed ASC + UC size
|
||||||
i = exhaleEnc.initEncoder (outAuData, &bw); // bw stores actual ASC + UC size
|
i = exhaleEnc.initEncoder (outAuData, &bw); // bw stores actual ASC + UC size
|
||||||
if ((i == 256) && (argc > 4)) i = 0; // clear LUFS warning
|
|
||||||
|
|
||||||
if ((i |= mp4Writer.open (outFileHandle, sampleRate, numChannels, inSampDepth, frameLength, startLength
|
if ((i |= mp4Writer.open (outFileHandle, sampleRate, numChannels, inSampDepth, frameLength, startLength
|
||||||
#if ENABLE_SIMPLE_SBR
|
#if ENABLE_SIMPLE_SBR
|
||||||
@ -1013,7 +983,7 @@ int main (const int argc, char* argv[])
|
|||||||
const uint32_t qPeak = uint32_t (32.0f * (20.0f - 20.0f * log10 (__max (EA_PEAK_MIN, float (loudStats & USHRT_MAX))) - EA_PEAK_NORM) + 0.5f);
|
const uint32_t qPeak = uint32_t (32.0f * (20.0f - 20.0f * log10 (__max (EA_PEAK_MIN, float (loudStats & USHRT_MAX))) - EA_PEAK_NORM) + 0.5f);
|
||||||
|
|
||||||
// recreate ASC + UC + loudness data
|
// recreate ASC + UC + loudness data
|
||||||
bw = EA_LOUD_INIT | (qPeak << 18) | (qLoud << 6) | 11u;
|
bw = EA_LOUD_INIT | (qPeak << 18) | (qLoud << 6) | 11; // measurementSystem
|
||||||
memset (outAuData, 0, 108 * sizeof (uint8_t)); // max allowed ASC + UC size
|
memset (outAuData, 0, 108 * sizeof (uint8_t)); // max allowed ASC + UC size
|
||||||
i = exhaleEnc.initEncoder (outAuData, &bw); // with finished loudnessInfo()
|
i = exhaleEnc.initEncoder (outAuData, &bw); // with finished loudnessInfo()
|
||||||
#ifndef NO_PREROLL_DATA
|
#ifndef NO_PREROLL_DATA
|
||||||
@ -1085,7 +1055,7 @@ mainFinish:
|
|||||||
{
|
{
|
||||||
fprintf_s (stderr, " ERROR while trying to close stdin stream! Has it already been closed?\n\n");
|
fprintf_s (stderr, " ERROR while trying to close stdin stream! Has it already been closed?\n\n");
|
||||||
}
|
}
|
||||||
else // argc = 4/6, WAV
|
else // argc = 4, file
|
||||||
{
|
{
|
||||||
#ifdef EXHALE_APP_WCHAR
|
#ifdef EXHALE_APP_WCHAR
|
||||||
fwprintf_s (stderr, L" ERROR while trying to close input file %s! Does it still exist?\n\n", argv[argc - 2]);
|
fwprintf_s (stderr, L" ERROR while trying to close input file %s! Does it still exist?\n\n", argv[argc - 2]);
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
|
|
||||||
0 ICON "exhaleApp.ico"
|
0 ICON "exhaleApp.ico"
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 1,1,3
|
FILEVERSION 1,1,4
|
||||||
BEGIN
|
BEGIN
|
||||||
BLOCK "StringFileInfo"
|
BLOCK "StringFileInfo"
|
||||||
BEGIN
|
BEGIN
|
||||||
|
@ -32,9 +32,8 @@ private:
|
|||||||
uint8_t* m_uCharBuffer; // temporary buffer for ungrouping
|
uint8_t* m_uCharBuffer; // temporary buffer for ungrouping
|
||||||
#ifndef NO_PREROLL_DATA
|
#ifndef NO_PREROLL_DATA
|
||||||
uint8_t m_usacConfig[20]; // buffer for UsacConfig in IPF
|
uint8_t m_usacConfig[20]; // buffer for UsacConfig in IPF
|
||||||
uint16_t m_usacConfigLen; // length of UsacConfig in bytes
|
uint16_t m_usacConfigLen;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// helper functions
|
// helper functions
|
||||||
void writeByteAlignment (); // write 0s for byte alignment
|
void writeByteAlignment (); // write 0s for byte alignment
|
||||||
unsigned writeChannelWiseIcsInfo (const IcsInfo& icsInfo); // ics_info()
|
unsigned writeChannelWiseIcsInfo (const IcsInfo& icsInfo); // ics_info()
|
||||||
@ -57,7 +56,10 @@ public:
|
|||||||
|
|
||||||
// constructor
|
// constructor
|
||||||
BitStreamWriter () { m_auBitStream.reset (); m_frameLength = 0; m_numSwbShort = 0; m_uCharBuffer = nullptr;
|
BitStreamWriter () { m_auBitStream.reset (); m_frameLength = 0; m_numSwbShort = 0; m_uCharBuffer = nullptr;
|
||||||
memset (m_usacConfig, 0, 20u); m_usacConfigLen = 0; }
|
#ifndef NO_PREROLL_DATA
|
||||||
|
memset (m_usacConfig, 0, 20); m_usacConfigLen = 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
// destructor
|
// destructor
|
||||||
~BitStreamWriter() { m_auBitStream.reset (); }
|
~BitStreamWriter() { m_auBitStream.reset (); }
|
||||||
// public functions
|
// public functions
|
||||||
|
Loading…
x
Reference in New Issue
Block a user