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 complying with the ISO/IEC 23003-3 (MPEG-D) Unified Speech and Audio
Coding (USAC, also known as Extended High-Efficiency AAC) standard. 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 exhale currently makes use of all frequency-domain (FD) coding tools
in the scalefactor based MDCT processing path, except for predictive in the scalefactor based MDCT processing path, except for predictive
joint stereo, which is still being integrated. Its objective is high joint stereo, which is still being integrated. Its objective is high

View File

@@ -25,9 +25,16 @@
<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>&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><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> <ul>
<li><h3>improved low-bitrate coding efficiency and support for MPEG-D loudness metadata</h3></li> <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> <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><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> <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> <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> <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> </ul>
<h3><br><b>Roadmap of Upcoming Features</b></h3> <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> <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> <ul>
<li><h3>support for coding with a core coder frame length of 768 samples, no version plan</h3></li> <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: 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: 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> <li><h3>exhaleLib: speed-ups and further quality tuning for critical signals, version 1.0.5.</h3></li>
</ul> </ul>
<h3><br></h3> <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>
<td valign="top" colspan="2"> <td valign="top" colspan="2">

View File

@@ -11,10 +11,6 @@
#include "exhaleLibPch.h" #include "exhaleLibPch.h"
#include "stereoProcessing.h" #include "stereoProcessing.h"
// static helper functions
// private helper function
// constructor // constructor
StereoProcessor::StereoProcessor () StereoProcessor::StereoProcessor ()
{ {
@@ -76,8 +72,8 @@ unsigned StereoProcessor::applyFullFrameMatrix (int32_t* const mdctSpectrum1, in
if (realOnlyCalc) // real data, only MDCTs are available if (realOnlyCalc) // real data, only MDCTs are available
{ {
int32_t* sfbNext1 = &sfbMdct1[1]; const int32_t* sfbNext1 = &sfbMdct1[1];
int32_t* sfbNext2 = &sfbMdct2[1]; const int32_t* sfbNext2 = &sfbMdct2[1];
for (uint16_t s = sfbWidth - (sfb + 1 == numSwbFrame ? 1 : 0); s > 0; s--) 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); grpRms1[sfb] = uint32_t ((sumAbsValM + (sfbWidth >> 1)) / sfbWidth);
grpRms2[sfb] = uint32_t ((sumAbsValS + (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 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 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 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 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; numSfbPredSte = 0;
} }
@@ -290,7 +315,7 @@ unsigned StereoProcessor::applyFullFrameMatrix (int32_t* const mdctSpectrum1, in
const uint16_t* grpOff = &grp.sfbOffsets[numSwbFrame * gr]; const uint16_t* grpOff = &grp.sfbOffsets[numSwbFrame * gr];
uint32_t* const grpRms1 = &groupingData1.sfbRmsValues[numSwbFrame * gr]; uint32_t* const grpRms1 = &groupingData1.sfbRmsValues[numSwbFrame * gr];
uint32_t* const grpRms2 = &groupingData2.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 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 if (realOnlyCalc) // real data, only MDCT is available
{ {
int32_t* sfbNextD = &sfbMdctD[1]; const int32_t* sfbNextD = &sfbMdctD[1];
int32_t* sfbNextR = &sfbMdctR[1]; const int32_t* sfbNextR = &sfbMdctR[1];
for (uint16_t s = sfbWidth - (sfb + 1 == numSwbFrame ? 1 : 0); s > 0; s--) for (uint16_t s = sfbWidth - (sfb + 1 == numSwbFrame ? 1 : 0); s > 0; s--)
{ {