summaryrefslogtreecommitdiff
path: root/pjmedia
diff options
context:
space:
mode:
authorLiong Sauw Ming <ming@teluu.com>2016-08-03 10:22:29 +0000
committerLiong Sauw Ming <ming@teluu.com>2016-08-03 10:22:29 +0000
commitc2cc7d010b165b4addb966fdf969e418324462cd (patch)
tree583dfcb979ed621cec13deec6ce40db45fa5b435 /pjmedia
parent0c02f3847f89a52537fa6663343621523d8d4ce6 (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.m47
-rw-r--r--pjmedia/src/pjmedia-videodev/ios_opengl_dev.m25
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);