Skip to content

Commit 3f09e43

Browse files
authored
Merge pull request #19033 from hrydgard/at3-standalone
Break out the Atrac3/Atrac3+ decoders from FFMPEG to a separate library
2 parents 9953786 + 58cb2ba commit 3f09e43

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+9877
-33
lines changed

CMakeLists.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -2215,6 +2215,9 @@ add_library(${CoreLibName} ${CoreLinkType}
22152215
Core/HLE/scePauth.h
22162216
Core/HW/SimpleAudioDec.cpp
22172217
Core/HW/SimpleAudioDec.h
2218+
Core/HW/Atrac3Standalone.cpp
2219+
Core/HW/Atrac3Standalone.h
2220+
Core/HW/SimpleAudioDec.h
22182221
Core/HW/AsyncIOManager.cpp
22192222
Core/HW/AsyncIOManager.h
22202223
Core/HW/BufferQueue.cpp
@@ -2363,7 +2366,7 @@ endif()
23632366

23642367
include_directories(ext/libchdr/include)
23652368

2366-
target_link_libraries(${CoreLibName} Common native chdr kirk cityhash sfmt19937 xbrz xxhash rcheevos minimp3 ${GlslangLibs}
2369+
target_link_libraries(${CoreLibName} Common native chdr kirk cityhash sfmt19937 xbrz xxhash rcheevos minimp3 at3_standalone ${GlslangLibs}
23672370
${CoreExtraLibs} ${OPENGL_LIBRARIES} ${X11_LIBRARIES} ${CMAKE_DL_LIBS})
23682371

23692372
if(NOT HTTPS_NOT_AVAILABLE)

Common/Common.vcxproj

+28-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8"?>
22
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
33
<ItemGroup Label="ProjectConfigurations">
44
<ProjectConfiguration Include="Debug|ARM">
@@ -385,6 +385,19 @@
385385
</Lib>
386386
</ItemDefinitionGroup>
387387
<ItemGroup>
388+
<ClInclude Include="..\ext\at3_standalone\at3_decoders.h" />
389+
<ClInclude Include="..\ext\at3_standalone\atrac.h" />
390+
<ClInclude Include="..\ext\at3_standalone\atrac3data.h" />
391+
<ClInclude Include="..\ext\at3_standalone\atrac3plus.h" />
392+
<ClInclude Include="..\ext\at3_standalone\atrac3plus_data.h" />
393+
<ClInclude Include="..\ext\at3_standalone\compat.h" />
394+
<ClInclude Include="..\ext\at3_standalone\fft.h" />
395+
<ClInclude Include="..\ext\at3_standalone\float_dsp.h" />
396+
<ClInclude Include="..\ext\at3_standalone\get_bits.h" />
397+
<ClInclude Include="..\ext\at3_standalone\intreadwrite.h" />
398+
<ClInclude Include="..\ext\at3_standalone\mathematics.h" />
399+
<ClInclude Include="..\ext\at3_standalone\mem.h" />
400+
<ClInclude Include="..\ext\at3_standalone\sinewin.h" />
388401
<ClInclude Include="..\ext\basis_universal\basisu.h" />
389402
<ClInclude Include="..\ext\basis_universal\basisu_containers.h" />
390403
<ClInclude Include="..\ext\basis_universal\basisu_containers_impl.h" />
@@ -584,6 +597,18 @@
584597
<ClInclude Include="x64Emitter.h" />
585598
</ItemGroup>
586599
<ItemGroup>
600+
<ClCompile Include="..\ext\at3_standalone\atrac.cpp" />
601+
<ClCompile Include="..\ext\at3_standalone\atrac3.cpp" />
602+
<ClCompile Include="..\ext\at3_standalone\atrac3plus.cpp" />
603+
<ClCompile Include="..\ext\at3_standalone\atrac3plusdec.cpp" />
604+
<ClCompile Include="..\ext\at3_standalone\atrac3plusdsp.cpp" />
605+
<ClCompile Include="..\ext\at3_standalone\get_bits.cpp" />
606+
<ClCompile Include="..\ext\at3_standalone\compat.cpp" />
607+
<ClCompile Include="..\ext\at3_standalone\fft.cpp" />
608+
<ClCompile Include="..\ext\at3_standalone\float_dsp.cpp" />
609+
<ClCompile Include="..\ext\at3_standalone\mathematics.cpp" />
610+
<ClCompile Include="..\ext\at3_standalone\mem.cpp" />
611+
<ClCompile Include="..\ext\at3_standalone\sinewin.cpp" />
587612
<ClCompile Include="..\ext\basis_universal\basisu_transcoder.cpp" />
588613
<ClCompile Include="..\ext\libpng17\png.c">
589614
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">NotUsing</PrecompiledHeader>
@@ -1016,6 +1041,8 @@
10161041
<ClCompile Include="x64Emitter.cpp" />
10171042
</ItemGroup>
10181043
<ItemGroup>
1044+
<Text Include="..\ext\at3_standalone\CMakeLists.txt" />
1045+
<Text Include="..\ext\at3_standalone\README.txt" />
10191046
<Text Include="..\ext\libpng17\CMakeLists.txt" />
10201047
</ItemGroup>
10211048
<ItemGroup>

Common/Common.vcxproj.filters

+84
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,45 @@
524524
<ClInclude Include="..\ext\minimp3\minimp3.h">
525525
<Filter>ext\minimp3</Filter>
526526
</ClInclude>
527+
<ClInclude Include="..\ext\at3_standalone\atrac3data.h">
528+
<Filter>ext\at3_standalone</Filter>
529+
</ClInclude>
530+
<ClInclude Include="..\ext\at3_standalone\atrac3plus.h">
531+
<Filter>ext\at3_standalone</Filter>
532+
</ClInclude>
533+
<ClInclude Include="..\ext\at3_standalone\atrac3plus_data.h">
534+
<Filter>ext\at3_standalone</Filter>
535+
</ClInclude>
536+
<ClInclude Include="..\ext\at3_standalone\atrac.h">
537+
<Filter>ext\at3_standalone</Filter>
538+
</ClInclude>
539+
<ClInclude Include="..\ext\at3_standalone\get_bits.h">
540+
<Filter>ext\at3_standalone</Filter>
541+
</ClInclude>
542+
<ClInclude Include="..\ext\at3_standalone\compat.h">
543+
<Filter>ext\at3_standalone</Filter>
544+
</ClInclude>
545+
<ClInclude Include="..\ext\at3_standalone\fft.h">
546+
<Filter>ext\at3_standalone</Filter>
547+
</ClInclude>
548+
<ClInclude Include="..\ext\at3_standalone\float_dsp.h">
549+
<Filter>ext\at3_standalone</Filter>
550+
</ClInclude>
551+
<ClInclude Include="..\ext\at3_standalone\intreadwrite.h">
552+
<Filter>ext\at3_standalone</Filter>
553+
</ClInclude>
554+
<ClInclude Include="..\ext\at3_standalone\mathematics.h">
555+
<Filter>ext\at3_standalone</Filter>
556+
</ClInclude>
557+
<ClInclude Include="..\ext\at3_standalone\at3_decoders.h">
558+
<Filter>ext\at3_standalone</Filter>
559+
</ClInclude>
560+
<ClInclude Include="..\ext\at3_standalone\mem.h">
561+
<Filter>ext\at3_standalone</Filter>
562+
</ClInclude>
563+
<ClInclude Include="..\ext\at3_standalone\sinewin.h">
564+
<Filter>ext\at3_standalone</Filter>
565+
</ClInclude>
527566
</ItemGroup>
528567
<ItemGroup>
529568
<ClCompile Include="ABI.cpp" />
@@ -981,6 +1020,42 @@
9811020
<ClCompile Include="..\ext\minimp3\minimp3.cpp">
9821021
<Filter>ext\minimp3</Filter>
9831022
</ClCompile>
1023+
<ClCompile Include="..\ext\at3_standalone\atrac3.cpp">
1024+
<Filter>ext\at3_standalone</Filter>
1025+
</ClCompile>
1026+
<ClCompile Include="..\ext\at3_standalone\atrac3plus.cpp">
1027+
<Filter>ext\at3_standalone</Filter>
1028+
</ClCompile>
1029+
<ClCompile Include="..\ext\at3_standalone\atrac3plusdec.cpp">
1030+
<Filter>ext\at3_standalone</Filter>
1031+
</ClCompile>
1032+
<ClCompile Include="..\ext\at3_standalone\atrac3plusdsp.cpp">
1033+
<Filter>ext\at3_standalone</Filter>
1034+
</ClCompile>
1035+
<ClCompile Include="..\ext\at3_standalone\float_dsp.cpp">
1036+
<Filter>ext\at3_standalone</Filter>
1037+
</ClCompile>
1038+
<ClCompile Include="..\ext\at3_standalone\mem.cpp">
1039+
<Filter>ext\at3_standalone</Filter>
1040+
</ClCompile>
1041+
<ClCompile Include="..\ext\at3_standalone\sinewin.cpp">
1042+
<Filter>ext\at3_standalone</Filter>
1043+
</ClCompile>
1044+
<ClCompile Include="..\ext\at3_standalone\atrac.cpp">
1045+
<Filter>ext\at3_standalone</Filter>
1046+
</ClCompile>
1047+
<ClCompile Include="..\ext\at3_standalone\mathematics.cpp">
1048+
<Filter>ext\at3_standalone</Filter>
1049+
</ClCompile>
1050+
<ClCompile Include="..\ext\at3_standalone\fft.cpp">
1051+
<Filter>ext\at3_standalone</Filter>
1052+
</ClCompile>
1053+
<ClCompile Include="..\ext\at3_standalone\get_bits.cpp">
1054+
<Filter>ext\at3_standalone</Filter>
1055+
</ClCompile>
1056+
<ClCompile Include="..\ext\at3_standalone\compat.cpp">
1057+
<Filter>ext\at3_standalone</Filter>
1058+
</ClCompile>
9841059
</ItemGroup>
9851060
<ItemGroup>
9861061
<Filter Include="Crypto">
@@ -1094,11 +1169,20 @@
10941169
<Filter Include="ext\minimp3">
10951170
<UniqueIdentifier>{83cd76d0-d1ac-4ed1-9bdc-11fb5a20e5d3}</UniqueIdentifier>
10961171
</Filter>
1172+
<Filter Include="ext\at3_standalone">
1173+
<UniqueIdentifier>{586da66e-922a-4479-9dac-9d608a1b9183}</UniqueIdentifier>
1174+
</Filter>
10971175
</ItemGroup>
10981176
<ItemGroup>
10991177
<Text Include="..\ext\libpng17\CMakeLists.txt">
11001178
<Filter>ext\libpng17</Filter>
11011179
</Text>
1180+
<Text Include="..\ext\at3_standalone\README.txt">
1181+
<Filter>ext\at3_standalone</Filter>
1182+
</Text>
1183+
<Text Include="..\ext\at3_standalone\CMakeLists.txt">
1184+
<Filter>ext\at3_standalone</Filter>
1185+
</Text>
11021186
</ItemGroup>
11031187
<ItemGroup>
11041188
<None Include="..\ext\basis_universal\basisu_transcoder_tables_astc.inc">

Core/Core.vcxproj

+2
Original file line numberDiff line numberDiff line change
@@ -573,6 +573,7 @@
573573
<ClCompile Include="HLE\sceUsbAcc.cpp" />
574574
<ClCompile Include="HLE\sceUsbCam.cpp" />
575575
<ClCompile Include="HLE\sceUsbMic.cpp" />
576+
<ClCompile Include="HW\Atrac3Standalone.cpp" />
576577
<ClCompile Include="HW\BufferQueue.cpp" />
577578
<ClCompile Include="HW\Camera.cpp" />
578579
<ClCompile Include="HW\Display.cpp" />
@@ -1181,6 +1182,7 @@
11811182
<ClInclude Include="HLE\sceUsbAcc.h" />
11821183
<ClInclude Include="HLE\sceUsbCam.h" />
11831184
<ClInclude Include="HLE\sceUsbMic.h" />
1185+
<ClInclude Include="HW\Atrac3Standalone.h" />
11841186
<ClInclude Include="HW\Camera.h" />
11851187
<ClInclude Include="HW\Display.h" />
11861188
<ClInclude Include="Instance.h" />

Core/Core.vcxproj.filters

+6
Original file line numberDiff line numberDiff line change
@@ -1306,6 +1306,9 @@
13061306
<ClCompile Include="Util\MemStick.cpp">
13071307
<Filter>Util</Filter>
13081308
</ClCompile>
1309+
<ClCompile Include="HW\Atrac3Standalone.cpp">
1310+
<Filter>HW</Filter>
1311+
</ClCompile>
13091312
</ItemGroup>
13101313
<ItemGroup>
13111314
<ClInclude Include="ELF\ElfReader.h">
@@ -2088,6 +2091,9 @@
20882091
<ClInclude Include="Util\MemStick.h">
20892092
<Filter>Util</Filter>
20902093
</ClInclude>
2094+
<ClInclude Include="HW\Atrac3Standalone.h">
2095+
<Filter>HW</Filter>
2096+
</ClInclude>
20912097
</ItemGroup>
20922098
<ItemGroup>
20932099
<None Include="..\LICENSE.TXT" />

Core/HW/Atrac3Standalone.cpp

+123
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
#include "SimpleAudioDec.h"
2+
3+
#include "ext/at3_standalone/at3_decoders.h"
4+
5+
inline int16_t clamp16(float f) {
6+
if (f >= 1.0f)
7+
return 32767;
8+
else if (f <= -1.0f)
9+
return -32767;
10+
else
11+
return (int)(f * 32767);
12+
}
13+
14+
// Uses our standalone AT3/AT3+ decoder derived from FFMPEG
15+
// Test case for ATRAC3: Mega Man Maverick Hunter X, PSP menu sound
16+
class Atrac3Audio : public AudioDecoder {
17+
public:
18+
Atrac3Audio(PSPAudioType audioType, int channels, size_t blockAlign, const uint8_t *extraData, size_t extraDataSize) : audioType_(audioType) {
19+
blockAlign_ = blockAlign;
20+
if (audioType == PSP_CODEC_AT3PLUS) {
21+
at3pCtx_ = atrac3p_alloc(channels, &blockAlign_);
22+
if (at3pCtx_)
23+
codecOpen_ = true;
24+
} else if (audioType_ == PSP_CODEC_AT3) {
25+
at3Ctx_ = atrac3_alloc(channels, &blockAlign_, extraData, extraDataSize);
26+
if (at3Ctx_)
27+
codecOpen_ = true;
28+
}
29+
for (int i = 0; i < 2; i++) {
30+
buffers_[i] = new float[4096];
31+
}
32+
}
33+
~Atrac3Audio() {
34+
if (at3Ctx_) {
35+
atrac3_free(at3Ctx_);
36+
}
37+
if (at3pCtx_) {
38+
atrac3p_free(at3pCtx_);
39+
}
40+
for (int i = 0; i < 2; i++) {
41+
delete[] buffers_[i];
42+
}
43+
}
44+
45+
bool IsOK() const override {
46+
return codecOpen_;
47+
}
48+
49+
bool Decode(const uint8_t *inbuf, int inbytes, uint8_t *outbuf, int *outbytes) override {
50+
if (!codecOpen_) {
51+
_dbg_assert_(false);
52+
}
53+
if (inbytes != blockAlign_ && blockAlign_ != 0) {
54+
WARN_LOG(ME, "Atrac3Audio::Decode: Unexpected block align %d (expected %d)", inbytes, blockAlign_);
55+
}
56+
blockAlign_ = inbytes;
57+
// We just call the decode function directly without going through the whole packet machinery.
58+
int got_frame = 0;
59+
int result;
60+
int nb_samples = 0;
61+
if (audioType_ == PSP_CODEC_AT3PLUS) {
62+
result = atrac3p_decode_frame(at3pCtx_, buffers_, &nb_samples, &got_frame, inbuf, inbytes);
63+
} else {
64+
65+
result = atrac3_decode_frame(at3Ctx_, buffers_, &nb_samples, &got_frame, inbuf, inbytes);
66+
}
67+
if (result < 0) {
68+
*outbytes = 0;
69+
return false;
70+
}
71+
srcPos_ = result;
72+
outSamples_ = nb_samples;
73+
if (nb_samples > 0) {
74+
*outbytes = nb_samples * 2 * 2;
75+
76+
// Convert frame to outbuf.
77+
for (int channel = 0; channel < 2; channel++) {
78+
int16_t *output = (int16_t *)outbuf;
79+
for (int i = 0; i < nb_samples; i++) {
80+
output[i * 2] = clamp16(buffers_[0][i]);
81+
output[i * 2 + 1] = clamp16(buffers_[1][i]);
82+
}
83+
}
84+
} else {
85+
*outbytes = 0;
86+
}
87+
return true;
88+
}
89+
90+
int GetOutSamples() const override {
91+
return outSamples_;
92+
}
93+
int GetSourcePos() const override {
94+
return srcPos_;
95+
}
96+
97+
void SetChannels(int channels) override {
98+
// Hmm. ignore for now.
99+
}
100+
101+
PSPAudioType GetAudioType() const override { return audioType_; }
102+
103+
private:
104+
ATRAC3PContext *at3pCtx_ = nullptr;
105+
ATRAC3Context *at3Ctx_ = nullptr;
106+
107+
int blockAlign_ = 0;
108+
109+
int outSamples_ = 0;
110+
int srcPos_ = 0;
111+
float *buffers_[2]{};
112+
113+
bool codecOpen_ = false;
114+
115+
PSPAudioType audioType_;
116+
};
117+
118+
AudioDecoder *CreateAtrac3Audio(int channels, size_t blockAlign, const uint8_t *extraData, size_t extraDataSize) {
119+
return new Atrac3Audio(PSP_CODEC_AT3, channels, blockAlign, extraData, extraDataSize);
120+
}
121+
AudioDecoder *CreateAtrac3PlusAudio(int channels, size_t blockAlign) {
122+
return new Atrac3Audio(PSP_CODEC_AT3PLUS, channels, blockAlign, nullptr, 0);
123+
}

Core/HW/Atrac3Standalone.h

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
#pragma once
2+
3+
#include "SimpleAudioDec.h"
4+
5+
AudioDecoder *CreateAtrac3Audio(int channels, size_t blockAlign, const uint8_t *extraData, size_t extraDataSize);
6+
AudioDecoder *CreateAtrac3PlusAudio(int channels, size_t blockAlign);

0 commit comments

Comments
 (0)