6 #include "interlacemodes.h"
7 #include "jpegwrapper.h"
10 #include "mwindow.inc"
11 #include "quicktime.h"
13 #include "videodevice.inc"
17 FileJPEG::FileJPEG(Asset *asset, File *file)
18 : FileList(asset, file, "JPEGLIST", ".jpg", FILE_JPEG, FILE_JPEG_LIST)
25 if(decompressor) mjpeg_delete((mjpeg_t*)decompressor);
29 int FileJPEG::check_sig(Asset *asset)
31 FILE *stream = fopen(asset->path, "rb");
36 fread(test, 10, 1, stream);
39 if(test[6] == 'J' && test[7] == 'F' && test[8] == 'I' && test[9] == 'F')
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')
51 if(strlen(asset->path) > 4)
53 int len = strlen(asset->path);
54 if(!strncasecmp(asset->path + len - 4, ".jpg", 4)) return 1;
61 void FileJPEG::get_parameters(BC_WindowBase *parent_window,
63 BC_WindowBase* &format_window,
69 JPEGConfigVideo *window = new JPEGConfigVideo(parent_window, asset);
70 format_window = window;
71 window->create_objects();
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)
83 if(match4(edit->asset->vcodec, QUICKTIME_JPEG)) return 1;
86 if(edit->asset->format == FILE_JPEG ||
87 edit->asset->format == FILE_JPEG_LIST)
93 int FileJPEG::colormodel_supported(int colormodel)
99 int FileJPEG::get_best_colormodel(Asset *asset, int driver)
106 case PLAYBACK_X11_XV:
107 case PLAYBACK_DV1394:
108 case PLAYBACK_FIREWIRE:
111 case PLAYBACK_X11_GL:
124 case VIDEO4LINUX2JPEG:
127 case CAPTURE_FIREWIRE:
128 case CAPTURE_IEC61883:
136 int FileJPEG::write_frame(VFrame *frame, VFrame *data, FrameWriterUnit *unit)
139 JPEGUnit *jpeg_unit = (JPEGUnit*)unit;
141 if(!jpeg_unit->compressor)
142 jpeg_unit->compressor = mjpeg_new(asset->width,
145 mjpeg_set_quality((mjpeg_t*)jpeg_unit->compressor, asset->jpeg_quality);
148 mjpeg_compress((mjpeg_t*)jpeg_unit->compressor,
153 frame->get_color_model(),
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));
174 int FileJPEG::read_frame_header(char *path)
181 if(!(stream = fopen(path, "rb")))
183 perror("FileJPEG::read_frame_header");
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);
213 int FileJPEG::read_frame(VFrame *output, VFrame *input)
215 if(!decompressor) decompressor = mjpeg_new(asset->width,
218 mjpeg_decompress((mjpeg_t*)decompressor,
220 input->get_compressed_size(),
226 output->get_color_model(),
233 FrameWriterUnit* FileJPEG::new_writer_unit(FrameWriter *writer)
235 return new JPEGUnit(this, writer);
243 JPEGUnit::JPEGUnit(FileJPEG *file, FrameWriter *writer)
244 : FrameWriterUnit(writer)
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),
267 this->parent_window = parent_window;
271 JPEGConfigVideo::~JPEGConfigVideo()
275 int JPEGConfigVideo::create_objects()
279 add_subwindow(new BC_Title(x, y, _("Quality:")));
280 add_subwindow(new BC_ISlider(x + 80,
290 &asset->jpeg_quality));
292 add_subwindow(new BC_OKButton(this));
296 int JPEGConfigVideo::close_event()