summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2015-04-08 09:07:00 +0000
committerLiong Sauw Ming <ming@teluu.com>2015-04-08 09:07:00 +0000
commitaca74ace1470fee0b1086a76482968eba9bcdd28 (patch)
tree64a94cfb014077eabf802ff2896aa75a863ca826
parent15a4fcd36e8aed35b539ae92246846c10f6dde70 (diff)
Re #1835: More robust handling of format change, to prevent data race if clock is still running.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5052 74dad513-b988-da41-8d7b-12977e46ad98
-rw-r--r--pjmedia/src/pjmedia-videodev/ios_opengl_dev.m33
1 files changed, 20 insertions, 13 deletions
diff --git a/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m b/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m
index 2826bf4b..4325c2e7 100644
--- a/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m
+++ b/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m
@@ -220,6 +220,8 @@ static iosgl_fmt_info* get_iosgl_format_info(pjmedia_format_id id)
pjmedia_vid_dev_opengl_draw(stream->gl_buf, stream->vid_size.w, stream->vid_size.h,
stream->frame->buf);
+
+ [stream->ogl_context presentRenderbuffer:GL_RENDERBUFFER];
}
- (void)finish_render
@@ -229,6 +231,16 @@ static iosgl_fmt_info* get_iosgl_format_info(pjmedia_format_id id)
*/
}
+- (void)change_format
+{
+ pjmedia_video_format_detail *vfd;
+
+ vfd = pjmedia_format_get_video_format_detail(&stream->param.fmt, PJ_TRUE);
+ pj_memcpy(&stream->vid_size, &vfd->size, sizeof(vfd->size));
+ if (stream->param.disp_size.w == 0 || stream->param.disp_size.h == 0)
+ pj_memcpy(&stream->param.disp_size, &vfd->size, sizeof(vfd->size));
+}
+
@end
/* API: create stream */
@@ -253,6 +265,12 @@ pjmedia_vid_dev_opengl_imp_create_stream(pj_pool_t *pool,
vfd = pjmedia_format_get_video_format_detail(&strm->param.fmt, PJ_TRUE);
strm->ts_inc = PJMEDIA_SPF2(param->clock_rate, &vfd->fps, 1);
+ rect = CGRectMake(0, 0, strm->param.disp_size.w, strm->param.disp_size.h);
+ strm->gl_view = [[GLView alloc] initWithFrame:rect];
+ if (!strm->gl_view)
+ return PJ_ENOMEM;
+ strm->gl_view->stream = strm;
+
/* If OUTPUT_RESIZE flag is not used, set display size to default */
if (!(param->flags & PJMEDIA_VID_DEV_CAP_OUTPUT_RESIZE)) {
pj_bzero(&strm->param.disp_size, sizeof(strm->param.disp_size));
@@ -264,12 +282,6 @@ pjmedia_vid_dev_opengl_imp_create_stream(pj_pool_t *pool,
if (status != PJ_SUCCESS)
goto on_error;
- rect = CGRectMake(0, 0, strm->param.disp_size.w, strm->param.disp_size.h);
- strm->gl_view = [[GLView alloc] initWithFrame:rect];
- if (!strm->gl_view)
- return PJ_ENOMEM;
- strm->gl_view->stream = strm;
-
/* Perform OpenGL buffer initializations in the main thread. */
strm->status = PJ_SUCCESS;
[strm->gl_view performSelectorOnMainThread:@selector(init_gl)
@@ -372,7 +384,6 @@ static pj_status_t iosgl_stream_set_cap(pjmedia_vid_dev_stream *s,
if (cap==PJMEDIA_VID_DEV_CAP_FORMAT) {
const pjmedia_video_format_info *vfi;
- pjmedia_video_format_detail *vfd;
pjmedia_format *fmt = (pjmedia_format *)pval;
iosgl_fmt_info *ifi;
@@ -386,10 +397,8 @@ static pj_status_t iosgl_stream_set_cap(pjmedia_vid_dev_stream *s,
pjmedia_format_copy(&strm->param.fmt, fmt);
- vfd = pjmedia_format_get_video_format_detail(fmt, PJ_TRUE);
- pj_memcpy(&strm->vid_size, &vfd->size, sizeof(vfd->size));
- if (strm->param.disp_size.w == 0 || strm->param.disp_size.h == 0)
- pj_memcpy(&strm->param.disp_size, &vfd->size, sizeof(vfd->size));
+ [strm->gl_view performSelectorOnMainThread:@selector(change_format)
+ withObject:nil waitUntilDone:YES];
return PJ_SUCCESS;
} else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW) {
@@ -459,8 +468,6 @@ static pj_status_t iosgl_stream_put_frame(pjmedia_vid_dev_stream *strm,
[stream->gl_view performSelectorOnMainThread:@selector(render)
withObject:nil waitUntilDone:YES];
- [stream->ogl_context presentRenderbuffer:GL_RENDERBUFFER];
-
return PJ_SUCCESS;
}