说明

LinphoneCall的状态

native函数

private native int getMediaType(long nativeStatsPtr);
private native int getIceState(long nativeStatsPtr);
private native float getDownloadBandwidth(long nativeStatsPtr);
private native float getUploadBandwidth(long nativeStatsPtr);
private native float getSenderLossRate(long nativeStatsPtr);
private native float getReceiverLossRate(long nativeStatsPtr);
private native float getSenderInterarrivalJitter(long nativeStatsPtr, long nativeCallPtr);
private native float getReceiverInterarrivalJitter(long nativeStatsPtr, long nativeCallPtr);
private native float getRoundTripDelay(long nativeStatsPtr);
private native long getLatePacketsCumulativeNumber(long nativeStatsPtr, long nativeCallPtr);
private native float getJitterBufferSize(long nativeStatsPtr);
private native float getLocalLossRate(long nativeStatsPtr);
private native float getLocalLateRate(long nativeStatsPtr);
private native void updateStats(long nativeCallPtr, int mediaType);

getMediaType

/* CallStats */
extern "C" jint Java_org_linphone_core_LinphoneCallStatsImpl_getMediaType(JNIEnv *env, jobject thiz, jlong stats_ptr) {
    return (jint)((LinphoneCallStats *)stats_ptr)->type;
}

LinphoneCallStats

