]> git.sesse.net Git - vlc/blobdiff - modules/stream_out/transcode.c
Qt coverlabel should always show an image, even when load fails
[vlc] / modules / stream_out / transcode.c
index 1c417c80d197cac3ee08f10a7d60ef49ece6b6f1..2e675587428f31a14fbfb4fb2a23d8a2c6c0a492 100644 (file)
@@ -1146,7 +1146,7 @@ static int transcode_audio_new( sout_stream_t *p_stream,
                     id->p_decoder->fmt_out.i_codec );
     id->p_encoder->fmt_in.audio.i_format = id->p_decoder->fmt_out.i_codec;
 
-    id->p_encoder->fmt_in.audio.i_rate = fmt_last.audio.i_rate;//id->p_encoder->fmt_out.audio.i_rate;
+    id->p_encoder->fmt_in.audio.i_rate = id->p_encoder->fmt_out.audio.i_rate;
     id->p_encoder->fmt_in.audio.i_physical_channels =
         id->p_encoder->fmt_out.audio.i_physical_channels;
     id->p_encoder->fmt_in.audio.i_original_channels =
@@ -1261,8 +1261,15 @@ static int transcode_audio_new( sout_stream_t *p_stream,
         id->p_encoder->p_cfg = p_stream->p_sys->p_audio_cfg;
         id->p_encoder->p_module =
             module_Need( id->p_encoder, "encoder", p_sys->psz_aenc, true );
-        if( !id->p_encoder->p_module )
+        if( !id->p_encoder->p_module ||
+            fmt_last.audio.i_channels != id->p_encoder->fmt_in.audio.i_channels  ||
+            fmt_last.i_codec != id->p_encoder->fmt_in.i_codec )
         {
+            if( id->p_encoder->p_module )
+            {
+                module_Unneed( id->p_encoder, id->p_encoder->p_module );
+                id->p_encoder->p_module = NULL;
+            }
             msg_Err( p_stream, "cannot find audio encoder (module:%s fourcc:%4.4s)",
                      p_sys->psz_aenc ? p_sys->psz_aenc : "any",
                      (char *)&p_sys->i_acodec );
@@ -1566,7 +1573,7 @@ static int transcode_video_new( sout_stream_t *p_stream, sout_stream_id_t *id )
                            VLC_THREAD_PRIORITY_VIDEO;
         p_sys->id_video = id;
         vlc_mutex_init( &p_sys->lock_out );
-        vlc_cond_init( p_stream, &p_sys->cond );
+        vlc_cond_init( &p_sys->cond );
         memset( p_sys->pp_pics, 0, sizeof(p_sys->pp_pics) );
         p_sys->i_first_pic = 0;
         p_sys->i_last_pic = 0;
@@ -1949,6 +1956,8 @@ static int transcode_video_process( sout_stream_t *p_stream,
                     id->p_encoder->fmt_in.video.i_width;
                 id->p_encoder->fmt_out.video.i_height =
                     id->p_encoder->fmt_in.video.i_height;
+                id->p_encoder->fmt_out.video.i_aspect =
+                    id->p_encoder->fmt_in.video.i_aspect;
             }
 
             if( transcode_video_encoder_open( p_stream, id ) != VLC_SUCCESS )
@@ -1972,7 +1981,7 @@ static int transcode_video_process( sout_stream_t *p_stream,
         if( p_sys->p_spu )
         {
             p_subpic = spu_SortSubpictures( p_sys->p_spu, p_pic->date,
-                       false /* Fixme: check if stream is paused */ );
+                       false /* Fixme: check if stream is paused */, false );
             /* TODO: get another pic */
         }
 
@@ -2008,7 +2017,7 @@ static int transcode_video_process( sout_stream_t *p_stream,
             fmt.i_sar_num = fmt.i_aspect * fmt.i_height / fmt.i_width;
             fmt.i_sar_den = VOUT_ASPECT_FACTOR;
 
-            spu_RenderSubpictures( p_sys->p_spu, &fmt, p_pic, p_pic, p_subpic,
+            spu_RenderSubpictures( p_sys->p_spu, &fmt, p_pic, p_subpic,
                                    i_scale_width, i_scale_height );
         }
 
@@ -2102,6 +2111,7 @@ static void* EncoderThread( vlc_object_t* p_this )
     sout_stream_sys_t *p_sys = (sout_stream_sys_t*)p_this;
     sout_stream_id_t *id = p_sys->id_video;
     picture_t *p_pic;
+    int canc = vlc_savecancel ();
 
     while( vlc_object_alive (p_sys) && !p_sys->b_error )
     {
@@ -2142,6 +2152,7 @@ static void* EncoderThread( vlc_object_t* p_this )
     }
     block_ChainRelease( p_sys->p_buffers );
 
+    vlc_restorecancel (canc);
     return NULL;
 }
 
@@ -2267,6 +2278,7 @@ static void video_del_buffer( vlc_object_t *p_this, picture_t *p_pic )
     VLC_UNUSED(p_this);
     if( p_pic )
     {
+        free( p_pic->p_q );
         free( p_pic->p_data_orig );
         free( p_pic->p_sys );
         free( p_pic );
@@ -2278,6 +2290,7 @@ static void video_del_buffer_decoder( decoder_t *p_decoder, picture_t *p_pic )
     VLC_UNUSED(p_decoder);
     p_pic->i_refcount = 0;
     p_pic->i_status = DESTROYED_PICTURE;
+    picture_CleanupQuant( p_pic );
 }
 
 static void video_del_buffer_filter( filter_t *p_filter, picture_t *p_pic )
@@ -2285,6 +2298,7 @@ static void video_del_buffer_filter( filter_t *p_filter, picture_t *p_pic )
     VLC_UNUSED(p_filter);
     p_pic->i_refcount = 0;
     p_pic->i_status = DESTROYED_PICTURE;
+    picture_CleanupQuant( p_pic );
 }
 
 static void video_link_picture_decoder( decoder_t *p_dec, picture_t *p_pic )
@@ -2511,7 +2525,7 @@ static int transcode_osd_process( sout_stream_t *p_stream,
     /* Check if we have a subpicture to send */
     if( p_sys->p_spu && in->i_dts > 0)
     {
-        p_subpic = spu_SortSubpictures( p_sys->p_spu, in->i_dts, false );
+        p_subpic = spu_SortSubpictures( p_sys->p_spu, in->i_dts, false, false );
     }
     else
     {