| 1 | Result without VAD, in cycles per sample: |
| 2 | {{{ |
| 3 | pcmu 12.90 |
| 4 | pcma 13.05 |
| 5 | gsm 1436.85 |
| 6 | speex/16000 5577.65 |
| 7 | speex/8000 9868.60 |
| 8 | }}} |
| 9 | |
| 10 | Result with VAD, in cycles per sample: |
| 11 | {{{ |
| 12 | pcmu 24.47 |
| 13 | pcma 23.95 |
| 14 | gsm 1538.53 |
| 15 | speex/16000 5578.68 |
| 16 | speex/8000 10026.28 |
| 17 | }}} |
| 18 | |
| 19 | Code: |
| 20 | {{{ |
| 21 | #include <pjsua-lib/pjsua_internal.h> |
| 22 | |
| 23 | static __declspec(naked) unsigned tick(void) |
| 24 | { |
| 25 | __asm { |
| 26 | rdtsc |
| 27 | ret |
| 28 | } |
| 29 | } |
| 30 | |
| 31 | static void codec_test() |
| 32 | { |
| 33 | pj_str_t ci[16]; |
| 34 | pjmedia_endpt *med_ept = pjsua_var.med_endpt; |
| 35 | pjmedia_codec_mgr *cm; |
| 36 | unsigned i, count; |
| 37 | pj_status_t status; |
| 38 | |
| 39 | cm = pjmedia_endpt_get_codec_mgr(med_ept); |
| 40 | |
| 41 | ci[0] = pj_str("pcmu"); |
| 42 | ci[1] = pj_str("pcma"); |
| 43 | ci[2] = pj_str("gsm"); |
| 44 | ci[3] = pj_str("speex/16000"); |
| 45 | ci[4] = pj_str("speex/8000"); |
| 46 | count = 5; |
| 47 | |
| 48 | for (i=0; i<count; ++i) { |
| 49 | pjmedia_codec_info *pci; |
| 50 | unsigned c=1; |
| 51 | pjmedia_codec *codec; |
| 52 | pj_pool_t *pool = pjsua_pool_create("test", 1000, 1000); |
| 53 | pjmedia_port *wav; |
| 54 | pj_int16_t framebuf[320]; |
| 55 | pjmedia_frame frame; |
| 56 | unsigned t, totsamp; |
| 57 | pjmedia_codec_param param; |
| 58 | |
| 59 | status = pjmedia_codec_mgr_find_codecs_by_id(cm, &ci[i], &c, &pci, NULL); |
| 60 | pj_assert(status == PJ_SUCCESS); |
| 61 | |
| 62 | //if (pci->pt != 0) |
| 63 | // continue; |
| 64 | |
| 65 | status = pjmedia_codec_mgr_get_default_param(cm, pci, ¶m); |
| 66 | pj_assert(status == PJ_SUCCESS); |
| 67 | |
| 68 | if (pci->clock_rate == 8000) { |
| 69 | status = pjmedia_wav_player_port_create(pool, "../bin/d8.wav", param.info.frm_ptime, PJMEDIA_FILE_NO_LOOP, 0, &wav); |
| 70 | } else if (pci->clock_rate == 16000) { |
| 71 | status = pjmedia_wav_player_port_create(pool, "../bin/d16.wav", param.info.frm_ptime, PJMEDIA_FILE_NO_LOOP, 0, &wav); |
| 72 | } else if (pci->clock_rate == 32000) { |
| 73 | status = pjmedia_wav_player_port_create(pool, "../bin/d32.wav", param.info.frm_ptime, PJMEDIA_FILE_NO_LOOP, 0, &wav); |
| 74 | } else { |
| 75 | continue; |
| 76 | } |
| 77 | |
| 78 | pj_assert(status == PJ_SUCCESS); |
| 79 | |
| 80 | status = pjmedia_codec_mgr_alloc_codec(cm, pci, &codec); |
| 81 | pj_assert(status == PJ_SUCCESS); |
| 82 | |
| 83 | status = codec->op->init(codec, pool); |
| 84 | pj_assert(status == PJ_SUCCESS); |
| 85 | |
| 86 | param.setting.vad = 1; |
| 87 | |
| 88 | status = codec->op->open(codec, ¶m); |
| 89 | pj_assert(status == PJ_SUCCESS); |
| 90 | |
| 91 | frame.buf = (char*)framebuf; |
| 92 | frame.size = param.info.frm_ptime * pci->clock_rate / 1000 * 2; |
| 93 | |
| 94 | t = 0; |
| 95 | totsamp = 0; |
| 96 | |
| 97 | while (pjmedia_port_get_frame(wav, &frame)==PJ_SUCCESS && frame.type==PJMEDIA_FRAME_TYPE_AUDIO) { |
| 98 | char outputbuf[320]; |
| 99 | pjmedia_frame output; |
| 100 | unsigned t0, t1; |
| 101 | |
| 102 | totsamp += param.info.frm_ptime * pci->clock_rate / 1000; |
| 103 | |
| 104 | output.buf = outputbuf; |
| 105 | output.size = sizeof(outputbuf); |
| 106 | t0 = tick(); |
| 107 | status = codec->op->encode(codec, &frame, sizeof(outputbuf), &output); |
| 108 | t1 = tick(); |
| 109 | pj_assert(status == PJ_SUCCESS); |
| 110 | //if (status != PJ_SUCCESS) { |
| 111 | // int j=0; |
| 112 | //} |
| 113 | |
| 114 | t += (t1 - t0); |
| 115 | |
| 116 | frame.size = param.info.frm_ptime * pci->clock_rate / 1000 * 2; |
| 117 | } |
| 118 | |
| 119 | pjmedia_port_destroy(wav); |
| 120 | codec->op->close(codec); |
| 121 | pjmedia_codec_mgr_dealloc_codec(cm, codec); |
| 122 | pj_pool_release(pool); |
| 123 | |
| 124 | PJ_LOG(3,("test", "%u\t%.*s\t%3.2f", |
| 125 | pci->clock_rate, ci[i].slen, ci[i].ptr, |
| 126 | t * 1.0 / totsamp)); |
| 127 | } |
| 128 | } |
| 129 | }}} |