From 5d4c8098b1eab32df4f5e0fcdc6b539e79419987 Mon Sep 17 00:00:00 2001 From: Nanang Izzuddin Date: Tue, 24 Aug 2010 10:45:01 +0000 Subject: Fix #1114: - Fixed bytes_per_frame calculation in stream port. - Fixed sample streamutil.c to use codec info/param for codec bandwidth calculation (was using bytes_per_frame info of stream port). - Doc fix for bytes_per_frame field in pjmedia_port_info. git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3292 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/include/pjmedia/port.h | 2 +- pjmedia/src/pjmedia/stream.c | 25 +++++++++++++++---------- pjsip-apps/src/samples/streamutil.c | 25 ++++++++++++++++++------- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/pjmedia/include/pjmedia/port.h b/pjmedia/include/pjmedia/port.h index 447c429d..ccfff18d 100644 --- a/pjmedia/include/pjmedia/port.h +++ b/pjmedia/include/pjmedia/port.h @@ -218,7 +218,7 @@ typedef struct pjmedia_port_info unsigned channel_count; /**< Number of channels. */ unsigned bits_per_sample; /**< Bits/sample */ unsigned samples_per_frame; /**< No of samples per frame. */ - unsigned bytes_per_frame; /**< No of samples per frame. */ + unsigned bytes_per_frame; /**< No of bytes per frame. */ } pjmedia_port_info; diff --git a/pjmedia/src/pjmedia/stream.c b/pjmedia/src/pjmedia/stream.c index f6d53d0a..4436da51 100644 --- a/pjmedia/src/pjmedia/stream.c +++ b/pjmedia/src/pjmedia/stream.c @@ -2030,23 +2030,28 @@ PJ_DEF(pj_status_t) pjmedia_stream_create( pjmedia_endpt *endpt, stream->codec_param.info.frm_ptime * stream->codec_param.setting.frm_per_pkt / 1000; - stream->port.info.bytes_per_frame = stream->codec_param.info.max_bps * - stream->codec_param.info.frm_ptime * - stream->codec_param.setting.frm_per_pkt / - 8 / 1000; - if ((stream->codec_param.info.max_bps * stream->codec_param.info.frm_ptime * - stream->codec_param.setting.frm_per_pkt) % 8000 != 0) - { - ++stream->port.info.bytes_per_frame; - } - stream->port.info.format.id = stream->codec_param.info.fmt_id; if (stream->codec_param.info.fmt_id == PJMEDIA_FORMAT_L16) { + /* Raw format */ + stream->port.info.bytes_per_frame = stream->port.info.samples_per_frame * + stream->port.info.bits_per_sample / 8; + stream->port.put_frame = &put_frame; stream->port.get_frame = &get_frame; } else { + /* Encoded format */ + stream->port.info.bytes_per_frame = stream->codec_param.info.max_bps * + stream->codec_param.info.frm_ptime * + stream->codec_param.setting.frm_per_pkt / + 8 / 1000; + if ((stream->codec_param.info.max_bps * stream->codec_param.info.frm_ptime * + stream->codec_param.setting.frm_per_pkt) % 8000 != 0) + { + ++stream->port.info.bytes_per_frame; + } stream->port.info.format.bitrate = stream->codec_param.info.avg_bps; stream->port.info.format.vad = (stream->codec_param.setting.vad != 0); + stream->port.put_frame = &put_frame; stream->port.get_frame = &get_frame_ext; } diff --git a/pjsip-apps/src/samples/streamutil.c b/pjsip-apps/src/samples/streamutil.c index 36809190..23606d10 100644 --- a/pjsip-apps/src/samples/streamutil.c +++ b/pjsip-apps/src/samples/streamutil.c @@ -89,7 +89,8 @@ static const char *desc = /* Prototype */ -static void print_stream_stat(pjmedia_stream *stream); +static void print_stream_stat(pjmedia_stream *stream, + const pjmedia_codec_param *codec_param); /* Prototype for LIBSRTP utility in file datatypes.c */ int hex_string_to_octet_string(char *raw, char *hex, int len); @@ -273,6 +274,7 @@ int main(int argc, char *argv[]) /* Default values */ const pjmedia_codec_info *codec_info; + pjmedia_codec_param codec_param; pjmedia_dir dir = PJMEDIA_DIR_DECODING; pj_sockaddr_in remote_addr; pj_uint16_t local_port = 4000; @@ -487,6 +489,13 @@ int main(int argc, char *argv[]) if (status != PJ_SUCCESS) goto on_exit; + /* Get codec default param for info */ + status = pjmedia_codec_mgr_get_default_param( + pjmedia_endpt_get_codec_mgr(med_endpt), + codec_info, + &codec_param); + /* Should be ok, as create_stream() above succeeded */ + pj_assert(status == PJ_SUCCESS); /* Get the port interface of the stream */ status = pjmedia_stream_get_port( stream, &stream_port); @@ -622,7 +631,7 @@ int main(int argc, char *argv[]) } if (tmp[0] == 's') - print_stream_stat(stream); + print_stream_stat(stream, &codec_param); else if (tmp[0] == 'q') break; @@ -723,7 +732,8 @@ static const char *good_number(char *buf, pj_int32_t val) /* * Print stream statistics */ -static void print_stream_stat(pjmedia_stream *stream) +static void print_stream_stat(pjmedia_stream *stream, + const pjmedia_codec_param *codec_param) { char duration[80], last_update[80]; char bps[16], ipbps[16], packets[16], bytes[16], ipbytes[16]; @@ -752,10 +762,11 @@ static void print_stream_stat(pjmedia_stream *stream) port->info.encoding_name.ptr, port->info.clock_rate, port->info.samples_per_frame * 1000 / port->info.clock_rate, - good_number(bps, port->info.bytes_per_frame * port->info.clock_rate / - port->info.samples_per_frame), - good_number(ipbps, (port->info.bytes_per_frame+32) * - port->info.clock_rate / port->info.clock_rate)); + good_number(bps, (codec_param->info.avg_bps+7)/8), + good_number(ipbps, ((codec_param->info.avg_bps+7)/8) + + (40 * 1000 / + codec_param->setting.frm_per_pkt / + codec_param->info.frm_ptime))); if (stat.rx.update_cnt == 0) strcpy(last_update, "never"); -- cgit v1.2.3