1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

use libfdk_aac for srs2.

This commit is contained in:
winlin 2015-06-08 15:02:19 +08:00
parent 00a25ee5c5
commit 574cf6a094
5 changed files with 37 additions and 35 deletions

View file

@ -19,9 +19,6 @@ echo "SRS_JOBS: ${SRS_JOBS}"
mkdir -p ${ff_build_dir} mkdir -p ${ff_build_dir}
mkdir -p ${ff_release_dir} mkdir -p ${ff_release_dir}
# for ubuntu14, donot compile libaacplus.
UBUNTU14=NO;grep -in "Ubuntu 14." /etc/issue >/dev/null 2>&1; if [[ $? -eq 0 ]]; then UBUNTU14=YES; fi
# yasm for libx264 # yasm for libx264
ff_yasm_bin=${ff_release_dir}/bin/yasm ff_yasm_bin=${ff_release_dir}/bin/yasm
if [[ -f ${ff_yasm_bin} ]]; then if [[ -f ${ff_yasm_bin} ]]; then

View file

@ -2860,13 +2860,15 @@ vector<string> SrsConfig::get_engine_vfilter(SrsConfDirective* engine)
string SrsConfig::get_engine_vcodec(SrsConfDirective* engine) string SrsConfig::get_engine_vcodec(SrsConfDirective* engine)
{ {
static string DEFAULT = "";
if (!engine) { if (!engine) {
return ""; return DEFAULT;
} }
SrsConfDirective* conf = engine->get("vcodec"); SrsConfDirective* conf = engine->get("vcodec");
if (!conf) { if (!conf) {
return ""; return DEFAULT;
} }
return conf->arg0(); return conf->arg0();
@ -2998,13 +3000,15 @@ vector<string> SrsConfig::get_engine_vparams(SrsConfDirective* engine)
string SrsConfig::get_engine_acodec(SrsConfDirective* engine) string SrsConfig::get_engine_acodec(SrsConfDirective* engine)
{ {
static string DEFAULT = "";
if (!engine) { if (!engine) {
return ""; return DEFAULT;
} }
SrsConfDirective* conf = engine->get("acodec"); SrsConfDirective* conf = engine->get("acodec");
if (!conf) { if (!conf) {
return ""; return DEFAULT;
} }
return conf->arg0(); return conf->arg0();

View file

@ -783,7 +783,7 @@ public:
virtual std::vector<std::string> get_engine_vfilter(SrsConfDirective* engine); virtual std::vector<std::string> get_engine_vfilter(SrsConfDirective* engine);
/** /**
* get the vcodec of engine, * get the vcodec of engine,
* the codec of video, copy or libx264 * the codec of video, can be vn, copy or libx264
*/ */
virtual std::string get_engine_vcodec(SrsConfDirective* engine); virtual std::string get_engine_vcodec(SrsConfDirective* engine);
/** /**
@ -827,7 +827,7 @@ public:
virtual std::vector<std::string> get_engine_vparams(SrsConfDirective* engine); virtual std::vector<std::string> get_engine_vparams(SrsConfDirective* engine);
/** /**
* get the acodec of engine, * get the acodec of engine,
* the audio codec can be copy or libaacplus * the audio codec can be an, copy or libfdk_aac
*/ */
virtual std::string get_engine_acodec(SrsConfDirective* engine); virtual std::string get_engine_acodec(SrsConfDirective* engine);
/** /**

View file

@ -48,6 +48,7 @@ using namespace std;
// for example, libaacplus, aac, fdkaac // for example, libaacplus, aac, fdkaac
#define SRS_RTMP_ENCODER_ACODEC "aac" #define SRS_RTMP_ENCODER_ACODEC "aac"
#define SRS_RTMP_ENCODER_LIBAACPLUS "libaacplus" #define SRS_RTMP_ENCODER_LIBAACPLUS "libaacplus"
#define SRS_RTMP_ENCODER_LIBFDKAAC "libfdk_aac"
SrsFFMPEG::SrsFFMPEG(std::string ffmpeg_bin) SrsFFMPEG::SrsFFMPEG(std::string ffmpeg_bin)
{ {
@ -174,7 +175,7 @@ int SrsFFMPEG::initialize_transcode(SrsConfDirective* engine)
} }
// @see, https://github.com/simple-rtmp-server/srs/issues/145 // @see, https://github.com/simple-rtmp-server/srs/issues/145
if (acodec == SRS_RTMP_ENCODER_LIBAACPLUS) { if (acodec == SRS_RTMP_ENCODER_LIBAACPLUS && acodec != SRS_RTMP_ENCODER_LIBFDKAAC) {
if (abitrate < 16 || abitrate > 72) { if (abitrate < 16 || abitrate > 72) {
ret = ERROR_ENCODER_ABITRATE; ret = ERROR_ENCODER_ABITRATE;
srs_error("invalid abitrate for aac: %d, must in [16, 72], ret=%d", abitrate, ret); srs_error("invalid abitrate for aac: %d, must in [16, 72], ret=%d", abitrate, ret);

View file

@ -289,7 +289,7 @@ std::string _full_conf = ""
" bf 3; \n " " bf 3; \n "
" refs 10; \n " " refs 10; \n "
" } \n " " } \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 70; \n " " abitrate 70; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -320,7 +320,7 @@ std::string _full_conf = ""
" vpreset superfast; \n " " vpreset superfast; \n "
" vparams { \n " " vparams { \n "
" } \n " " } \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 45; \n " " abitrate 45; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -349,7 +349,7 @@ std::string _full_conf = ""
" vpreset superfast; \n " " vpreset superfast; \n "
" vparams { \n " " vparams { \n "
" } \n " " } \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 45; \n " " abitrate 45; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -379,7 +379,7 @@ std::string _full_conf = ""
" vpreset superfast; \n " " vpreset superfast; \n "
" vparams { \n " " vparams { \n "
" } \n " " } \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 45; \n " " abitrate 45; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -396,7 +396,7 @@ std::string _full_conf = ""
" engine acodec { \n " " engine acodec { \n "
" enabled on; \n " " enabled on; \n "
" vcodec copy; \n " " vcodec copy; \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 45; \n " " abitrate 45; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -413,7 +413,7 @@ std::string _full_conf = ""
" engine vn { \n " " engine vn { \n "
" enabled on; \n " " enabled on; \n "
" vcodec vn; \n " " vcodec vn; \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 45; \n " " abitrate 45; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -461,7 +461,7 @@ std::string _full_conf = ""
" bf 3; \n " " bf 3; \n "
" refs 10; \n " " refs 10; \n "
" } \n " " } \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 70; \n " " abitrate 70; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -483,7 +483,7 @@ std::string _full_conf = ""
" vpreset medium; \n " " vpreset medium; \n "
" vparams { \n " " vparams { \n "
" } \n " " } \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 70; \n " " abitrate 70; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -503,7 +503,7 @@ std::string _full_conf = ""
" vpreset fast; \n " " vpreset fast; \n "
" vparams { \n " " vparams { \n "
" } \n " " } \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 60; \n " " abitrate 60; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -523,7 +523,7 @@ std::string _full_conf = ""
" vpreset superfast; \n " " vpreset superfast; \n "
" vparams { \n " " vparams { \n "
" } \n " " } \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 45; \n " " abitrate 45; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -534,7 +534,7 @@ std::string _full_conf = ""
" engine vcopy { \n " " engine vcopy { \n "
" enabled on; \n " " enabled on; \n "
" vcodec copy; \n " " vcodec copy; \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 45; \n " " abitrate 45; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -581,7 +581,7 @@ std::string _full_conf = ""
" vpreset superfast; \n " " vpreset superfast; \n "
" vparams { \n " " vparams { \n "
" } \n " " } \n "
" acodec libaacplus; \n " " acodec libfdk_aac; \n "
" abitrate 45; \n " " abitrate 45; \n "
" asample_rate 44100; \n " " asample_rate 44100; \n "
" achannels 2; \n " " achannels 2; \n "
@ -2586,7 +2586,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_mirror)
EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str()); EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str());
EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str()); EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0);
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(45, conf.get_engine_abitrate(engine)); EXPECT_EQ(45, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -2676,7 +2676,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_crop)
EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str()); EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str());
EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str()); EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0);
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(45, conf.get_engine_abitrate(engine)); EXPECT_EQ(45, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -2766,7 +2766,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_logo)
EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str()); EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str());
EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str()); EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0);
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(45, conf.get_engine_abitrate(engine)); EXPECT_EQ(45, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -2849,7 +2849,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_audio)
EXPECT_STREQ("flv", conf.get_engine_iformat(engine).c_str()); EXPECT_STREQ("flv", conf.get_engine_iformat(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vfilter(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vfilter(engine).size() == 0);
EXPECT_STREQ("copy", conf.get_engine_vcodec(engine).c_str()); EXPECT_STREQ("copy", conf.get_engine_vcodec(engine).c_str());
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(45, conf.get_engine_abitrate(engine)); EXPECT_EQ(45, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -2933,7 +2933,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_vn)
EXPECT_STREQ("flv", conf.get_engine_iformat(engine).c_str()); EXPECT_STREQ("flv", conf.get_engine_iformat(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vfilter(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vfilter(engine).size() == 0);
EXPECT_STREQ("vn", conf.get_engine_vcodec(engine).c_str()); EXPECT_STREQ("vn", conf.get_engine_vcodec(engine).c_str());
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(45, conf.get_engine_abitrate(engine)); EXPECT_EQ(45, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -3105,7 +3105,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_all)
EXPECT_STREQ("main", conf.get_engine_vprofile(engine).c_str()); EXPECT_STREQ("main", conf.get_engine_vprofile(engine).c_str());
EXPECT_STREQ("medium", conf.get_engine_vpreset(engine).c_str()); EXPECT_STREQ("medium", conf.get_engine_vpreset(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() > 0); EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() > 0);
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(70, conf.get_engine_abitrate(engine)); EXPECT_EQ(70, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -3130,7 +3130,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_all)
EXPECT_STREQ("main", conf.get_engine_vprofile(engine).c_str()); EXPECT_STREQ("main", conf.get_engine_vprofile(engine).c_str());
EXPECT_STREQ("medium", conf.get_engine_vpreset(engine).c_str()); EXPECT_STREQ("medium", conf.get_engine_vpreset(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0);
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(70, conf.get_engine_abitrate(engine)); EXPECT_EQ(70, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -3155,7 +3155,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_all)
EXPECT_STREQ("main", conf.get_engine_vprofile(engine).c_str()); EXPECT_STREQ("main", conf.get_engine_vprofile(engine).c_str());
EXPECT_STREQ("fast", conf.get_engine_vpreset(engine).c_str()); EXPECT_STREQ("fast", conf.get_engine_vpreset(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0);
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(60, conf.get_engine_abitrate(engine)); EXPECT_EQ(60, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -3180,7 +3180,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_all)
EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str()); EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str());
EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str()); EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0);
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(45, conf.get_engine_abitrate(engine)); EXPECT_EQ(45, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -3197,7 +3197,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_all)
EXPECT_STREQ("flv", conf.get_engine_iformat(engine).c_str()); EXPECT_STREQ("flv", conf.get_engine_iformat(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vfilter(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vfilter(engine).size() == 0);
EXPECT_STREQ("copy", conf.get_engine_vcodec(engine).c_str()); EXPECT_STREQ("copy", conf.get_engine_vcodec(engine).c_str());
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(45, conf.get_engine_abitrate(engine)); EXPECT_EQ(45, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -3322,7 +3322,7 @@ VOID TEST(ConfigMainTest, ParseFullConf_transcode_ffempty)
EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str()); EXPECT_STREQ("baseline", conf.get_engine_vprofile(engine).c_str());
EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str()); EXPECT_STREQ("superfast", conf.get_engine_vpreset(engine).c_str());
EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0); EXPECT_TRUE((int)conf.get_engine_vparams(engine).size() == 0);
EXPECT_STREQ("libaacplus", conf.get_engine_acodec(engine).c_str()); EXPECT_STREQ("libfdk_aac", conf.get_engine_acodec(engine).c_str());
EXPECT_EQ(45, conf.get_engine_abitrate(engine)); EXPECT_EQ(45, conf.get_engine_abitrate(engine));
EXPECT_EQ(44100, conf.get_engine_asample_rate(engine)); EXPECT_EQ(44100, conf.get_engine_asample_rate(engine));
EXPECT_EQ(2, conf.get_engine_achannels(engine)); EXPECT_EQ(2, conf.get_engine_achannels(engine));
@ -4837,12 +4837,12 @@ VOID TEST(ConfigMainTest, CheckConf_transcode)
if (true) { if (true) {
MockSrsConfig conf; MockSrsConfig conf;
EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost v{transcode{engine {acodec libaacplus;}}}")); EXPECT_TRUE(ERROR_SUCCESS == conf.parse(_MIN_OK_CONF"vhost v{transcode{engine {acodec libfdk_aac;}}}"));
} }
if (true) { if (true) {
MockSrsConfig conf; MockSrsConfig conf;
EXPECT_TRUE(ERROR_SUCCESS != conf.parse(_MIN_OK_CONF"vhost v{transcode{engine {acodecs libaacplus;}}}")); EXPECT_TRUE(ERROR_SUCCESS != conf.parse(_MIN_OK_CONF"vhost v{transcode{engine {acodecs libfdk_aac;}}}"));
} }
if (true) { if (true) {