finalize release

This commit is contained in:
Christian R. Helmrich
2020-03-31 20:00:00 +02:00
parent 37cab9d936
commit 6e1e9b9782
3 changed files with 53 additions and 17 deletions

View File

@@ -7,6 +7,10 @@ encode uncompressed WAVE-format audio files into MPEG-4-format files
complying with the ISO/IEC 23003-3 (MPEG-D) Unified Speech and Audio
Coding (USAC, also known as Extended High-Efficiency AAC) standard.
In addition, exhale writes program peak-level and loudness data into
the generated MPEG-4 files according to the ISO/IEC 23003-4, Dynamic
Range Control (DRC) specification for use by decoders providing DRC.
exhale currently makes use of all frequency-domain (FD) coding tools
in the scalefactor based MDCT processing path, except for predictive
joint stereo, which is still being integrated. Its objective is high

View File

@@ -25,9 +25,16 @@
<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>
<h3>&nbsp; &nbsp;The version of this distribution of the &laquo;exhale&raquo; software release is <b>1.0.1</b> (official pub&shy;lic minor release) from February 2020. Please check <a href="http://www.ecodis.de">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>&nbsp; &nbsp;The version of this distribution of the &laquo;exhale&raquo; software release is <b>1.0.2</b> (official pub&shy;lic minor release) from March 2020. Please check <a href="http://www.ecodis.de">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>&nbsp; &nbsp;Version <b>1.0.1 <span class="gray">&nbsp;Feb. 2020, this release</span></b></h3>
<h3>&nbsp; &nbsp;Version <b>1.0.2 <span class="gray">&nbsp;Mar. 2020, this release</span></b></h3>
<ul>
<li><h3>added basic low/mid-rate joint-stereo coding functionality, bugfixes, and speedups</h3></li>
<li><h3>exhaleApp: support for input sampling rates of up to 48000 Hz with CVBR mode 2</h3></li>
<li><h3>exhaleLib: frame adaptive joint-stereo preprocessing and coding (CVBR mode &lt;5)</h3></li>
<li><h3>exhaleLib: accelerated R/D opt. coding, stability and quality fixes (issues 2 and 3)</h3></li>
</ul>
<h3>&nbsp; &nbsp;Version <b>1.0.1 <span class="gray">&nbsp;Feb. 2020</span></b></h3>
<ul>
<li><h3>improved low-bitrate coding efficiency and support for MPEG-D loudness metadata</h3></li>
<li><h3>exhaleApp: increased MP4 file versatility (issue 1) and calculation of loudness info</h3></li>
@@ -49,20 +56,20 @@
<h3><br><b>Known Issues with This Release</b></h3>
<h3>&nbsp; &nbsp;If you notice an issue with this release <b>not</b> mentioned below, please contact ecodis or a contributor with the details (configuration, input file) needed to reproduce the issue.</h3>
<ul>
<li><h3>exhaleLib: Coding of stereo or multichannel input yields suboptimal audio quality because the joint-channel coding functionality provided by the ISO/IEC <a href="https://www.iso.org/standard/76385.html">23003-3</a> standard has not been implemented so far. See the functionality roadmap below.</h3></li>
<li><h3>exhaleLib: Coding of stereo or multichannel input occasionally leads to suboptimal audio quality because the joint-channel coding functionality provided by ISO/IEC <a href="https://www.iso.org/standard/76385.html">23003-3</a> has not been fully implemented. See the functionality roadmap below.</h3></li>
<li><h3>exhaleApp: Only basic WAVE input file reading functionality has been implemen&shy;ted. Specifically, 8-bit WAVE input is assumed to contain an even number of audio samples, and the Broadcast and Extensible WAVE file formats are not supported.</h3></li>
</ul>
<h3><br><b>Roadmap of Upcoming Features</b></h3>
<h3>&nbsp; &nbsp;If you are in need of an additional library or application feature <b>not</b> mentioned below, please contact ecodis or a contributor with a request, and we will see what we can do.</h3>
<ul>
<li><h3>support for coding with a core coder frame length of 768 samples, no version plan</h3></li>
<li><h3>exhaleLib: finalized integration of joint-channel coding functionality, version 1.0.2</h3></li>
<li><h3>exhaleLib: finalized integration of higher-rate joint-channel coding, version 1.0.3</h3></li>
<li><h3>exhaleLib: quality tuning and bug fixing for low-rate stereo coding, version 1.0.3</h3></li>
<li><h3>exhaleLib: finalization of support for 3.0 &#x2013; 5.1 multichannel coding, version 1.0.4</h3></li>
<li><h3>exhaleLib: speed-ups and further quality tuning for critical signals, version 1.0.5.</h3></li>
</ul>
<h3><br></h3>
<h4><span class="gray">Written by C. R. Helmrich for exhale 1.0.1, Feb. 2020. Available at www.ecodis.de/exhale/release.htm.</span><br><br></h4>
<h4><span class="gray">Written by C. R. Helmrich for exhale 1.0.2, Mar. 2020. Available at www.ecodis.de/exhale/release.htm.</span><br><br></h4>
</td>
<td valign="top" colspan="2">

View File

