OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 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 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 | 241 |
242 *outWindow = _window; | 242 *outWindow = _window; |
243 *outDisplay = _display; | 243 *outDisplay = _display; |
244 | 244 |
245 return 0; | 245 return 0; |
246 } | 246 } |
247 #endif // WEBRTC_LINUX | 247 #endif // WEBRTC_LINUX |
248 | 248 |
249 // Note: Mac code is in testApi_mac.mm. | 249 // Note: Mac code is in testApi_mac.mm. |
250 | 250 |
251 class MyRenderCallback: public VideoRenderCallback | 251 class MyRenderCallback: public rtc::VideoSinkInterface<VideoFrame> |
252 { | 252 { |
253 public: | 253 public: |
254 MyRenderCallback() : | 254 MyRenderCallback() : |
255 _cnt(0) | 255 _cnt(0) |
256 { | 256 { |
257 } | 257 } |
258 ; | 258 ; |
259 ~MyRenderCallback() | 259 ~MyRenderCallback() |
260 { | 260 { |
261 } | 261 } |
262 ; | 262 ; |
263 virtual int32_t RenderFrame(const uint32_t streamId, | 263 void OnFrame(const VideoFrame& videoFrame) override { |
264 const VideoFrame& videoFrame) { | |
265 _cnt++; | 264 _cnt++; |
266 if (_cnt % 100 == 0) | 265 if (_cnt % 100 == 0) |
267 { | 266 { |
268 printf("Render callback %d \n",_cnt); | 267 printf("Render callback %d \n",_cnt); |
269 } | 268 } |
270 return 0; | |
271 } | 269 } |
272 int32_t _cnt; | 270 int32_t _cnt; |
273 }; | 271 }; |
274 | 272 |
275 void GetTestVideoFrame(VideoFrame* frame, uint8_t startColor) { | 273 void GetTestVideoFrame(VideoFrame* frame, uint8_t startColor) { |
276 // changing color | 274 // changing color |
277 static uint8_t color = startColor; | 275 static uint8_t color = startColor; |
278 | 276 |
279 memset(frame->buffer(kYPlane), color, frame->allocated_size(kYPlane)); | 277 memset(frame->buffer(kYPlane), color, frame->allocated_size(kYPlane)); |
280 memset(frame->buffer(kUPlane), color, frame->allocated_size(kUPlane)); | 278 memset(frame->buffer(kUPlane), color, frame->allocated_size(kUPlane)); |
281 memset(frame->buffer(kVPlane), color, frame->allocated_size(kVPlane)); | 279 memset(frame->buffer(kVPlane), color, frame->allocated_size(kVPlane)); |
282 | 280 |
283 ++color; | 281 ++color; |
284 } | 282 } |
285 | 283 |
286 int TestSingleStream(VideoRender* renderModule) { | 284 int TestSingleStream(VideoRender* renderModule) { |
287 int error = 0; | 285 int error = 0; |
288 // Add settings for a stream to render | 286 // Add settings for a stream to render |
289 printf("Add stream 0 to entire window\n"); | 287 printf("Add stream 0 to entire window\n"); |
290 const int streamId0 = 0; | 288 const int streamId0 = 0; |
291 VideoRenderCallback* renderCallback0 = renderModule->AddIncomingRenderStream
(streamId0, 0, 0.0f, 0.0f, 1.0f, 1.0f); | 289 rtc::VideoSinkInterface<VideoFrame>* renderCallback0 = |
| 290 renderModule->AddIncomingRenderStream( |
| 291 streamId0, 0, 0.0f, 0.0f, 1.0f, 1.0f); |
292 assert(renderCallback0 != NULL); | 292 assert(renderCallback0 != NULL); |
293 | 293 |
294 printf("Start render\n"); | 294 printf("Start render\n"); |
295 error = renderModule->StartRender(streamId0); | 295 error = renderModule->StartRender(streamId0); |
296 if (error != 0) { | 296 if (error != 0) { |
297 // TODO(phoglund): This test will not work if compiled in release mode. | 297 // TODO(phoglund): This test will not work if compiled in release mode. |
298 // This rather silly construct here is to avoid compilation errors when | 298 // This rather silly construct here is to avoid compilation errors when |
299 // compiling in release. Release => no asserts => unused 'error' variable. | 299 // compiling in release. Release => no asserts => unused 'error' variable. |
300 assert(false); | 300 assert(false); |
301 } | 301 } |
302 | 302 |
303 // Loop through an I420 file and render each frame | 303 // Loop through an I420 file and render each frame |
304 const int width = 352; | 304 const int width = 352; |
305 const int half_width = (width + 1) / 2; | 305 const int half_width = (width + 1) / 2; |
306 const int height = 288; | 306 const int height = 288; |
307 | 307 |
308 VideoFrame videoFrame0; | 308 VideoFrame videoFrame0; |
309 videoFrame0.CreateEmptyFrame(width, height, width, half_width, half_width); | 309 videoFrame0.CreateEmptyFrame(width, height, width, half_width, half_width); |
310 | 310 |
311 const uint32_t renderDelayMs = 500; | 311 const uint32_t renderDelayMs = 500; |
312 | 312 |
313 for (int i=0; i<TEST_FRAME_NUM; i++) { | 313 for (int i=0; i<TEST_FRAME_NUM; i++) { |
314 GetTestVideoFrame(&videoFrame0, TEST_STREAM0_START_COLOR); | 314 GetTestVideoFrame(&videoFrame0, TEST_STREAM0_START_COLOR); |
315 // Render this frame with the specified delay | 315 // Render this frame with the specified delay |
316 videoFrame0.set_render_time_ms(TickTime::MillisecondTimestamp() | 316 videoFrame0.set_render_time_ms(TickTime::MillisecondTimestamp() |
317 + renderDelayMs); | 317 + renderDelayMs); |
318 renderCallback0->RenderFrame(streamId0, videoFrame0); | 318 renderCallback0->OnFrame(videoFrame0); |
319 SleepMs(1000/TEST_FRAME_RATE); | 319 SleepMs(1000/TEST_FRAME_RATE); |
320 } | 320 } |
321 | 321 |
322 | 322 |
323 // Shut down | 323 // Shut down |
324 printf("Closing...\n"); | 324 printf("Closing...\n"); |
325 error = renderModule->StopRender(streamId0); | 325 error = renderModule->StopRender(streamId0); |
326 assert(error == 0); | 326 assert(error == 0); |
327 | 327 |
328 error = renderModule->DeleteIncomingRenderStream(streamId0); | 328 error = renderModule->DeleteIncomingRenderStream(streamId0); |
(...skipping 16 matching lines...) Expand all Loading... |
345 return 0; | 345 return 0; |
346 } | 346 } |
347 | 347 |
348 int TestBitmapText(VideoRender* renderModule) { | 348 int TestBitmapText(VideoRender* renderModule) { |
349 #if defined(WIN32) | 349 #if defined(WIN32) |
350 | 350 |
351 int error = 0; | 351 int error = 0; |
352 // Add settings for a stream to render | 352 // Add settings for a stream to render |
353 printf("Add stream 0 to entire window\n"); | 353 printf("Add stream 0 to entire window\n"); |
354 const int streamId0 = 0; | 354 const int streamId0 = 0; |
355 VideoRenderCallback* renderCallback0 = renderModule->AddIncomingRenderStream
(streamId0, 0, 0.0f, 0.0f, 1.0f, 1.0f); | 355 rtc::VideoSinkInterface<VideoFrame>* renderCallback0 = |
| 356 renderModule->AddIncomingRenderStream( |
| 357 streamId0, 0, 0.0f, 0.0f, 1.0f, 1.0f); |
356 assert(renderCallback0 != NULL); | 358 assert(renderCallback0 != NULL); |
357 | 359 |
358 printf("Adding Bitmap\n"); | 360 printf("Adding Bitmap\n"); |
359 DDCOLORKEY ColorKey; // black | 361 DDCOLORKEY ColorKey; // black |
360 ColorKey.dwColorSpaceHighValue = RGB(0, 0, 0); | 362 ColorKey.dwColorSpaceHighValue = RGB(0, 0, 0); |
361 ColorKey.dwColorSpaceLowValue = RGB(0, 0, 0); | 363 ColorKey.dwColorSpaceLowValue = RGB(0, 0, 0); |
362 HBITMAP hbm = (HBITMAP)LoadImage(NULL, | 364 HBITMAP hbm = (HBITMAP)LoadImage(NULL, |
363 (LPCTSTR)_T("renderStartImage.bmp"), | 365 (LPCTSTR)_T("renderStartImage.bmp"), |
364 IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); | 366 IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE); |
365 renderModule->SetBitmap(hbm, 0, &ColorKey, 0.0f, 0.0f, 0.3f, | 367 renderModule->SetBitmap(hbm, 0, &ColorKey, 0.0f, 0.0f, 0.3f, |
(...skipping 16 matching lines...) Expand all Loading... |
382 VideoFrame videoFrame0; | 384 VideoFrame videoFrame0; |
383 videoFrame0.CreateEmptyFrame(width, height, width, half_width, half_width); | 385 videoFrame0.CreateEmptyFrame(width, height, width, half_width, half_width); |
384 | 386 |
385 const uint32_t renderDelayMs = 500; | 387 const uint32_t renderDelayMs = 500; |
386 | 388 |
387 for (int i=0; i<TEST_FRAME_NUM; i++) { | 389 for (int i=0; i<TEST_FRAME_NUM; i++) { |
388 GetTestVideoFrame(&videoFrame0, TEST_STREAM0_START_COLOR); | 390 GetTestVideoFrame(&videoFrame0, TEST_STREAM0_START_COLOR); |
389 // Render this frame with the specified delay | 391 // Render this frame with the specified delay |
390 videoFrame0.set_render_time_ms(TickTime::MillisecondTimestamp() + | 392 videoFrame0.set_render_time_ms(TickTime::MillisecondTimestamp() + |
391 renderDelayMs); | 393 renderDelayMs); |
392 renderCallback0->RenderFrame(streamId0, videoFrame0); | 394 renderCallback0->OnFrame(videoFrame0); |
393 SleepMs(1000/TEST_FRAME_RATE); | 395 SleepMs(1000/TEST_FRAME_RATE); |
394 } | 396 } |
395 // Sleep and let all frames be rendered before closing | 397 // Sleep and let all frames be rendered before closing |
396 SleepMs(renderDelayMs*2); | 398 SleepMs(renderDelayMs*2); |
397 | 399 |
398 | 400 |
399 // Shut down | 401 // Shut down |
400 printf("Closing...\n"); | 402 printf("Closing...\n"); |
401 ColorKey.dwColorSpaceHighValue = RGB(0,0,0); | 403 ColorKey.dwColorSpaceHighValue = RGB(0,0,0); |
402 ColorKey.dwColorSpaceLowValue = RGB(0,0,0); | 404 ColorKey.dwColorSpaceLowValue = RGB(0,0,0); |
(...skipping 10 matching lines...) Expand all Loading... |
413 | 415 |
414 return 0; | 416 return 0; |
415 } | 417 } |
416 | 418 |
417 int TestMultipleStreams(VideoRender* renderModule) { | 419 int TestMultipleStreams(VideoRender* renderModule) { |
418 int error = 0; | 420 int error = 0; |
419 | 421 |
420 // Add settings for a stream to render | 422 // Add settings for a stream to render |
421 printf("Add stream 0\n"); | 423 printf("Add stream 0\n"); |
422 const int streamId0 = 0; | 424 const int streamId0 = 0; |
423 VideoRenderCallback* renderCallback0 = | 425 rtc::VideoSinkInterface<VideoFrame>* renderCallback0 = |
424 renderModule->AddIncomingRenderStream(streamId0, 0, 0.0f, 0.0f, 0.45f, 0
.45f); | 426 renderModule->AddIncomingRenderStream( |
| 427 streamId0, 0, 0.0f, 0.0f, 0.45f, 0.45f); |
425 assert(renderCallback0 != NULL); | 428 assert(renderCallback0 != NULL); |
426 printf("Add stream 1\n"); | 429 printf("Add stream 1\n"); |
427 const int streamId1 = 1; | 430 const int streamId1 = 1; |
428 VideoRenderCallback* renderCallback1 = | 431 rtc::VideoSinkInterface<VideoFrame>* renderCallback1 = |
429 renderModule->AddIncomingRenderStream(streamId1, 0, 0.55f, 0.0f, 1.0f, 0
.45f); | 432 renderModule->AddIncomingRenderStream( |
| 433 streamId1, 0, 0.55f, 0.0f, 1.0f, 0.45f); |
430 assert(renderCallback1 != NULL); | 434 assert(renderCallback1 != NULL); |
431 printf("Add stream 2\n"); | 435 printf("Add stream 2\n"); |
432 const int streamId2 = 2; | 436 const int streamId2 = 2; |
433 VideoRenderCallback* renderCallback2 = | 437 rtc::VideoSinkInterface<VideoFrame>* renderCallback2 = |
434 renderModule->AddIncomingRenderStream(streamId2, 0, 0.0f, 0.55f, 0.45f,
1.0f); | 438 renderModule->AddIncomingRenderStream( |
| 439 streamId2, 0, 0.0f, 0.55f, 0.45f, 1.0f); |
435 assert(renderCallback2 != NULL); | 440 assert(renderCallback2 != NULL); |
436 printf("Add stream 3\n"); | 441 printf("Add stream 3\n"); |
437 const int streamId3 = 3; | 442 const int streamId3 = 3; |
438 VideoRenderCallback* renderCallback3 = | 443 rtc::VideoSinkInterface<VideoFrame>* renderCallback3 = |
439 renderModule->AddIncomingRenderStream(streamId3, 0, 0.55f, 0.55f, 1.0f,
1.0f); | 444 renderModule->AddIncomingRenderStream( |
| 445 streamId3, 0, 0.55f, 0.55f, 1.0f, 1.0f); |
440 assert(renderCallback3 != NULL); | 446 assert(renderCallback3 != NULL); |
441 error = renderModule->StartRender(streamId0); | 447 error = renderModule->StartRender(streamId0); |
442 if (error != 0) { | 448 if (error != 0) { |
443 // TODO(phoglund): This test will not work if compiled in release mode. | 449 // TODO(phoglund): This test will not work if compiled in release mode. |
444 // This rather silly construct here is to avoid compilation errors when | 450 // This rather silly construct here is to avoid compilation errors when |
445 // compiling in release. Release => no asserts => unused 'error' variable. | 451 // compiling in release. Release => no asserts => unused 'error' variable. |
446 assert(false); | 452 assert(false); |
447 } | 453 } |
448 error = renderModule->StartRender(streamId1); | 454 error = renderModule->StartRender(streamId1); |
449 assert(error == 0); | 455 assert(error == 0); |
(...skipping 17 matching lines...) Expand all Loading... |
467 videoFrame3.CreateEmptyFrame(width, height, width, half_width, half_width); | 473 videoFrame3.CreateEmptyFrame(width, height, width, half_width, half_width); |
468 | 474 |
469 const uint32_t renderDelayMs = 500; | 475 const uint32_t renderDelayMs = 500; |
470 | 476 |
471 // Render frames with the specified delay. | 477 // Render frames with the specified delay. |
472 for (int i=0; i<TEST_FRAME_NUM; i++) { | 478 for (int i=0; i<TEST_FRAME_NUM; i++) { |
473 GetTestVideoFrame(&videoFrame0, TEST_STREAM0_START_COLOR); | 479 GetTestVideoFrame(&videoFrame0, TEST_STREAM0_START_COLOR); |
474 | 480 |
475 videoFrame0.set_render_time_ms(TickTime::MillisecondTimestamp() + | 481 videoFrame0.set_render_time_ms(TickTime::MillisecondTimestamp() + |
476 renderDelayMs); | 482 renderDelayMs); |
477 renderCallback0->RenderFrame(streamId0, videoFrame0); | 483 renderCallback0->OnFrame(videoFrame0); |
478 | 484 |
479 GetTestVideoFrame(&videoFrame1, TEST_STREAM1_START_COLOR); | 485 GetTestVideoFrame(&videoFrame1, TEST_STREAM1_START_COLOR); |
480 videoFrame1.set_render_time_ms(TickTime::MillisecondTimestamp() + | 486 videoFrame1.set_render_time_ms(TickTime::MillisecondTimestamp() + |
481 renderDelayMs); | 487 renderDelayMs); |
482 renderCallback1->RenderFrame(streamId1, videoFrame1); | 488 renderCallback1->OnFrame(videoFrame1); |
483 | 489 |
484 GetTestVideoFrame(&videoFrame2, TEST_STREAM2_START_COLOR); | 490 GetTestVideoFrame(&videoFrame2, TEST_STREAM2_START_COLOR); |
485 videoFrame2.set_render_time_ms(TickTime::MillisecondTimestamp() + | 491 videoFrame2.set_render_time_ms(TickTime::MillisecondTimestamp() + |
486 renderDelayMs); | 492 renderDelayMs); |
487 renderCallback2->RenderFrame(streamId2, videoFrame2); | 493 renderCallback2->OnFrame(videoFrame2); |
488 | 494 |
489 GetTestVideoFrame(&videoFrame3, TEST_STREAM3_START_COLOR); | 495 GetTestVideoFrame(&videoFrame3, TEST_STREAM3_START_COLOR); |
490 videoFrame3.set_render_time_ms(TickTime::MillisecondTimestamp() + | 496 videoFrame3.set_render_time_ms(TickTime::MillisecondTimestamp() + |
491 renderDelayMs); | 497 renderDelayMs); |
492 renderCallback3->RenderFrame(streamId3, videoFrame3); | 498 renderCallback3->OnFrame(videoFrame3); |
493 | 499 |
494 SleepMs(1000/TEST_FRAME_RATE); | 500 SleepMs(1000/TEST_FRAME_RATE); |
495 } | 501 } |
496 | 502 |
497 // Shut down | 503 // Shut down |
498 printf("Closing...\n"); | 504 printf("Closing...\n"); |
499 error = renderModule->StopRender(streamId0); | 505 error = renderModule->StopRender(streamId0); |
500 assert(error == 0); | 506 assert(error == 0); |
501 error = renderModule->DeleteIncomingRenderStream(streamId0); | 507 error = renderModule->DeleteIncomingRenderStream(streamId0); |
502 assert(error == 0); | 508 assert(error == 0); |
(...skipping 11 matching lines...) Expand all Loading... |
514 assert(error == 0); | 520 assert(error == 0); |
515 | 521 |
516 return 0; | 522 return 0; |
517 } | 523 } |
518 | 524 |
519 int TestExternalRender(VideoRender* renderModule) { | 525 int TestExternalRender(VideoRender* renderModule) { |
520 int error = 0; | 526 int error = 0; |
521 MyRenderCallback *externalRender = new MyRenderCallback(); | 527 MyRenderCallback *externalRender = new MyRenderCallback(); |
522 | 528 |
523 const int streamId0 = 0; | 529 const int streamId0 = 0; |
524 VideoRenderCallback* renderCallback0 = | 530 rtc::VideoSinkInterface<VideoFrame>* renderCallback0 = |
525 renderModule->AddIncomingRenderStream(streamId0, 0, 0.0f, 0.0f, | 531 renderModule->AddIncomingRenderStream(streamId0, 0, 0.0f, 0.0f, |
526 1.0f, 1.0f); | 532 1.0f, 1.0f); |
527 assert(renderCallback0 != NULL); | 533 assert(renderCallback0 != NULL); |
528 error = renderModule->AddExternalRenderCallback(streamId0, externalRender); | 534 error = renderModule->AddExternalRenderCallback(streamId0, externalRender); |
529 if (error != 0) { | 535 if (error != 0) { |
530 // TODO(phoglund): This test will not work if compiled in release mode. | 536 // TODO(phoglund): This test will not work if compiled in release mode. |
531 // This rather silly construct here is to avoid compilation errors when | 537 // This rather silly construct here is to avoid compilation errors when |
532 // compiling in release. Release => no asserts => unused 'error' variable. | 538 // compiling in release. Release => no asserts => unused 'error' variable. |
533 assert(false); | 539 assert(false); |
534 } | 540 } |
535 | 541 |
536 error = renderModule->StartRender(streamId0); | 542 error = renderModule->StartRender(streamId0); |
537 assert(error == 0); | 543 assert(error == 0); |
538 | 544 |
539 const int width = 352; | 545 const int width = 352; |
540 const int half_width = (width + 1) / 2; | 546 const int half_width = (width + 1) / 2; |
541 const int height = 288; | 547 const int height = 288; |
542 VideoFrame videoFrame0; | 548 VideoFrame videoFrame0; |
543 videoFrame0.CreateEmptyFrame(width, height, width, half_width, half_width); | 549 videoFrame0.CreateEmptyFrame(width, height, width, half_width, half_width); |
544 | 550 |
545 const uint32_t renderDelayMs = 500; | 551 const uint32_t renderDelayMs = 500; |
546 int frameCount = TEST_FRAME_NUM; | 552 int frameCount = TEST_FRAME_NUM; |
547 for (int i=0; i<frameCount; i++) { | 553 for (int i=0; i<frameCount; i++) { |
548 videoFrame0.set_render_time_ms(TickTime::MillisecondTimestamp() + | 554 videoFrame0.set_render_time_ms(TickTime::MillisecondTimestamp() + |
549 renderDelayMs); | 555 renderDelayMs); |
550 renderCallback0->RenderFrame(streamId0, videoFrame0); | 556 renderCallback0->OnFrame(videoFrame0); |
551 SleepMs(33); | 557 SleepMs(33); |
552 } | 558 } |
553 | 559 |
554 // Sleep and let all frames be rendered before closing | 560 // Sleep and let all frames be rendered before closing |
555 SleepMs(2*renderDelayMs); | 561 SleepMs(2*renderDelayMs); |
556 | 562 |
557 // Shut down | 563 // Shut down |
558 printf("Closing...\n"); | 564 printf("Closing...\n"); |
559 error = renderModule->StopRender(streamId0); | 565 error = renderModule->StopRender(streamId0); |
560 assert(error == 0); | 566 assert(error == 0); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 Display* display; | 642 Display* display; |
637 WebRtcCreateWindow(&testWindow, &display, 0, 352, 288); | 643 WebRtcCreateWindow(&testWindow, &display, 0, 352, 288); |
638 VideoRenderType windowType = kRenderX11; | 644 VideoRenderType windowType = kRenderX11; |
639 window = (void*)testWindow; | 645 window = (void*)testWindow; |
640 #endif // WEBRTC_LINUX | 646 #endif // WEBRTC_LINUX |
641 | 647 |
642 RunVideoRenderTests(window, windowType); | 648 RunVideoRenderTests(window, windowType); |
643 return 0; | 649 return 0; |
644 } | 650 } |
645 #endif // !WEBRTC_MAC | 651 #endif // !WEBRTC_MAC |
OLD | NEW |