chapters.hpp
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:4k
源码类别:

midi

开发平台:

Unix_Linux

  1. /*****************************************************************************
  2.  * chapters.hpp : matroska demuxer
  3.  *****************************************************************************
  4.  * Copyright (C) 2003-2004 the VideoLAN team
  5.  * $Id: 4116ef3439be3e9041dd24c510a8ef2f0fa974fc $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir@via.ecp.fr>
  8.  *          Steve Lhomme <steve.lhomme@free.fr>
  9.  *
  10.  * This program is free software; you can redistribute it and/or modify
  11.  * it under the terms of the GNU General Public License as published by
  12.  * the Free Software Foundation; either version 2 of the License, or
  13.  * (at your option) any later version.
  14.  *
  15.  * This program is distributed in the hope that it will be useful,
  16.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  * GNU General Public License for more details.
  19.  *
  20.  * You should have received a copy of the GNU General Public License
  21.  * along with this program; if not, write to the Free Software
  22.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  23.  *****************************************************************************/
  24. /* chapter_item, chapter_edition, and chapter_translation classes */
  25. #ifndef _CHAPTER_H_
  26. #define _CHAPTER_H_
  27. #include "mkv.hpp"
  28. class chapter_translation_c
  29. {
  30. public:
  31.     chapter_translation_c()
  32.         :p_translated(NULL)
  33.     {}
  34.     ~chapter_translation_c()
  35.     {
  36.         delete p_translated;
  37.     }
  38.     KaxChapterTranslateID  *p_translated;
  39.     unsigned int           codec_id;
  40.     std::vector<uint64_t>  editions;
  41. };
  42. class chapter_codec_cmds_c;
  43. class chapter_item_c
  44. {
  45. public:
  46.     chapter_item_c()
  47.     :i_start_time(0)
  48.     ,i_end_time(-1)
  49.     ,i_user_start_time(-1)
  50.     ,i_user_end_time(-1)
  51.     ,i_seekpoint_num(-1)
  52.     ,b_display_seekpoint(true)
  53.     ,b_user_display(false)
  54.     ,psz_parent(NULL)
  55.     ,b_is_leaving(false)
  56.     {}
  57.     virtual ~chapter_item_c();
  58.     int64_t RefreshChapters( bool b_ordered, int64_t i_prev_user_time );
  59.     int PublishChapters( input_title_t & title, int & i_user_chapters, int i_level = 0 );
  60.     virtual chapter_item_c * FindTimecode( mtime_t i_timecode, const chapter_item_c * p_current, bool & b_found );
  61.     void Append( const chapter_item_c & edition );
  62.     chapter_item_c * FindChapter( int64_t i_find_uid );
  63.     virtual chapter_item_c *BrowseCodecPrivate( unsigned int codec_id,
  64.                                     bool (*match)(const chapter_codec_cmds_c &data, const void *p_cookie, size_t i_cookie_size ),
  65.                                     const void *p_cookie,
  66.                                     size_t i_cookie_size );
  67.     std::string                 GetCodecName( bool f_for_title = false ) const;
  68.     bool                        ParentOf( const chapter_item_c & item ) const;
  69.     int16                       GetTitleNumber( ) const;
  70.  
  71.     int64_t                     i_start_time, i_end_time;
  72.     int64_t                     i_user_start_time, i_user_end_time; /* the time in the stream when an edition is ordered */
  73.     std::vector<chapter_item_c*> sub_chapters;
  74.     int                         i_seekpoint_num;
  75.     int64_t                     i_uid;
  76.     bool                        b_display_seekpoint;
  77.     bool                        b_user_display;
  78.     std::string                 psz_name;
  79.     chapter_item_c              *psz_parent;
  80.     bool                        b_is_leaving;
  81.  
  82.     std::vector<chapter_codec_cmds_c*> codecs;
  83.     static bool CompareTimecode( const chapter_item_c * itemA, const chapter_item_c * itemB )
  84.     {
  85.         return ( itemA->i_user_start_time < itemB->i_user_start_time || (itemA->i_user_start_time == itemB->i_user_start_time && itemA->i_user_end_time < itemB->i_user_end_time) );
  86.     }
  87.     bool Enter( bool b_do_subchapters );
  88.     bool Leave( bool b_do_subchapters );
  89.     bool EnterAndLeave( chapter_item_c *p_item, bool b_enter = true );
  90. };
  91. class chapter_edition_c : public chapter_item_c
  92. {
  93. public:
  94.     chapter_edition_c()
  95.     :b_ordered(false)
  96.     {}
  97.  
  98.     void RefreshChapters( );
  99.     mtime_t Duration() const;
  100.     std::string GetMainName() const;
  101.     chapter_item_c * FindTimecode( mtime_t i_timecode, const chapter_item_c * p_current );
  102.  
  103.     bool                        b_ordered;
  104. };
  105. #endif