Esempio n. 1
0
int ast_format_rate(const struct ast_format *format)
{
	switch (format->id) {
	case AST_FORMAT_SLINEAR12:
		return 12000;
	case AST_FORMAT_SLINEAR24:
		return 24000;
	case AST_FORMAT_SLINEAR32:
		return 32000;
	case AST_FORMAT_SLINEAR44:
		return 44100;
	case AST_FORMAT_SLINEAR48:
		return 48000;
	case AST_FORMAT_SLINEAR96:
		return 96000;
	case AST_FORMAT_SLINEAR192:
		return 192000;
	case AST_FORMAT_G722:
	case AST_FORMAT_SLINEAR16:
	case AST_FORMAT_SIREN7:
	case AST_FORMAT_SPEEX16:
		return 16000;
	case AST_FORMAT_SIREN14:
	case AST_FORMAT_SPEEX32:
		return 32000;
	case AST_FORMAT_G719:
		return 48000;
	case AST_FORMAT_SILK:
		if (!(ast_format_isset(format,
			SILK_ATTR_KEY_SAMP_RATE,
			SILK_ATTR_VAL_SAMP_24KHZ,
			AST_FORMAT_ATTR_END))) {
			return 24000;
		} else if (!(ast_format_isset(format,
			SILK_ATTR_KEY_SAMP_RATE,
			SILK_ATTR_VAL_SAMP_16KHZ,
			AST_FORMAT_ATTR_END))) {
			return 16000;
		} else if (!(ast_format_isset(format,
			SILK_ATTR_KEY_SAMP_RATE,
			SILK_ATTR_VAL_SAMP_12KHZ,
			AST_FORMAT_ATTR_END))) {
			return 12000;
		} else {
			return 8000;
		}
	case AST_FORMAT_CELT:
	{
		int samplerate;
		if (!(ast_format_get_value(format,
			CELT_ATTR_KEY_SAMP_RATE,
			&samplerate))) {
			return samplerate;
		}
	}
	default:
		return 8000;
	}
}
Esempio n. 2
0
static int lintosilk_new(struct ast_trans_pvt *pvt)
{

  SKP_int32 ret;
  int silk_samplerate = 8000;
  int slin_samplerate = 8000;
  struct silk_coder_pvt *coder = pvt->pvt;
  char format_string[100];
  char* pointer = format_string;
  char* format;
  struct ast_format format_struct;
  struct ast_format* format_def = &format_struct;
  int attr_dtx = 0,
      attr_fec = 0,
      attr_pktloss_pct = 0,
      attr_max_bitrate = 0,
      attr_samp_rate = 0;

  /* init the silk encoder */
  coder->psEnc = malloc(encSizeBytes);
  ret = SKP_Silk_SDK_InitEncoder(coder->psEnc, &coder->encControl);
  if (ret) {
    ast_log(LOG_WARNING, "SKP_Silk_SDK_InitEncoder returned %d\n", ret);
  }

  /* Get the names of the silk codecs */
  ast_getformatname_multiple_byid(format_string, sizeof(format_string), AST_FORMAT_SILK);
  /* The destination sample rate is set explicitly */
  ret = ast_format_get_value(&pvt->explicit_dst, SILK_ATTR_KEY_SAMP_RATE, &attr_samp_rate);
  switch(attr_samp_rate){
    case SILK_ATTR_VAL_SAMP_8KHZ: silk_samplerate = 8000; break;
    case SILK_ATTR_VAL_SAMP_12KHZ: silk_samplerate = 12000; break;
    case SILK_ATTR_VAL_SAMP_16KHZ: silk_samplerate = 16000; break;
    case SILK_ATTR_VAL_SAMP_24KHZ: silk_samplerate = 24000; break;
  }
  /* get the source rate */
  switch(pvt->t->src_format.id){
    case AST_FORMAT_SLINEAR: slin_samplerate = 8000; break;
    case AST_FORMAT_SLINEAR12: slin_samplerate = 12000; break;
    case AST_FORMAT_SLINEAR16: slin_samplerate = 16000; break;
    case AST_FORMAT_SLINEAR24: slin_samplerate = 24000; break;
    default: slin_samplerate = 8000; break;
  }

  /* SILK Docs say that internal sampling rate > API Sampling rate is not allowed */
  if(slin_samplerate < silk_samplerate){
    silk_samplerate = slin_samplerate;
  }
  /* set the parameters for the coder */
  coder->encControl.API_sampleRate = (SKP_int32)slin_samplerate; /* lin input rate */
  coder->encControl.maxInternalSampleRate = (SKP_int32)silk_samplerate; /* silk output rate */
  coder->encControl.packetSize = (packetSize_ms * slin_samplerate) / 1000;
  coder->encControl.complexity = complexity;

  while ((format = strsep(&pointer, "(|)"))){
    if(strlen(format) > 0){
      if((format_def = ast_getformatbyname(format, format_def))){
        /* now pull out the format attributes */
        ret = ast_format_get_value(format_def, SILK_ATTR_KEY_DTX, &attr_dtx);
        coder->encControl.useDTX = !ret ? (SKP_int32)attr_dtx : useDTX;
        ret = ast_format_get_value(format_def, SILK_ATTR_KEY_FEC, &attr_fec);
        coder->encControl.useInBandFEC = !ret ? (SKP_int32)attr_fec : useInBandFEC;
        ret = ast_format_get_value(format_def, SILK_ATTR_KEY_PACKETLOSS_PERCENTAGE, &attr_pktloss_pct);
        coder->encControl.packetLossPercentage = !ret ? (SKP_int32)attr_pktloss_pct : packetLossPercentage;
        ret = ast_format_get_value(format_def, SILK_ATTR_KEY_MAX_BITRATE, &attr_max_bitrate);
        coder->encControl.bitRate = !ret ? (SKP_int32)attr_max_bitrate : bitRate;
        break;
      }
    }
  }

  return 0;
}
Esempio n. 3
0
static int load_module(void)
{
  SKP_int32 ret = 0;;
  int res = 0;
  char format_string[100];
  char* format;
  char* pointer = format_string;
  struct ast_format format_struct;
  struct ast_format* format_def = &format_struct;
  int attr_samp_rate = 0;

  /* print the skype version */
  ast_log(LOG_NOTICE, "SILK Version : %s\n", SKP_Silk_SDK_get_version());

  /* get the encoder / decoder sizes */
  ret = SKP_Silk_SDK_Get_Encoder_Size(&encSizeBytes);
  if (ret) {
    ast_log(LOG_WARNING, "SKP_Silk_SDK_Get_Encoder_size returned %d", ret);
  }
  ret = SKP_Silk_SDK_Get_Decoder_Size(&decSizeBytes);
  if (ret) {
    ast_log(LOG_WARNING, "SKP_Silk_SDK_Get_Decoder_size returned %d", ret);
  }

  /* Finish the setup of the encoders / decoders */
  /* silk8 */
  ast_format_set(&silk8tolin.src_format, AST_FORMAT_SILK,1,
                SILK_ATTR_KEY_SAMP_RATE,
                SILK_ATTR_VAL_SAMP_8KHZ,
                AST_FORMAT_ATTR_END);
  ast_format_set(&silk8tolin.dst_format, AST_FORMAT_SLINEAR,0);

  ast_format_set(&lintosilk8.src_format, AST_FORMAT_SLINEAR,0);
  ast_format_set(&lintosilk8.dst_format, AST_FORMAT_SILK,1,
                SILK_ATTR_KEY_SAMP_RATE,
                SILK_ATTR_VAL_SAMP_8KHZ,
                AST_FORMAT_ATTR_END);
  /* silk12 */
  ast_format_set(&silk12tolin.src_format, AST_FORMAT_SILK,1,
                SILK_ATTR_KEY_SAMP_RATE,
                SILK_ATTR_VAL_SAMP_12KHZ,
                AST_FORMAT_ATTR_END);
  ast_format_set(&silk12tolin.dst_format, AST_FORMAT_SLINEAR12,0);

  ast_format_set(&lintosilk12.src_format, AST_FORMAT_SLINEAR12,0);
  ast_format_set(&lintosilk12.dst_format, AST_FORMAT_SILK,1,
                SILK_ATTR_KEY_SAMP_RATE,
                SILK_ATTR_VAL_SAMP_12KHZ,
                AST_FORMAT_ATTR_END);

  /* silk16 */
  ast_format_set(&silk16tolin.src_format, AST_FORMAT_SILK,1,
                SILK_ATTR_KEY_SAMP_RATE,
                SILK_ATTR_VAL_SAMP_16KHZ,
                AST_FORMAT_ATTR_END);
  ast_format_set(&silk16tolin.dst_format, AST_FORMAT_SLINEAR16,0);

  ast_format_set(&lintosilk16.src_format, AST_FORMAT_SLINEAR16,0);
  ast_format_set(&lintosilk16.dst_format, AST_FORMAT_SILK,1,
                SILK_ATTR_KEY_SAMP_RATE,
                SILK_ATTR_VAL_SAMP_16KHZ,
                AST_FORMAT_ATTR_END);

  /* silk24 */
  ast_format_set(&silk24tolin.src_format, AST_FORMAT_SILK,1,
                SILK_ATTR_KEY_SAMP_RATE,
                SILK_ATTR_VAL_SAMP_24KHZ,
                AST_FORMAT_ATTR_END);
  ast_format_set(&silk24tolin.dst_format, AST_FORMAT_SLINEAR24,0);

  ast_format_set(&lintosilk24.src_format, AST_FORMAT_SLINEAR24,0);
  ast_format_set(&lintosilk24.dst_format, AST_FORMAT_SILK,1,
                SILK_ATTR_KEY_SAMP_RATE,
                SILK_ATTR_VAL_SAMP_24KHZ,
                AST_FORMAT_ATTR_END);


  /* Get the names of the silk codecs */
  ast_getformatname_multiple_byid(format_string, sizeof(format_string), AST_FORMAT_SILK);
  ast_log(LOG_NOTICE, "Defined silk codecs are: %s\n", format_string);

  while ((format = strsep(&pointer, "(|)"))){
    if(strlen(format) > 0){
      if((format_def = ast_getformatbyname(format, format_def))){
        /* now pull out the format attributes */
        ret = ast_format_get_value(format_def, SILK_ATTR_KEY_SAMP_RATE, &attr_samp_rate);
        if(!ret) {
          switch (attr_samp_rate) {
            case SILK_ATTR_VAL_SAMP_8KHZ:
              res |= ast_register_translator(&silk8tolin);
              res |= ast_register_translator(&lintosilk8);
              silk8_reg = 1;
              break;
            case SILK_ATTR_VAL_SAMP_12KHZ:
              res |= ast_register_translator(&silk12tolin);
              res |= ast_register_translator(&lintosilk12);
              silk12_reg = 1;
              break;
            case SILK_ATTR_VAL_SAMP_16KHZ:
              res |= ast_register_translator(&silk16tolin);
              res |= ast_register_translator(&lintosilk16);
              silk16_reg = 1;
              break;
            case SILK_ATTR_VAL_SAMP_24KHZ:
              res |= ast_register_translator(&silk24tolin);
              res |= ast_register_translator(&lintosilk24);
              silk24_reg = 1;
              break;
          }
        }
      }
    }
  }


  /* register the encoder / decoder */
  if(res){
    return AST_MODULE_LOAD_FAILURE;
  }

  return AST_MODULE_LOAD_SUCCESS;
}