Skip to content
Snippets Groups Projects
Forked from GStreamer / gst-plugins-bad
Source project has a limited visibility.
  • Nirbheek Chauhan's avatar
    4ccd563c
    msdk: Fix increasing memory usage in dynamic pipelines · 4ccd563c
    Nirbheek Chauhan authored
    Our context is non-persistent, and we propagate it throughout the
    pipeline. This means that if we try to reuse any gstmsdk element by
    removing it from the pipeline and then re-adding it, we'll clone the
    mfxSession and create a new gstmsdk context as a child of the old one
    inside `gst_msdk_context_new_with_parent()`.
    
    Normally this only allocates a few KB inside the driver, but on
    Windows it seems to allocate tens of MBs which leads to linearly
    increasing memory usage for each PLAYING->NULL->PLAYING state cycle
    for the process. The contexts will only be freed when the pipeline
    itself goes to `NULL`, which would defeat the purpose of dynamic
    pipelines.
    
    Essentially, we need to optimize the case in which the element is
    removed from the pipeline and re-added and the same context is re-set
    on it. To detect that case, we set the context on `old_context`, and
    compare it to the new one when preparing the context. If they're the
    same, we don't need to do anything.
    
    Fixes gstreamer/gst-plugins-bad#946
    4ccd563c
    History
    msdk: Fix increasing memory usage in dynamic pipelines
    Nirbheek Chauhan authored
    Our context is non-persistent, and we propagate it throughout the
    pipeline. This means that if we try to reuse any gstmsdk element by
    removing it from the pipeline and then re-adding it, we'll clone the
    mfxSession and create a new gstmsdk context as a child of the old one
    inside `gst_msdk_context_new_with_parent()`.
    
    Normally this only allocates a few KB inside the driver, but on
    Windows it seems to allocate tens of MBs which leads to linearly
    increasing memory usage for each PLAYING->NULL->PLAYING state cycle
    for the process. The contexts will only be freed when the pipeline
    itself goes to `NULL`, which would defeat the purpose of dynamic
    pipelines.
    
    Essentially, we need to optimize the case in which the element is
    removed from the pipeline and re-added and the same context is re-set
    on it. To detect that case, we set the context on `old_context`, and
    compare it to the new one when preparing the context. If they're the
    same, we don't need to do anything.
    
    Fixes gstreamer/gst-plugins-bad#946