[vlc-commits] [Git][videolan/vlc][master] 11 commits: subpicture: initialize i_stop to VLC_TICK_INVALID rather than 0

Steve Lhomme (@robUx4) gitlab at videolan.org
Tue Jun 4 14:17:42 UTC 2024



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
1a3cf7e6 by Steve Lhomme at 2024-06-04T13:44:24+00:00
subpicture: initialize i_stop to VLC_TICK_INVALID rather than 0

To match the documentation.

- - - - -
b39d8e71 by Steve Lhomme at 2024-06-04T13:44:24+00:00
Revert "check the length is not VLC_TICK_INVALID explicitly"

This reverts commit 9143eafc854512d8a19e3fa789fb94726ad8689c,
commit 382ede8976bcb91e445a2debfa86d3f7f7034482,
commit c76ae3ab5b52ef6acd68c71d2f1d82ae0d6e9cdb,
commit 70d55311e4ebb005b94d234ed525be5cd6f0829e.

We want to check the length of 0 and not an invalid value.

- - - - -
b93fe566 by Steve Lhomme at 2024-06-04T13:44:24+00:00
demux/subtitles: set i_stop to VLC_TICK_INVALID when it's not known

This is the expected value in that case.

- - - - -
aaa29ba6 by Steve Lhomme at 2024-06-04T13:44:24+00:00
encttml: check i_stop is valid before using it

- - - - -
b0b6a5c0 by Steve Lhomme at 2024-06-04T13:44:24+00:00
encvtt: check i_stop is valid before using it

- - - - -
9b54fd0b by Steve Lhomme at 2024-06-04T13:44:24+00:00
dvbsub: don't compare i_stop if it's invalid

Considering VLC_TICK_INVALID is 0, when it's VLC_TICK_INVALID
the test should not pass.

- - - - -
c7035fab by Steve Lhomme at 2024-06-04T13:44:24+00:00
t140: don't compare i_stop if it's invalid

Considering VLC_TICK_INVALID is 0, when it's VLC_TICK_INVALID
the test should not pass.

- - - - -
99a1646c by Steve Lhomme at 2024-06-04T13:44:24+00:00
vout_subpictures: don't compare i_stop if it's invalid

According to the ephemer documentation:
/**< If this flag is set to true the subtitle
 will be displayed until the next one appears
 or if i_stop is reached when it is valid */

So i_stop should only be considered when it's valid.

- - - - -
69cb754b by Steve Lhomme at 2024-06-04T13:44:24+00:00
vout_subpictures: don't use i_stop if it's invalid to check for late entries

Considering VLC_TICK_INVALID is 0, the should behave the same as before.

- - - - -
a55cf7c2 by Steve Lhomme at 2024-06-04T13:44:24+00:00
spudec: don't compare i_stop if it's invalid

Considering VLC_TICK_INVALID is 0, when it's VLC_TICK_INVALID
the test should pass.

- - - - -
694497fa by Steve Lhomme at 2024-06-04T13:44:24+00:00
vlc_subpictures: move b_subtitle outside of the part the vout thread may modify

Only the SPU source should set this flag.

- - - - -


20 changed files:

- include/vlc_subpicture.h
- modules/codec/arib/aribsub.c
- modules/codec/dvbsub.c
- modules/codec/spudec/parse.c
- modules/codec/stl.c
- modules/codec/subsdec.c
- modules/codec/substx3g.c
- modules/codec/subsusf.c
- modules/codec/t140.c
- modules/codec/ttml/encttml.c
- modules/codec/webvtt/encvtt.c
- modules/codec/zvbi.c
- modules/demux/subtitle.c
- modules/spu/audiobargraph_v.c
- modules/spu/dynamicoverlay/dynamicoverlay.c
- modules/spu/logo.c
- modules/spu/marq.c
- modules/spu/mosaic.c
- modules/spu/rss.c
- src/video_output/vout_subpictures.c


Changes:

=====================================
include/vlc_subpicture.h
=====================================
@@ -255,6 +255,8 @@ struct subpicture_t
                                    will be displayed until the next one appears
                                    or if i_stop is reached when it is valid */
     bool            b_fade;                               /**< enable fading */
+    bool            b_subtitle;      /**< subtitle with timestamps relative to
+                                                                  the video */
     /**@}*/
 
     /** \name Display properties
@@ -262,7 +264,6 @@ struct subpicture_t
      * changed by the video output thread, or simply ignored depending of the
      * subtitle type. */
     /**@{*/
-    bool         b_subtitle;            /**< the picture is a movie subtitle */
     unsigned     i_original_picture_width;  /**< original width of the movie */
     unsigned     i_original_picture_height;/**< original height of the movie */
     int          i_alpha;                                  /**< transparency */


