OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2015 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
141 static const GLsizei kNumTextureSets = 2; | 141 static const GLsizei kNumTextureSets = 2; |
142 static const GLsizei kNumTextures = 3 * kNumTextureSets; | 142 static const GLsizei kNumTextures = 3 * kNumTextureSets; |
143 | 143 |
144 @implementation RTCOpenGLVideoRenderer { | 144 @implementation RTCOpenGLVideoRenderer { |
145 #if TARGET_OS_IPHONE | 145 #if TARGET_OS_IPHONE |
146 EAGLContext *_context; | 146 EAGLContext *_context; |
147 #else | 147 #else |
148 NSOpenGLContext *_context; | 148 NSOpenGLContext *_context; |
149 #endif | 149 #endif |
150 BOOL _isInitialized; | 150 BOOL _isInitialized; |
151 NSUInteger _currentTextureSet; | 151 GLint _currentTextureSet; |
152 // Handles for OpenGL constructs. | 152 // Handles for OpenGL constructs. |
153 GLuint _textures[kNumTextures]; | 153 GLuint _textures[kNumTextures]; |
154 GLuint _program; | 154 GLuint _program; |
155 #if !TARGET_OS_IPHONE | 155 #if !TARGET_OS_IPHONE |
156 GLuint _vertexArray; | 156 GLuint _vertexArray; |
157 #endif | 157 #endif |
158 GLuint _vertexBuffer; | 158 GLuint _vertexBuffer; |
159 GLint _position; | 159 GLint _position; |
160 GLint _texcoord; | 160 GLint _texcoord; |
161 GLint _ySampler; | 161 GLint _ySampler; |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
306 return YES; | 306 return YES; |
307 } | 307 } |
308 | 308 |
309 - (BOOL)updateTextureSizesForFrame:(RTCVideoFrame *)frame { | 309 - (BOOL)updateTextureSizesForFrame:(RTCVideoFrame *)frame { |
310 if (frame.height == _lastDrawnFrame.height && | 310 if (frame.height == _lastDrawnFrame.height && |
311 frame.width == _lastDrawnFrame.width && | 311 frame.width == _lastDrawnFrame.width && |
312 frame.chromaWidth == _lastDrawnFrame.chromaWidth && | 312 frame.chromaWidth == _lastDrawnFrame.chromaWidth && |
313 frame.chromaHeight == _lastDrawnFrame.chromaHeight) { | 313 frame.chromaHeight == _lastDrawnFrame.chromaHeight) { |
314 return YES; | 314 return YES; |
315 } | 315 } |
316 GLsizei lumaWidth = frame.width; | 316 GLsizei lumaWidth = static_cast<GLsizei>(frame.width); |
317 GLsizei lumaHeight = frame.height; | 317 GLsizei lumaHeight = static_cast<GLsizei>(frame.height); |
318 GLsizei chromaWidth = frame.chromaWidth; | 318 GLsizei chromaWidth = static_cast<GLsizei>(frame.chromaWidth); |
319 GLsizei chromaHeight = frame.chromaHeight; | 319 GLsizei chromaHeight = static_cast<GLsizei>(frame.chromaHeight); |
320 for (GLint i = 0; i < kNumTextureSets; i++) { | 320 for (GLint i = 0; i < kNumTextureSets; i++) { |
321 glActiveTexture(GL_TEXTURE0 + i * 3); | 321 glActiveTexture(GL_TEXTURE0 + i * 3); |
322 glTexImage2D(GL_TEXTURE_2D, | 322 glTexImage2D(GL_TEXTURE_2D, |
323 0, | 323 0, |
324 RTC_PIXEL_FORMAT, | 324 RTC_PIXEL_FORMAT, |
325 lumaWidth, | 325 lumaWidth, |
326 lumaHeight, | 326 lumaHeight, |
327 0, | 327 0, |
328 RTC_PIXEL_FORMAT, | 328 RTC_PIXEL_FORMAT, |
329 GL_UNSIGNED_BYTE, | 329 GL_UNSIGNED_BYTE, |
(...skipping 24 matching lines...) Expand all Loading... |
354 (NSUInteger)frame.vPitch != frame.chromaWidth) { | 354 (NSUInteger)frame.vPitch != frame.chromaWidth) { |
355 _planeBuffer.reset(new uint8_t[frame.width * frame.height]); | 355 _planeBuffer.reset(new uint8_t[frame.width * frame.height]); |
356 } else { | 356 } else { |
357 _planeBuffer.reset(); | 357 _planeBuffer.reset(); |
358 } | 358 } |
359 return YES; | 359 return YES; |
360 } | 360 } |
361 | 361 |
362 - (void)uploadPlane:(const uint8_t *)plane | 362 - (void)uploadPlane:(const uint8_t *)plane |
363 sampler:(GLint)sampler | 363 sampler:(GLint)sampler |
364 offset:(NSUInteger)offset | 364 offset:(GLint)offset |
365 width:(size_t)width | 365 width:(size_t)width |
366 height:(size_t)height | 366 height:(size_t)height |
367 stride:(int32_t)stride { | 367 stride:(int32_t)stride { |
368 glActiveTexture(GL_TEXTURE0 + offset); | 368 glActiveTexture(static_cast<GLenum>(GL_TEXTURE0 + offset)); |
369 // When setting texture sampler uniforms, the texture index is used not | 369 // When setting texture sampler uniforms, the texture index is used not |
370 // the texture handle. | 370 // the texture handle. |
371 glUniform1i(sampler, offset); | 371 glUniform1i(sampler, offset); |
372 #if TARGET_OS_IPHONE | 372 #if TARGET_OS_IPHONE |
373 BOOL hasUnpackRowLength = _context.API == kEAGLRenderingAPIOpenGLES3; | 373 BOOL hasUnpackRowLength = _context.API == kEAGLRenderingAPIOpenGLES3; |
374 #else | 374 #else |
375 BOOL hasUnpackRowLength = YES; | 375 BOOL hasUnpackRowLength = YES; |
376 #endif | 376 #endif |
377 const uint8_t *uploadPlane = plane; | 377 const uint8_t *uploadPlane = plane; |
378 if ((size_t)stride != width) { | 378 if ((size_t)stride != width) { |
379 if (hasUnpackRowLength) { | 379 if (hasUnpackRowLength) { |
380 // GLES3 allows us to specify stride. | 380 // GLES3 allows us to specify stride. |
381 glPixelStorei(GL_UNPACK_ROW_LENGTH, stride); | 381 glPixelStorei(GL_UNPACK_ROW_LENGTH, stride); |
382 glTexImage2D(GL_TEXTURE_2D, | 382 glTexImage2D(GL_TEXTURE_2D, |
383 0, | 383 0, |
384 RTC_PIXEL_FORMAT, | 384 RTC_PIXEL_FORMAT, |
385 width, | 385 static_cast<GLsizei>(width), |
386 height, | 386 static_cast<GLsizei>(height), |
387 0, | 387 0, |
388 RTC_PIXEL_FORMAT, | 388 RTC_PIXEL_FORMAT, |
389 GL_UNSIGNED_BYTE, | 389 GL_UNSIGNED_BYTE, |
390 uploadPlane); | 390 uploadPlane); |
391 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); | 391 glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); |
392 return; | 392 return; |
393 } else { | 393 } else { |
394 // Make an unpadded copy and upload that instead. Quick profiling showed | 394 // Make an unpadded copy and upload that instead. Quick profiling showed |
395 // that this is faster than uploading row by row using glTexSubImage2D. | 395 // that this is faster than uploading row by row using glTexSubImage2D. |
396 uint8_t *unpaddedPlane = _planeBuffer.get(); | 396 uint8_t *unpaddedPlane = _planeBuffer.get(); |
397 for (size_t y = 0; y < height; ++y) { | 397 for (size_t y = 0; y < height; ++y) { |
398 memcpy(unpaddedPlane + y * width, plane + y * stride, width); | 398 memcpy(unpaddedPlane + y * width, plane + y * stride, width); |
399 } | 399 } |
400 uploadPlane = unpaddedPlane; | 400 uploadPlane = unpaddedPlane; |
401 } | 401 } |
402 } | 402 } |
403 glTexImage2D(GL_TEXTURE_2D, | 403 glTexImage2D(GL_TEXTURE_2D, |
404 0, | 404 0, |
405 RTC_PIXEL_FORMAT, | 405 RTC_PIXEL_FORMAT, |
406 width, | 406 static_cast<GLsizei>(width), |
407 height, | 407 static_cast<GLsizei>(height), |
408 0, | 408 0, |
409 RTC_PIXEL_FORMAT, | 409 RTC_PIXEL_FORMAT, |
410 GL_UNSIGNED_BYTE, | 410 GL_UNSIGNED_BYTE, |
411 uploadPlane); | 411 uploadPlane); |
412 } | 412 } |
413 | 413 |
414 - (BOOL)updateTextureDataForFrame:(RTCVideoFrame *)frame { | 414 - (BOOL)updateTextureDataForFrame:(RTCVideoFrame *)frame { |
415 NSUInteger textureOffset = _currentTextureSet * 3; | 415 GLint textureOffset = _currentTextureSet * 3; |
416 NSAssert(textureOffset + 3 <= kNumTextures, @"invalid offset"); | 416 NSAssert(textureOffset + 3 <= kNumTextures, @"invalid offset"); |
417 | 417 |
418 [self uploadPlane:frame.yPlane | 418 [self uploadPlane:frame.yPlane |
419 sampler:_ySampler | 419 sampler:_ySampler |
420 offset:textureOffset | 420 offset:textureOffset |
421 width:frame.width | 421 width:frame.width |
422 height:frame.height | 422 height:frame.height |
423 stride:frame.yPitch]; | 423 stride:frame.yPitch]; |
424 | 424 |
425 [self uploadPlane:frame.uPlane | 425 [self uploadPlane:frame.uPlane |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 GL_FLOAT, | 476 GL_FLOAT, |
477 GL_FALSE, | 477 GL_FALSE, |
478 4 * sizeof(GLfloat), | 478 4 * sizeof(GLfloat), |
479 (void *)(2 * sizeof(GLfloat))); | 479 (void *)(2 * sizeof(GLfloat))); |
480 glEnableVertexAttribArray(_texcoord); | 480 glEnableVertexAttribArray(_texcoord); |
481 | 481 |
482 return YES; | 482 return YES; |
483 } | 483 } |
484 | 484 |
485 @end | 485 @end |
OLD | NEW |