4 * Copyright (C) 2008 Adam Williams <broadcast at earthling dot net>
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
25 #include "colormodels.h"
36 extern char dcraw_info[1024];
37 extern float **dcraw_data;
38 extern int dcraw_alpha;
39 extern float dcraw_matrix[9];
40 int dcraw_main (int argc, const char **argv);
44 FileCR2::FileCR2(Asset *asset, File *file)
45 : FileList(asset, file, "CR2LIST", ".cr2", FILE_CR2, FILE_CR2_LIST)
48 if(asset->format == FILE_UNKNOWN)
49 asset->format = FILE_CR2;
54 //printf("FileCR2::~FileCR2\n");
63 int FileCR2::check_sig(Asset *asset)
65 char *ptr = strstr(asset->path, ".pcm");
67 //printf("FileCR2::check_sig %d\n", __LINE__);
68 FILE *stream = fopen(asset->path, "rb");
73 (void)fread(test, 10, 1, stream);
76 if(test[0] == 'C' && test[1] == 'R' && test[2] == '2' &&
77 test[3] == 'L' && test[4] == 'I' && test[5] == 'S' && test[6] == 'T')
79 //printf("FileCR2::check_sig %d\n", __LINE__);
84 //printf("FileCR2::check_sig %d\n", __LINE__);
87 char string[BCTEXTLEN];
90 strcpy(string, asset->path);
100 int result = dcraw_main(argc, argv);
102 //printf("FileCR2::check_sig %d %d\n", __LINE__, result);
107 // int FileCR2::open_file(int rd, int wr)
111 // const char *argv[4] =
119 // int result = dcraw_main(argc, argv);
120 // if(!result) format_to_asset();
125 int FileCR2::read_frame_header(char *path)
128 printf("FileCR2::read_frame_header %d\n", __LINE__);
129 const char *argv[4] =
137 int result = dcraw_main(argc, argv);
138 if(!result) format_to_asset();
140 printf("FileCR2::read_frame_header %d %d\n", __LINE__, result);
147 // int FileCR2::close_file()
152 void FileCR2::format_to_asset()
154 asset->video_data = 1;
156 sscanf(dcraw_info, "%d %d", &asset->width, &asset->height);
160 int FileCR2::read_frame(VFrame *frame, char *path)
162 //printf("FileCR2::read_frame\n");
164 if(frame->get_color_model() == BC_RGBA_FLOAT)
169 // Want to disable interpolation if an interpolation plugin is on, but
170 // this is impractical because of the amount of caching. The interpolation
171 // could not respond to a change in the plugin settings and it could not
172 // reload the frame after the plugin was added. Also, since an 8 bit
173 // PBuffer would be required, it could never have enough resolution.
174 // int interpolate = 0;
175 // if(!strcmp(frame->get_next_effect(), "Interpolate Pixels"))
179 // printf("FileCR2::read_frame %d\n", interpolate);
180 // frame->dump_stacks();
183 char *argv[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0 };
184 argv[argc++] = (char*)"dcraw";
186 argv[argc++] = (char*)"-c";
188 // printf("FileCR2::read_frame %d interpolate=%d white_balance=%d\n",
190 // file->interpolate_raw,
191 // file->white_balance_raw);
193 // Use camera white balance.
194 // Before 2006, DCraw had no Canon white balance.
195 // In 2006 DCraw seems to support Canon white balance.
196 // Still no gamma support.
197 // Need to toggle this in preferences because it defeats dark frame subtraction.
198 if(file->white_balance_raw)
199 argv[argc++] = (char*)"-w";
202 if(!file->interpolate_raw)
204 // Trying to do everything but interpolate doesn't work because convert_to_rgb
205 // doesn't work with bayer patterns.
206 // Use document mode and hack dcraw to apply white balance in the write_ function.
207 argv[argc++] = (char*)"-d";
210 printf("FileCR2::read_frame %d %s\n", __LINE__, path);
213 dcraw_data = (float**)frame->get_rows();
216 int result = dcraw_main(argc, (const char**) argv);
218 // This was only used by the bayer interpolate plugin, which itself created
219 // too much complexity to use effectively.
220 // It required bypassing the cache any time a plugin parameter changed
221 // to store the color matrix from dcraw in the frame stack along with the new
222 // plugin parameters. The cache couldn't know if a parameter in the stack came
223 // from dcraw or a plugin & replace it.
224 char string[BCTEXTLEN];
226 "%f %f %f %f %f %f %f %f %f\n",
238 frame->get_params()->update("DCRAW_MATRIX", string);
240 // frame->dump_params();
245 int FileCR2::colormodel_supported(int colormodel)
247 if(colormodel == BC_RGB_FLOAT ||
248 colormodel == BC_RGBA_FLOAT)
254 // Be sure to add a line to File::get_best_colormodel
255 int FileCR2::get_best_colormodel(Asset *asset, int driver)
257 //printf("FileCR2::get_best_colormodel %d\n", __LINE__);
261 // int64_t FileCR2::get_memory_usage()
263 // int64_t result = asset->width * asset->height * sizeof(float) * 3;
264 // //printf("FileCR2::get_memory_usage %d " _LD "\n", __LINE__, result);
269 int FileCR2::use_path()