initial commit
[goodguy/history.git] / cinelerra-5.0 / cinelerra / filedv.h
1
2 /*
3  * CINELERRA
4  * Copyright (C) 2004 Richard Baverstock
5  * 
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  * 
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  * 
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  * 
20  */
21
22 #ifndef FILEDV_H
23 #define FILEDV_H
24
25 #include "../config.h"
26 #include "filebase.h"
27 #include "file.inc"
28
29 #ifdef DV_USE_FFMPEG
30 #include <avcodec.h>
31 #endif
32
33 #include <libdv/dv.h>
34
35
36 class FileDV : public FileBase
37 {
38 public:
39         FileDV(Asset *asset, File *file);
40         ~FileDV();
41
42         static void get_parameters(BC_WindowBase *parent_window,
43                 Asset *asset,
44                 BC_WindowBase* &format_window,
45                 int audio_options,
46                 int video_options);
47         
48         int reset_parameters_derived();
49         int open_file(int rd, int wr);
50
51         static int check_sig(Asset *asset);
52         int close_file_derived();
53         
54         int64_t get_video_position();
55         int64_t get_audio_position();
56         
57         int set_video_position(int64_t x);
58         int set_audio_position(int64_t x);
59
60         int audio_samples_copy(double **buffer, int64_t len);
61         
62         int write_samples(double **buffer, int64_t len);
63         int write_frames(VFrame ***frames, int len);
64         
65         int read_compressed_frame(VFrame *buffer);
66         int write_compressed_frame(VFrame *buffers);
67         
68         int64_t compressed_frame_size();
69         
70         int read_samples(double *buffer, int64_t len);
71         int read_frame(VFrame *frame);
72         
73         int colormodel_supported(int colormodel);
74         
75         int can_copy_from(Edit *edit, int64_t position);
76         
77         static int get_best_colormodel(Asset *asset, int driver);
78         
79         int get_audio_frame(int64_t pos);
80         int get_audio_offset(int64_t pos);
81
82 private:
83         FILE *stream;
84
85         Mutex *stream_lock;
86         Mutex *decoder_lock;
87         Mutex *video_position_lock;
88         
89         dv_decoder_t *decoder;
90         dv_encoder_t *encoder;
91         dv_encoder_t *audio_encoder;
92                 
93         int64_t audio_position;
94         int64_t video_position;
95         
96         unsigned char *video_buffer;
97         unsigned char *audio_buffer;
98
99         int16_t **audio_sample_buffer;
100         int audio_sample_buffer_start;
101         int audio_sample_buffer_end;
102         int audio_sample_buffer_len;
103         int audio_sample_buffer_maxsize;
104         
105         int audio_frames_written;
106         
107         int output_size;
108         int isPAL;
109 };
110
111
112 class DVConfigAudio: public BC_Window
113 {
114 public:
115         DVConfigAudio(BC_WindowBase *parent_window, Asset *asset);
116         ~DVConfigAudio();
117
118         void create_objects();
119         int close_event();
120
121 private:
122         Asset *asset;
123         BC_WindowBase *parent_window;
124 };
125
126
127
128 class DVConfigVideo: public BC_Window
129 {
130 public:
131         DVConfigVideo(BC_WindowBase *parent_window, Asset *asset);
132         ~DVConfigVideo();
133
134         void create_objects();
135         int close_event();
136
137 private:
138         Asset *asset;
139         BC_WindowBase *parent_window;
140 };
141
142
143 #endif