5 #include "interlacemodes.h"
6 #include "jpegwrapper.h"
10 #include "quicktime.h"
12 #include "videodevice.inc"
16 FileJPEG::FileJPEG(Asset *asset, File *file)
17 : FileList(asset, file, "JPEGLIST", ".jpg", FILE_JPEG, FILE_JPEG_LIST)
24 if(decompressor) mjpeg_delete((mjpeg_t*)decompressor);
28 int FileJPEG::check_sig(Asset *asset)
30 FILE *stream = fopen(asset->path, "rb");
35 fread(test, 10, 1, stream);
38 if(test[6] == 'J' && test[7] == 'F' && test[8] == 'I' && test[9] == 'F')
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')
50 if(strlen(asset->path) > 4)
52 int len = strlen(asset->path);
53 if(!strncasecmp(asset->path + len - 4, ".jpg", 4)) return 1;
60 void FileJPEG::get_parameters(BC_WindowBase *parent_window,
62 BC_WindowBase* &format_window,
68 JPEGConfigVideo *window = new JPEGConfigVideo(parent_window, asset);
69 format_window = window;
70 window->create_objects();
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)
82 if(match4(edit->asset->vcodec, QUICKTIME_JPEG)) return 1;
85 if(edit->asset->format == FILE_JPEG ||
86 edit->asset->format == FILE_JPEG_LIST)
92 int FileJPEG::colormodel_supported(int colormodel)
98 int FileJPEG::get_best_colormodel(Asset *asset, int driver)
105 case PLAYBACK_X11_XV:
106 case PLAYBACK_DV1394:
107 case PLAYBACK_FIREWIRE:
120 case VIDEO4LINUX2JPEG:
123 case CAPTURE_FIREWIRE:
131 int FileJPEG::write_frame(VFrame *frame, VFrame *data, FrameWriterUnit *unit)
134 JPEGUnit *jpeg_unit = (JPEGUnit*)unit;
136 if(!jpeg_unit->compressor)
137 jpeg_unit->compressor = mjpeg_new(asset->width,
140 mjpeg_set_quality((mjpeg_t*)jpeg_unit->compressor, asset->jpeg_quality);
143 mjpeg_compress((mjpeg_t*)jpeg_unit->compressor,
148 frame->get_color_model(),
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));
169 int FileJPEG::read_frame_header(char *path)
176 if(!(stream = fopen(path, "rb")))
178 perror("FileJPEG::read_frame_header");
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);
208 int FileJPEG::read_frame(VFrame *output, VFrame *input)
210 if(!decompressor) decompressor = mjpeg_new(asset->width,
213 mjpeg_decompress((mjpeg_t*)decompressor,
215 input->get_compressed_size(),
221 output->get_color_model(),
228 FrameWriterUnit* FileJPEG::new_writer_unit(FrameWriter *writer)
230 return new JPEGUnit(this, writer);
238 JPEGUnit::JPEGUnit(FileJPEG *file, FrameWriter *writer)
239 : FrameWriterUnit(writer)
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),
262 this->parent_window = parent_window;
266 JPEGConfigVideo::~JPEGConfigVideo()
270 int JPEGConfigVideo::create_objects()
274 add_subwindow(new BC_Title(x, y, _("Quality:")));
275 add_subwindow(new BC_ISlider(x + 80,
285 &asset->jpeg_quality));
287 add_subwindow(new BC_OKButton(this));
291 int JPEGConfigVideo::close_event()