]> git.sesse.net Git - vlc/blobdiff - src/video_output/vout_subpictures.c
One more "Remove useless test before free"
[vlc] / src / video_output / vout_subpictures.c
index d959382fb06be7feb7c0f3be636c19f49df058b3..6531492e1daaa2947a05a931b436cdca2bccde0a 100644 (file)
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
 #include <vlc/vlc.h>
 #include <vlc_vout.h>
 #include <vlc_block.h>
@@ -145,17 +149,20 @@ int spu_ParseChain( spu_t *p_spu )
         if( p_spu->pp_filter[p_spu->i_filter]->p_module )
         {
             filter_owner_sys_t *p_sys = malloc( sizeof(filter_owner_sys_t) );
-            p_spu->pp_filter[p_spu->i_filter]->p_owner = p_sys;
-            spu_Control( p_spu, SPU_CHANNEL_REGISTER, &p_sys->i_channel );
-            p_sys->p_spu = p_spu;
-            p_spu->i_filter++;
+            if( p_sys )
+            {
+                p_spu->pp_filter[p_spu->i_filter]->p_owner = p_sys;
+                spu_Control( p_spu, SPU_CHANNEL_REGISTER, &p_sys->i_channel );
+                p_sys->p_spu = p_spu;
+                p_spu->i_filter++;
+            }
         }
         else
         {
             msg_Dbg( p_spu, "no sub filter found" );
             config_ChainDestroy( p_spu->pp_filter[p_spu->i_filter]->p_cfg );
             vlc_object_detach( p_spu->pp_filter[p_spu->i_filter] );
-            vlc_object_destroy( p_spu->pp_filter[p_spu->i_filter] );
+            vlc_object_release( p_spu->pp_filter[p_spu->i_filter] );
         }
 
         if( p_spu->i_filter >= 10 )
@@ -165,7 +172,7 @@ int spu_ParseChain( spu_t *p_spu )
 
         free( psz_name );
     }
-    if( val.psz_string ) free( val.psz_string );
+    free( val.psz_string );
 
     return VLC_SUCCESS;
 }
@@ -196,7 +203,7 @@ void spu_Destroy( spu_t *p_spu )
             module_Unneed( p_spu->p_blend, p_spu->p_blend->p_module );
 
         vlc_object_detach( p_spu->p_blend );
-        vlc_object_destroy( p_spu->p_blend );
+        vlc_object_release( p_spu->p_blend );
     }
 
     if( p_spu->p_text )
@@ -205,7 +212,7 @@ void spu_Destroy( spu_t *p_spu )
             module_Unneed( p_spu->p_text, p_spu->p_text->p_module );
 
         vlc_object_detach( p_spu->p_text );
-        vlc_object_destroy( p_spu->p_text );
+        vlc_object_release( p_spu->p_text );
     }
 
     if( p_spu->p_scale )
@@ -214,13 +221,13 @@ void spu_Destroy( spu_t *p_spu )
             module_Unneed( p_spu->p_scale, p_spu->p_scale->p_module );
 
         vlc_object_detach( p_spu->p_scale );
-        vlc_object_destroy( p_spu->p_scale );
+        vlc_object_release( p_spu->p_scale );
     }
 
     spu_DeleteChain( p_spu );
 
     vlc_mutex_destroy( &p_spu->subpicture_lock );
-    vlc_object_destroy( p_spu );
+    vlc_object_release( p_spu );
 }
 
 static void spu_DeleteChain( spu_t *p_spu )
@@ -234,7 +241,7 @@ static void spu_DeleteChain( spu_t *p_spu )
         free( p_spu->pp_filter[p_spu->i_filter]->p_owner );
         config_ChainDestroy( p_spu->pp_filter[p_spu->i_filter]->p_cfg );
         vlc_object_detach( p_spu->pp_filter[p_spu->i_filter] );
-        vlc_object_destroy( p_spu->pp_filter[p_spu->i_filter] );
+        vlc_object_release( p_spu->pp_filter[p_spu->i_filter] );
     }
 }
 
@@ -273,7 +280,7 @@ void spu_Attach( spu_t *p_spu, vlc_object_t *p_this, vlc_bool_t b_attach )
  */
 static void RegionPictureRelease( picture_t *p_pic )
 {
-    if( p_pic->p_data_orig ) free( p_pic->p_data_orig );
+    free( p_pic->p_data_orig );
 }
 subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this,
                                          video_format_t *p_fmt )
