Skip to content

Commit

Permalink
WavPack: various fixes for multichannel & DSD files
Browse files Browse the repository at this point in the history
- fix parsing of multichannel files with greater than 8 streams
- fix compression ratio calculation for all multichannel files
- fix DSD file parsing
  • Loading branch information
dbry committed Jun 12, 2024
1 parent 0e18545 commit 5108c1a
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 29 deletions.
76 changes: 48 additions & 28 deletions Source/MediaInfo/Audio/File_Wvpk.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ void File_Wvpk::Streams_Finish()
int64u BitDepth=dsf?1:(Wvpk_Resolution[(resolution1?1:0)*2+(resolution0?1:0)]);
int64u Duration=Samples*1000/SamplingRate;
int64u CompressedSize=File_Size-TagsSize;
int64u UncompressedSize=Duration*(mono?1:2)*BitDepth*(SamplingRate<<(3*dsf))/8/1000;
int64u UncompressedSize=Duration*(num_channels?num_channels:(mono?1:2))*BitDepth*(SamplingRate<<(3*dsf))/8/1000;
float32 CompressionRatio=((float32)UncompressedSize)/CompressedSize;
Fill(Stream_Audio, 0, Audio_StreamSize, CompressedSize, 3, true);
Fill(Stream_Audio, 0, Audio_Duration, Duration, 10, true);
Expand Down Expand Up @@ -481,6 +481,7 @@ void File_Wvpk::Data_Parse_Fill()
if (!dsf)
Fill(Stream_Audio, 0, Audio_BitDepth, Wvpk_Resolution[(resolution1?1:0)*2+(resolution0?1:0)]);
Fill(Stream_Audio, StreamPos_Last, Audio_Channel_s_, num_channels?num_channels:(mono?1:2));

if (channel_mask)
{
Ztring Channels_Positions, Channels_Positions2;
Expand Down Expand Up @@ -585,8 +586,8 @@ void File_Wvpk::Data_Parse_Fill()
Fill(Stream_Audio, 0, Audio_Codec_Settings, Mode);
if (dsf)
{
Fill(Stream_Audio, 0, Audio_Format_Settings_Mode, "DSF");
Fill(Stream_Audio, 0, Audio_Format_Settings, "DSF");
Fill(Stream_Audio, 0, Audio_Format_Settings_Mode, __T("DSD")+Ztring::ToZtring(16<<SamplingRate_Shift));
Fill(Stream_Audio, 0, Audio_Format_Settings, __T("DSD")+Ztring::ToZtring(16<<SamplingRate_Shift));
}
if (correction)
Fill(Stream_Audio, 0, Audio_Format_AdditionalFeatures, "Correction");
Expand All @@ -613,32 +614,50 @@ void File_Wvpk::id_07()
void File_Wvpk::id_0D()
{
//Parsing
Get_L1 (num_channels, "num_channels");
switch (Size)
if (Size == 6 || Size == 7) // new case where number of streams > 8
{
int8u num_chans_low8, num_chans_high4;
Get_L1 (num_chans_low8, "num_channels");
Skip_XX(1, "num_streams");
Get_L1 (num_chans_high4, "num_channels");
num_channels = num_chans_low8 + ((num_chans_high4 & 0xF) << 8) + 1;

if (Size == 6)
Get_L3 (channel_mask, "channel_mask");
else // Size == 7
Get_L4 (channel_mask, "channel_mask");
}
else
{
case 1 :
break;
case 2 :
{
int8u channel_mask_1;
Get_L1 (channel_mask_1, "channel_mask");
channel_mask=channel_mask_1;
}
break;
case 3 :
{
int16u channel_mask_2;
Get_L2 (channel_mask_2, "channel_mask");
channel_mask=channel_mask_2;
}
break;
case 4 :
Get_L3 (channel_mask, "channel_mask");
break;
case 5 :
Get_L4 (channel_mask, "channel_mask");
break;
default : Skip_XX(Size, "unknown");
int8u num_chans_8;
Get_L1 (num_chans_8, "num_channels");
num_channels = num_chans_8;
switch (Size)
{
case 1 :
break;
case 2 :
{
int8u channel_mask_1;
Get_L1 (channel_mask_1, "channel_mask");
channel_mask=channel_mask_1;
}
break;
case 3 :
{
int16u channel_mask_2;
Get_L2 (channel_mask_2, "channel_mask");
channel_mask=channel_mask_2;
}
break;
case 4 :
Get_L3 (channel_mask, "channel_mask");
break;
case 5 :
Get_L4 (channel_mask, "channel_mask");
break;
default : Skip_XX(Size, "unknown");
}
}
}

Expand All @@ -650,6 +669,7 @@ void File_Wvpk::id_0E()
Get_L1 (Temp, "framerate multiplier");
if (Temp<31)
SamplingRate_Shift=Temp;
Skip_XX(Size-1, "Data");
}

//---------------------------------------------------------------------------
Expand Down
2 changes: 1 addition & 1 deletion Source/MediaInfo/Audio/File_Wvpk.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ private :
bool dsf;
int8u SamplingRate_Index;
int8u SamplingRate_Shift;
int8u num_channels;
int16u num_channels;
int32u SamplingRate;
int32u channel_mask;
int32u Size;
Expand Down

0 comments on commit 5108c1a

Please sign in to comment.