[vlc-commits] MKV: Handle multi-editions as different titles
Denis Charmet
git at videolan.org
Tue Sep 4 23:28:10 CEST 2012
vlc | branch: master | Denis Charmet <typx at dinauz.org> | Tue Sep 4 13:53:36 2012 +0200| [df0b9f55b263a422a560efd10e33bd31f5569c35] | committer: Jean-Baptiste Kempf
MKV: Handle multi-editions as different titles
Close #7401
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=df0b9f55b263a422a560efd10e33bd31f5569c35
---
modules/demux/mkv/demux.cpp | 25 ++++++++++++-------------
modules/demux/mkv/mkv.cpp | 14 +++++++++-----
2 files changed, 21 insertions(+), 18 deletions(-)
diff --git a/modules/demux/mkv/demux.cpp b/modules/demux/mkv/demux.cpp
index 87ae968..8b60a7d 100644
--- a/modules/demux/mkv/demux.cpp
+++ b/modules/demux/mkv/demux.cpp
@@ -653,18 +653,19 @@ bool demux_sys_t::PreloadLinked()
p_seg = used_segments[i];
if ( p_seg->Editions() != NULL )
{
- input_title_t *p_title = vlc_input_title_New();
- p_seg->i_sys_title = i;
- int i_chapters;
-
- // TODO use a name for each edition, let the TITLE deal with a codec name
for ( j=0; j<p_seg->Editions()->size(); j++ )
{
+ input_title_t *p_title = vlc_input_title_New();
+ int i_chapters;
+
+ // TODO use a name for each edition, let the TITLE deal with a codec name
if ( p_title->psz_name == NULL )
{
const char* psz_tmp = (*p_seg->Editions())[j]->GetMainName().c_str();
if( *psz_tmp != '\0' )
p_title->psz_name = strdup( psz_tmp );
+ else if( asprintf(&(p_title->psz_name), "%s %d", N_("Segment"), (int)i) == -1 )
+ p_title->psz_name = NULL;
}
i_chapters = 0;
@@ -672,17 +673,11 @@ bool demux_sys_t::PreloadLinked()
// Input duration into i_length
p_title->i_length = ( *p_seg->Editions() )[j]->i_duration;
- }
- // create a name if there is none
- if ( p_title->psz_name == NULL )
- {
- if( asprintf(&(p_title->psz_name), "%s %d", N_("Segment"), (int)i) == -1 )
- p_title->psz_name = NULL;
+ titles.push_back( p_title );
}
-
- titles.push_back( p_title );
}
+ p_seg->i_sys_title = p_seg->i_current_edition;
}
// TODO decide which segment should be first used (VMG for DVD)
@@ -719,6 +714,10 @@ bool demux_sys_t::PreparePlayback( virtual_segment_c *p_new_segment )
p_current_segment->CurrentSegment()->InformationCreate( );
p_current_segment->CurrentSegment()->Select( 0 );
+ /* Seek to the beginning */
+ p_current_segment->Seek(p_current_segment->CurrentSegment()->sys.demuxer,
+ 0, 0, NULL, -1);
+
return true;
}
diff --git a/modules/demux/mkv/mkv.cpp b/modules/demux/mkv/mkv.cpp
index 90736e2..ba9b835 100644
--- a/modules/demux/mkv/mkv.cpp
+++ b/modules/demux/mkv/mkv.cpp
@@ -355,19 +355,23 @@ static int Control( demux_t *p_demux, int i_query, va_list args )
*ppp_title = (input_title_t**)malloc( sizeof( input_title_t**) * p_sys->titles.size() );
for( size_t i = 0; i < p_sys->titles.size(); i++ )
- {
(*ppp_title)[i] = vlc_input_title_Duplicate( p_sys->titles[i] );
- }
return VLC_SUCCESS;
}
return VLC_EGENERIC;
case DEMUX_SET_TITLE:
- /* TODO handle editions as titles */
+ /* handle editions as titles */
i_idx = (int)va_arg( args, int );
- if( i_idx < p_sys->used_segments.size() )
+ if(i_idx < p_sys->titles.size() && p_sys->titles[i_idx]->i_seekpoint)
{
- p_sys->JumpTo( *p_sys->used_segments[i_idx], NULL );
+ p_sys->p_current_segment->i_current_edition = i_idx;
+ p_sys->i_current_title = i_idx;
+ p_sys->p_current_segment->p_current_chapter = p_sys->p_current_segment->editions[p_sys->p_current_segment->i_current_edition]->getChapterbyTimecode(0);
+
+ Seek( p_demux, (int64_t)p_sys->titles[i_idx]->seekpoint[0]->i_time_offset, -1, NULL);
+ p_demux->info.i_seekpoint |= INPUT_UPDATE_SEEKPOINT;
+ p_demux->info.i_seekpoint = 0;
return VLC_SUCCESS;
}
return VLC_EGENERIC;
More information about the vlc-commits
mailing list