submodules/linphone/coreapi/linphonecore.h:typedef struct _LinphoneCallStats LinphoneCallStats;
submodules/linphone/coreapi/linphonecore.h:struct _LinphoneCallStats {

LinphoneCallStats

/**
 * The LinphoneCallStats objects carries various statistic informations regarding quality of audio or video streams.
 *
 * To receive these informations periodically and as soon as they are computed, the application is invited to place a #LinphoneCoreCallStatsUpdatedCb callback in the LinphoneCoreVTable structure
 * it passes for instantiating the LinphoneCore object (see linphone_core_new() ).
 *
 * At any time, the application can access last computed statistics using linphone_call_get_audio_stats() or linphone_call_get_video_stats().
**/
struct _LinphoneCallStats {
    int     type; /**< Can be either LINPHONE_CALL_STATS_AUDIO or LINPHONE_CALL_STATS_VIDEO*/
    jitter_stats_t  jitter_stats; /**<jitter buffer statistics, see oRTP documentation for details */
    mblk_t*     received_rtcp; /**<Last RTCP packet received, as a mblk_t structure. See oRTP documentation for details how to extract information from it*/
    mblk_t*     sent_rtcp;/**<Last RTCP packet sent, as a mblk_t structure. See oRTP documentation for details how to extract information from it*/
    float       round_trip_delay; /**<Round trip propagation time in seconds if known, -1 if unknown.*/
    LinphoneIceState    ice_state; /**< State of ICE processing. */
    LinphoneUpnpState   upnp_state; /**< State of uPnP processing. */
    float download_bandwidth; /**<Download bandwidth measurement of received stream, expressed in kbit/s, including IP/UDP/RTP headers*/
    float upload_bandwidth; /**<Download bandwidth measurement of sent stream, expressed in kbit/s, including IP/UDP/RTP headers*/
    float local_late_rate; /**<percentage of packet received too late over last second*/
    float local_loss_rate; /**<percentage of lost packet over last second*/
    int updated; /**< Tell which RTCP packet has been updated (received_rtcp or sent_rtcp). Can be either LINPHONE_CALL_STATS_RECEIVED_RTCP_UPDATE or LINPHONE_CALL_STATS_SENT_RTCP_UPDATE */
    float rtcp_download_bandwidth; /**<RTCP download bandwidth measurement of received stream, expressed in kbit/s, including IP/UDP/RTP headers*/
    float rtcp_upload_bandwidth; /**<RTCP download bandwidth measurement of sent stream, expressed in kbit/s, including IP/UDP/RTP headers*/
    rtp_stats_t rtp_stats; /**< RTP stats */
    bool_t rtcp_received_via_mux; /*private flag, for non-regression test only*/
};

getIceState

extern "C" jint Java_org_linphone_core_LinphoneCallStatsImpl_getIceState(JNIEnv *env, jobject thiz, jlong stats_ptr) {
    return (jint)((LinphoneCallStats *)stats_ptr)->ice_state;
}

getDownloadBandwidth

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getDownloadBandwidth(JNIEnv *env, jobject thiz, jlong stats_ptr) {
    return (jfloat)((LinphoneCallStats *)stats_ptr)->download_bandwidth;
}

getUploadBandwidth

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getUploadBandwidth(JNIEnv *env, jobject thiz, jlong stats_ptr) {
    return (jfloat)((LinphoneCallStats *)stats_ptr)->upload_bandwidth;
}

getSenderLossRate

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getSenderLossRate(JNIEnv *env, jobject thiz, jlong stats_ptr) {
    const LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr;
    return (jfloat) linphone_call_stats_get_sender_loss_rate(stats);
}

linphone_call_stats_get_sender_loss_rate

submodules/linphone/coreapi/linphonecore.h:LINPHONE_PUBLIC float linphone_call_stats_get_sender_loss_rate(const LinphoneCallStats *stats);
submodules/linphone/coreapi/linphonecall.c:float linphone_call_stats_get_sender_loss_rate(const LinphoneCallStats *stats) {
````




<div class="se-preview-section-delimiter"></div>

“`

/**
 * Get the local loss rate since last report
 * @return The sender loss rate
**/
float linphone_call_stats_get_sender_loss_rate(const LinphoneCallStats *stats) {
    const report_block_t *srb = NULL;

    if (!stats || !stats->sent_rtcp)
        return 0.0;
    /* Perform msgpullup() to prevent crashes in rtcp_is_SR() or rtcp_is_RR() if the RTCP packet is composed of several mblk_t structure */
    if (stats->sent_rtcp->b_cont != NULL)
        msgpullup(stats->sent_rtcp, -1);
    if (rtcp_is_SR(stats->sent_rtcp))
        srb = rtcp_SR_get_report_block(stats->sent_rtcp, 0);
    else if (rtcp_is_RR(stats->sent_rtcp))
        srb = rtcp_RR_get_report_block(stats->sent_rtcp, 0);
    if (!srb)
        return 0.0;
    return 100.0f * report_block_get_fraction_lost(srb) / 256.0f;
}

getReceiverLossRate

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getReceiverLossRate(JNIEnv *env, jobject thiz, jlong stats_ptr) {
    const LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr;
    return (jfloat) linphone_call_stats_get_receiver_loss_rate(stats);
}

linphone_call_stats_get_receiver_loss_rate

/**
 * Gets the remote reported loss rate since last report
 * @return The receiver loss rate
**/
float linphone_call_stats_get_receiver_loss_rate(const LinphoneCallStats *stats) {
    const report_block_t *rrb = NULL;

    if (!stats || !stats->received_rtcp)
        return 0.0;
    /* Perform msgpullup() to prevent crashes in rtcp_is_SR() or rtcp_is_RR() if the RTCP packet is composed of several mblk_t structure */
    if (stats->received_rtcp->b_cont != NULL)
        msgpullup(stats->received_rtcp, -1);
    if (rtcp_is_RR(stats->received_rtcp))
        rrb = rtcp_RR_get_report_block(stats->received_rtcp, 0);
    else if (rtcp_is_SR(stats->received_rtcp))
        rrb = rtcp_SR_get_report_block(stats->received_rtcp, 0);
    if (!rrb)
        return 0.0;
    return 100.0f * report_block_get_fraction_lost(rrb) / 256.0f;
}

getSenderInterarrivalJitter

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getSenderInterarrivalJitter(JNIEnv *env, jobject thiz, jlong stats_ptr, jlong call_ptr) {
    LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr;
    LinphoneCall *call = (LinphoneCall *)call_ptr;
    return (jfloat) linphone_call_stats_get_sender_interarrival_jitter(stats, call);
}

linphone_call_stats_get_sender_interarrival_jitter

/**
 * Gets the local interarrival jitter
 * @return The interarrival jitter at last emitted sender report
**/
float linphone_call_stats_get_sender_interarrival_jitter(const LinphoneCallStats *stats, LinphoneCall *call) {
    const LinphoneCallParams *params;
    const PayloadType *pt;
    const report_block_t *srb = NULL;

    if (!stats || !call || !stats->sent_rtcp)
        return 0.0;
    params = linphone_call_get_current_params(call);
    if (!params)
        return 0.0;
    /* Perform msgpullup() to prevent crashes in rtcp_is_SR() or rtcp_is_RR() if the RTCP packet is composed of several mblk_t structure */
    if (stats->sent_rtcp->b_cont != NULL)
        msgpullup(stats->sent_rtcp, -1);
    if (rtcp_is_SR(stats->sent_rtcp))
        srb = rtcp_SR_get_report_block(stats->sent_rtcp, 0);
    else if (rtcp_is_RR(stats->sent_rtcp))
        srb = rtcp_RR_get_report_block(stats->sent_rtcp, 0);
    if (!srb)
        return 0.0;
    if (stats->type == LINPHONE_CALL_STATS_AUDIO)
        pt = linphone_call_params_get_used_audio_codec(params);
    else
        pt = linphone_call_params_get_used_video_codec(params);
    if (!pt || (pt->clock_rate == 0))
        return 0.0;
    return (float)report_block_get_interarrival_jitter(srb) / (float)pt->clock_rate;
}

getReceiverInterarrivalJitter

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getReceiverInterarrivalJitter(JNIEnv *env, jobject thiz, jlong stats_ptr, jlong call_ptr) {
    LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr;
    LinphoneCall *call = (LinphoneCall *)call_ptr;
    return (jfloat) linphone_call_stats_get_receiver_interarrival_jitter(stats, call);
}

linphone_call_stats_get_receiver_interarrival_jitter

/**
 * Gets the remote reported interarrival jitter
 * @return The interarrival jitter at last received receiver report
**/
float linphone_call_stats_get_receiver_interarrival_jitter(const LinphoneCallStats *stats, LinphoneCall *call) {
    const LinphoneCallParams *params;
    const PayloadType *pt;
    const report_block_t *rrb = NULL;

    if (!stats || !call || !stats->received_rtcp)
        return 0.0;
    params = linphone_call_get_current_params(call);
    if (!params)
        return 0.0;
    /* Perform msgpullup() to prevent crashes in rtcp_is_SR() or rtcp_is_RR() if the RTCP packet is composed of several mblk_t structure */
    if (stats->received_rtcp->b_cont != NULL)
        msgpullup(stats->received_rtcp, -1);
    if (rtcp_is_SR(stats->received_rtcp))
        rrb = rtcp_SR_get_report_block(stats->received_rtcp, 0);
    else if (rtcp_is_RR(stats->received_rtcp))
        rrb = rtcp_RR_get_report_block(stats->received_rtcp, 0);
    if (!rrb)
        return 0.0;
    if (stats->type == LINPHONE_CALL_STATS_AUDIO)
        pt = linphone_call_params_get_used_audio_codec(params);
    else
        pt = linphone_call_params_get_used_video_codec(params);
    if (!pt || (pt->clock_rate == 0))
        return 0.0;
    return (float)report_block_get_interarrival_jitter(rrb) / (float)pt->clock_rate;
}

getRoundTripDelay

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getRoundTripDelay(JNIEnv *env, jobject thiz, jlong stats_ptr) {
    return (jfloat)((LinphoneCallStats *)stats_ptr)->round_trip_delay;
}

getLatePacketsCumulativeNumber

extern "C" jlong Java_org_linphone_core_LinphoneCallStatsImpl_getLatePacketsCumulativeNumber(JNIEnv *env, jobject thiz, jlong stats_ptr, jlong call_ptr) {
    LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr;
    LinphoneCall *call = (LinphoneCall *)call_ptr;
    return (jlong) linphone_call_stats_get_late_packets_cumulative_number(stats, call);
}

inphone_call_stats_get_late_packets_cumulative_number

/**
 * Gets the cumulative number of late packets
 * @return The cumulative number of late packets
**/
uint64_t linphone_call_stats_get_late_packets_cumulative_number(const LinphoneCallStats *stats, LinphoneCall *call) {
    return linphone_call_stats_get_rtp_stats(stats).outoftime;
}

linphone_call_stats_get_rtp_stats

tp_stats_t linphone_call_stats_get_rtp_stats(const LinphoneCallStats *stats) {
    rtp_stats_t rtp_stats;
    memset(&rtp_stats, 0, sizeof(rtp_stats));

    if (stats) {
        memcpy(&rtp_stats, &stats->rtp_stats, sizeof(stats->rtp_stats));
    }

    return rtp_stats;
}

getJitterBufferSize

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getJitterBufferSize(JNIEnv *env, jobject thiz, jlong stats_ptr) {
    return (jfloat)((LinphoneCallStats *)stats_ptr)->jitter_stats.jitter_buffer_size_ms;
}

getLocalLossRate

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getLocalLossRate(JNIEnv *env, jobject thiz,jlong stats_ptr) {
    const LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr;
    return stats->local_loss_rate;
}

getLocalLateRate

extern "C" jfloat Java_org_linphone_core_LinphoneCallStatsImpl_getLocalLateRate(JNIEnv *env, jobject thiz, jlong stats_ptr) {
    const LinphoneCallStats *stats = (LinphoneCallStats *)stats_ptr;
    return stats->local_late_rate;
}

updateStats

extern "C" void Java_org_linphone_core_LinphoneCallStatsImpl_updateStats(JNIEnv *env, jobject thiz, jlong call_ptr, jint mediatype) {
    if (mediatype==LINPHONE_CALL_STATS_AUDIO)
        linphone_call_get_audio_stats((LinphoneCall*)call_ptr);
    else
        linphone_call_get_video_stats((LinphoneCall*)call_ptr);
}