@@ -11,10 +11,6 @@
#include "exhaleLibPch.h"
#include "stereoProcessing.h"
// static helper functions
// private helper function
// constructor
StereoProcessor::StereoProcessor ()
{
@@ -76,8 +72,8 @@ unsigned StereoProcessor::applyFullFrameMatrix (int32_t* const mdctSpectrum1, in
if (realOnlyCalc) // real data, only MDCTs are available
{
int32_t* sfbNext1 = &sfbMdct1[1];
int32_t* sfbNext2 = &sfbMdct2[1];
const int32_t* sfbNext1 = &sfbMdct1[1];
const int32_t* sfbNext2 = &sfbMdct2[1];
for (uint16_t s = sfbWidth - (sfb + 1 == numSwbFrame ? 1 : 0); s > 0; s--)
{
@@ -151,7 +147,7 @@ unsigned StereoProcessor::applyFullFrameMatrix (int32_t* const mdctSpectrum1, in
grpRms1[sfb] = uint32_t ((sumAbsValM + (sfbWidth >> 1)) / sfbWidth);
grpRms2[sfb] = uint32_t ((sumAbsValS + (sfbWidth >> 1)) / sfbWidth);
sfbStereoData[sfb + numSwbFrame * gr] = 16; // alpha = 0
if (applyPredSte) sfbStereoData[sfb + numSwbFrame * gr] = 16; // initialize to alpha=0
if ((sfbIsOdd) || (sfb + 1 == maxSfbSte)) // finish pair
{
@@ -175,7 +171,36 @@ unsigned StereoProcessor::applyFullFrameMatrix (int32_t* const mdctSpectrum1, in
}
if (realOnlyCalc) // real data, only MDCTs available
{
// TODO
const int32_t* nextA = (alterPredDir ? &mdctSpectrum2[offEv + 1] : &mdctSpectrum1[offEv + 1]);
const int32_t* nextB = (alterPredDir ? &mdctSpectrum1[offEv + 1] : &mdctSpectrum2[offEv + 1]);
if (sfbEv == 0) // exclude unavailable DC estimate
{
mdctA -= width; nextA++;
mdctB -= width; nextB++;
}
else
{
mdctA -= (width + 1); // point to pre-
mdctB -= (width + 1); // vious samples
}
for (uint16_t s = width - (sfbEv == 0 ? 2 : 1); s > 0; s--) // exclude unavailable final estimate
{
const int64_t mdstA = ((int64_t) *(nextA++) - (int64_t) *(mdctA++)) >> 1; // estimate, see also
const int64_t mdstB = ((int64_t) *(nextB++) - (int64_t) *(mdctB++)) >> 1; // getMeanAbsValues()
sumPrdRefRes += (mdstA * mdstB + SA_BW) >> (SA_BW_SHIFT + 1);
sumPrdRefRef += (mdstA * mdstA + SA_BW) >> (SA_BW_SHIFT + 1);
}
if (sfb + 1 < numSwbFrame) // process final sample
{
const int64_t msSgn = (alterPredDir ? -1 : 1);
const int64_t mdstA = ((((int64_t) *nextB + *nextA * msSgn + 1) >> 1) - (int64_t) *mdctA) >> 1;
const int64_t mdstB = ((((int64_t) *nextA - *nextB * msSgn + 1) >> 1) - (int64_t) *mdctB) >> 1;
sumPrdRefRes += (mdstA * mdstB + SA_BW) >> (SA_BW_SHIFT + 1);
sumPrdRefRef += (mdstA * mdstA + SA_BW) >> (SA_BW_SHIFT + 1);
}
}
else // complex data, both MDCTs and MDSTs available
{
@@ -277,7 +302,7 @@ unsigned StereoProcessor::applyFullFrameMatrix (int32_t* const mdctSpectrum1, in
if (numSfbPredSte <= 1) // discard prediction coefficients and stay with legacy M/S stereo
{
memset (sfbStereoData, 16, numSwbFrame * grp.numWindowGroups * sizeof (uint8_t));
if (applyPredSte) memset (sfbStereoData, 16, numSwbFrame * grp.numWindowGroups * sizeof (uint8_t));
numSfbPredSte = 0;
}
@@ -290,7 +315,7 @@ unsigned StereoProcessor::applyFullFrameMatrix (int32_t* const mdctSpectrum1, in
const uint16_t* grpOff = &grp.sfbOffsets[numSwbFrame * gr];
uint32_t* const grpRms1 = &groupingData1.sfbRmsValues[numSwbFrame * gr];
uint32_t* const grpRms2 = &groupingData2.sfbRmsValues[numSwbFrame * gr];
int32_t b = 0, prevResi = 0;
int32_t prevResi = 0;
if (realOnlyCalc) // preparation of res. magnitude value
{
@@ -316,8 +341,8 @@ unsigned StereoProcessor::applyFullFrameMatrix (int32_t* const mdctSpectrum1, in
if (realOnlyCalc) // real data, only MDCT is available
{
int32_t* sfbNextD = &sfbMdctD[1];
int32_t* sfbNextR = &sfbMdctR[1];
const int32_t* sfbNextD = &sfbMdctD[1];
const int32_t* sfbNextR = &sfbMdctR[1];
for (uint16_t s = sfbWidth - (sfb + 1 == numSwbFrame ? 1 : 0); s > 0; s--)
{