You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
7.0 KiB
C
143 lines
7.0 KiB
C
/*
|
|
* Musepack audio compression
|
|
* Copyright (c) 2005-2009, The Musepack Development Team
|
|
* Copyright (C) 1999-2004 Buschmann/Klemm/Piecha/Wolf
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
*/
|
|
|
|
#include "libmpcpsy.h"
|
|
#include <mpc/minimax.h>
|
|
|
|
|
|
typedef struct {
|
|
float ShortThr;
|
|
unsigned char MinValChoice;
|
|
unsigned int EarModelFlag;
|
|
signed char Ltq_offset;
|
|
float TMN;
|
|
float NMT;
|
|
signed char minSMR;
|
|
signed char Ltq_max;
|
|
unsigned short BandWidth;
|
|
unsigned char tmpMask_used;
|
|
unsigned char CVD_used;
|
|
float varLtq;
|
|
unsigned char MS_Channelmode;
|
|
unsigned char CombPenalities;
|
|
unsigned char NS_Order;
|
|
float PNS;
|
|
float TransDetect;
|
|
} Profile_Setting_t;
|
|
|
|
#define PROFILE_PRE2_TELEPHONE 5 // --quality 0
|
|
// #define PROFILE_PRE_TELEPHONE 6 // --quality 1
|
|
// #define PROFILE_TELEPHONE 7 // --quality 2
|
|
// #define PROFILE_THUMB 8 // --quality 3
|
|
// #define PROFILE_RADIO 9 // --quality 4
|
|
// #define PROFILE_STANDARD 10 // --quality 5
|
|
// #define PROFILE_XTREME 11 // --quality 6
|
|
// #define PROFILE_INSANE 12 // --quality 7
|
|
// #define PROFILE_BRAINDEAD 13 // --quality 8
|
|
// #define PROFILE_POST_BRAINDEAD 14 // --quality 9
|
|
#define PROFILE_POST2_BRAINDEAD 15 // --quality 10
|
|
|
|
|
|
static const Profile_Setting_t Profiles [16] = {
|
|
{ 0 },
|
|
{ 0 },
|
|
{ 0 },
|
|
{ 0 },
|
|
{ 0 },
|
|
/* Short MinVal EarModel Ltq_ min Ltq_ Band- tmpMask CVD_ varLtq MS Comb NS_ Trans */
|
|
/* Thr Choice Flag offset TMN NMT SMR max Width _used used channel Penal used PNS Det */
|
|
{ 1.e9f, 1, 300, 30, 3.0, -1.0, 0, 106, 4820, 1, 1, 1., 3, 24, 6, 1.09f, 200 }, // 0: pre-Telephone
|
|
{ 1.e9f, 1, 300, 24, 6.0, 0.5, 0, 100, 7570, 1, 1, 1., 3, 20, 6, 0.77f, 180 }, // 1: pre-Telephone
|
|
{ 1.e9f, 1, 400, 18, 9.0, 2.0, 0, 94, 10300, 1, 1, 1., 4, 18, 6, 0.55f, 160 }, // 2: Telephone
|
|
{ 50.0f, 2, 430, 12, 12.0, 3.5, 0, 88, 13090, 1, 1, 1., 5, 15, 6, 0.39f, 140 }, // 3: Thumb
|
|
{ 15.0f, 2, 440, 6, 15.0, 5.0, 0, 82, 15800, 1, 1, 1., 6, 10, 6, 0.27f, 120 }, // 4: Radio
|
|
{ 5.0f, 2, 550, 0, 18.0, 6.5, 1, 76, 19980, 1, 2, 1., 11, 9, 6, 0.00f, 100 }, // 5: Standard
|
|
{ 4.0f, 2, 560, -6, 21.0, 8.0, 2, 70, 22000, 1, 2, 1., 12, 7, 6, 0.00f, 80 }, // 6: Xtreme
|
|
{ 3.0f, 2, 570, -12, 24.0, 9.5, 3, 64, 24000, 1, 2, 2., 13, 5, 6, 0.00f, 60 }, // 7: Insane
|
|
{ 2.8f, 2, 580, -18, 27.0, 11.0, 4, 58, 26000, 1, 2, 4., 13, 4, 6, 0.00f, 40 }, // 8: BrainDead
|
|
{ 2.6f, 2, 590, -24, 30.0, 12.5, 5, 52, 28000, 1, 2, 8., 13, 4, 6, 0.00f, 20 }, // 9: post-BrainDead
|
|
{ 2.4f, 2, 599, -30, 33.0, 14.0, 6, 46, 30000, 1, 2, 16., 15, 2, 6, 0.00f, 10 }, //10: post-BrainDead
|
|
};
|
|
|
|
|
|
int TestProfileParams ( PsyModel* m )
|
|
{ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
|
static signed char TMNStereoAdj [] = { -6, -18, -15, -18, -12, -9, -6, 0,0,0, +1, +1, +1, +1, 0, +1 }; // Penalties for TMN
|
|
static signed char NMTStereoAdj [] = { -3, -18, -15, -15, -9, -6, -3, 0,0,0, 0, +1, +1, +1, 0, +1 }; // Penalties for NMT
|
|
int i;
|
|
|
|
m->MainQual = PROFILE_PRE2_TELEPHONE;
|
|
|
|
for ( i = PROFILE_PRE2_TELEPHONE; i <= PROFILE_POST2_BRAINDEAD; i++ ) {
|
|
if ( m->ShortThr > Profiles [i].ShortThr ) continue;
|
|
if ( m->MinValChoice < Profiles [i].MinValChoice ) continue;
|
|
if ( m->EarModelFlag < Profiles [i].EarModelFlag ) continue;
|
|
if ( m->Ltq_offset > Profiles [i].Ltq_offset ) continue;
|
|
if ( m->Ltq_max > Profiles [i].Ltq_max ) continue; // offset should normally be considered here
|
|
if ( m->TMN + TMNStereoAdj [m->MS_Channelmode] <
|
|
Profiles [i].TMN + TMNStereoAdj [Profiles [i].MS_Channelmode] )
|
|
continue;
|
|
if ( m->NMT + NMTStereoAdj [m->MS_Channelmode] <
|
|
Profiles [i].NMT + NMTStereoAdj [Profiles [i].MS_Channelmode] )
|
|
continue;
|
|
if ( m->minSMR < Profiles [i].minSMR ) continue;
|
|
if ( m->BandWidth < Profiles [i].BandWidth ) continue;
|
|
if ( m->tmpMask_used < Profiles [i].tmpMask_used ) continue;
|
|
if ( m->CVD_used < Profiles [i].CVD_used ) continue;
|
|
// if ( varLtq > Profiles [i].varLtq ) continue;
|
|
// if ( NS_Order < Profiles [i].NS_Order ) continue;
|
|
if ( m->PNS > Profiles [i].PNS ) continue;
|
|
m->MainQual = i;
|
|
}
|
|
return m->MainQual;
|
|
}
|
|
|
|
void SetQualityParams (PsyModel * m, float qual )
|
|
{
|
|
int i;
|
|
float mix;
|
|
|
|
qual = clip(qual, 0., 10.);
|
|
|
|
i = (int) qual + PROFILE_PRE2_TELEPHONE;
|
|
mix = qual - (int) qual;
|
|
|
|
m->MainQual = i;
|
|
m->FullQual = qual + PROFILE_PRE2_TELEPHONE;
|
|
m->ShortThr = Profiles [i].ShortThr * (1-mix) + Profiles [i+1].ShortThr * mix;
|
|
m->MinValChoice = Profiles [i].MinValChoice ;
|
|
m->EarModelFlag = Profiles [i].EarModelFlag ;
|
|
m->Ltq_offset = Profiles [i].Ltq_offset * (1-mix) + Profiles [i+1].Ltq_offset * mix;
|
|
m->varLtq = Profiles [i].varLtq * (1-mix) + Profiles [i+1].varLtq * mix;
|
|
m->Ltq_max = Profiles [i].Ltq_max * (1-mix) + Profiles [i+1].Ltq_max * mix;
|
|
m->TMN = Profiles [i].TMN * (1-mix) + Profiles [i+1].TMN * mix;
|
|
m->NMT = Profiles [i].NMT * (1-mix) + Profiles [i+1].NMT * mix;
|
|
m->minSMR = Profiles [i].minSMR ;
|
|
m->BandWidth = Profiles [i].BandWidth * (1-mix) + Profiles [i+1].BandWidth * mix;
|
|
m->tmpMask_used = Profiles [i].tmpMask_used ;
|
|
m->CVD_used = Profiles [i].CVD_used ;
|
|
m->MS_Channelmode = Profiles [i].MS_Channelmode;
|
|
m->CombPenalities = Profiles [i].CombPenalities;
|
|
m->NS_Order = Profiles [i].NS_Order ;
|
|
m->PNS = Profiles [i].PNS * (1-mix) + Profiles [i+1].PNS * mix;
|
|
m->TransDetect = Profiles [i].TransDetect* (1-mix) + Profiles [i+1].TransDetect* mix;
|
|
}
|
|
|