[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Linphone-developers] Please help on why there no any RPSI whenavpf

From: Ghislain MARY
Subject: Re: [Linphone-developers] Please help on why there no any RPSI whenavpf is enabled.
Date: Wed, 27 May 2015 09:40:23 +0200
User-agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0

Hi Jim,

Here is an explanation:
 - The inviting party proposes the use of PLI, SLI, RPSI and FIR.
 - The answering party only accepts the use of FIR.

FIR is a feedback message to force the other party to generate a keyframe.
There can be a lot of reasons why the other party does not accepts the other feedback message types: it does not support them, it is not configured to use them...


Le 27/05/2015 04:56, jim a écrit :

Thanks Ghislain for your reply!


I have some questions about the media session negotiation, here are the sdp detail:


m=audio 7078 RTP/AVPF 96 101

a=rtpmap:96 SILK/16000

a=rtpmap:101 telephone-event/16000

a=rtcp-fb:* trr-int 5000

m=video 9078 RTP/AVPF 96 97

a=rtpmap:96 VP8/90000

a=rtpmap:97 H264/90000

a=fmtp:97 profile-level-id=42801F

a=rtcp-fb:* trr-int 5000

a=rtcp-fb:96 nack pli

a=rtcp-fb:96 nack sli

a=rtcp-fb:96 nack rpsi

a=rtcp-fb:96 ccm fir


m=audio 16836 RTP/AVPF 96

a=rtpmap:96 SILK/16000

a=fmtp:96 maxaveragebitrate=20000

a=fmtp:96 usedtx=0

a=fmtp:96 useinbandfec=1

a=silenceSupp:off - - - -




m=video 18598 RTP/AVPF 96

a=rtpmap:96 VP8/90000

a=rtcp-fb:* ccm fir


Can you help to explain:

1) Does it means that the other party do not confirm with the type of RPSI/PLI/SLI ? 

2) What is the possible reason for the other party do not support such kinds of Feed Back types? 

3) And What’s the line a=rtcp-fb:* ccm fir in  200OK means for?

Your help will be appreciated!

 Original Message 
Sender: Ghislain MARY<address@hidden>
Recipient: linphone-developers<address@hidden>
Date: Tuesday, May 26, 2015 15:50
Subject: Re: [Linphone-developers] Please help on why there no any RPSI whenavpf is enabled.


Enabling AVPF only means that you propose it when calling. But there is a negociation with the other party and therefore it may not be enabled. There is even a negocation for each AVPF packet types (RPSI, PLI, SLI) so RPSI may be disabled by the other party.
But if the negociation is successful, Linphone sends a RPSI for every golden and/or altref frame being received.


Le 26/05/2015 05:59, jim a écrit :

Hi Jehan,

I set the avpf_enabled to be TRUE by calling linphone_proxy_config_enable_avpf(), but I do not find the decoder sending any Reference Picture Selection Indication. Is that anything wrong with it? Must the decoder respond to the encoder a RPSI when it 

recieve a golden frame or a alfref frame?



 Original Message 
Sender: jehan monnier<address@hidden>
Recipient: linphone-developers<address@hidden>
Date: Friday, May 15, 2015 17:50
Subject: Re: [Linphone-developers] Please help on how to get lastsuccessfully decoded frame for application to display whilethe the current frame is corrupt when decoding in dec_process

Hi Jim,

With Linphone, you can achieve same result with linphonerc parameter:


Best regards

Le 15 mai 2015 à 03:35, jim <address@hidden> a écrit :

Hi experts,

This is Jim and I am using linphone for a voip project.  To improve the user experience for video , I want to make some change in the mediastream2 layer: if we find the current frame is corrupt, just use the last successfully decoded frame to display.

I try this way for vp8 in vp8.c, the line in blue is what I add :
static mblk_t *dec_last_successfully_decoded_frame = NULL;

static void dec_process(MSFilter *f) {
mblk_t *im;
DecState *s=(DecState*)f->data;

while( (im=ms_queue_get(f->inputs[0]))!=0) {
mblk_t *m;

dec_unpacketize(f, s, im, &s->q);

vpx_codec_err_t err;
vpx_codec_iter_t  iter = NULL;
vpx_image_t *img;

err = vpx_codec_decode(&s->codec, m->b_rptr, m->b_wptr - m->b_rptr, NULL0);
if (err) {
ms_warning("vpx_codec_decode failed : %d %s (%s)\n", err, vpx_codec_err_to_string(err), vpx_codec_error_detail(&s->codec));

if ((f->ticker->time - s->last_error_reported_time)>5000 || s->last_error_reported_time==0) {
if (s->first_image_decoded == FALSE) {
/* if no frames have been decoded yet, do not try to browse decoded frames */


                 if (VPX_CODEC_CORRUPT_FRAME == err||VPX_CODEC_UNSUP_BITSTREAM == err) {


                     /* do not try to browse decoded frames, use last successfully decoded frame instead */
                     if (dec_last_successfully_decoded_frame) {
                         ms_queue_put(f->outputs[0], dec_last_successfully_decoded_frame);

/* browse decoded frames */
while((img = vpx_codec_get_frame(&s->codec, &iter))) {
int i,j;

if (s->yuv_width != img->d_w || s->yuv_height != img->d_h) {
if (s->yuv_msg)
s->yuv_msg = ms_yuv_buf_alloc(&s->outbuf, img->d_w, img->d_h);
s->yuv_width = img->d_w;
s->yuv_height = img->d_h;

/* scale/copy frame to destination mblk_t */
for(i=0; i<3; i++) {
uint8_t* dest = s->outbuf.planes[i];
uint8_t* src = "">
int h = img->d_h >> ((i>0)?1:0);

for(j=0; j<h; j++) {
memcpy(dest, src, s->outbuf.strides[i]);

dest += s->outbuf.strides[i];
src += img->stride[i];


//ms_queue_put(f->outputs[0], dupmsg(s->yuv_msg));


                 if (dec_last_successfully_decoded_frame) {
                     dec_last_successfully_decoded_frame = NULL;



                ms_queue_put(f->outputs[0], dupmsg(s->yuv_msg));
                 dec_last_successfully_decoded_frame = dupmsg(s->yuv_msg);


if (ms_video_update_average_fps(&s->fps, f->ticker->time)) {
ms_message("VP8 decoder: Frame size: %dx%d", s->yuv_width, s->yuv_height);
if (!s->first_image_decoded) {
s->first_image_decoded = TRUE;

But it does not work for me, Can anyone help with me or give some advice on it.
Looking forwards to your answer, your kind help will be appreciated!


Linphone-developers mailing list

Linphone-developers mailing list

reply via email to

[Prev in Thread] Current Thread [Next in Thread]