Commit 3ee5ab75 authored by sekine's avatar sekine
Browse files

Branch for contribution 29.

parent a45b753e
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -162,6 +162,8 @@

#define BINAURALIZATION_DELAY_REPORT                    /* VA: Issue 255 - Changes the way the decoder delay is reported */

#define NTT_LOW_RATE_STEREO                             /* NTT switches */
//#define ALL_MONO                                      /* NTT switches */

/* ################## End DEVELOPMENT switches ######################### */
/* clang-format on */
+10 −0
Original line number Diff line number Diff line
@@ -402,6 +402,16 @@ ivas_error ivas_init_encoder(
        /* MetaData for DFT stereo */
        st_ivas->hCPE[cpe_id]->hMetaData->ind_list = ind_list_metadata[0];
        reset_indices_enc( st_ivas->hCPE[cpe_id]->hMetaData, MAX_BITS_METADATA );

#ifdef NTT_LOW_RATE_STEREO /*combine with stereo_dmx_evs() */
		if (hEncoderConfig->ivas_total_brate <= 24400) {
			if ((error = stereo_dmx_evs_init_encoder(&(st_ivas->hStereoDmxEVS), input_Fs)) != IVAS_ERR_OK)
			{
				return error;
			}
		}
#endif   

    }
    else if ( ivas_format == ISM_FORMAT )
    {
+119 −0
Original line number Diff line number Diff line
@@ -1021,6 +1021,33 @@ ivas_error IVAS_ENC_GetInputBufferSize(
    return IVAS_ERR_OK;
}

#ifdef NTT_LOW_RATE_STEREO


float sum2_i_step(
	const int16_t *vec, /* i  : input vector                                    */
	const int16_t lvec, /* i  : length of input vector                          */
	int16_t step        /* i  : skip sample by step                             */
);

float sum2_i_step(
	const int16_t *vec, /* i  : input vector                          */
	const int16_t lvec, /* i  : length of input vector                */
	int16_t step)
{
	int16_t i;
	float tmp;

	tmp = 0.0f;
	for (i = 0; i < lvec; i += step)
	{
		tmp += (float)(vec[i] * vec[i]);
	}

	return tmp;
}

#endif

/*---------------------------------------------------------------------*
 * IVAS_ENC_EncodeFrameToSerial()
@@ -1141,6 +1168,98 @@ ivas_error IVAS_ENC_EncodeFrameToSerial(
    }
    else /* IVAS */
    {
#ifdef NTT_LOW_RATE_STEREO /* combine downmix with IVAS */
		if (hEncoderConfig->ivas_total_brate <= 24400)
		{
			int16_t ititd;
			int16_t mixBuffer[2000], it;
			float stereo_w, w, stereo_wwL, stereo_wwR, stereo_ww, ratioLR /*, inv_ratioLR*/;
			float bias, range, mag0; /*mix weight depending on corr*/
			float energy_R, energy_L;

			const int16_t overlap_len = 160;
			const float nom_slope = 1.f / (float)overlap_len;
			static int16_t count;
			static float prev_w = 0.0f;
			static float prevL = 0.0f, prevR = 0.0f;

			count++;
			for (it = 0; it < inputBufferSize; it++)
			{
				mixBuffer[it] = inputBuffer[it];
			}
			stereo_dmx_evs_enc(st_ivas->hStereoDmxEVS, hEncoderConfig->input_Fs, mixBuffer, inputBufferSize / 2);
			//fprintf( stderr, "itd %f %f %f\n", st_ivas->hStereoDmxEVS->itd, st_ivas->hStereoDmxEVS->dmx_weight[0], st_ivas->hStereoDmxEVS->dmx_weight[1] );
			ititd = (int16_t)(st_ivas->hStereoDmxEVS->itd);
			//fprintf( stderr, "itd  %d %d ---", count, itit );

			if (hEncoderConfig->ivas_total_brate == 24400)
			{
				bias = 0.6f;
				range = 0.4f;
			}
			else if (hEncoderConfig->ivas_total_brate == 16400)
			{
				bias = 0.3f;//20230211
				range = 0.5f; //20230211
			}
			else /*total_brate=13200*/
			{
				bias = 0.0f;
				range = 0.7f;
			}
			mag0 = min(1.0f, fabsf(ititd) * 0.003f) * 0.5f;
			mag0 = cosf(mag0 * EVS_PI);
			mag0 *= mag0 * 0.4f; /* mag0= mag0*mag0*0.2*//*mag0=cos(itd/300*PI)*cos(itd/300*PI)*0.5*/
			mag0 += 0.6f;
			w = st_ivas->hStereoDmxEVS->dmx_weight[0];

#ifdef ALL_MONO

			for (it = 0; it < inputBufferSize / 2; it++)
			{
				inputBuffer[2 * it] = mixBuffer[it];
				inputBuffer[2 * it + 1] = mixBuffer[it];
			}
#else 
			stereo_w = 0.95f *prev_w + 0.05f *mag0 * min(1.0f, max(0.0f, (bias + range * 0.5f * (1.f + cosf(2.f * w * EVS_PI)))));

			energy_L = sum2_i_step(inputBuffer, inputBufferSize, 2)  *0.2f + prevL * 0.8f + 1.0f;
			energy_R = sum2_i_step(inputBuffer + 1, inputBufferSize, 2)*0.2f + prevR * 0.8f + 1.0f;

			//fprintf( stderr, "L/R %5.3f,w, %5.3f,itd,%4d, bi,%3.1f,ra,%3.1f,mag0,%3.1f,stereo_w %4.2f\n",
			//    energy_L/energy_R, w, ititd, bias, range, mag0, stereo_w );
			if (energy_L > energy_R)
			{
				ratioLR = 0.6f + 0.4f * (energy_R / energy_L);
			}
			else
			{
				ratioLR = 0.6f + 0.4f * (energy_L / energy_R);
			}
			stereo_ww = 1.0f - ((1.0f - stereo_w) *  ratioLR);

			for (it = 0; it < overlap_len / 2; it++)
			{
				stereo_wwL = stereo_ww * (it * nom_slope) + prev_w * (1.f - it * nom_slope);
				stereo_wwR = 1.f - stereo_wwL;
				inputBuffer[2 * it] = (int16_t)(inputBuffer[2 * it] * stereo_wwL + mixBuffer[it] * stereo_wwR);
				inputBuffer[2 * it + 1] = (int16_t)(inputBuffer[2 * it + 1] * stereo_wwL + mixBuffer[it] * stereo_wwR);
			}
			stereo_wwL = stereo_ww;
			stereo_wwR = 1.f - stereo_wwL;
			for (; it < inputBufferSize / 2; it++)
			{
				inputBuffer[2 * it] = (int16_t)(inputBuffer[2 * it] * stereo_wwL + mixBuffer[it] * stereo_wwR);
				inputBuffer[2 * it + 1] = (int16_t)(inputBuffer[2 * it + 1] * stereo_wwL + mixBuffer[it] * stereo_wwR);
			}

			prev_w = stereo_w;
			prevL = energy_L;
			prevR = energy_R;
#endif
		}
#endif
        if ( ( error = ivas_enc( st_ivas, inputBuffer, inputBufferSize ) ) != IVAS_ERR_OK )
        {
            return error;