Ignore:
Timestamp:
Sep 22, 2014 7:03:25 AM (10 years ago)
Author:
ming
Message:

Re #1790: Use OpenGL textures instead of platform dependent textures.

This revision contains:

  • remove the generation of iOS texture (instead directly use OpenGL textures)
  • add iOS and Android window type
File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m

    r4917 r4925  
    3535{ 
    3636    pjmedia_format_id   pjmedia_format; 
    37     UInt32              iosgl_format; 
    3837} iosgl_fmt_info; 
    3938 
     
    4140static iosgl_fmt_info iosgl_fmts[] = 
    4241{ 
    43     {PJMEDIA_FORMAT_BGRA, kCVPixelFormatType_32BGRA} , 
     42    {PJMEDIA_FORMAT_BGRA} , 
    4443}; 
    4544 
     
    6665    unsigned                ts_inc; 
    6766    pjmedia_rect_size       vid_size; 
     67    const pjmedia_frame    *frame; 
    6868     
    6969    gl_buffers                  *gl_buf; 
    7070    GLView                      *gl_view; 
    7171    EAGLContext                 *ogl_context; 
    72     CVOpenGLESTextureCacheRef    vid_texture; 
    73     CVImageBufferRef             pb; 
    74     void                        *pb_addr; 
    75     CVOpenGLESTextureRef         texture; 
    7672}; 
    7773 
     
    154150     
    155151    /* Create GL buffers */ 
    156     pjmedia_vid_dev_opengl_create_buffers(stream->pool, &stream->gl_buf); 
     152    pjmedia_vid_dev_opengl_create_buffers(stream->pool, PJ_FALSE, 
     153                                          &stream->gl_buf); 
    157154     
    158155    [stream->ogl_context renderbufferStorage:GL_RENDERBUFFER 
     
    175172    } 
    176173     
    177     pjmedia_vid_dev_opengl_draw(stream->gl_buf, 
    178         (unsigned int)CVOpenGLESTextureGetTarget(stream->texture), 
    179         (unsigned int)CVOpenGLESTextureGetName(stream->texture)); 
     174    pjmedia_vid_dev_opengl_draw(stream->gl_buf, stream->vid_size.w, stream->vid_size.h, 
     175                                stream->frame->buf); 
    180176} 
    181177 
     
    194190    pj_status_t status = PJ_SUCCESS; 
    195191    CGRect rect; 
    196     CVReturn err; 
    197192     
    198193    strm = PJ_POOL_ZALLOC_T(pool, struct iosgl_stream); 
     
    228223    if ((status = strm->status) != PJ_SUCCESS) { 
    229224        PJ_LOG(3, (THIS_FILE, "Unable to create and init OpenGL buffers")); 
    230         goto on_error; 
    231     } 
    232      
    233     /*  Create a new CVOpenGLESTexture cache */ 
    234     err = CVOpenGLESTextureCacheCreate(kCFAllocatorDefault, NULL, 
    235                                        strm->ogl_context, NULL, 
    236                                        &strm->vid_texture); 
    237     if (err) { 
    238         PJ_LOG(3, (THIS_FILE, "Unable to create OpenGL texture cache %d", 
    239                    err)); 
    240         status = PJMEDIA_EVID_SYSERR; 
    241225        goto on_error; 
    242226    } 
     
    344328        if (strm->param.disp_size.w == 0 || strm->param.disp_size.h == 0) 
    345329            pj_memcpy(&strm->param.disp_size, &vfd->size, sizeof(vfd->size)); 
    346          
    347         /* Invalidate the buffer */ 
    348         if (strm->pb) { 
    349             CVPixelBufferRelease(strm->pb); 
    350             strm->pb = NULL; 
    351         } 
    352          
     330 
    353331        return PJ_SUCCESS; 
    354332    } else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW) { 
     
    411389{ 
    412390    struct iosgl_stream *stream = (struct iosgl_stream*)strm; 
    413     CVReturn err; 
    414  
    415     /* Pixel buffer will only create a wrapper for the frame's buffer, 
    416      * so if the frame buffer changes, we have to recreate pb 
    417      */ 
    418     if (!stream->pb || (frame->buf && stream->pb_addr != frame->buf)) { 
    419         if (stream->pb) { 
    420             CVPixelBufferRelease(stream->pb); 
    421             stream->pb = NULL; 
    422         } 
    423         err = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, 
    424                                            stream->vid_size.w, 
    425                                            stream->vid_size.h, 
    426                                            kCVPixelFormatType_32BGRA, 
    427                                            frame->buf, 
    428                                            stream->vid_size.w * 4, 
    429                                            NULL, NULL, NULL, &stream->pb); 
    430         if (err) { 
    431             PJ_LOG(3, (THIS_FILE, "Unable to create pixel buffer %d", err)); 
    432             return PJMEDIA_EVID_SYSERR; 
    433         } 
    434         stream->pb_addr = frame->buf; 
    435     } 
    436  
    437     /* Create a CVOpenGLESTexture from the CVImageBuffer */ 
    438     err=CVOpenGLESTextureCacheCreateTextureFromImage(kCFAllocatorDefault, 
    439                                                      stream->vid_texture, 
    440                                                      stream->pb, NULL, 
    441                                                      GL_TEXTURE_2D, GL_RGBA, 
    442                                                      stream->vid_size.w, 
    443                                                      stream->vid_size.h, 
    444                                                      GL_BGRA, 
    445                                                      GL_UNSIGNED_BYTE, 
    446                                                      0, &stream->texture); 
    447     if (!stream->texture || err) { 
    448         PJ_LOG(3, (THIS_FILE, "Unable to create OpenGL texture %d", err)); 
    449         return PJMEDIA_EVID_SYSERR; 
    450     } 
    451      
     391     
     392    stream->frame = frame; 
    452393    /* Perform OpenGL drawing in the main thread. */ 
    453394    [stream->gl_view performSelectorOnMainThread:@selector(render) 
     
    457398     
    458399    [stream->ogl_context presentRenderbuffer:GL_RENDERBUFFER]; 
    459   
    460     /* Flush the CVOpenGLESTexture cache and release the texture */ 
    461     CVOpenGLESTextureCacheFlush(stream->vid_texture, 0); 
    462     CFRelease(stream->texture); 
    463400     
    464401    return PJ_SUCCESS; 
     
    487424    iosgl_stream_stop(strm); 
    488425     
    489     if (stream->pb) { 
    490         CVPixelBufferRelease(stream->pb); 
    491         stream->pb = NULL; 
    492     } 
    493      
    494     if (stream->vid_texture) { 
    495         CFRelease(stream->vid_texture); 
    496         stream->vid_texture = NULL; 
    497     } 
    498  
    499426    if ([EAGLContext currentContext] == stream->ogl_context) 
    500427        [EAGLContext setCurrentContext:nil]; 
Note: See TracChangeset for help on using the changeset viewer.