diff options
author | Liong Sauw Ming <ming@teluu.com> | 2016-08-03 10:22:29 +0000 |
---|---|---|
committer | Liong Sauw Ming <ming@teluu.com> | 2016-08-03 10:22:29 +0000 |
commit | c2cc7d010b165b4addb966fdf969e418324462cd (patch) | |
tree | 583dfcb979ed621cec13deec6ce40db45fa5b435 /pjmedia | |
parent | 0c02f3847f89a52537fa6663343621523d8d4ce6 (diff) |
Fixed #1948: Modify async dispatch to synchronous on Mac and iOS video device implementation
Thanks to Marc Etcheverry for the patch.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@5406 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia')
-rw-r--r-- | pjmedia/src/pjmedia-videodev/darwin_dev.m | 47 | ||||
-rw-r--r-- | pjmedia/src/pjmedia-videodev/ios_opengl_dev.m | 25 |
2 files changed, 42 insertions, 30 deletions
diff --git a/pjmedia/src/pjmedia-videodev/darwin_dev.m b/pjmedia/src/pjmedia-videodev/darwin_dev.m index 6ac018bc..74d96da5 100644 --- a/pjmedia/src/pjmedia-videodev/darwin_dev.m +++ b/pjmedia/src/pjmedia-videodev/darwin_dev.m @@ -234,6 +234,15 @@ static void set_preset_str() #endif } +static void dispatch_sync_on_main_queue(void (^block)(void)) +{ + if ([NSThread isMainThread]) { + block(); + } else { + dispatch_sync(dispatch_get_main_queue(), block); + } +} + /**************************************************************************** * Factory operations */ @@ -943,7 +952,7 @@ static pj_status_t darwin_stream_set_cap(pjmedia_vid_dev_stream *s, if (!native_preview) { if (strm->prev_layer) { CALayer *prev_layer = strm->prev_layer; - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ [prev_layer removeFromSuperlayer]; [prev_layer release]; }); @@ -969,7 +978,7 @@ static pj_status_t darwin_stream_set_cap(pjmedia_vid_dev_stream *s, darwin_init_view(strm); /* Preview layer instantiation should be in main thread! */ - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ /* Create preview layer */ AVCaptureVideoPreviewLayer *prev_layer = [[AVCaptureVideoPreviewLayer alloc] @@ -1074,7 +1083,7 @@ static pj_status_t darwin_stream_set_cap(pjmedia_vid_dev_stream *s, { UIView *view = (UIView *)pval; strm->param.window.info.ios.window = (void *)pval; - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ [view addSubview:strm->render_view]; }); return PJ_SUCCESS; @@ -1087,7 +1096,7 @@ static pj_status_t darwin_stream_set_cap(pjmedia_vid_dev_stream *s, CGRect r = strm->render_view.bounds; r.size = CGSizeMake(strm->param.disp_size.w, strm->param.disp_size.h); - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ strm->render_view.bounds = r; if (strm->prev_layer) strm->prev_layer.frame = r; @@ -1099,7 +1108,7 @@ static pj_status_t darwin_stream_set_cap(pjmedia_vid_dev_stream *s, { pj_memcpy(&strm->param.window_pos, pval, sizeof(strm->param.window_pos)); - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ strm->render_view.center = CGPointMake(strm->param.window_pos.x + strm->param.disp_size.w/2.0, @@ -1111,7 +1120,7 @@ static pj_status_t darwin_stream_set_cap(pjmedia_vid_dev_stream *s, case PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE: { - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ strm->render_view.hidden = (BOOL)(*((pj_bool_t *)pval)); }); return PJ_SUCCESS; @@ -1133,7 +1142,7 @@ static pj_status_t darwin_stream_set_cap(pjmedia_vid_dev_stream *s, if (strm->param.dir == PJMEDIA_DIR_RENDER) { #if TARGET_OS_IPHONE - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ strm->render_view.transform = CGAffineTransformMakeRotation( ((int)strm->param.orient-1) * -M_PI_2); @@ -1218,13 +1227,9 @@ static pj_status_t darwin_stream_start(pjmedia_vid_dev_stream *strm) PJ_LOG(4, (THIS_FILE, "Starting Darwin video stream")); if (stream->cap_session) { - if ([NSThread isMainThread]) { + dispatch_sync_on_main_queue(^{ [stream->cap_session startRunning]; - } else { - dispatch_sync(dispatch_get_main_queue(), ^{ - [stream->cap_session startRunning]; - }); - } + }); if (![stream->cap_session isRunning]) { PJ_LOG(3, (THIS_FILE, "Unable to start AVFoundation capture " @@ -1250,7 +1255,7 @@ static pj_status_t darwin_stream_put_frame(pjmedia_vid_dev_stream *strm, pj_memcpy(stream->render_buf, frame->buf, stream->frame_size); /* Perform video display in a background thread */ - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ [stream->vout_delegate update_image]; }); #endif @@ -1268,13 +1273,9 @@ static pj_status_t darwin_stream_stop(pjmedia_vid_dev_stream *strm) PJ_LOG(4, (THIS_FILE, "Stopping Darwin video stream")); - if ([NSThread isMainThread]) { - [stream->cap_session stopRunning]; - } else { - dispatch_sync(dispatch_get_main_queue(), ^{ - [stream->cap_session stopRunning]; - }); - } + dispatch_sync_on_main_queue(^{ + [stream->cap_session stopRunning]; + }); return PJ_SUCCESS; } @@ -1312,7 +1313,7 @@ static pj_status_t darwin_stream_destroy(pjmedia_vid_dev_stream *strm) #if TARGET_OS_IPHONE if (stream->prev_layer) { CALayer *prev_layer = stream->prev_layer; - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ [prev_layer removeFromSuperlayer]; [prev_layer release]; }); @@ -1321,7 +1322,7 @@ static pj_status_t darwin_stream_destroy(pjmedia_vid_dev_stream *strm) if (stream->render_view) { UIView *view = stream->render_view; - dispatch_async(dispatch_get_main_queue(), ^{ + dispatch_sync_on_main_queue(^{ [view removeFromSuperview]; [view release]; }); 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); |