4 * Copyright (C) 2020 William Morrow
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.
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.
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
30 #include "mainerror.h"
31 #include "renderengine.h"
33 #include "edlsession.h"
35 #include "transportque.h"
41 FileREF::FileREF(Asset *asset, File *file)
42 : FileBase(asset, file)
47 samples_position = -1;
57 for( int i=0; i<MAX_CHANNELS; ++i ) samples[i] = 0;
65 int FileREF::open_file(int rd, int wr)
67 if( is_open ) return 1;
69 eprintf(_("Reference files cant be created by rendering\n"));
74 if( file_xml.read_from_file(asset->path) ) return 1;
75 // file_xml.check_version();
76 if( ref ) ref->remove_user();
78 ref->create_objects();
79 if( ref->load_xml(&file_xml, LOAD_ALL) ) {
82 eprintf(_("Error loading Reference file:\n%s"), asset->path);
85 if( !asset->layers ) asset->layers = ref->get_video_layers();
86 asset->video_data = asset->layers > 0 ? 1 : 0;
87 asset->video_length = asset->video_data ? ref->get_video_frames() : 0;
88 asset->actual_width = asset->video_data ? ref->get_w() : 0;
89 asset->actual_height = asset->video_data ? ref->get_h() : 0;
90 if( !asset->width ) asset->width = asset->actual_width;
91 if( !asset->height ) asset->height = asset->actual_height;
92 if( !asset->frame_rate ) asset->frame_rate = ref->get_frame_rate();
93 strcpy(asset->vcodec, "REF");
94 asset->channels = ref->get_audio_channels();
95 asset->audio_data = asset->channels > 0 ? 1 : 0;
96 asset->sample_rate = ref->get_sample_rate();
97 asset->audio_length = asset->audio_data ? ref->get_audio_samples() : 0;
98 strcpy(asset->acodec, "REF");
99 command = new TransportCommand(file->preferences);
101 command->get_edl()->copy_all(ref);
102 command->command = NORMAL_FWD;
103 command->change_type = CHANGE_ALL;
104 command->realtime = 0;
105 samples_position = -1;
108 render_engine = new RenderEngine(0, file->preferences, 0, 0);
109 render_engine->set_acache(acache = new CICache(file->preferences));
110 render_engine->set_vcache(vcache = new CICache(file->preferences));
111 render_engine->arm_command(command);
117 int FileREF::close_file()
119 if( !is_open ) return 1;
120 if( ref ) ref->remove_user();
122 delete render_engine; render_engine = 0;
123 delete command; command = 0;
124 if( acache ) { acache->remove_user(); acache = 0; }
125 if( vcache ) { vcache->remove_user(); vcache = 0; }
126 delete temp; temp = 0;
127 for( int i=0; i<MAX_CHANNELS; ++i ) {
128 delete samples[i]; samples[i] = 0;
133 samples_position = -1;
140 int64_t FileREF::get_video_position()
142 return video_position;
145 int64_t FileREF::get_audio_position()
147 return audio_position;
150 int FileREF::set_video_position(int64_t pos)
152 this->video_position = pos;
155 int FileREF::set_layer(int layer)
161 int FileREF::set_audio_position(int64_t pos)
163 this->audio_position = pos;
166 int FileREF::set_channel(int channel)
168 this->channel = channel;
172 int FileREF::read_samples(double *buffer, int64_t len)
174 int result = len > 0 ? 0 : 1;
175 if( !render_engine || !render_engine->arender ) result = 1;
177 if( samples_length != len ) {
179 for( int i=0; i<MAX_CHANNELS; ++i ) {
180 delete samples[i]; samples[i] = 0;
183 if( samples_length < 0 ) {
184 samples_length = len;
185 int ch = 0, channels = asset->channels;
186 while( ch < channels ) samples[ch++] = new Samples(samples_length);
187 samples_position = -1;
189 if( samples_position != audio_position ) {
190 result = render_engine->arender->process_buffer(samples, len, audio_position);
191 samples_position = audio_position;
194 Samples *cbfr = samples[channel];
195 double *data = cbfr ? cbfr->get_data() : 0;
196 if( !data ) result = 1;
197 int64_t sz = len*(sizeof(*buffer));
199 memcpy(buffer, data, sz);
201 memset(buffer, 0, sz);
205 int FileREF::read_frame(VFrame *frame)
207 int result = render_engine && render_engine->vrender ? 0 : 1;
208 EDLSession *render_session = render_engine->get_edl()->session;
209 int color_model = render_session->color_model;
210 int out_w = render_session->output_w, out_h = render_session->output_h;
211 VFrame *vframe = frame;
212 if( color_model != frame->get_color_model() ||
213 out_w != frame->get_w() || out_h != frame->get_h() ) {
214 VFrame::get_temp(temp, out_w, out_h, color_model);
218 result = render_engine->vrender->process_buffer(vframe, video_position++, 0);
219 if( vframe != frame )
220 frame->transfer_from(vframe);
224 int FileREF::colormodel_supported(int colormodel)
230 int FileREF::get_best_colormodel(Asset *asset, int driver)
232 return BC_RGBA_FLOAT;