1 /*
2   ogmmerge -- utility for splicing together ogg bitstreams
3       from component media subtypes
4 
5   ogmmerge.h
6   general class and type definitions
7 
8   Written by Moritz Bunkus <moritz@bunkus.org>
9   Based on Xiph.org's 'oggmerge' found in their CVS repository
10   See http://www.xiph.org
11 
12   Distributed under the GPL
13   see the file COPYING for details
14   or visit http://www.gnu.org/copyleft/gpl.html
15 */
16 
17 #ifndef __ogmmerge_H__
18 #define __ogmmerge_H__
19 
20 #include <stdio.h>
21 
22 #include <ogg/ogg.h>
23 #include <vorbis/codec.h>
24 
25 #include "common.h"
26 #include "ogmstreams.h"
27 
28 #define DISPLAYPRIORITY_HIGH   10
29 #define DISPLAYPRIORITY_MEDIUM  5
30 #define DISPLAYPRIORITY_LOW     1
31 
32 typedef struct {
33   int    displacement;
34   double linear;
35 } audio_sync_t;
36 
37 typedef struct {
38   double start;
39   double end;
40 } range_t;
41 
42 typedef double stamp_t;
43 #define MAX_TIMESTAMP ((double)3.40282347e+38F)
44 
45 typedef struct {
46   ogg_page *og;
47   stamp_t   timestamp;
48   int       header_page;
49   int       index_serial;
50 } ogmmerge_page_t;
51 
52 typedef class generic_reader_c {
53   protected:
54     vorbis_comment *chapter_info;
55   public:
56     generic_reader_c();
57     virtual ~generic_reader_c();
58     virtual int              read() = 0;
59     virtual int              serial_in_use(int serial) = 0;
60     virtual ogmmerge_page_t *get_page() = 0;
61     virtual ogmmerge_page_t *get_header_page(int header_type =
62                                              PACKET_TYPE_HEADER) = 0;
63     virtual void             reset() = 0;
64     virtual int              display_priority() = 0;
65     virtual void             display_progress() = 0;
66     virtual void             set_chapter_info(vorbis_comment *info);
67 } generic_reader_c;
68 
69 typedef class generic_packetizer_c {
70   protected:
71     int             serialno;
72     vorbis_comment *comments;
73   public:
74     generic_packetizer_c();
75     virtual ~generic_packetizer_c() {};
76     virtual int              page_available() = 0;
77     virtual ogmmerge_page_t *get_page() = 0;
78     virtual ogmmerge_page_t *get_header_page(int header_type =
79                                              PACKET_TYPE_HEADER) = 0;
80     virtual stamp_t          make_timestamp(ogg_int64_t granulepos) = 0;
81     virtual int              serial_in_use(int serial);
82     virtual int              flush_pages(int header_page = 0) = 0;
83     virtual int              queue_pages(int header_page = 0) = 0;
84     virtual stamp_t          get_smallest_timestamp() = 0;
85     virtual void             produce_eos_packet() = 0;
86     virtual void             produce_header_packets() = 0;
87     virtual void             reset() = 0;
88     virtual void             set_comments(vorbis_comment *ncomments);
89 } generic_packetizer_c;
90 
91 class error_c {
92   private:
93     char *error;
94   public:
error_c(char * nerror)95     error_c(char *nerror) { error = nerror; };
get_error()96     char *get_error()     { return error; };
97 };
98 
99 #ifndef OGMSPLIT
100 extern int   force_flushing;
101 extern int   omit_empty_packets;
102 extern int   old_headers;
103 extern float video_fps; // needed for MicroDVD fps-to-time conversion
104 int          create_unique_serial();
105 extern void  add_index(int serial);
106 #endif
107 
108 int             chapter_information_probe(FILE *file, off_t size);
109 vorbis_comment *chapter_information_read(char *name);
110 vorbis_comment *chapter_information_adjust(vorbis_comment *vc, double start,
111                                            double end);
112 
113 #endif  /* __ogmmerge_H__ */
114