I'm developing a video call app and facing strange behavior of pjsip.
From example app there are helper classes for working with camera:
PjCamera.java and PjCameraInfo.java
I'm trying to switch camera via the next code:
try {
CallVidSetStreamParam callVidSetStreamParam = new CallVidSetStreamParam();
callVidSetStreamParam.setCapDev(mCameraId);
myCall.vidSetStream(pjsua_call_vid_strm_op.PJSUA_CALL_VID_STRM_CHANGE_CAP_DEV, callVidSetStreamParam);
}catch (Exception e){
e.printStackTrace();
}
Where mCameraId is ID of the camera that is elected by the user. My conception is to allow user choose camera only before the calling. So I put this method into onCallMediaState(OnCallMediaStateParam prm) callback inside myCall after all media parsing operations done (same as in the example app).
So the sequencing of app logic is:
1. User chooses the camera
2. immediately calling (auto)
3. after all media initialize camera switched to desired one (back or front)
4. user ends call
All is fine here while user chooses the front camera. But when user chooses the back one strange thing happens:
1. First time he selects the back one all is ok. And he hangs up.
2. Now when he tries to do another one call (no matter which camera to choose now) the camera preview becomes black and no video sent to other side.
3. Now when he hangs up the call the app crashes immediately without any related error or warning.
After investigation I have found the reason of crash:
PjCamera.java contains methods Start() and Stop() that initialize and free/destroy android camera object to work with.
PjCamera.java contains methods Start() and Stop() that initialize and free/destroy android camera object to work with.
These methods are called by pjsip lib.
Using the debugger I have noticed that behavior of theese differs for calls with front camera and for calls with back camera.
let suppose facing camera id = 0 and back = 1
So for calls wit front camera the sequencing is:
1. Start() for 0 (starts camera at a call time)
1. Start() for 0 (starts camera at a call time)
2. Stop() for 0 (when call is ended)
3. Stop() for 0 (for some reason once again after call is ended)
And for calls with back camera the sequencing is:
1. Start() for 0 (starts camera at a call time)
2. Stop() for 0 (to switch the camera)
3. Start() for 1 (switching camera to back)
4. Stop() for 1(when call is ended)
5. Start() for 1(for some reason after call is ended)
So for front camera case the repeat is not fatal - second Stop() call is just NOP
But for the back camera this becomes pain - library reopens the back camera after the call was ended.
And this provides the app crash when calling after that.
I tried to investigate the pjsip source but failed to found a reason for such behavior. I'm not very familiar with C/C++ programming though.
So why is it happens?
Why pjsip tries to Stop() front camera twice while it reopens the back camera after call is ended and camera closed?
And how to overcome this issue?
Best Regards,
Sergey
_______________________________________________ Visit our blog: http://blog.pjsip.org pjsip mailing list pjsip@xxxxxxxxxxxxxxx http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org