[vlc-devel] [PATCH 1/2] mkv: only jump on known chapters from chapter commands

Denis Charmet typx at dinauz.org
Thu Mar 17 15:34:49 CET 2016


On 2016-03-17 15:11, Steve Lhomme wrote:
> ---
>  modules/demux/mkv/chapter_command.cpp | 14 +++++++-------
>  modules/demux/mkv/demux.cpp           | 12 ++++--------
>  modules/demux/mkv/demux.hpp           |  2 +-
>  3 files changed, 12 insertions(+), 16 deletions(-)
> 
> diff --git a/modules/demux/mkv/chapter_command.cpp
> b/modules/demux/mkv/chapter_command.cpp
> index 966c339..ab49ad5 100644
> --- a/modules/demux/mkv/chapter_command.cpp
> +++ b/modules/demux/mkv/chapter_command.cpp
> @@ -308,9 +308,9 @@ bool dvd_command_interpretor_c::Interpret( const
> binary * p_command, size_t i_si
> 
>              // find in the ChapProcessPrivate matching this Title 
> level
>              p_vchapter = sys.BrowseCodecPrivate( 1,
> MatchTitleNumber, &i_title, sizeof(i_title), p_vsegment );
> -            if ( p_vsegment != NULL )
> +            if ( p_vsegment != NULL && p_vchapter != NULL )
>              {
> -                sys.JumpTo( *p_vsegment, p_vchapter );
> +                sys.JumpTo( *p_vsegment, *p_vchapter );
>                  f_result = true;
>              }
> 
> @@ -351,9 +351,9 @@ bool dvd_command_interpretor_c::Interpret( const
> binary * p_command, size_t i_si
>                          break;
>                      }
>                      p_vchapter = sys.BrowseCodecPrivate( 1,
> MatchPgcType, &p_type, 1, p_vsegment );
> -                    if ( p_vsegment != NULL )
> +                    if ( p_vsegment != NULL && p_vchapter != NULL )
>                      {
> -                        sys.JumpTo( *p_vsegment, p_vchapter );
> +                        sys.JumpTo( *p_vsegment, *p_vchapter );
>                          f_result = true;
>                      }
>                  break;
> @@ -410,7 +410,7 @@ bool dvd_command_interpretor_c::Interpret( const
> binary * p_command, size_t i_si
>                          p_vchapter = p_vsegment->BrowseCodecPrivate(
> 1, MatchPgcType, &p_type, 1 );
>                          if ( p_vchapter != NULL )
>                          {
> -                            sys.JumpTo( *p_vsegment, p_vchapter );
> +                            sys.JumpTo( *p_vsegment, *p_vchapter );
>                              f_result = true;
>                          }
>                      }
> @@ -454,7 +454,7 @@ bool dvd_command_interpretor_c::Interpret( const
> binary * p_command, size_t i_si
>                              p_vchapter =
> p_vsegment->BrowseCodecPrivate( 1, MatchPgcType, &p_type, 1 );
>                              if ( p_vchapter != NULL )
>                              {
> -                                sys.JumpTo( *p_vsegment, p_vchapter 
> );
> +                                sys.JumpTo( *p_vsegment, *p_vchapter 
> );
>                                  f_result = true;
>                              }
>                          }
> @@ -496,7 +496,7 @@ bool dvd_command_interpretor_c::Interpret( const
> binary * p_command, size_t i_si
>                              p_vchapter =
> p_vchapter->BrowseCodecPrivate( 1, MatchChapterNumber, &i_ptt,
> sizeof(i_ptt) );
>                              if ( p_vchapter != NULL )
>                              {
> -                                sys.JumpTo( *p_vsegment, p_vchapter 
> );
> +                                sys.JumpTo( *p_vsegment, *p_vchapter 
> );
>                                  f_result = true;
>                              }
>                          }
> diff --git a/modules/demux/mkv/demux.cpp b/modules/demux/mkv/demux.cpp
> index 110508e..ac50dd4 100644
> --- a/modules/demux/mkv/demux.cpp
> +++ b/modules/demux/mkv/demux.cpp
> @@ -804,7 +804,7 @@ bool demux_sys_t::PreparePlayback(
> virtual_segment_c *p_new_vsegment )
>      return true;
>  }
> 
> -void demux_sys_t::JumpTo( virtual_segment_c & vsegment,
> virtual_chapter_c * p_vchapter )
> +void demux_sys_t::JumpTo( virtual_segment_c & vsegment,
> virtual_chapter_c & vchapter )
>  {
>      // if the segment is not part of the current segment, select the 
> new one
>      if ( &vsegment != p_current_vsegment )
> @@ -812,15 +812,11 @@ void demux_sys_t::JumpTo( virtual_segment_c &
> vsegment, virtual_chapter_c * p_vc
>          PreparePlayback( &vsegment );
>      }
> 
> -    if ( p_vchapter )
> +    if ( !vchapter.p_chapter || !vchapter.p_chapter->Enter( true ) )
>      {
> -        if ( !p_vchapter->p_chapter || !p_vchapter->p_chapter->Enter( 
> true ) )
> -        {
> -            // jump to the location in the found segment
> -            vsegment.Seek( demuxer,
> p_vchapter->i_mk_virtual_start_time, p_vchapter, -1 );
> -        }
> +        // jump to the location in the found segment
> +        vsegment.Seek( demuxer, vchapter.i_mk_virtual_start_time,
> &vchapter, -1 );

When you force a Seek from the demux and not from Control, you should 
call ES_OUT_RESET_PCR to flush your buffers.

>      }
> -
>  }
> 
>  matroska_segment_c *demux_sys_t::FindSegment( const EbmlBinary & uid 
> ) const
> diff --git a/modules/demux/mkv/demux.hpp b/modules/demux/mkv/demux.hpp
> index 44e8bd4..519e85b 100644
> --- a/modules/demux/mkv/demux.hpp
> +++ b/modules/demux/mkv/demux.hpp
> @@ -385,7 +385,7 @@ public:
>      void FreeUnused();
>      bool PreparePlayback( virtual_segment_c *p_new_vsegment );
>      matroska_stream_c *AnalyseAllSegmentsFound( demux_t *p_demux,
> EbmlStream *p_estream, bool b_initial = false );
> -    void JumpTo( virtual_segment_c & p_vsegment, virtual_chapter_c *
> p_vchapter );
> +    void JumpTo( virtual_segment_c & vsegment, virtual_chapter_c & 
> vchapter );
> 
>      void InitUi();
>      void CleanUi();

Regards,
-- 
Denis Charmet - TypX
Le mauvais esprit est un art de vivre


More information about the vlc-devel mailing list