Здравствуйте, Blazkowicz, Вы писали:
B>Ты жу не обижайся, но код форамтировать надо чтобы хоть кто-то удосужился прочитать. Так уж и быть подправлю твой пост.
B>А профайлер пробовал? Ты легко найдешь кто дает бОльшую нагрузку? inputAudioStream.read(buffer);
B>Может имеет смысл поигратся с размером буфера? Если к примеру inputAudioStream.read(buffer); вычитывает не очень много данных, то цикл выполняется очень часто. Если найти способ увеличть время выполнение цикла, пока буфер определенного размера не будет заполнен, то и цикл не будет выполнять а поток будет просто ждать пока прийдет достаточно данных. inputAudioStream хотя бы обернут в BufferedInputStream?
Неа, необернут, попробую этот вариант, просто уже крышу рвет от этого Кодера, просто я не думаю что следующий кусок кода "g729.encode(buffer, 0, buffer1, 0)" выполняется шустро, привожу пример пример одного из его методов "Квантование линейного спектра или Quantazing LSP":
/****************************Qua_LSP*************************************/
i=0;
ind = 0;
offset = 0;
freq = 0;
L_temp = 0;
Temp1 = 0;
Temp2 = 0;
ind = 63;
for(i=LD8A.M-1; i>=0; i--){
while(basic_op.sub(tab_ld8a.table2[ind], lsp_new[i]) < 0){
ind = basic_op.sub(ind, 1);
if(ind <= 0){
break;
}
}
offset = basic_op.sub(lsp_new[i], tab_ld8a.table2[ind]);
L_temp = basic_op.L_mult(tab_ld8a.slope_acos[ind], offset);
Temp1 = basic_op.shl(ind, 9);
Temp2 = basic_op.L_shr(L_temp, 12);
freq = basic_op.add((int)Temp1,(int)Temp2);
lsf[i] = basic_op.mult(freq, 25736);
}
/**********************Lsp_qua_cs****************************************/
i_cs = 0;
sft_cs = 0;
mode_cs = 0;
j_cs = 0;
index_cs = 0;
mode_index_cs = 0;
cand_cur_cs = 0;
L_accb_cs = 0;
L_acc_cs = 0;
Temp1_cs = 0;
Temp2_cs = 0;
Temp3_cs = 0;
L_dmin_cs = 0;
/***************************Get_weigt***********************************/
buf_cs[0] = (int)(lsf[1] - (LD8A.PI04+8192));
for(i_cs=1; i_cs < LD8A.M-1; i_cs++){
Temp1_cs = (int)(lsf[i_cs+1] - lsf[i_cs-1]);
buf_cs[i_cs] = (int)(Temp1_cs - 8192);
}
buf_cs[LD8A.M-1] = (int)((LD8A.PI92-8192) - lsf[LD8A.M-2]);
for(i_cs=0; i_cs<LD8A.M; i_cs++){
if(buf_cs[i_cs]>0){
wegt_cs[i_cs] = 2048;
} else{
L_acc_cs = basic_op.L_mult(buf_cs[i_cs], buf_cs[i_cs]);
Temp1_cs = basic_op.L_shl(L_acc_cs, 2);
Temp1_cs = basic_op.extract_h(Temp1_cs);
L_acc_cs = basic_op.L_mult((int)Temp1_cs, LD8A.CONST10);
Temp1_cs = basic_op.L_shl(L_acc_cs, 2);
Temp1_cs = basic_op.extract_h(Temp1_cs);
wegt_cs[i_cs] = basic_op.add((int)Temp1_cs, 2048);
}
}
L_acc_cs = basic_op.L_mult(wegt_cs[4], LD8A.CONST12);
Temp1_cs = basic_op.L_shl(L_acc_cs, 1);
wegt_cs[4] = basic_op.extract_h(Temp1_cs);
L_acc_cs = basic_op.L_mult(wegt_cs[5], LD8A.CONST12);
Temp1_cs = basic_op.L_shl(L_acc_cs, 1);
wegt_cs[5] = basic_op.extract_h(Temp1_cs);
Temp1_cs = 0;
for(i_cs=0; i_cs<LD8A.M; i_cs++){
Temp1_cs = (int)(wegt_cs[i_cs] - (int)Temp1_cs);
if(Temp1_cs>0){
Temp1_cs = wegt_cs[i_cs];
}
}
sft_cs = basic_op.norm_s((int)Temp1_cs);
for(i_cs=0; i_cs<LD8A.M; i_cs++){
wegt_cs[i_cs] = basic_op.shl(wegt_cs[i_cs], sft_cs);
}
/*********************************************************************/
/***********************Relspwed***********************************/
for(mode_cs=0; mode_cs < LD8A.MODE; mode_cs++){
for(j_cs=0; j_cs<LD8A.M; j_cs++){
Temp2_cs = (int)(16<<lsf[j_cs]);
for(i_cs=0; i_cs<LD8A.MA_NP; i_cs++){
Temp1_cs = Freq_prev[i_cs][j_cs] * tab_ld8a.fg[mode_cs][i_cs][j_cs];
if (Temp1_cs != 0x40000000) {
Temp1_cs *= 2;
} else {
Temp1_cs = basic_op.MAX_64;
}
Temp2_cs-= Temp1_cs;
if (((Temp2_cs ^ Temp1_cs) & basic_op.MIN_64) != 0) {
if (((Temp2_cs ^ Temp2_cs) & basic_op.MIN_64)>0) {
Temp2_cs = (Temp2_cs < 0) ? basic_op.MIN_64 : basic_op.MAX_64;
}
}
}
Temp1_cs = (int)(Temp2_cs>>16);
Temp2_cs = (int)Temp1_cs*tab_ld8a.fg_sum_inv[mode_cs][j_cs];
if (Temp2_cs != 0x40000000) {
Temp2_cs *= 2;
} else {
Temp2_cs = basic_op.MAX_64;
}
rbuf_cs[j_cs] = (int)(L_shl1(Temp2_cs, 3)>>16);
}
cand_cur_cs = 0;
L_dmin_cs = basic_op.MAX_64;
for(i_cs=0;i_cs<LD8A.NC0;i_cs++){
Temp1_cs = 0;
for(j_cs=0;j_cs<LD8A.M;j_cs++){
Temp2_cs = (int)(rbuf_cs[j_cs] - tab_ld8a.lspcb1[i_cs][j_cs]);
Temp3_cs = Temp2_cs * Temp2_cs;
if (Temp3_cs != 0x40000000) {
Temp3_cs *= 2;
} else {
Temp3_cs = basic_op.MAX_64;
}
Temp1_cs+=Temp3_cs;
if (((Temp1_cs ^ Temp3_cs) & basic_op.MIN_64) == 0) {
if (((Temp1_cs ^ Temp1_cs) & basic_op.MIN_64)>0) {
Temp1_cs = (Temp1_cs < 0) ? basic_op.MIN_64 : basic_op.MAX_64;
}
}
}
Temp3_cs=Temp1_cs-L_dmin_cs;
if (((Temp1_cs ^ L_dmin_cs) & basic_op.MIN_64) != 0) {
if (((Temp3_cs ^ Temp1_cs) & basic_op.MIN_64)>0) {
Temp3_cs = (Temp1_cs < 0) ? basic_op.MIN_64 : basic_op.MAX_64;
}
}
if(Temp3_cs<0){
L_dmin_cs = Temp1_cs;
cand_cur_cs = i_cs;
}
}
cand_cs[mode_cs] = cand_cur_cs;
for(j_cs=0; j_cs<LD8A.NC; j_cs++){
buf1_cs[j_cs] = (int)(rbuf_cs[j_cs] - tab_ld8a.lspcb1[cand_cur_cs][j_cs]);
}
index_cs = 0;
L_dmin_cs = basic_op.MAX_64;
for(i_cs=0; i_cs<LD8A.NC1; i_cs++){
Temp1_cs = 0;
for(j_cs=0; j_cs<LD8A.NC; j_cs++){
Temp2_cs = (int)(buf1_cs[j_cs] - tab_ld8a.lspcb2[i_cs][j_cs]);
Temp3_cs = wegt_cs[j_cs] * (int)Temp2_cs;
Temp3_cs = (Temp3_cs & 0xffff8000) >> 15;
if ((Temp3_cs & 0x00010000)>0)
Temp3_cs = Temp3_cs | 0xffff0000;
Temp3_cs = (int)Temp3_cs;
Temp3_cs*= Temp2_cs;
if (Temp3_cs != 0x40000000) {
Temp3_cs *= 2;
} else {
Temp3_cs = basic_op.MAX_64;
}
Temp1_cs+=Temp3_cs;
if (((Temp1_cs ^ Temp3_cs) & basic_op.MIN_64) == 0) {
if (((Temp1_cs ^ Temp1_cs) & basic_op.MIN_64)>0) {
Temp1_cs = (Temp1_cs < 0) ? basic_op.MIN_64 : basic_op.MAX_64;
}
}
}
Temp2_cs= Temp1_cs - L_dmin_cs;
if (((Temp1_cs ^ L_dmin_cs) & basic_op.MIN_64) != 0) {
if (((Temp2_cs ^ Temp1_cs) & basic_op.MIN_64)>0) {
Temp2_cs = (Temp1_cs < 0) ? basic_op.MIN_64 : basic_op.MAX_64;
}
}
if(Temp2_cs < 0){
L_dmin_cs = Temp1_cs;
index_cs = i_cs;
}
}
tindex1_cs[mode_cs] = index_cs;
for(i_cs=0; i_cs < LD8A.NC; i_cs++){
buf_cs[j_cs] = (int)(tab_ld8a.lspcb1[cand_cur_cs][i_cs]+tab_ld8a.lspcb2[index_cs][i_cs]);
}
for(j_cs=1; j_cs<LD8A.NC; j_cs++){
Temp1_cs = (int)(buf_cs[j_cs-1] - buf_cs[j_cs]);
Temp2_cs = (int)((int)Temp1_cs+LD8A.GAP1);
Temp2_cs = basic_op.shr((int)Temp2_cs, 1);
if(Temp2_cs > 0){
buf_cs[j_cs-1]-= Temp2_cs;
buf_cs[j_cs] = (int)(buf_cs[j_cs]+(int)Temp2_cs);
}
}
for(j_cs=LD8A.NC; j_cs < LD8A.M; j_cs++){
buf1_cs[j_cs] = (int)(rbuf_cs[j_cs] - tab_ld8a.lspcb1[cand_cur_cs][j_cs]);
}
index_cs = 0;
L_dmin_cs = basic_op.MAX_64;
for(i_cs = 0; i_cs < LD8A.NC1; i_cs++){
Temp1_cs = 0;
for(j_cs = LD8A.NC; j_cs < LD8A.M; j_cs++){
Temp2_cs = (int)(buf1_cs[j_cs] - tab_ld8a.lspcb2[i_cs][j_cs]);
Temp3_cs = wegt_cs[j_cs] * (int)Temp2_cs;
Temp3_cs = (Temp3_cs & 0xffff8000) >> 15;
if ((Temp3_cs & 0x00010000)>0)
Temp3_cs = Temp3_cs | 0xffff0000;
Temp3_cs = (int)Temp3_cs;
Temp3_cs*= Temp2_cs;
if (Temp3_cs != 0x40000000) {
Temp3_cs *= 2;
} else {
Temp3_cs = basic_op.MAX_64;
}
Temp1_cs+=Temp3_cs;
if (((Temp1_cs ^ Temp3_cs) & basic_op.MIN_64) == 0) {
if (((Temp1_cs ^ Temp1_cs) & basic_op.MIN_64)>0) {
Temp1_cs = (Temp1_cs < 0) ? basic_op.MIN_64 : basic_op.MAX_64;
}
}
}
Temp2_cs=Temp1_cs-L_dmin_cs;
if (((Temp1_cs ^ L_dmin_cs) & basic_op.MIN_64) != 0) {
if (((Temp2_cs ^ Temp1_cs) & basic_op.MIN_64)>0) {
Temp2_cs = (Temp1_cs < 0) ? basic_op.MIN_64 : basic_op.MAX_64;
}
}
if(Temp2_cs < 0){
L_dmin_cs = Temp1_cs;
index_cs = i_cs;
}
}
tindex2_cs[mode_cs] = index_cs;
for(j_cs=LD8A.NC; j_cs<LD8A.M; j_cs++){
buf_cs[j_cs] = (int)(tab_ld8a.lspcb1[cand_cur_cs][j_cs]+tab_ld8a.lspcb2[index_cs][j_cs]);
}
for(j_cs=LD8A.NC; j_cs<LD8A.M; j_cs++){
Temp1_cs = (int)(buf_cs[j_cs-1] - buf_cs[j_cs]);
Temp2_cs = (int)((int)Temp1_cs+LD8A.GAP1);
Temp2_cs = basic_op.shr((int)Temp2_cs, 1);
if(Temp2_cs > 0){
buf_cs[j_cs-1] = (int)(buf_cs[j_cs-1] - (int)Temp2_cs);
buf_cs[j_cs] = (int)(buf_cs[j_cs]+(int)Temp2_cs);
}
}
for(i_cs=1; i_cs < LD8A.M; i_cs++){
Temp1_cs = (int)(buf_cs[i_cs-1]- buf_cs[i_cs]);
Temp2_cs = (int)((int)Temp1_cs+LD8A.GAP2);
Temp2_cs = basic_op.shr((int)Temp2_cs, 1);
if(Temp2_cs > 0){
buf_cs[i_cs-1]-= (int)Temp2_cs;
buf_cs[i_cs] = (int)(buf_cs[i_cs]+(int)Temp2_cs);
}
}
L_tdist_cs[mode_cs] = 0;
for(j_cs = 0; j_cs<LD8A.M; j_cs++){
Temp1_cs=(int)(buf_cs[j_cs]-rbuf_cs[j_cs]);
Temp1_cs*= tab_ld8a.fg_sum[mode_cs][j_cs];
Temp1_cs = (Temp1_cs & 0xffff8000) >> 15;
if ((Temp1_cs & 0x00010000)>0)
Temp1_cs = Temp1_cs | 0xffff0000;
Temp1_cs = (int)Temp1_cs;
L_acc_cs= wegt_cs[j_cs]*Temp1_cs;
if (L_acc_cs != 0x40000000) {
L_acc_cs *= 2;
} else {
L_acc_cs = basic_op.MAX_64;
}
Temp2_cs = L_shl1(L_acc_cs, 4);
Temp3_cs = (int)(Temp2_cs>>16);
Temp3_cs*= Temp1_cs;
if (Temp3_cs != 0x40000000) {
Temp3_cs *= 2;
} else {
Temp3_cs = basic_op.MAX_64;
}
L_tdist_cs[mode_cs]+=Temp3_cs;
if (((L_tdist_cs[mode_cs] ^ Temp3_cs) & basic_op.MIN_64) == 0) {
if (((L_tdist_cs[mode_cs] ^ L_tdist_cs[mode_cs]) & basic_op.MIN_64)>0) {
L_tdist_cs[mode_cs] = (L_tdist_cs[mode_cs] < 0) ? basic_op.MIN_64 : basic_op.MAX_64;
}
}
}
}
А за форматирование прошу прощение, был напуган, с буфером попробую, но блин боюсь мало успеха будет, просто реально народ, уже бошка невыдерживает четвертый месяц немогу сбить нагрузку на проц и именно с Кодером, Декодер все чики пуки, а вот кодер какая то жопа, уже начал линейную структуру кода создавать, что бы Java меньше с переходами парилась