Changeset 457 for pjproject/trunk/pjmedia/src/pjmedia-codec/gsm.c
- Timestamp:
- May 19, 2006 3:58:13 PM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia-codec/gsm.c
r438 r457 21 21 #include <pjmedia/errno.h> 22 22 #include <pjmedia/endpoint.h> 23 #include <pjmedia/plc.h> 23 24 #include <pjmedia/port.h> 25 #include <pjmedia/silencedet.h> 24 26 #include <pj/assert.h> 25 27 #include <pj/pool.h> … … 69 71 unsigned output_buf_len, 70 72 struct pjmedia_frame *output); 73 static pj_status_t gsm_codec_recover(pjmedia_codec *codec, 74 unsigned output_buf_len, 75 struct pjmedia_frame *output); 71 76 72 77 /* Definition for GSM codec operations. */ … … 78 83 &gsm_codec_parse, 79 84 &gsm_codec_encode, 80 &gsm_codec_decode 85 &gsm_codec_decode, 86 &gsm_codec_recover 81 87 }; 82 88 … … 101 107 } gsm_codec_factory; 102 108 109 103 110 /* GSM codec private data. */ 104 111 struct gsm_data 105 112 { 106 void *encoder; 107 void *decoder; 113 void *encoder; 114 void *decoder; 115 pj_bool_t plc_enabled; 116 pjmedia_plc *plc; 117 pj_bool_t vad_enabled; 118 pjmedia_silence_det *vad; 108 119 }; 109 120 … … 240 251 241 252 attr->setting.frm_per_pkt = 1; 242 243 /* Default all flag bits disabled. */ 253 attr->setting.vad = 1; 254 attr->setting.plc = 1; 255 256 /* Default all other flag bits disabled. */ 244 257 245 258 return PJ_SUCCESS; … … 277 290 pjmedia_codec *codec; 278 291 struct gsm_data *gsm_data; 292 pj_status_t status; 279 293 280 294 PJ_ASSERT_RETURN(factory && id && p_codec, PJ_EINVAL); … … 298 312 sizeof(struct gsm_data)); 299 313 codec->codec_data = gsm_data; 314 315 /* Create PLC */ 316 status = pjmedia_plc_create(gsm_codec_factory.pool, 8000, 317 160, 0, &gsm_data->plc); 318 if (status != PJ_SUCCESS) { 319 pj_mutex_unlock(gsm_codec_factory.mutex); 320 return status; 321 } 322 323 /* Create silence detector */ 324 status = pjmedia_silence_det_create(gsm_codec_factory.pool, 325 8000, 160, 326 &gsm_data->vad); 327 if (status != PJ_SUCCESS) { 328 pj_mutex_unlock(gsm_codec_factory.mutex); 329 return status; 330 } 300 331 } 301 332 … … 361 392 if (!gsm_data->decoder) 362 393 return PJMEDIA_CODEC_EFAILED; 394 395 gsm_data->vad_enabled = (attr->setting.vad != 0); 396 gsm_data->plc_enabled = (attr->setting.plc != 0); 363 397 364 398 return PJ_SUCCESS; … … 438 472 return PJMEDIA_CODEC_EPCMTOOSHORT; 439 473 474 /* Detect silence */ 475 if (gsm_data->vad_enabled) { 476 pj_bool_t is_silence; 477 478 is_silence = pjmedia_silence_det_detect(gsm_data->vad, 479 input->buf, 480 input->size / 2, 481 NULL); 482 if (is_silence) { 483 output->type = PJMEDIA_FRAME_TYPE_NONE; 484 output->buf = NULL; 485 output->size = 0; 486 output->timestamp.u64 = input->timestamp.u64; 487 return PJ_SUCCESS; 488 } 489 } 490 491 /* Encode */ 440 492 gsm_encode(gsm_data->encoder, (short*)input->buf, 441 493 (unsigned char*)output->buf); … … 473 525 output->type = PJMEDIA_FRAME_TYPE_AUDIO; 474 526 527 if (gsm_data->plc_enabled) 528 pjmedia_plc_save( gsm_data->plc, output->buf); 529 530 return PJ_SUCCESS; 531 } 532 533 534 /* 535 * Recover lost frame. 536 */ 537 static pj_status_t gsm_codec_recover(pjmedia_codec *codec, 538 unsigned output_buf_len, 539 struct pjmedia_frame *output) 540 { 541 struct gsm_data *gsm_data = codec->codec_data; 542 543 PJ_ASSERT_RETURN(gsm_data->plc_enabled, PJ_EINVALIDOP); 544 545 PJ_ASSERT_RETURN(output_buf_len >= 320, PJMEDIA_CODEC_EPCMTOOSHORT); 546 547 pjmedia_plc_generate(gsm_data->plc, output->buf); 548 output->size = 320; 549 475 550 return PJ_SUCCESS; 476 551 }
Note: See TracChangeset
for help on using the changeset viewer.