- Timestamp:
- Sep 22, 2014 7:03:25 AM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/trunk/pjmedia/src/pjmedia-videodev/ios_opengl_dev.m
r4917 r4925 35 35 { 36 36 pjmedia_format_id pjmedia_format; 37 UInt32 iosgl_format;38 37 } iosgl_fmt_info; 39 38 … … 41 40 static iosgl_fmt_info iosgl_fmts[] = 42 41 { 43 {PJMEDIA_FORMAT_BGRA , kCVPixelFormatType_32BGRA} ,42 {PJMEDIA_FORMAT_BGRA} , 44 43 }; 45 44 … … 66 65 unsigned ts_inc; 67 66 pjmedia_rect_size vid_size; 67 const pjmedia_frame *frame; 68 68 69 69 gl_buffers *gl_buf; 70 70 GLView *gl_view; 71 71 EAGLContext *ogl_context; 72 CVOpenGLESTextureCacheRef vid_texture;73 CVImageBufferRef pb;74 void *pb_addr;75 CVOpenGLESTextureRef texture;76 72 }; 77 73 … … 154 150 155 151 /* 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); 157 154 158 155 [stream->ogl_context renderbufferStorage:GL_RENDERBUFFER … … 175 172 } 176 173 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); 180 176 } 181 177 … … 194 190 pj_status_t status = PJ_SUCCESS; 195 191 CGRect rect; 196 CVReturn err;197 192 198 193 strm = PJ_POOL_ZALLOC_T(pool, struct iosgl_stream); … … 228 223 if ((status = strm->status) != PJ_SUCCESS) { 229 224 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;241 225 goto on_error; 242 226 } … … 344 328 if (strm->param.disp_size.w == 0 || strm->param.disp_size.h == 0) 345 329 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 353 331 return PJ_SUCCESS; 354 332 } else if (cap == PJMEDIA_VID_DEV_CAP_OUTPUT_WINDOW) { … … 411 389 { 412 390 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; 452 393 /* Perform OpenGL drawing in the main thread. */ 453 394 [stream->gl_view performSelectorOnMainThread:@selector(render) … … 457 398 458 399 [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);463 400 464 401 return PJ_SUCCESS; … … 487 424 iosgl_stream_stop(strm); 488 425 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 499 426 if ([EAGLContext currentContext] == stream->ogl_context) 500 427 [EAGLContext setCurrentContext:nil];
Note: See TracChangeset
for help on using the changeset viewer.