From 4014b949eea611d4555de653f29fc2a0a77517b9 Mon Sep 17 00:00:00 2001 From: Liong Sauw Ming Date: Mon, 5 May 2014 07:47:48 +0000 Subject: Re #1762: Add capability enumerations and native preview capability git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4834 74dad513-b988-da41-8d7b-12977e46ad98 --- pjmedia/src/pjmedia-videodev/ios_dev.m | 65 ++++++++++++++++++++++------------ 1 file changed, 42 insertions(+), 23 deletions(-) (limited to 'pjmedia/src') diff --git a/pjmedia/src/pjmedia-videodev/ios_dev.m b/pjmedia/src/pjmedia-videodev/ios_dev.m index 929f8d93..96ffe9e4 100644 --- a/pjmedia/src/pjmedia-videodev/ios_dev.m +++ b/pjmedia/src/pjmedia-videodev/ios_dev.m @@ -252,7 +252,11 @@ static pj_status_t ios_factory_init(pjmedia_vid_dev_factory *f) for (i = 0; i < qf->dev_count; i++) { qdi = &qf->dev_info[i]; qdi->info.fmt_cnt = PJ_ARRAY_SIZE(ios_fmts); - qdi->info.caps |= PJMEDIA_VID_DEV_CAP_FORMAT; + qdi->info.caps |= PJMEDIA_VID_DEV_CAP_FORMAT | + PJMEDIA_VID_DEV_CAP_OUTPUT_RESIZE | + PJMEDIA_VID_DEV_CAP_OUTPUT_POSITION | + PJMEDIA_VID_DEV_CAP_OUTPUT_HIDE | + PJMEDIA_VID_DEV_CAP_ORIENTATION; for (l = 0; l < PJ_ARRAY_SIZE(ios_fmts); l++) { pjmedia_format *fmt = &qdi->info.fmt[l]; @@ -574,26 +578,9 @@ static pj_status_t ios_factory_create_stream( kCVPixelBufferPixelFormatTypeKey, nil]; /* Native preview */ - if ((param->flags & PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW) && - param->native_preview) - { - /* Preview layer instantiation should be in main thread! */ - dispatch_async(dispatch_get_main_queue(), ^{ - /* Create view */ - ios_init_view(strm); - - /* Create preview layer */ - AVCaptureVideoPreviewLayer *previewLayer = - [AVCaptureVideoPreviewLayer layerWithSession: strm->cap_session]; - - /* Attach preview layer to a UIView */ - CGRect r = strm->render_view.bounds; - previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; - previewLayer.frame = r; - [[strm->render_view layer] addSublayer:previewLayer]; - - NSLog(@"Native preview initialized."); - }); + if (param->flags & PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW) { + ios_stream_set_cap(&strm->base, PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW, + ¶m->native_preview); } } else if (param->dir & PJMEDIA_DIR_RENDER) { @@ -676,6 +663,37 @@ static pj_status_t ios_stream_set_cap(pjmedia_vid_dev_stream *s, PJ_ASSERT_RETURN(s && pval, PJ_EINVAL); switch (cap) { + /* Native preview */ + case PJMEDIA_VID_DEV_CAP_INPUT_PREVIEW: + { + pj_bool_t native_preview = *((pj_bool_t *)pval); + + if (!strm->cap_session) return PJ_EINVAL; + + if (!native_preview || strm->render_view) + return PJ_SUCCESS; + + /* Create view */ + ios_init_view(strm); + + /* Preview layer instantiation should be in main thread! */ + dispatch_async(dispatch_get_main_queue(), ^{ + /* Create preview layer */ + AVCaptureVideoPreviewLayer *previewLayer = + [AVCaptureVideoPreviewLayer layerWithSession:strm->cap_session]; + + /* Attach preview layer to a UIView */ + CGRect r = strm->render_view.bounds; + previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; + previewLayer.frame = r; + [[strm->render_view layer] addSublayer:previewLayer]; + }); + + NSLog(@"Native preview initialized."); + + return PJ_SUCCESS; + } + /* Fast switch */ case PJMEDIA_VID_DEV_CAP_SWITCH: { @@ -906,10 +924,11 @@ static pj_status_t ios_stream_destroy(pjmedia_vid_dev_stream *strm) } if (stream->render_view) { + UIView *view = stream->render_view; dispatch_async(dispatch_get_main_queue(), ^{ - [stream->render_view removeFromSuperview]; - [stream->render_view release]; + [view removeFromSuperview]; + [view release]; }); stream->render_view = NULL; } -- cgit v1.2.3