Re: [pjsip] Green frames in H264 video initialization

M
Marc
Fri, Aug 12, 2016 11:34 PM

Note that in iOS you actually have to check for:

if (vparam.fmt.id == PJMEDIA_FORMAT_BGRA)

And write to memory as if it is a YUV buffer, not an BGRA buffer.

Also, you may want to set the 0 to 16 instead. See SSpatialLayerConfig.bfFullRange in OpenH264.

Thanks,

  • Marc

Hi Marc,

The green frames in the beginning of a video call is likely caused by
missing keyframe. Keyframe requests are sent regularly every
PJSUA_VID_REQ_KEYFRAME_INTERVAL, and application can also explicitly
send keyframe using the API pjsua_call_set_vid_strm() with op
PJSUA_CALL_VID_STRM_SEND_KEYFRAME. We also have a pending ticket for
this #1910 (https://trac.pjsip.org/repos/ticket/1910) which aims to do
this automatically within the library.

To change the color to black, instead of green, you can modify
pjmedia/src/pjmedia/vid_port.c, in function pjmedia_vid_port_create(),
where the initial buffer of the video frame is allocated. Below is an
example of how to set the frame to black in I420 format. For other YUV
formats, which have different ways to represent black, you may need to
modify the code accordingly.

if (need_frame_buf) {
    .....
    vp->frm_buf->type = PJMEDIA_FRAME_TYPE_NONE;
    /* Insert the below code after you find the above line ---- */
    /* Note: this will only work for I420 format */
    if (vparam.fmt.id == PJMEDIA_FORMAT_I420) {
        pj_memset(vp->frm_buf->buf, 0x80, vp->frm_buf_size);
        pj_bzero(vp->frm_buf->buf,
            vparam.fmt.det.vid.size.w*vparam.fmt.det.vid.size.h);
    }
    /* ---- */

Unfortunately, currently there's no notification for the first decoded
frame/keyframe received.

Best regards,
Ming

On Thu, Jul 21, 2016 at 7:04 AM, Marc marc@taplightsoftware.com wrote:

When making a call using OpenH264, we get a few seconds of green frames before the first video frames show up successfully.

It seems that this isn?t an OpenH264 (1.0.0 as that is the only version that compiles with PJSIP) issue, but a PJSIP one.

As a side note, it seems that later versions of OpenH264 have switched to gray: https://github.com/cisco/openh264/issues/1163

I have commented out oh264_codec_decode and oh264_got_decoded_frame to just return Pj_SUCCESS and do nothing else, and I still get the green screen and obviously no video.

I have also commented out decode_frame in vid_stream.c

This is on iOS using CAEAGLayer as the renderer.

0 in YUV colorspace turns out to be green. Where exactly should I look to fix this issue so we can get either one of 2 things.

  1. The green should become black (0x80 in YUV)
  2. A proper notification that we actually have the first decoded frame (or the first key frame) from the RTP H264 stream and we should display the video window.

Thanks


Visit our blog: http://blog.pjsip.org

pjsip mailing list
pjsip@lists.pjsip.org
http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org

Note that in iOS you actually have to check for: if (vparam.fmt.id == PJMEDIA_FORMAT_BGRA) And write to memory as if it is a YUV buffer, not an BGRA buffer. Also, you may want to set the 0 to 16 instead. See SSpatialLayerConfig.bfFullRange in OpenH264. Thanks, - Marc > Hi Marc, > > The green frames in the beginning of a video call is likely caused by > missing keyframe. Keyframe requests are sent regularly every > PJSUA_VID_REQ_KEYFRAME_INTERVAL, and application can also explicitly > send keyframe using the API pjsua_call_set_vid_strm() with op > PJSUA_CALL_VID_STRM_SEND_KEYFRAME. We also have a pending ticket for > this #1910 (https://trac.pjsip.org/repos/ticket/1910) which aims to do > this automatically within the library. > > To change the color to black, instead of green, you can modify > pjmedia/src/pjmedia/vid_port.c, in function pjmedia_vid_port_create(), > where the initial buffer of the video frame is allocated. Below is an > example of how to set the frame to black in I420 format. For other YUV > formats, which have different ways to represent black, you may need to > modify the code accordingly. > > if (need_frame_buf) { > ..... > vp->frm_buf->type = PJMEDIA_FRAME_TYPE_NONE; > /* Insert the below code after you find the above line ---- */ > /* Note: this will only work for I420 format */ > if (vparam.fmt.id == PJMEDIA_FORMAT_I420) { > pj_memset(vp->frm_buf->buf, 0x80, vp->frm_buf_size); > pj_bzero(vp->frm_buf->buf, > vparam.fmt.det.vid.size.w*vparam.fmt.det.vid.size.h); > } > /* ---- */ > > Unfortunately, currently there's no notification for the first decoded > frame/keyframe received. > > Best regards, > Ming > > On Thu, Jul 21, 2016 at 7:04 AM, Marc <marc@taplightsoftware.com> wrote: >> When making a call using OpenH264, we get a few seconds of green frames before the first video frames show up successfully. >> >> It seems that this isn?t an OpenH264 (1.0.0 as that is the only version that compiles with PJSIP) issue, but a PJSIP one. >> >> As a side note, it seems that later versions of OpenH264 have switched to gray: https://github.com/cisco/openh264/issues/1163 >> >> I have commented out oh264_codec_decode and oh264_got_decoded_frame to just return Pj_SUCCESS and do nothing else, and I still get the green screen and obviously no video. >> >> I have also commented out decode_frame in vid_stream.c >> >> This is on iOS using CAEAGLayer as the renderer. >> >> 0 in YUV colorspace turns out to be green. Where exactly should I look to fix this issue so we can get either one of 2 things. >> >> 1. The green should become black (0x80 in YUV) >> 2. A proper notification that we actually have the first decoded frame (or the first key frame) from the RTP H264 stream and we should display the video window. >> >> Thanks >> >> >> _______________________________________________ >> Visit our blog: http://blog.pjsip.org >> >> pjsip mailing list >> pjsip@lists.pjsip.org >> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org