Changeset 2359 for pjproject/trunk/pjmedia/src/pjmedia-codec/ipp_codecs.c
- Timestamp:
- Oct 29, 2008 10:17:02 AM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia-codec/ipp_codecs.c
r2358 r2359 115 115 typedef struct ipp_private { 116 116 int codec_idx; /**< Codec index. */ 117 void *codec_setting; /**< Specific codec setting. */ 117 118 pj_pool_t *pool; /**< Pool for each instance. */ 118 119 … … 122 123 pj_uint16_t frame_size; /**< Bitstream frame size. */ 123 124 124 pj_bool_t plc_enabled; 125 pjmedia_plc *plc; 126 127 pj_bool_t vad_enabled; 128 pjmedia_silence_det *vad; 129 pj_timestamp last_tx; 125 pj_bool_t plc_enabled; /**< PLC enabled flag. */ 126 pjmedia_plc *plc; /**< PJMEDIA PLC engine, NULL if 127 codec has internal PLC. */ 128 129 pj_bool_t vad_enabled; /**< VAD enabled flag. */ 130 pjmedia_silence_det *vad; /**< PJMEDIA VAD engine, NULL if 131 codec has internal VAD. */ 132 pj_timestamp last_tx; /**< Timestamp of last transmit.*/ 130 133 } ipp_private_t; 131 134 … … 420 423 #include <pjmedia-codec/amr_helper.h> 421 424 425 typedef struct amr_settings_t { 426 pjmedia_codec_amr_settings enc_setting; 427 pjmedia_codec_amr_settings dec_setting; 428 pj_int8_t enc_mode; 429 } amr_settings_t; 430 431 422 432 /* Rearrange AMR bitstream and convert RTP frame into USC frame: 423 433 * - make the start_bit to be 0 … … 432 442 pjmedia_frame frame; 433 443 pjmedia_codec_amr_bit_info *info; 434 pj_bool_t amr_nb; 435 436 amr_nb = (ipp_codec[codec_data->codec_idx].pt == PJMEDIA_RTP_PT_AMR); 444 pjmedia_codec_amr_settings *setting; 445 446 setting = &((amr_settings_t*)codec_data->codec_setting)->dec_setting; 447 437 448 frame = *rtp_frame; 438 pjmedia_codec_amr_ reorder_sens_to_enc(amr_nb, rtp_frame, &frame);449 pjmedia_codec_amr_predecode(rtp_frame, setting, &frame); 439 450 info = (pjmedia_codec_amr_bit_info*) &frame.bit_info; 440 451 … … 442 453 usc_frame->nbytes = frame.size; 443 454 if (info->mode != -1) { 444 usc_frame->bitrate = amr_nb?455 usc_frame->bitrate = setting->amr_nb? 445 456 pjmedia_codec_amrnb_bitrates[info->mode]: 446 457 pjmedia_codec_amrwb_bitrates[info->mode]; … … 454 465 usc_frame->frametype = 0; 455 466 else 456 usc_frame->frametype = amr_nb ? 5 : 6;467 usc_frame->frametype = setting->amr_nb ? 5 : 6; 457 468 } else if (frame.size == 5) { 458 469 /* SID */ … … 462 473 usc_frame->frametype = STI? 2 : 1; 463 474 } else { 464 usc_frame->frametype = amr_nb ? 6 : 7;475 usc_frame->frametype = setting->amr_nb ? 6 : 7; 465 476 } 466 477 } else { … … 476 487 enum {MAX_FRAMES_PER_PACKET = 16}; 477 488 478 pjmedia_codec_amr_settings setting;479 489 pjmedia_frame frames[MAX_FRAMES_PER_PACKET]; 480 490 unsigned nframes = 0; … … 482 492 pj_uint8_t *r; /* Read cursor */ 483 493 pj_uint8_t SID_FT; 484 485 setting.amr_nb = ipp_codec[codec_data->codec_idx].pt == PJMEDIA_RTP_PT_AMR; 486 setting.CMR = 15; /* not requesting any mode */ 487 setting.octet_aligned = 0; 488 489 SID_FT = (pj_uint8_t)(setting.amr_nb? 8 : 9); 494 pjmedia_codec_amr_settings *setting; 495 496 setting = &((amr_settings_t*)codec_data->codec_setting)->enc_setting; 497 498 SID_FT = (pj_uint8_t)(setting->amr_nb? 8 : 9); 490 499 491 500 /* Align pkt buf right */ … … 521 530 /* Pack */ 522 531 *pkt_size = max_pkt_size; 523 return pjmedia_codec_amr_pack(frames, nframes, &setting, pkt, pkt_size);532 return pjmedia_codec_amr_pack(frames, nframes, setting, pkt, pkt_size); 524 533 } 525 534 … … 530 539 unsigned *frame_cnt, pjmedia_frame frames[]) 531 540 { 532 pjmedia_codec_amr_settings setting; 541 amr_settings_t* s = (amr_settings_t*)codec_data->codec_setting; 542 pjmedia_codec_amr_settings *setting; 543 pj_status_t status; 533 544 pj_uint8_t CMR; 534 545 535 setting.amr_nb = ipp_codec[codec_data->codec_idx].pt == PJMEDIA_RTP_PT_AMR; 536 setting.octet_aligned = 0; 537 538 return pjmedia_codec_amr_parse(pkt, pkt_size, ts, &setting, frames, 539 frame_cnt, &CMR); 546 setting = &s->dec_setting; 547 548 status = pjmedia_codec_amr_parse(pkt, pkt_size, ts, setting, frames, 549 frame_cnt, &CMR); 550 if (status != PJ_SUCCESS) 551 return status; 552 553 /* Check Change Mode Request. */ 554 if ((setting->amr_nb && CMR <= 7) || (!setting->amr_nb && CMR <= 8)) { 555 s->enc_mode = CMR; 556 } 557 558 return PJ_SUCCESS; 540 559 } 541 560 … … 1001 1020 codec_data->plc_enabled = (attr->setting.plc != 0); 1002 1021 1022 #if PJMEDIA_HAS_INTEL_IPP_CODEC_AMR 1023 /* Init AMR settings */ 1024 if (ippc->pt == PJMEDIA_RTP_PT_AMR || ippc->pt == PJMEDIA_RTP_PT_AMRWB) { 1025 amr_settings_t *s; 1026 1027 s = PJ_POOL_ZALLOC_T(pool, amr_settings_t); 1028 codec_data->codec_setting = s; 1029 1030 s->enc_mode = pjmedia_codec_amr_get_mode(ippc->def_bitrate); 1031 if (s->enc_mode < 0) 1032 goto on_error; 1033 1034 s->enc_setting.amr_nb = ippc->pt == PJMEDIA_RTP_PT_AMR; 1035 s->enc_setting.octet_aligned = 0; 1036 s->enc_setting.reorder = PJ_TRUE; 1037 s->enc_setting.CMR = 15; 1038 1039 s->dec_setting.amr_nb = ippc->pt == PJMEDIA_RTP_PT_AMR; 1040 s->dec_setting.octet_aligned = 0; 1041 s->dec_setting.reorder = PJ_TRUE; 1042 } 1043 #endif 1044 1003 1045 return PJ_SUCCESS; 1004 1046 … … 1162 1204 1163 1205 #if PJMEDIA_HAS_INTEL_IPP_CODEC_AMR 1164 /* For AMR: put info (frametype, degraded, last frame ) in the1165 * first byte1206 /* For AMR: put info (frametype, degraded, last frame, mode) in the 1207 * first two octets for payload packing. 1166 1208 */ 1167 1209 if (pt == PJMEDIA_RTP_PT_AMR || pt == PJMEDIA_RTP_PT_AMRWB) {
Note: See TracChangeset
for help on using the changeset viewer.