=====================================
modules/codec/arib/aribsub.c
=====================================
@@ -263,7 +263,7 @@ static subpicture_t *render( decoder_t *p_dec, arib_parser_t *p_parser,
 
     vlc_tick_t i_duration = VLC_TICK_FROM_US(arib_decoder_get_time( p_arib_decoder ));
     p_spu->i_start = p_block->i_pts;
-    p_spu->i_stop = i_duration ? p_block->i_pts + i_duration : 0;
+    p_spu->i_stop = i_duration ? p_block->i_pts + i_duration : VLC_TICK_INVALID;
     p_spu->b_ephemer  = i_duration == 0;
 
     arib_spu_updater_sys_t *p_spu_sys = p_spu->updater.sys;


=====================================
modules/codec/dvbsub.c
=====================================
@@ -2011,7 +2011,8 @@ static block_t *Encode( encoder_t *p_enc, subpicture_t *p_subpic )
     bs_write( s, 8, 0xff );/* End marker */
     p_block->i_buffer = bs_pos( s ) / 8;
     p_block->i_pts = p_block->i_dts = p_subpic->i_start;
-    if( !p_subpic->b_ephemer && ( p_subpic->i_stop > p_subpic->i_start ) )
+    if( !p_subpic->b_ephemer &&
+        ( p_subpic->i_stop != VLC_TICK_INVALID && p_subpic->i_stop > p_subpic->i_start ) )
     {
         block_t *p_block_stop;
 
@@ -2108,7 +2109,7 @@ static void encode_page_composition( encoder_t *p_enc, bs_t *s,
 
     i_timeout = 0;
     if( p_subpic && !p_subpic->b_ephemer &&
-        ( p_subpic->i_stop > p_subpic->i_start ) )
+        ( p_subpic->i_stop != VLC_TICK_INVALID && p_subpic->i_stop > p_subpic->i_start ) )
     {
         i_timeout = SEC_FROM_VLC_TICK(p_subpic->i_stop - p_subpic->i_start);
     }
@@ -2650,4 +2651,3 @@ static void default_dds_init( decoder_t * p_dec )
     p_sys->display.i_height_minus1 = 576-1;
     p_sys->display.b_windowed = false;
 }
-


=====================================
modules/codec/spudec/parse.c
=====================================
@@ -210,7 +210,8 @@ static void OutputPicture( decoder_t *p_dec,
     p_spu->b_ephemer = p_spu_properties->b_ephemer;
     p_spu->b_subtitle = p_spu_properties->b_subtitle;
 
-    if( p_spu->i_stop <= p_spu->i_start && !p_spu->b_ephemer )
+    if( (p_spu->i_stop == VLC_TICK_INVALID || p_spu->i_stop <= p_spu->i_start) &&
+        !p_spu->b_ephemer )
     {
         /* This subtitle will live for 5 seconds or until the next subtitle */
         p_spu->i_stop = p_spu->i_start + VLC_TICK_FROM_MS(500 * 11);


=====================================
modules/codec/stl.c
=====================================
@@ -419,7 +419,7 @@ static int Decode(decoder_t *p_dec, block_t *p_block)
                 {
                     p_sub->i_start    = p_block->i_pts;
                     p_sub->i_stop     = p_block->i_pts + p_block->i_length;
-                    p_sub->b_ephemer  = (p_block->i_length == VLC_TICK_INVALID);
+                    p_sub->b_ephemer  = (p_block->i_length == 0);
                 }
                 decoder_QueueSub(p_dec, p_sub);
             }


=====================================
modules/codec/subsdec.c
=====================================
@@ -454,7 +454,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
     }
     p_spu->i_start    = p_block->i_pts;
     p_spu->i_stop     = p_block->i_pts + p_block->i_length;
-    p_spu->b_ephemer  = (p_block->i_length == VLC_TICK_INVALID);
+    p_spu->b_ephemer  = (p_block->i_length == 0);
 
     subtext_updater_sys_t *p_spu_sys = p_spu->updater.sys;
 


=====================================
modules/codec/substx3g.c
=====================================
@@ -413,7 +413,7 @@ static int Decode( decoder_t *p_dec, block_t *p_block )
 
     p_spu->i_start    = p_block->i_pts;
     p_spu->i_stop     = p_block->i_pts + p_block->i_length;
-    p_spu->b_ephemer  = (p_block->i_length == VLC_TICK_INVALID);
+    p_spu->b_ephemer  = (p_block->i_length == 0);
 
     p_spu_sys->region.b_absolute = false;
     p_spu_sys->region.align = SUBPICTURE_ALIGN_BOTTOM;


=====================================
modules/codec/subsusf.c
=====================================
@@ -262,7 +262,7 @@ static subpicture_t *ParseText( decoder_t *p_dec, block_t *p_block )
 
     p_spu->i_start = p_block->i_pts;
     p_spu->i_stop = p_block->i_pts + p_block->i_length;
-    p_spu->b_ephemer = (p_block->i_length == VLC_TICK_INVALID);
+    p_spu->b_ephemer = (p_block->i_length == 0);
     if (p_sys->i_original_width > 0 && p_sys->i_original_height > 0)
     {
         p_spu->i_original_picture_width = p_sys->i_original_width;


=====================================
modules/codec/t140.c
=====================================
@@ -117,7 +117,8 @@ static block_t *Encode( encoder_t *p_enc, subpicture_t *p_spu )
     p_block->p_buffer[p_block->i_buffer] = 0;
 
     p_block->i_pts = p_block->i_dts = p_spu->i_start;
-    if( !p_spu->b_ephemer && ( p_spu->i_stop > p_spu->i_start ) )
+    if( !p_spu->b_ephemer &&
+        ( p_spu->i_stop != VLC_TICK_INVALID && p_spu->i_stop > p_spu->i_start ) )
         p_block->i_length = p_spu->i_stop - p_spu->i_start;
 
     return p_block;


=====================================
modules/codec/ttml/encttml.c
=====================================
@@ -202,7 +202,7 @@ static block_t *Encode( encoder_t *p_enc, subpicture_t *p_spu )
             if( p_block )
             {
                 p_block->i_dts = p_block->i_pts = VLC_TICK_0 + p_spu->i_start;
-                if( p_spu->i_stop > p_spu->i_start )
+                if( p_spu->i_stop != VLC_TICK_INVALID && p_spu->i_stop > p_spu->i_start )
                     p_block->i_length = p_spu->i_stop - p_spu->i_start;
             }
         }


=====================================
modules/codec/webvtt/encvtt.c
=====================================
@@ -237,7 +237,7 @@ static block_t *Encode( encoder_t *p_enc, subpicture_t *p_spu )
     if( p_block )
     {
         p_block->i_pts = p_block->i_dts = p_spu->i_start;
-        if( p_spu->i_stop > p_spu->i_start )
+        if( p_spu->i_stop != VLC_TICK_INVALID && p_spu->i_stop > p_spu->i_start )
             p_block->i_length = p_spu->i_stop - p_spu->i_start;
     }
 


=====================================
modules/codec/zvbi.c
=====================================
@@ -582,7 +582,7 @@ static subpicture_t *Subpicture( decoder_t *p_dec,
     }
     else
     {
-        p_spu->i_stop = 0;
+        p_spu->i_stop = VLC_TICK_INVALID;
         p_region->b_absolute = true;
         p_region->i_align = i_align;
         // bottom center based on "vbi-position"


=====================================
modules/demux/subtitle.c
=====================================
@@ -872,7 +872,7 @@ static int Demux( demux_t *p_demux )
             {
                 p_block->i_dts =
                 p_block->i_pts = VLC_TICK_0 + p_subtitle->i_start * p_sys->f_rate;
-                if( p_subtitle->i_stop >= 0 && p_subtitle->i_stop >= p_subtitle->i_start )
+                if( p_subtitle->i_stop != VLC_TICK_INVALID && p_subtitle->i_stop >= p_subtitle->i_start )
                     p_block->i_length = (p_subtitle->i_stop - p_subtitle->i_start) * p_sys->f_rate;
 
                 es_out_Send( p_demux->out, p_sys->es, p_block );
@@ -1032,7 +1032,7 @@ static int ParseMicroDvd( vlc_object_t *p_obj, subs_properties_t *p_props,
 
     /* */
     p_subtitle->i_start  =  VLC_TICK_0 + i_start * p_props->i_microsecperframe;
-    p_subtitle->i_stop   = i_stop >= 0 ? (VLC_TICK_0 + i_stop  * p_props->i_microsecperframe) : -1;
+    p_subtitle->i_stop   = i_stop >= 0 ? (VLC_TICK_0 + i_stop  * p_props->i_microsecperframe) : VLC_TICK_INVALID;
     p_subtitle->psz_text = psz_text;
     return VLC_SUCCESS;
 }
@@ -1578,7 +1578,7 @@ static int ParseMPL2(vlc_object_t *p_obj, subs_properties_t *p_props,
             sscanf( s, "[%d][%d] %[^\r\n]", &i_start, &i_stop, psz_text ) == 3)
         {
             p_subtitle->i_start = VLC_TICK_0 + VLC_TICK_FROM_MS(i_start * 100);
-            p_subtitle->i_stop  = i_stop >= 0 ? VLC_TICK_0 + VLC_TICK_FROM_MS(i_stop  * 100) : -1;
+            p_subtitle->i_stop  = i_stop >= 0 ? VLC_TICK_0 + VLC_TICK_FROM_MS(i_stop  * 100) : VLC_TICK_INVALID;
             break;
         }
         free( psz_text );


=====================================
modules/spu/audiobargraph_v.c
=====================================
@@ -363,7 +363,7 @@ static subpicture_t *FilterSub(filter_t *p_filter, vlc_tick_t date)
         goto exit;
 
     p_spu->i_start = date;
-    p_spu->i_stop = 0;
+    p_spu->i_stop = VLC_TICK_INVALID;
     p_spu->b_ephemer = true;
 
     /* Send an empty subpicture to clear the display when needed */


=====================================
modules/spu/dynamicoverlay/dynamicoverlay.c
=====================================
@@ -347,7 +347,7 @@ static subpicture_t *Filter( filter_t *p_filter, vlc_tick_t date )
         return NULL;
 
     p_spu->i_start = date;
-    p_spu->i_stop = 0;
+    p_spu->i_stop = VLC_TICK_INVALID;
     p_spu->b_ephemer = true;
 
     vlc_vector_foreach(p_overlay, &p_sys->overlays)


=====================================
modules/spu/logo.c
=====================================
@@ -346,7 +346,7 @@ static subpicture_t *FilterSub( filter_t *p_filter, vlc_tick_t date )
         goto exit;
 
     p_spu->i_start = date;
-    p_spu->i_stop = 0;
+    p_spu->i_stop = VLC_TICK_INVALID;
     p_spu->b_ephemer = true;
 
     /* Send an empty subpicture to clear the display when needed */


=====================================
modules/spu/marq.c
=====================================
@@ -298,7 +298,7 @@ static subpicture_t *Filter( filter_t *p_filter, vlc_tick_t date )
 
     p_region->p_text = text_segment_New( msg );
     p_spu->i_start = date;
-    p_spu->i_stop  = p_sys->i_timeout == 0 ? 0 : date + p_sys->i_timeout;
+    p_spu->i_stop  = p_sys->i_timeout == 0 ? VLC_TICK_INVALID : date + p_sys->i_timeout;
     p_spu->b_ephemer = true;
 
     /*  where to locate the string: */


=====================================
modules/spu/mosaic.c
=====================================
@@ -458,7 +458,7 @@ static subpicture_t *Filter( filter_t *p_filter, vlc_tick_t date )
     /* Initialize subpicture */
     p_spu->i_channel = 0;
     p_spu->i_start  = date;
-    p_spu->i_stop = 0;
+    p_spu->i_stop = VLC_TICK_INVALID;
     p_spu->b_ephemer = true;
     p_spu->i_alpha = p_sys->i_alpha;
 


=====================================
modules/spu/rss.c
=====================================
@@ -477,7 +477,7 @@ static subpicture_t *Filter( filter_t *p_filter, vlc_tick_t date )
     if( p_sys->p_style->i_font_size > 0 )
         region->fmt.i_visible_height = p_sys->p_style->i_font_size;
     p_spu->i_start = date;
-    p_spu->i_stop  = 0;
+    p_spu->i_stop  = VLC_TICK_INVALID;
     p_spu->b_ephemer = true;
 
     /*  where to locate the string: */


=====================================
src/video_output/vout_subpictures.c
=====================================
@@ -875,8 +875,10 @@ spu_SelectSubpictures(spu_t *spu, vlc_tick_t system_now,
 
             /* If the spu is ephemer, the stop time is invalid, but it has been converted to
                system time and used in comparisons below */
-            const bool is_stop_valid = !current->b_ephemer || render_entry->orgstop > render_entry->orgstart;
-            render_entry->is_late = is_stop_valid && current->i_stop <= render_date;
+            const bool is_stop_valid = !current->b_ephemer ||
+                (render_entry->orgstop != VLC_TICK_INVALID && render_entry->orgstop > render_entry->orgstart);
+            render_entry->is_late = is_stop_valid &&
+                (current->i_stop == VLC_TICK_INVALID || current->i_stop <= render_date);
 
             /* start_date will be used for correct automatic overlap support
              * in case picture that should not be displayed anymore (display_time)
@@ -2149,7 +2151,7 @@ void spu_PutSubpicture(spu_t *spu, subpicture_t *subpic)
 
     /* An ephemer with stop time can be ephemer,
        but a pic without stop time must be ephemer */
-    if(subpic->i_stop < subpic->i_start)
+    if(subpic->i_stop != VLC_TICK_INVALID && subpic->i_stop < subpic->i_start)
         subpic->b_ephemer = true;
 
     if (spu_channel_Push(channel, subpic, orgstart, orgstop))



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/2e462c506231d1e8e449f1d75dc615d79215f6b2...694497fa0e8f38bf8c0cd1b36385891a82f2d80e

-- 
This project does not include diff previews in email notifications.
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/2e462c506231d1e8e449f1d75dc615d79215f6b2...694497fa0e8f38bf8c0cd1b36385891a82f2d80e
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list