tools air tools air
play

tools air tools air http://www.toolsonair.com ToolsOnAir is - PowerPoint PPT Presentation

Practical Real-Time Video Rendering with Modern OpenGL and GStreamer Heinrich Fink (R&D Engineer) tools air tools air http://www.toolsonair.com ToolsOnAir is known for its Mac-based software solutions for broadcasting.


  1. Practical Real-Time Video Rendering with Modern OpenGL and GStreamer Heinrich Fink (R&D Engineer) tools ‡ air

  2. tools ‡ air http://www.toolsonair.com • ToolsOnAir is known for its Mac-based software solutions for broadcasting. •Capture, playout with real-time graphics •Check out our webpage for more details

  3. R&D Projects • Today I’d like to talk about two R&D projects that we have been working on in the past year

  4. #1 gl-frame-bender • The first one is a benchmarking framework for GPU-based video processing using OpenGL

  5. Playout Deliver RGB to Y’CbCr Render Graphics Y’CbCr to RGB Acquire Master inputs • The use-case is a simple playout pipeline… •takes input master streams •converts them from luma/chroma coding to RGB •renders graphics •then encode back to luma/chroma •and delivers the mixed output to the playout medium

  6. • OpenGL is a good choice for implementing this, especially when graphics is going to be a focus

  7. But OpenGL has become a very large set of APIs, even for our simple use case, there many different code paths for •Video image processing algorithms •Optimising frame transfer •Application infrastructure & tools

  8. 10-bit 4:2:2 Y’CbCr to RGBA conversion Gamma decoding GLSL Image load/store operations Floating point render formats GLSL Compute shaders Chroma scaling filters GLSL integer ops But OpenGL has become a very large set of APIs, even for our simple use case, there many different code paths for •Video image processing algorithms •Optimising frame transfer •Application infrastructure & tools

  9. 10-bit 4:2:2 Y’CbCr to RGBA conversion Asynchronous texture transfers Gamma decoding Multi vs. single contexts/threads GLSL Image load/store operations Avoid implicit synchronisations Floating point render formats Persistent buffers GLSL Compute shaders Incoherent buffer updates Chroma scaling filters GLSL integer ops But OpenGL has become a very large set of APIs, even for our simple use case, there many different code paths for •Video image processing algorithms •Optimising frame transfer •Application infrastructure & tools

  10. 10-bit 4:2:2 Y’CbCr to RGBA conversion Asynchronous texture transfers Gamma decoding Multi vs. single contexts/threads GLSL Image load/store operations Avoid implicit synchronisations Floating point render formats Persistent buffers GLSL Compute shaders Incoherent buffer updates Chroma scaling filters GLSL integer ops GL sync Debug output GL timer queries Application-side concurrent pipelines But OpenGL has become a very large set of APIs, even for our simple use case, there many different code paths for •Video image processing algorithms •Optimising frame transfer •Application infrastructure & tools

  11. ? Well, how do we know which works best?

  12. Input data gl-frame-bender Output data Performance User settings metrics frame-bender-lib OpenGL 4.x Rendered output Input sequence video pipeline sequence C++11 pipeline infrastructure • To answer this, we’ve created a tool called “gl-frame-bender” •It’s a throughput-oriented benchmarking framework that runs a simple playout-like video processing pipeline. •It takes a set of standard 10-bit test sequences as input •Allows the user to choose between various implementation variants and records performance metrics into a file.

  13. Input data gl-frame-bender Output data Performance User settings metrics frame-bender-lib OpenGL 4.x Rendered output Input sequence video pipeline sequence C++11 pipeline infrastructure • To answer this, we’ve created a tool called “gl-frame-bender” •It’s a throughput-oriented benchmarking framework that runs a simple playout-like video processing pipeline. •It takes a set of standard 10-bit test sequences as input •Allows the user to choose between various implementation variants and records performance metrics into a file.

  14. CopyPBOToHost MapPBO PackPBO ConvertFormat Render ConvertFormat UnpackPBO UnmapPBO CopyHostToPBO • The framework uses a software pipeline pattern. Individual “stages” transport data down- and upstream via thread-safe queues • Potentially, each stage could be executed on its own thread • Speaking in OpenGL terms, the first stage copies host-memory into memory mapped by a pixel buffer object • The next stage unmaps the PBO, which is then “unpacked” (uploaded) to a GL texture. • This texture, still in video luma/chroma color space is then converted into linear RGB , where simple graphics are then rendered. • Then we reverse everything • The size of the queues and their threading are are freely configurable by the user • Each stage is able to record their execution start and end times using CPU and GPU clocks. • These records can be written into a compressed file after the execution of the test program • Now let’s look at some optimisations we have implemented for running this pipeline

  15. CopyPBOToHost MapPBO PackPBO ConvertFormat Render ConvertFormat UnpackPBO UnmapPBO CopyHostToPBO • The framework uses a software pipeline pattern. Individual “stages” transport data down- and upstream via thread-safe queues • Potentially, each stage could be executed on its own thread • Speaking in OpenGL terms, the first stage copies host-memory into memory mapped by a pixel buffer object • The next stage unmaps the PBO, which is then “unpacked” (uploaded) to a GL texture. • This texture, still in video luma/chroma color space is then converted into linear RGB , where simple graphics are then rendered. • Then we reverse everything • The size of the queues and their threading are are freely configurable by the user • Each stage is able to record their execution start and end times using CPU and GPU clocks. • These records can be written into a compressed file after the execution of the test program • Now let’s look at some optimisations we have implemented for running this pipeline

  16. CopyPBOToHost MapPBO PackPBO ConvertFormat Render ConvertFormat UnpackPBO UnmapPBO CopyHostToPBO • The framework uses a software pipeline pattern. Individual “stages” transport data down- and upstream via thread-safe queues • Potentially, each stage could be executed on its own thread • Speaking in OpenGL terms, the first stage copies host-memory into memory mapped by a pixel buffer object • The next stage unmaps the PBO, which is then “unpacked” (uploaded) to a GL texture. • This texture, still in video luma/chroma color space is then converted into linear RGB , where simple graphics are then rendered. • Then we reverse everything • The size of the queues and their threading are are freely configurable by the user • Each stage is able to record their execution start and end times using CPU and GPU clocks. • These records can be written into a compressed file after the execution of the test program • Now let’s look at some optimisations we have implemented for running this pipeline

  17. CopyPBOToHost MapPBO PackPBO ConvertFormat Render ConvertFormat UnpackPBO UnmapPBO CopyHostToPBO • The framework uses a software pipeline pattern. Individual “stages” transport data down- and upstream via thread-safe queues • Potentially, each stage could be executed on its own thread • Speaking in OpenGL terms, the first stage copies host-memory into memory mapped by a pixel buffer object • The next stage unmaps the PBO, which is then “unpacked” (uploaded) to a GL texture. • This texture, still in video luma/chroma color space is then converted into linear RGB , where simple graphics are then rendered. • Then we reverse everything • The size of the queues and their threading are are freely configurable by the user • Each stage is able to record their execution start and end times using CPU and GPU clocks. • These records can be written into a compressed file after the execution of the test program • Now let’s look at some optimisations we have implemented for running this pipeline

  18. CopyPBOToHost MapPBO PackPBO ConvertFormat Render ConvertFormat UnpackPBO UnmapPBO CopyHostToPBO • The framework uses a software pipeline pattern. Individual “stages” transport data down- and upstream via thread-safe queues • Potentially, each stage could be executed on its own thread • Speaking in OpenGL terms, the first stage copies host-memory into memory mapped by a pixel buffer object • The next stage unmaps the PBO, which is then “unpacked” (uploaded) to a GL texture. • This texture, still in video luma/chroma color space is then converted into linear RGB , where simple graphics are then rendered. • Then we reverse everything • The size of the queues and their threading are are freely configurable by the user • Each stage is able to record their execution start and end times using CPU and GPU clocks. • These records can be written into a compressed file after the execution of the test program • Now let’s look at some optimisations we have implemented for running this pipeline

Recommend


More recommend