Changeset 6078


Ignore:
Timestamp:
Sep 25, 2019 3:34:38 AM (12 months ago)
Author:
nanang
Message:

Fix #2236: Fixed exception in iOS Video Toolbox H264 due to UI API called on background thread.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia-codec/vid_toolbox.m

    r6038 r6078  
    180180/* Prototypes */ 
    181181static OSStatus create_decoder(struct vtool_codec_data *vtool_data); 
     182 
     183static void dispatch_sync_on_main_queue(void (^block)(void)) 
     184{ 
     185    if ([NSThread isMainThread]) { 
     186        block(); 
     187    } else { 
     188        dispatch_sync(dispatch_get_main_queue(), block); 
     189    } 
     190} 
    182191 
    183192PJ_DEF(pj_status_t) pjmedia_codec_vid_toolbox_init(pjmedia_vid_codec_mgr *mgr, 
     
    760769    NSDictionary *frm_prop = NULL; 
    761770    OSStatus ret; 
    762 #if TARGET_OS_IPHONE 
    763     UIApplicationState state; 
    764 #endif 
    765771  
    766772    PJ_ASSERT_RETURN(codec && input && out_size && output && has_more, 
    767773                     PJ_EINVAL); 
    768  
    769 #if TARGET_OS_IPHONE 
    770     /* Skip encoding if app is not active, i.e. in the bg. */ 
    771     state = [UIApplication sharedApplication].applicationState; 
    772     if (state != UIApplicationStateActive) { 
    773         *has_more = PJ_FALSE; 
    774         output->size = 0; 
    775         output->type = PJMEDIA_FRAME_TYPE_NONE; 
    776  
    777         return PJ_SUCCESS; 
    778     } 
    779 #endif 
    780774 
    781775    vtool_data = (vtool_codec_data*) codec->codec_data; 
     
    849843                                          NULL, NULL); 
    850844    if (ret == kVTInvalidSessionErr) { 
     845#if TARGET_OS_IPHONE 
     846        /* Just return if app is not active, i.e. in the bg. */ 
     847        __block UIApplicationState state; 
     848 
     849        dispatch_sync_on_main_queue(^{ 
     850            state = [UIApplication sharedApplication].applicationState; 
     851        }); 
     852        if (state != UIApplicationStateActive) { 
     853            *has_more = PJ_FALSE; 
     854            output->size = 0; 
     855            output->type = PJMEDIA_FRAME_TYPE_NONE; 
     856 
     857            CVPixelBufferRelease(image_buf); 
     858            return PJ_SUCCESS; 
     859        } 
     860#endif 
     861 
    851862        /* Reset compression session */ 
    852863        ret = create_encoder(vtool_data); 
     
    11131124    pj_bool_t decode_whole = DECODE_WHOLE; 
    11141125    OSStatus ret; 
    1115 #if TARGET_OS_IPHONE 
    1116     UIApplicationState state; 
    1117 #endif 
    11181126 
    11191127    PJ_ASSERT_RETURN(codec && count && packets && out_size && output, 
    11201128                     PJ_EINVAL); 
    11211129    PJ_ASSERT_RETURN(output->buf, PJ_EINVAL); 
    1122  
    1123 #if TARGET_OS_IPHONE 
    1124     /* Skip decoding if app is not active, i.e. in the bg. */ 
    1125     state = [UIApplication sharedApplication].applicationState; 
    1126     if (state != UIApplicationStateActive) { 
    1127         output->type = PJMEDIA_FRAME_TYPE_NONE; 
    1128         output->size = 0; 
    1129         output->timestamp = packets[0].timestamp; 
    1130         return PJ_SUCCESS; 
    1131     } 
    1132 #endif 
    11331130 
    11341131    vtool_data = (vtool_codec_data*) codec->codec_data; 
     
    12811278                          NULL, NULL); 
    12821279                if (ret == kVTInvalidSessionErr) { 
     1280#if TARGET_OS_IPHONE 
     1281                    /* Just return if app is not active, i.e. in the bg. */ 
     1282                    __block UIApplicationState state; 
     1283 
     1284                    dispatch_sync_on_main_queue(^{ 
     1285                        state = [UIApplication sharedApplication].applicationState; 
     1286                    }); 
     1287                    if (state != UIApplicationStateActive) { 
     1288                        output->type = PJMEDIA_FRAME_TYPE_NONE; 
     1289                        output->size = 0; 
     1290                        output->timestamp = packets[0].timestamp; 
     1291 
     1292                        CFRelease(block_buf); 
     1293                        CFRelease(sample_buf); 
     1294                        return PJ_SUCCESS; 
     1295                    } 
     1296#endif 
    12831297                    if (vtool_data->dec_format) 
    12841298                        CFRelease(vtool_data->dec_format); 
Note: See TracChangeset for help on using the changeset viewer.