r602: Fix baver's code... don't insert timecode when show_tc is not set
[cinelerra_cv/mob.git] / cinelerra / filejpeg.C
blob67a1a6c9e512206e5b39208bc2e28f216f485b5d
1 #include "asset.h"
2 #include "edit.h"
3 #include "file.h"
4 #include "filejpeg.h"
5 #include "interlacemodes.h"
6 #include "jpegwrapper.h"
7 #include "language.h"
8 #include "libmjpeg.h"
9 #include "mwindow.inc"
10 #include "quicktime.h"
11 #include "vframe.h"
12 #include "videodevice.inc"
16 FileJPEG::FileJPEG(Asset *asset, File *file)
17  : FileList(asset, file, "JPEGLIST", ".jpg", FILE_JPEG, FILE_JPEG_LIST)
19         decompressor = 0;
22 FileJPEG::~FileJPEG()
24         if(decompressor) mjpeg_delete((mjpeg_t*)decompressor);
28 int FileJPEG::check_sig(Asset *asset)
30         FILE *stream = fopen(asset->path, "rb");
32         if(stream)
33         {
34                 char test[10];
35                 fread(test, 10, 1, stream);
36                 fclose(stream);
38                 if(test[6] == 'J' && test[7] == 'F' && test[8] == 'I' && test[9] == 'F')
39                 {
40                         return 1;
41                 }
42                 else
43                 if(test[0] == 'J' && test[1] == 'P' && test[2] == 'E' && test[3] == 'G' && 
44                         test[4] == 'L' && test[5] == 'I' && test[6] == 'S' && test[7] == 'T')
45                 {
46                         return 1;
47                 }
48         }
50         if(strlen(asset->path) > 4)
51         {
52                 int len = strlen(asset->path);
53                 if(!strncasecmp(asset->path + len - 4, ".jpg", 4)) return 1;
54         }
55         return 0;
60 void FileJPEG::get_parameters(BC_WindowBase *parent_window, 
61         Asset *asset, 
62         BC_WindowBase* &format_window,
63         int audio_options,
64         int video_options)
66         if(video_options)
67         {
68                 JPEGConfigVideo *window = new JPEGConfigVideo(parent_window, asset);
69                 format_window = window;
70                 window->create_objects();
71                 window->run_window();
72                 delete window;
73         }
77 int FileJPEG::can_copy_from(Edit *edit, int64_t position)
79 //printf("FileJPEG::can_copy_from %d %s\n", asset->format, asset->vcodec);
80         if(edit->asset->format == FILE_MOV)
81         {
82                 if(match4(edit->asset->vcodec, QUICKTIME_JPEG)) return 1;
83         }
84         else
85         if(edit->asset->format == FILE_JPEG || 
86                 edit->asset->format == FILE_JPEG_LIST)
87                 return 1;
89         return 0;
92 int FileJPEG::colormodel_supported(int colormodel)
94         return colormodel;
98 int FileJPEG::get_best_colormodel(Asset *asset, int driver)
100         switch(driver)
101         {
102                 case PLAYBACK_X11:
103                         return BC_RGB888;
104                         break;
105                 case PLAYBACK_X11_XV:
106                 case PLAYBACK_DV1394:
107                 case PLAYBACK_FIREWIRE:
108                         return BC_YUV420P;
109                         break;
110                 case PLAYBACK_LML:
111                 case PLAYBACK_BUZ:
112                         return BC_YUV422P;
113                         break;
114                 case VIDEO4LINUX:
115                 case VIDEO4LINUX2:
116                         return BC_YUV420P;
117                         break;
118                 case CAPTURE_BUZ:
119                 case CAPTURE_LML:
120                 case VIDEO4LINUX2JPEG:
121                         return BC_YUV422;
122                         break;
123                 case CAPTURE_FIREWIRE:
124                         return BC_YUV420P;
125                         break;
126         }
127         return BC_YUV420P;
131 int FileJPEG::write_frame(VFrame *frame, VFrame *data, FrameWriterUnit *unit)
133         int result = 0;
134         JPEGUnit *jpeg_unit = (JPEGUnit*)unit;
136         if(!jpeg_unit->compressor)
137                 jpeg_unit->compressor = mjpeg_new(asset->width, 
138                         asset->height, 
139                         1);
140         mjpeg_set_quality((mjpeg_t*)jpeg_unit->compressor, asset->jpeg_quality);
141         
142         
143         mjpeg_compress((mjpeg_t*)jpeg_unit->compressor, 
144                 frame->get_rows(), 
145                 frame->get_y(), 
146                 frame->get_u(), 
147                 frame->get_v(),
148                 frame->get_color_model(),
149                 1);
150         
151         data->allocate_compressed_data(mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor));
152         data->set_compressed_size(mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor));
153         memcpy(data->get_data(), 
154                 mjpeg_output_buffer((mjpeg_t*)jpeg_unit->compressor), 
155                 mjpeg_output_size((mjpeg_t*)jpeg_unit->compressor));
156         
157         return result;
169 int FileJPEG::read_frame_header(char *path)
171         int result = 0;
174         FILE *stream;
176         if(!(stream = fopen(path, "rb")))
177         {
178                 perror("FileJPEG::read_frame_header");
179                 return 1;
180         }
181         
182         
184         struct jpeg_decompress_struct jpeg_decompress;
185         struct jpeg_error_mgr jpeg_error;
187         jpeg_decompress.err = jpeg_std_error(&jpeg_error);
188         jpeg_create_decompress(&jpeg_decompress);
190         jpeg_stdio_src(&jpeg_decompress, stream);
191         jpeg_read_header(&jpeg_decompress, TRUE);
193         asset->width = jpeg_decompress.image_width;
194         asset->height = jpeg_decompress.image_height;
196         asset->interlace_mode = BC_ILACE_MODE_NOTINTERLACED;
198         jpeg_destroy((j_common_ptr)&jpeg_decompress);
199         fclose(stream);
200         
201         
202         
203         return result;
208 int FileJPEG::read_frame(VFrame *output, VFrame *input)
210         if(!decompressor) decompressor = mjpeg_new(asset->width, 
211                 asset->height, 
212                 1);
213         mjpeg_decompress((mjpeg_t*)decompressor, 
214                 input->get_data(), 
215                 input->get_compressed_size(),
216                 0,  
217                 output->get_rows(), 
218                 output->get_y(), 
219                 output->get_u(), 
220                 output->get_v(),
221                 output->get_color_model(),
222                 1);
223         
224         
225         return 0;
228 FrameWriterUnit* FileJPEG::new_writer_unit(FrameWriter *writer)
230         return new JPEGUnit(this, writer);
238 JPEGUnit::JPEGUnit(FileJPEG *file, FrameWriter *writer)
239  : FrameWriterUnit(writer)
241         this->file = file;
242         compressor = 0;
244 JPEGUnit::~JPEGUnit()
246         if(compressor) mjpeg_delete((mjpeg_t*)compressor);
255 JPEGConfigVideo::JPEGConfigVideo(BC_WindowBase *parent_window, Asset *asset)
256  : BC_Window(PROGRAM_NAME ": Video Compression",
257         parent_window->get_abs_cursor_x(1),
258         parent_window->get_abs_cursor_y(1),
259         400,
260         100)
262         this->parent_window = parent_window;
263         this->asset = asset;
266 JPEGConfigVideo::~JPEGConfigVideo()
270 int JPEGConfigVideo::create_objects()
272         int x = 10, y = 10;
274         add_subwindow(new BC_Title(x, y, _("Quality:")));
275         add_subwindow(new BC_ISlider(x + 80, 
276                 y,
277                 0,
278                 200,
279                 200,
280                 0,
281                 100,
282                 asset->jpeg_quality,
283                 0,
284                 0,
285                 &asset->jpeg_quality));
287         add_subwindow(new BC_OKButton(this));
288         return 0;
291 int JPEGConfigVideo::close_event()
293         set_done(0);
294         return 1;