@@ -303,7 +310,7 @@ subpicture_region_t *__spu_CreateRegion( vlc_object_t *p_this,
     if( !p_region->picture.i_planes )
     {
         free( p_region );
-        if( p_fmt->p_palette ) free( p_fmt->p_palette );
+        free( p_fmt->p_palette );
         return NULL;
     }
 
@@ -325,6 +332,7 @@ subpicture_region_t *__spu_MakeRegion( vlc_object_t *p_this,
 {
     subpicture_region_t *p_region = malloc( sizeof(subpicture_region_t) );
     (void)p_this;
+    if( !p_region ) return NULL;
     memset( p_region, 0, sizeof(subpicture_region_t) );
     p_region->p_next = 0;
     p_region->p_cache = 0;
@@ -354,13 +362,11 @@ void __spu_DestroyRegion( vlc_object_t *p_this, subpicture_region_t *p_region )
     if( !p_region ) return;
     if( p_region->picture.pf_release )
         p_region->picture.pf_release( &p_region->picture );
-    if( p_region->fmt.p_palette ) free( p_region->fmt.p_palette );
+    free( p_region->fmt.p_palette );
     if( p_region->p_cache ) __spu_DestroyRegion( p_this, p_region->p_cache );
 
-    if( p_region->psz_text )
-        free( p_region->psz_text );
-    if( p_region->psz_html )
-        free( p_region->psz_html );
+    free( p_region->psz_text );
+    free( p_region->psz_html );
     //free( p_region->p_style ); FIXME --fenrir plugin does not allocate the memory for it. I think it might lead to segfault, video renderer can live longer than the decoder
     free( p_region );
 }
@@ -509,24 +515,66 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
                             subpicture_t *p_subpic,
                             int i_scale_width_orig, int i_scale_height_orig )
 {
-    int i_source_video_width  = p_fmt->i_width  * 1000 / i_scale_width_orig;
-    int i_source_video_height = p_fmt->i_height * 1000 / i_scale_height_orig;
+    int i_source_video_width;
+    int i_source_video_height;
+    subpicture_t *p_subpic_v = p_subpic;
 
     /* Get lock */
     vlc_mutex_lock( &p_spu->subpicture_lock );
 
+    for( p_subpic_v = p_subpic;
+            p_subpic_v != NULL && p_subpic_v->i_status != FREE_SUBPICTURE;
+            p_subpic_v = p_subpic_v->p_next )
+    {
+        if( p_subpic_v->pf_pre_render )
+        {
+            p_subpic_v->pf_pre_render( p_fmt, p_spu, p_subpic_v, mdate() );
+        }
+    }
+
+    if( i_scale_width_orig <= 0 )
+        i_scale_width_orig = 1;
+    if( i_scale_height_orig <= 0 )
+        i_scale_height_orig = 1;
+
+    i_source_video_width  = p_fmt->i_width  * 1000 / i_scale_width_orig;
+    i_source_video_height = p_fmt->i_height * 1000 / i_scale_height_orig;
+
     /* Check i_status again to make sure spudec hasn't destroyed the subpic */
     while( ( p_subpic != NULL ) && ( p_subpic->i_status != FREE_SUBPICTURE ) )
     {
-        subpicture_region_t *p_region = p_subpic->p_region;
+        subpicture_region_t *p_region;
         int pi_scale_width[ SCALE_SIZE ];
         int pi_scale_height[ SCALE_SIZE ];
         int pi_subpic_x[ SCALE_SIZE ];
         int k;
 
+        /* If the source video and subtitles stream agree on the size of
+         * the video then disregard all further references to the subtitle
+         * stream.
+         */
+        if( ( i_source_video_height == p_subpic->i_original_picture_height ) &&
+            ( i_source_video_width  == p_subpic->i_original_picture_width ) )
+        {
+            p_subpic->i_original_picture_height = 0;
+            p_subpic->i_original_picture_width = 0;
+        }
+
         for( k = 0; k < SCALE_SIZE ; k++ )
             pi_subpic_x[ k ] = p_subpic->i_x;
 
+        if( p_subpic->pf_update_regions )
+        {
+            if ( p_subpic->p_region ) {
+                spu_DestroyRegion( p_spu, p_subpic->p_region );
+            }
+            p_subpic->p_region = p_region = p_subpic->pf_update_regions( p_fmt, p_spu, p_subpic, mdate() );
+        }
+        else
+        {
+            p_region = p_subpic->p_region;
+        }
+
         /* Load the blending module */
         if( !p_spu->p_blend && p_region )
         {
@@ -536,11 +584,11 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
                 p_spu->p_blend->fmt_out.video.i_y_offset = 0;
             p_spu->p_blend->fmt_out.video.i_aspect = p_fmt->i_aspect;
             p_spu->p_blend->fmt_out.video.i_chroma = p_fmt->i_chroma;
-            p_spu->p_blend->fmt_in.video.i_chroma = VLC_FOURCC('Y','U','V','P');
-            /* FIXME: We'll also be using it for YUVA and RGBA blending ... */
 
-            p_spu->p_blend->p_module =
-                module_Need( p_spu->p_blend, "video blending", 0, 0 );
+            /* The blend module will be loaded when needed with the real
+            * input format */
+            memset( &p_spu->p_blend->fmt_in, 0, sizeof(p_spu->p_blend->fmt_in) );
+            p_spu->p_blend->p_module = NULL;
         }
 
         /* Load the text rendering module; it is possible there is a
@@ -576,19 +624,20 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
                 p_spu->p_text->p_module =
                     module_Need( p_spu->p_text, "text renderer", 0, 0 );
             }
-            if( psz_modulename ) free( psz_modulename );
+            free( psz_modulename );
         }
 
         if( p_spu->p_text )
         {
             subpicture_region_t *p_text_region = p_subpic->p_region;
 
-            /* Only overwrite the size fields if the region is still in pre-rendered
-             * TEXT format. We have to traverse the subregion list because if more
-             * than one subregion is present, the text region isn't guarentteed to
-             * be the first in the list, and only text regions use this flag.
-             * All of this effort assists with the rescaling of text that has been
-             * rendered at native resolution, rather than video resolution.
+            /* Only overwrite the size fields if the region is still in
+             * pre-rendered TEXT format. We have to traverse the subregion
+             * list because if more than one subregion is present, the text
+             * region isn't guarentteed to be the first in the list, and
+             * only text regions use this flag. All of this effort assists
+             * with the rescaling of text that has been rendered at native
+             * resolution, rather than video resolution.
              */
             while( p_text_region &&
                    ( p_text_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') ) )
@@ -596,15 +645,28 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
                 p_text_region = p_text_region->p_next;
             }
 
-            if( p_text_region && 
+            if( p_text_region &&
                 ( ( p_text_region->i_align & SUBPICTURE_RENDERED ) == 0 ) )
             {
-                p_spu->p_text->fmt_out.video.i_width =
-                    p_spu->p_text->fmt_out.video.i_visible_width =
-                    p_fmt->i_width;
-                p_spu->p_text->fmt_out.video.i_height =
-                    p_spu->p_text->fmt_out.video.i_visible_height =
-                    p_fmt->i_height;
+                if( (p_subpic->i_original_picture_height > 0) &&
+                    (p_subpic->i_original_picture_width  > 0) )
+                {
+                    p_spu->p_text->fmt_out.video.i_width =
+                        p_spu->p_text->fmt_out.video.i_visible_width =
+                        p_subpic->i_original_picture_width;
+                    p_spu->p_text->fmt_out.video.i_height =
+                        p_spu->p_text->fmt_out.video.i_visible_height =
+                        p_subpic->i_original_picture_height;
+                }
+                else
+                {
+                    p_spu->p_text->fmt_out.video.i_width =
+                        p_spu->p_text->fmt_out.video.i_visible_width =
+                        p_fmt->i_width;
+                    p_spu->p_text->fmt_out.video.i_height =
+                        p_spu->p_text->fmt_out.video.i_visible_height =
+                        p_fmt->i_height;
+                }
             }
         }
 
@@ -618,18 +680,24 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
             pi_scale_height[ SCALE_TEXT ]    = ( p_fmt->i_height * 1000 ) /
                                           p_spu->p_text->fmt_out.video.i_height;
         }
+        /* If we have an explicit size plane to render to, then turn off
+         * the fontsize rescaling.
+         */
+        if( (p_subpic->i_original_picture_height > 0) &&
+            (p_subpic->i_original_picture_width  > 0) )
+        {
+            i_scale_width_orig  = 1000;
+            i_scale_height_orig = 1000;
+        }
 
         for( k = 0; k < SCALE_SIZE ; k++ )
         {
+            /* Case of both width and height being specified has been dealt
+             * with above by instead rendering to an output pane of the
+             * explicit dimensions specified - we don't need to scale it.
+             */
             if( (p_subpic->i_original_picture_height > 0) &&
-                (p_subpic->i_original_picture_width  > 0) )
-            {
-                pi_scale_width[ k ]  = pi_scale_width[ k ]  * i_source_video_width /
-                                 p_subpic->i_original_picture_width;
-                pi_scale_height[ k ] = pi_scale_height[ k ] * i_source_video_height /
-                                 p_subpic->i_original_picture_height;
-            }
-            else if( p_subpic->i_original_picture_height > 0 )
+                (p_subpic->i_original_picture_width <= 0) )
             {
                 pi_scale_height[ k ] = pi_scale_height[ k ] * i_source_video_height /
                                  p_subpic->i_original_picture_height;
@@ -653,7 +721,7 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
         }
 
         /* Take care of the aspect ratio */
-        if( p_region && 
+        if( p_region &&
             ( ( p_region->fmt.i_sar_num * p_fmt->i_sar_den ) !=
               ( p_region->fmt.i_sar_den * p_fmt->i_sar_num ) ) )
         {
@@ -691,7 +759,7 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
                 module_Need( p_spu->p_scale, "video filter2", 0, 0 );
         }
 
-        while( p_region && p_spu->p_blend && p_spu->p_blend->pf_video_blend )
+        while( p_region )
         {
             video_format_t orig_fmt = p_region->fmt;
             vlc_bool_t b_rerender_text = VLC_FALSE;
@@ -782,7 +850,7 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
             }
 
             /* Scale SPU if necessary */
-            if( p_region->p_cache && 
+            if( p_region->p_cache &&
                 ( p_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') ) )
             {
                 if( pi_scale_width[ i_scale_idx ] * p_region->fmt.i_width / 1000 !=
@@ -796,9 +864,9 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
                 }
             }
 
-            if( ( ( pi_scale_width[ i_scale_idx ] != 1000 ) || 
+            if( ( ( pi_scale_width[ i_scale_idx ] != 1000 ) ||
                   ( pi_scale_height[ i_scale_idx ] != 1000 ) ) &&
-                ( ( pi_scale_width[ i_scale_idx ] > 0 ) || 
+                ( ( pi_scale_width[ i_scale_idx ] > 0 ) ||
                   ( pi_scale_height[ i_scale_idx ] > 0 ) ) &&
                 p_spu->p_scale && !p_region->p_cache &&
                 ( p_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') ) )
@@ -904,50 +972,6 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
                 i_y_offset -= ( p_spu->i_margin * i_inv_scale_y / 1000 + i_diff );
             }
 
-            p_spu->p_blend->fmt_in.video = p_region->fmt;
-
-            /* Force cropping if requested */
-            if( p_spu->b_force_crop )
-            {
-                video_format_t *p_fmt = &p_spu->p_blend->fmt_in.video;
-                int i_crop_x = p_spu->i_crop_x * pi_scale_width[ i_scale_idx ] / 1000
-                                    * i_inv_scale_x / 1000;
-                int i_crop_y = p_spu->i_crop_y * pi_scale_height[ i_scale_idx ] / 1000
-                                    * i_inv_scale_y / 1000;
-                int i_crop_width = p_spu->i_crop_width * pi_scale_width[ i_scale_idx ] / 1000
-                                    * i_inv_scale_x / 1000;
-                int i_crop_height = p_spu->i_crop_height * pi_scale_height[ i_scale_idx ] / 1000
-                                    * i_inv_scale_y / 1000;
-
-                /* Find the intersection */
-                if( i_crop_x + i_crop_width <= i_x_offset ||
-                    i_x_offset + (int)p_fmt->i_visible_width < i_crop_x ||
-                    i_crop_y + i_crop_height <= i_y_offset ||
-                    i_y_offset + (int)p_fmt->i_visible_height < i_crop_y )
-                {
-                    /* No intersection */
-                    p_fmt->i_visible_width = p_fmt->i_visible_height = 0;
-                }
-                else
-                {
-                    int i_x, i_y, i_x_end, i_y_end;
-                    i_x = __MAX( i_crop_x, i_x_offset );
-                    i_y = __MAX( i_crop_y, i_y_offset );
-                    i_x_end = __MIN( i_crop_x + i_crop_width,
-                                   i_x_offset + (int)p_fmt->i_visible_width );
-                    i_y_end = __MIN( i_crop_y + i_crop_height,
-                                   i_y_offset + (int)p_fmt->i_visible_height );
-
-                    p_fmt->i_x_offset = i_x - i_x_offset;
-                    p_fmt->i_y_offset = i_y - i_y_offset;
-                    p_fmt->i_visible_width = i_x_end - i_x;
-                    p_fmt->i_visible_height = i_y_end - i_y;
-
-                    i_x_offset = i_x;
-                    i_y_offset = i_y;
-                }
-            }
-
             if( p_subpic->b_fade )
             {
                 mtime_t i_fade_start = ( p_subpic->i_stop +
@@ -960,11 +984,68 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
                 }
             }
 
-            i_x_offset = __MAX( i_x_offset, 0 );
-            i_y_offset = __MAX( i_y_offset, 0 );
-
             if( p_region->fmt.i_chroma != VLC_FOURCC('T','E','X','T') )
             {
+                if( p_spu->p_blend->fmt_in.video.i_chroma != p_region->fmt.i_chroma )
+                {
+                    /* The chroma is not the same, we need to reload the blend module
+                     * XXX to match the old behaviour just test !p_spu->p_blend->fmt_in.video.i_chroma */
+                    if( p_spu->p_blend->p_module )
+                        module_Unneed( p_spu->p_blend, p_spu->p_blend->p_module );
+
+                    p_spu->p_blend->fmt_in.video = p_region->fmt;
+                    p_spu->p_blend->p_module = module_Need( p_spu->p_blend, "video blending", 0, 0 );
+                }
+                else
+                {
+                    p_spu->p_blend->fmt_in.video = p_region->fmt;
+                }
+
+                /* Force cropping if requested */
+                if( p_spu->b_force_crop )
+                {
+                    video_format_t *p_fmt = &p_spu->p_blend->fmt_in.video;
+                    int i_crop_x = p_spu->i_crop_x * pi_scale_width[ i_scale_idx ] / 1000
+                                        * i_inv_scale_x / 1000;
+                    int i_crop_y = p_spu->i_crop_y * pi_scale_height[ i_scale_idx ] / 1000
+                                        * i_inv_scale_y / 1000;
+                    int i_crop_width = p_spu->i_crop_width * pi_scale_width[ i_scale_idx ] / 1000
+                                        * i_inv_scale_x / 1000;
+                    int i_crop_height = p_spu->i_crop_height * pi_scale_height[ i_scale_idx ] / 1000
+                                        * i_inv_scale_y / 1000;
+
+                    /* Find the intersection */
+                    if( i_crop_x + i_crop_width <= i_x_offset ||
+                        i_x_offset + (int)p_fmt->i_visible_width < i_crop_x ||
+                        i_crop_y + i_crop_height <= i_y_offset ||
+                        i_y_offset + (int)p_fmt->i_visible_height < i_crop_y )
+                    {
+                        /* No intersection */
+                        p_fmt->i_visible_width = p_fmt->i_visible_height = 0;
+                    }
+                    else
+                    {
+                        int i_x, i_y, i_x_end, i_y_end;
+                        i_x = __MAX( i_crop_x, i_x_offset );
+                        i_y = __MAX( i_crop_y, i_y_offset );
+                        i_x_end = __MIN( i_crop_x + i_crop_width,
+                                       i_x_offset + (int)p_fmt->i_visible_width );
+                        i_y_end = __MIN( i_crop_y + i_crop_height,
+                                       i_y_offset + (int)p_fmt->i_visible_height );
+
+                        p_fmt->i_x_offset = i_x - i_x_offset;
+                        p_fmt->i_y_offset = i_y - i_y_offset;
+                        p_fmt->i_visible_width = i_x_end - i_x;
+                        p_fmt->i_visible_height = i_y_end - i_y;
+
+                        i_x_offset = i_x;
+                        i_y_offset = i_y;
+                    }
+                }
+
+                i_x_offset = __MAX( i_x_offset, 0 );
+                i_y_offset = __MAX( i_y_offset, 0 );
+
                 /* Update the output picture size */
                 p_spu->p_blend->fmt_out.video.i_width =
                     p_spu->p_blend->fmt_out.video.i_visible_width =
@@ -973,9 +1054,18 @@ void spu_RenderSubpictures( spu_t *p_spu, video_format_t *p_fmt,
                     p_spu->p_blend->fmt_out.video.i_visible_height =
                         p_fmt->i_height;
 
-                p_spu->p_blend->pf_video_blend( p_spu->p_blend, p_pic_dst,
-                    p_pic_src, &p_region->picture, i_x_offset, i_y_offset,
-                    i_fade_alpha * p_subpic->i_alpha / 255 );
+                if( p_spu->p_blend->p_module )
+                {
+                    p_spu->p_blend->pf_video_blend( p_spu->p_blend, p_pic_dst,
+                        p_pic_src, &p_region->picture, i_x_offset, i_y_offset,
+                        i_fade_alpha * p_subpic->i_alpha / 255 );
+                }
+                else
+                {
+                    msg_Err( p_spu, "blending %4.4s to %4.4s failed",
+                             (char *)&p_spu->p_blend->fmt_out.video.i_chroma,
+                             (char *)&p_spu->p_blend->fmt_out.video.i_chroma );
+                }
             }
 
             if( b_rerender_text )
@@ -1243,8 +1333,9 @@ static void sub_del_buffer( filter_t *p_filter, subpicture_t *p_subpic )
 
 static subpicture_t *spu_new_buffer( filter_t *p_filter )
 {
-    subpicture_t *p_subpic = (subpicture_t *)malloc(sizeof(subpicture_t));
     (void)p_filter;
+    subpicture_t *p_subpic = (subpicture_t *)malloc(sizeof(subpicture_t));
+    if( !p_subpic ) return NULL;
     memset( p_subpic, 0, sizeof(subpicture_t) );
     p_subpic->b_absolute = VLC_TRUE;
 
@@ -1270,7 +1361,7 @@ static void spu_del_buffer( filter_t *p_filter, subpicture_t *p_subpic )
 static picture_t *spu_new_video_buffer( filter_t *p_filter )
 {
     picture_t *p_picture = malloc( sizeof(picture_t) );
-
+    if( !p_picture ) return NULL;
     if( vout_AllocatePicture( p_filter, p_picture,
                               p_filter->fmt_out.video.i_chroma,
                               p_filter->fmt_out.video.i_width,
@@ -1290,22 +1381,23 @@ static picture_t *spu_new_video_buffer( filter_t *p_filter )
 static void spu_del_video_buffer( filter_t *p_filter, picture_t *p_pic )
 {
     (void)p_filter;
-    if( p_pic && p_pic->p_data_orig ) free( p_pic->p_data_orig );
-    if( p_pic ) free( p_pic );
+    if( p_pic )
+    {
+        free( p_pic->p_data_orig );
+        free( p_pic );
+    }
 }
 
 static int SubFilterCallback( vlc_object_t *p_object, char const *psz_var,
                          vlc_value_t oldval, vlc_value_t newval, void *p_data )
 {
-    (void)p_object; (void)oldval; (void)newval;
+    VLC_UNUSED(p_object); VLC_UNUSED(oldval);
+    VLC_UNUSED(newval); VLC_UNUSED(psz_var);
 
-    if( !strcmp( psz_var, "sub-filter" ) )
-    {
-        spu_t *p_spu = (spu_t *)p_data;
-        vlc_mutex_lock( &p_spu->subpicture_lock );
-        spu_DeleteChain( p_spu );
-        spu_ParseChain( p_spu );
-        vlc_mutex_unlock( &p_spu->subpicture_lock );
-    }
+    spu_t *p_spu = (spu_t *)p_data;
+    vlc_mutex_lock( &p_spu->subpicture_lock );
+    spu_DeleteChain( p_spu );
+    spu_ParseChain( p_spu );
+    vlc_mutex_unlock( &p_spu->subpicture_lock );
     return VLC_SUCCESS;
 }