r854: Merge 2.1:
[cinelerra_cv/ct.git] / cinelerra / filejpeg.C
blob9dc492266447fd1ce7c6a1ea98e9081c4665e68c
1 #include "asset.h"
2 #include "bcsignals.h"
3 #include "edit.h"
4 #include "file.h"
5 #include "filejpeg.h"
6 #include "interlacemodes.h"
7 #include "jpegwrapper.h"
8 #include "language.h"
9 #include "libmjpeg.h"
10 #include "mwindow.inc"
11 #include "quicktime.h"
12 #include "vframe.h"
13 #include "videodevice.inc"
17 FileJPEG::FileJPEG(Asset *asset, File *file)
18  : FileList(asset, file, "JPEGLIST", ".jpg", FILE_JPEG, FILE_JPEG_LIST)
20         decompressor = 0;
23 FileJPEG::~FileJPEG()
25         if(decompressor) mjpeg_delete((mjpeg_t*)decompressor);
29 int FileJPEG::check_sig(Asset *asset)
31         FILE *stream = fopen(asset->path, "rb");
33         if(stream)
34         {
35                 char test[10];
36                 fread(test, 10, 1, stream);
37                 fclose(stream);
39                 if(test[6] == 'J' && test[7] == 'F' && test[8] == 'I' && test[9] == 'F')
40                 {
41                         return 1;
42                 }
43                 else
44                 if(test[0] == 'J' && test[1] == 'P' && test[2] == 'E' && test[3] == 'G' && 
45                         test[4] == 'L' && test[5] == 'I' && test[6] == 'S' && test[7] == 'T')
46                 {
47                         return 1;
48                 }
49         }
51         if(strlen(asset->path) > 4)
52         {
53                 int len = strlen(asset->path);
54                 if(!strncasecmp(asset->path + len - 4, ".jpg", 4)) return 1;
55         }
56         return 0;
61 void FileJPEG::get_parameters(BC_WindowBase *parent_window, 
62         Asset *asset, 
63         BC_WindowBase* &format_window,
64         int audio_options,
65         int video_options)
67         if(video_options)
68         {
69                 JPEGConfigVideo *window = new JPEGConfigVideo(parent_window, asset);
70                 format_window = window;
71                 window->create_objects();
72                 window->run_window();
73                 delete window;
74         }
78 int FileJPEG::can_copy_from(Edit *edit, int64_t position)
80 //printf("FileJPEG::can_copy_from %d %s\n", asset->format, asset->vcodec);
81         if(edit->asset->format == FILE_MOV)
82         {
83                 if(match4(edit->asset->vcodec, QUICKTIME_JPEG)) return 1;
84         }
85         else
86         if(edit->asset->format == FILE_JPEG || 
87                 edit->asset->format == FILE_JPEG_LIST)
88                 return 1;
90         return 0;
93 int FileJPEG::colormodel_supported(int colormodel)
95         return colormodel;
99 int FileJPEG::get_best_colormodel(Asset *asset, int driver)
101         switch(driver)
102         {
103                 case PLAYBACK_X11:
104                         return BC_RGB888;
105                         break;
106                 case PLAYBACK_X11_XV:
107                 case PLAYBACK_DV1394:
108                 case PLAYBACK_FIREWIRE:
109                         return BC_YUV420P;
110                         break;
111                 case PLAYBACK_X11_GL:
112                         return BC_YUV888;
113                         break;
114                 case PLAYBACK_LML:
115                 case PLAYBACK_BUZ:
116                         return BC_YUV422P;
117                         break;
118                 case VIDEO4LINUX:
119                 case VIDEO4LINUX2:
120                         return BC_YUV420P;
121                         break;
122                 case CAPTURE_BUZ:
123                 case CAPTURE_LML:
124                 case VIDEO4LINUX2JPEG:
125                         return BC_YUV422;
126                         break;
127                 case CAPTURE_FIREWIRE:
128                 case CAPTURE_IEC61883:
129                         return BC_YUV420P;
130                         break;
131         }
132         return BC_YUV420P;
136 int FileJPEG::write_frame(VFrame *frame, VFrame *data, FrameWriterUnit *unit)
138         int result = 0;
139         JPEGUnit *jpeg_unit = (JPEGUnit*)unit;
141         if(!jpeg_unit->compressor)
142                 jpeg_unit->compressor = mjpeg_new(asset->width, 
143                         asset->height, 
144                         1);
145         mjpeg_set_quality((mjpeg_t*)jpeg_unit->compressor, asset->jpeg_quality);
146         
147         
148         mjpeg_compress((mjpeg_t*)jpeg_unit->compressor, 
149                 frame->get_rows(), 
150                 frame->get_y(), 
151                 frame->get_u(), 
152                 frame->get_v(),
153                 frame->get_color_model(),
154                 1);
155         
156         data->allocate_compressed_data(mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor));
157         data->set_compressed_size(mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor));
158         memcpy(data->get_data(), 
159                 mjpeg_output_buffer((mjpeg_t*)jpeg_unit->compressor), 
160                 mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor));
161         
162         return result;
174 int FileJPEG::read_frame_header(char *path)
176         int result = 0;
179         FILE *stream;
181         if(!(stream = fopen(path, "rb")))
182         {
183                 perror("FileJPEG::read_frame_header");
184                 return 1;
185         }
186         
187         
189         struct jpeg_decompress_struct jpeg_decompress;
190         struct jpeg_error_mgr jpeg_error;
192         jpeg_decompress.err = jpeg_std_error(&jpeg_error);
193         jpeg_create_decompress(&jpeg_decompress);
195         jpeg_stdio_src(&jpeg_decompress, stream);
196         jpeg_read_header(&jpeg_decompress, TRUE);
198         asset->width = jpeg_decompress.image_width;
199         asset->height = jpeg_decompress.image_height;
201         asset->interlace_mode = BC_ILACE_MODE_NOTINTERLACED;
203         jpeg_destroy((j_common_ptr)&jpeg_decompress);
204         fclose(stream);
205         
206         
207         
208         return result;
213 int FileJPEG::read_frame(VFrame *output, VFrame *input)
215         if(!decompressor) decompressor = mjpeg_new(asset->width, 
216                 asset->height, 
217                 1);
218         mjpeg_decompress((mjpeg_t*)decompressor, 
219                 input->get_data(), 
220                 input->get_compressed_size(),
221                 0,  
222                 output->get_rows(), 
223                 output->get_y(), 
224                 output->get_u(), 
225                 output->get_v(),
226                 output->get_color_model(),
227                 1);
230         return 0;
233 FrameWriterUnit* FileJPEG::new_writer_unit(FrameWriter *writer)
235         return new JPEGUnit(this, writer);
243 JPEGUnit::JPEGUnit(FileJPEG *file, FrameWriter *writer)
244  : FrameWriterUnit(writer)
246         this->file = file;
247         compressor = 0;
249 JPEGUnit::~JPEGUnit()
251         if(compressor) mjpeg_delete((mjpeg_t*)compressor);
260 JPEGConfigVideo::JPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset)
261  : BC_Window(PROGRAM_NAME ": Video Compression",
262         parent_window->get_abs_cursor_x(1),
263         parent_window->get_abs_cursor_y(1),
264         400,
265         100)
267         this->parent_window = parent_window;
268         this->asset = asset;
271 JPEGConfigVideo::~JPEGConfigVideo()
275 int JPEGConfigVideo::create_objects()
277         int x = 10, y = 10;
279         add_subwindow(new BC_Title(x, y, _("Quality:")));
280         add_subwindow(new BC_ISlider(x + 80, 
281                 y,
282                 0,
283                 200,
284                 200,
285                 0,
286                 100,
287                 asset->jpeg_quality,
288                 0,
289                 0,
290                 &asset->jpeg_quality));
292         add_subwindow(new BC_OKButton(this));
293         return 0;
296 int JPEGConfigVideo::close_event()
298         set_done(0);
299         return 1;