Changeset 2834 for pjproject/trunk/pjmedia/src/pjmedia-codec/passthrough.c
- Timestamp:
- Jul 15, 2009 5:55:16 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia-codec/passthrough.c
r2825 r2834 115 115 void *codec_setting; /**< Specific codec setting. */ 116 116 pj_uint16_t avg_frame_size; /**< Average of frame size. */ 117 unsigned samples_per_frame; /**< Samples per frame, for iLBC 118 this can be 240 or 160, can 119 only be known after codec is 120 opened. */ 117 121 } codec_private_t; 118 122 … … 381 385 codec_desc[i].enabled = enabled; 382 386 } 387 388 #if PJMEDIA_HAS_PASSTHROUGH_CODEC_ILBC 389 /* Update iLBC codec description based on default mode setting. */ 390 for (i = 0; i < PJ_ARRAY_SIZE(codec_desc); ++i) { 391 if (codec_desc[i].enabled && 392 codec_desc[i].fmt_id == PJMEDIA_FORMAT_ILBC) 393 { 394 codec_desc[i].samples_per_frame = 395 (setting->ilbc_mode == 20? 160 : 240); 396 codec_desc[i].def_bitrate = 397 (setting->ilbc_mode == 20? 15200 : 13333); 398 pj_strset2(&codec_desc[i].dec_fmtp.param[0].val, 399 (setting->ilbc_mode == 20? "20" : "30")); 400 break; 401 } 402 } 403 #endif 383 404 } 384 405 … … 646 667 pool = codec_data->pool; 647 668 648 /* Get bitstream size */ 649 i = attr->info.avg_bps * desc->samples_per_frame; 669 /* Cache samples per frame value */ 670 codec_data->samples_per_frame = desc->samples_per_frame; 671 672 /* Calculate bitstream size */ 673 i = attr->info.avg_bps * codec_data->samples_per_frame; 650 674 j = desc->clock_rate << 3; 651 675 codec_data->avg_frame_size = (pj_uint16_t)(i / j); … … 695 719 #endif 696 720 721 #if PJMEDIA_HAS_PASSTHROUGH_CODEC_ILBC 722 { 723 enum { DEFAULT_MODE = 30 }; 724 static pj_str_t STR_MODE = {"mode", 4}; 725 pj_uint16_t dec_fmtp_mode = DEFAULT_MODE, 726 enc_fmtp_mode = DEFAULT_MODE; 727 728 /* Get decoder mode */ 729 for (i = 0; i < attr->setting.dec_fmtp.cnt; ++i) { 730 if (pj_stricmp(&attr->setting.dec_fmtp.param[i].name, &STR_MODE) == 0) 731 { 732 dec_fmtp_mode = (pj_uint16_t) 733 pj_strtoul(&attr->setting.dec_fmtp.param[i].val); 734 break; 735 } 736 } 737 738 /* Decoder mode must be set */ 739 PJ_ASSERT_RETURN(dec_fmtp_mode == 20 || dec_fmtp_mode == 30, 740 PJMEDIA_CODEC_EINMODE); 741 742 /* Get encoder mode */ 743 for (i = 0; i < attr->setting.enc_fmtp.cnt; ++i) { 744 if (pj_stricmp(&attr->setting.enc_fmtp.param[i].name, &STR_MODE) == 0) 745 { 746 enc_fmtp_mode = (pj_uint16_t) 747 pj_strtoul(&attr->setting.enc_fmtp.param[i].val); 748 break; 749 } 750 } 751 752 PJ_ASSERT_RETURN(enc_fmtp_mode==20 || enc_fmtp_mode==30, 753 PJMEDIA_CODEC_EINMODE); 754 755 /* Both sides of a bi-directional session MUST use the same "mode" value. 756 * In this point, possible values are only 20 or 30, so when encoder and 757 * decoder modes are not same, just use the default mode, it is 30. 758 */ 759 if (enc_fmtp_mode != dec_fmtp_mode) { 760 enc_fmtp_mode = dec_fmtp_mode = DEFAULT_MODE; 761 PJ_LOG(4,(pool->obj_name, 762 "Normalized iLBC encoder and decoder modes to %d", 763 DEFAULT_MODE)); 764 } 765 766 /* Update some attributes based on negotiated mode. */ 767 attr->info.avg_bps = (dec_fmtp_mode == 30? 13333 : 15200); 768 attr->info.frm_ptime = dec_fmtp_mode; 769 770 /* Override average frame size */ 771 codec_data->avg_frame_size = (dec_fmtp_mode == 30? 50 : 38); 772 773 /* Override samples per frame */ 774 codec_data->samples_per_frame = (dec_fmtp_mode == 30? 240 : 160); 775 } 776 #endif 777 697 778 return PJ_SUCCESS; 698 779 } … … 746 827 frames[count].buf = pkt; 747 828 frames[count].size = codec_data->avg_frame_size; 748 frames[count].timestamp.u64 = ts->u64 + count*desc->samples_per_frame; 829 frames[count].timestamp.u64 = ts->u64 + 830 count * codec_data->samples_per_frame; 749 831 750 832 pkt = (pj_uint8_t*)pkt + codec_data->avg_frame_size; … … 758 840 frames[count].buf = pkt; 759 841 frames[count].size = pkt_size; 760 frames[count].timestamp.u64 = ts->u64 + count*desc->samples_per_frame; 842 frames[count].timestamp.u64 = ts->u64 + 843 count * codec_data->samples_per_frame; 761 844 ++count; 762 845 } … … 855 938 pjmedia_frame_ext_append_subframe(output_, input_.buf, 856 939 (pj_uint16_t)(input_.size << 3), 857 (pj_uint16_t) desc->samples_per_frame);940 (pj_uint16_t)codec_data->samples_per_frame); 858 941 output->timestamp = input->timestamp; 859 942 … … 864 947 pjmedia_frame_ext_append_subframe(output_, input->buf, 865 948 (pj_uint16_t)(input->size << 3), 866 (pj_uint16_t) desc->samples_per_frame);949 (pj_uint16_t)codec_data->samples_per_frame); 867 950 output->timestamp = input->timestamp; 868 951 … … 884 967 885 968 pjmedia_frame_ext_append_subframe(output_, NULL, 0, 886 (pj_uint16_t) desc->samples_per_frame);969 (pj_uint16_t)codec_data->samples_per_frame); 887 970 888 971 return PJ_SUCCESS;
Note: See TracChangeset
for help on using the changeset viewer.