Skip to content

Problem with the definition of MQA in some files #14

@Besha1

Description

@Besha1

I ran into a problem that MQA_identifier does not define all MQA files as MQA
I compared the work of MQA_identifier with the work of is_mqa.py this guy here
https://github.com/redsudo/mqaid
So MQA_identifier does not find many MQA files where is_mqa.py find

I looked at your implementation and the implementation is_mqa.py.They are similar and I found the problem as it seems to me.

The problem is that you check once if (buffer == 0xbe0498c88)
found in buffer |= ((static_cast<uint32_t>(s[0]) ^ static_cast<uint32_t>(s[1])) >> pos) & 1u;
from the value const auto pos = (this->decoder.bps - 16u);

In is_mqa.py the check takes place in the range from 16 to 24
samples = list(iter_data(sound_data))
streams = (Bits((x ^ y) >> p & 1
for x, y in zip(samples[::2], samples[1::2]))
for p in range(16, 24))

My tests showed that need to check at least three times
Need to check with at least three values from pos

something like this

uint64_t buffer = 0;
uint64_t buffer1 = 0;
uint64_t buffer2 = 0;

const auto pos = (this->decoder.bps - 16u); // aim for 16th bit

for (const auto &s: this->decoder.samples) {
buffer |= ((static_cast<uint32_t>(s[0]) ^ static_cast<uint32_t>(s[1])) >> pos) & 1u;
buffer1 |= ((static_cast<uint32_t>(s[0]) ^ static_cast<uint32_t>(s[1])) >> pos +1) & 1u;
buffer2 |= ((static_cast<uint32_t>(s[0]) ^ static_cast<uint32_t>(s[1])) >> pos+2) & 1u;

 if (buffer == 0xbe0498c88) {
    this->isMQA_ = true;
    // Get Original Sample Rate
    // Get MQA Studio
    // We are done return true
    return true;
 } else
 if (buffer1 == 0xbe0498c88) {
    this->isMQA_ = true;
    // Get Original Sample Rate
    // Get MQA Studio
    // We are done return true
    return true;
 } else
 if (buffer2 == 0xbe0498c88) {
    this->isMQA_ = true;
    // Get Original Sample Rate
    // Get MQA Studio
    // We are done return true
     return true;
 } else
 buffer = (buffer << 1u) & 0xFFFFFFFFFu;
 buffer1 = (buffer1 << 1u) & 0xFFFFFFFFFu;
 buffer2 = (buffer2 << 1u) & 0xFFFFFFFFFu;

}
return false;

With such changes, MQA_identifier works perfectly,

If you are interested, I also added in the MQA_identifier
If MQA is found, Vorbis tags are added to the flac file
ENCODER = MQAEncode v1.1, 2.3.3+800 (a505918)
MQAENCODER = MQAEncode v1.1, 2.3.3+800 (a505918)
ORIGINALSAMPLERATE = value from MQA_identifier id.originalSampleRate()

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions