transcode: fix destructive assignment after drain
authorAlaric Senat <alaric@videolabs.io>
Mon, 24 Jun 2024 16:11:23 +0000 (18:11 +0200)
committerSebastian Ramacher <sramacher@debian.org>
Tue, 21 Jan 2025 18:02:47 +0000 (19:02 +0100)
The drain checks are done after the first encoder output fetch. At this
point, `out` is already filled with some frames gotten from the encoder
some lines above:

```
// ...
    if( p_sys->i_threads >= 1 )
    {
        /* Pick up any return data the encoder thread wants to output. */
        vlc_mutex_lock( &p_sys->lock_out );
        *out = p_sys->p_buffers;
        p_sys->p_buffers = NULL;
        vlc_mutex_unlock( &p_sys->lock_out );
    }

// ...
```

This assignment currently leaks all previously gathered frames to
replace them by the drained output. This patch appends the drained
frames to the existing output instead.

Gbp-Pq: Name 0008-transcode-fix-destructive-assignment-after-drain.patch

modules/stream_out/transcode/video.c

index 9070babb2d33cdc6bdf26acfa41a10d8abd94480..e2065af09e38489806cd6292eac1dbd7ae4b1a51 100644 (file)
@@ -906,7 +906,7 @@ end:
 
             vlc_join( p_stream->p_sys->thread, NULL );
             vlc_mutex_lock( &p_sys->lock_out );
-            *out = p_sys->p_buffers;
+            block_ChainAppend(out, p_sys->p_buffers);
             p_sys->p_buffers = NULL;
             vlc_mutex_unlock( &p_sys->lock_out );