summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia-videodev/ios_opengl_dev.m')
-rw-r--r--pjmedia/src/pjmedia-videodev/ios_opengl_dev.m25
1 files changed, 18 insertions, 7 deletions
diff --git a/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m b/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m
index 4325c2e7..b7efe45e 100644
--- a/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m
+++ b/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m
@@ -19,6 +19,7 @@
#include <pjmedia-videodev/videodev_imp.h>
#include <pj/assert.h>
#include <pj/log.h>
+#include <pj/os.h>
#if defined(PJMEDIA_HAS_VIDEO) && PJMEDIA_HAS_VIDEO != 0 && \
defined(PJMEDIA_VIDEO_DEV_HAS_IOS_OPENGL) && \
@@ -128,6 +129,15 @@ static iosgl_fmt_info* get_iosgl_format_info(pjmedia_format_id id)
return NULL;
}
+static void dispatch_sync_on_main_queue(void (^block)(void))
+{
+ if ([NSThread isMainThread]) {
+ block();
+ } else {
+ dispatch_sync(dispatch_get_main_queue(), block);
+ }
+}
+
@implementation GLView
+ (Class) layerClass
@@ -266,7 +276,9 @@ pjmedia_vid_dev_opengl_imp_create_stream(pj_pool_t *pool,
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];
+ dispatch_sync_on_main_queue(^{
+ strm->gl_view = [[GLView alloc] initWithFrame:rect];
+ });
if (!strm->gl_view)
return PJ_ENOMEM;
strm->gl_view->stream = strm;
@@ -404,19 +416,18 @@ static pj_status_t iosgl_stream_set_cap(pjmedia_vid_dev_stream *s,
} else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW) {
UIView *view = (UIView *)pval;
strm->param.window.info.ios.window = (void *)pval;
- dispatch_async(dispatch_get_main_queue(),
- ^{[view addSubview:strm->gl_view];});
+ dispatch_sync_on_main_queue(^{[view addSubview:strm->gl_view];});
return PJ_SUCCESS;
} else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_RESIZE) {
pj_memcpy(&strm->param.disp_size, pval, sizeof(strm->param.disp_size));
- dispatch_async(dispatch_get_main_queue(), ^{
+ dispatch_sync_on_main_queue(^{
strm->gl_view.bounds = CGRectMake(0, 0, strm->param.disp_size.w,
strm->param.disp_size.h);
});
return PJ_SUCCESS;
} else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_POSITION) {
pj_memcpy(&strm->param.window_pos, pval, sizeof(strm->param.window_pos));
- dispatch_async(dispatch_get_main_queue(), ^{
+ dispatch_sync_on_main_queue(^{
strm->gl_view.center = CGPointMake(strm->param.window_pos.x +
strm->param.disp_size.w/2.0,
strm->param.window_pos.y +
@@ -424,7 +435,7 @@ static pj_status_t iosgl_stream_set_cap(pjmedia_vid_dev_stream *s,
});
return PJ_SUCCESS;
} else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE) {
- dispatch_async(dispatch_get_main_queue(), ^{
+ dispatch_sync_on_main_queue(^{
strm->gl_view.hidden = (BOOL)(*((pj_bool_t *)pval));
});
return PJ_SUCCESS;
@@ -432,7 +443,7 @@ static pj_status_t iosgl_stream_set_cap(pjmedia_vid_dev_stream *s,
pj_memcpy(&strm->param.orient, pval, sizeof(strm->param.orient));
if (strm->param.orient == PJMEDIA_ORIENT_UNKNOWN)
return PJ_SUCCESS;
- dispatch_async(dispatch_get_main_queue(), ^{
+ dispatch_sync_on_main_queue(^{
strm->gl_view.transform =
CGAffineTransformMakeRotation(((int)strm->param.orient-1) *
-M_PI_2);