[vlc-commits] transcode: change error handling

Thomas Guillem git at videolan.org
Fri Jan 19 12:01:44 CET 2018


vlc/vlc-3.0 | branch: master | Thomas Guillem <thomas at gllm.fr> | Fri Jan 19 08:31:53 2018 +0100| [77f0dfe2b19a5acf667033457fd93643a8b0918e] | committer: Jean-Baptiste Kempf

transcode: change error handling

Don't reset b_transcode to false in case of error, otherwise transcoding
resources won't be freed.

(cherry picked from commit 67e993164249d81bb38bf3f3030238d04d36b176)
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>

> http://git.videolan.org/gitweb.cgi/vlc/vlc-3.0.git/?a=commit;h=77f0dfe2b19a5acf667033457fd93643a8b0918e
---

 modules/stream_out/transcode/audio.c     | 17 +++++++++--------
 modules/stream_out/transcode/transcode.c |  3 +++
 modules/stream_out/transcode/transcode.h |  1 +
 modules/stream_out/transcode/video.c     |  9 ++-------
 4 files changed, 15 insertions(+), 15 deletions(-)

diff --git a/modules/stream_out/transcode/audio.c b/modules/stream_out/transcode/audio.c
index c60569a26f..c7ce848239 100644
--- a/modules/stream_out/transcode/audio.c
+++ b/modules/stream_out/transcode/audio.c
@@ -285,7 +285,7 @@ int transcode_audio_process( sout_stream_t *p_stream,
         p_audio_bufs = p_audio_bufs->p_next;
         p_audio_buf->p_next = NULL;
 
-        if( b_error )
+        if( id->b_error )
         {
             block_Release( p_audio_buf );
             continue;
@@ -312,7 +312,10 @@ int transcode_audio_process( sout_stream_t *p_stream,
             {
                 id->id = sout_StreamIdAdd( p_stream->p_next, &id->p_encoder->fmt_out );
                 if (!id->id)
-                    id->b_transcode = false;
+                {
+                    vlc_mutex_unlock(&id->fifo.lock);
+                    goto error;
+                }
             }
         }
 
@@ -365,10 +368,7 @@ int transcode_audio_process( sout_stream_t *p_stream,
         p_audio_buf = aout_FiltersPlay( id->p_af_chain, p_audio_buf,
                                         INPUT_RATE_DEFAULT );
         if( !p_audio_buf )
-        {
-            b_error = true;
-            continue;
-        }
+            goto error;
 
         p_audio_buf->i_dts = p_audio_buf->i_pts;
 
@@ -378,8 +378,9 @@ int transcode_audio_process( sout_stream_t *p_stream,
         block_Release( p_audio_buf );
         continue;
 error:
-        block_Release( p_audio_buf );
-        b_error = true;
+        if( p_audio_buf )
+            block_Release( p_audio_buf );
+        id->b_error = true;
     } while( p_audio_bufs );
 
 end:
diff --git a/modules/stream_out/transcode/transcode.c b/modules/stream_out/transcode/transcode.c
index 3420db2369..c92dd4a974 100644
--- a/modules/stream_out/transcode/transcode.c
+++ b/modules/stream_out/transcode/transcode.c
@@ -583,6 +583,9 @@ static int Send( sout_stream_t *p_stream, sout_stream_id_sys_t *id,
 {
     block_t *p_out = NULL;
 
+    if( id->b_error )
+        goto error;
+
     if( !id->b_transcode )
     {
         if( id->id )
diff --git a/modules/stream_out/transcode/transcode.h b/modules/stream_out/transcode/transcode.h
index 8ab9b2111d..1b5e886d94 100644
--- a/modules/stream_out/transcode/transcode.h
+++ b/modules/stream_out/transcode/transcode.h
@@ -73,6 +73,7 @@ struct aout_filters;
 struct sout_stream_id_sys_t
 {
     bool            b_transcode;
+    bool            b_error;
 
     /* id of the out stream */
     void *id;
diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index c59968ab71..60476dec45 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -61,9 +61,6 @@ static int video_update_format_decoder( decoder_t *p_dec )
         .sys = sys,
     };
 
-    if( !id->b_transcode )
-        return 0;
-
     if( id->p_encoder->fmt_in.i_codec == p_dec->fmt_out.i_codec ||
         video_format_IsSimilar( &id->video_dec_out,
                                 &p_dec->fmt_out.video ) )
@@ -428,7 +425,6 @@ static void transcode_video_framerate_init( sout_stream_t *p_stream,
         id->p_decoder->fmt_out.video.i_frame_rate_base,
         id->p_encoder->fmt_in.video.i_frame_rate,
         id->p_encoder->fmt_in.video.i_frame_rate_base );
-
 }
 
 static void transcode_video_size_init( sout_stream_t *p_stream,
@@ -776,7 +772,7 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_sys_t *id,
         p_pics = p_pics->p_next;
         p_pic->p_next = NULL;
 
-        if( b_error )
+        if( id->b_error )
         {
             picture_Release( p_pic );
             continue;
@@ -862,8 +858,7 @@ int transcode_video_process( sout_stream_t *p_stream, sout_stream_id_sys_t *id,
 error:
         if( p_pic )
             picture_Release( p_pic );
-        id->b_transcode = false;
-        b_error = true;
+        id->b_error = true;
     } while( p_pics );
 
     if( p_sys->i_threads >= 1 )



More information about the vlc-commits mailing list