dcraw reset, ffmpeg+filejpeg+filesndfile fixes, vdevicex11 rework, bcbitmap fix,...
[goodguy/history.git] / cinelerra-5.1 / cinelerra / filejpeg.C
index 1eac64c74d5e5ee6402fb8b32939183bd1a0c7f0..e3f57bb85c5dc500a929bbf4cc5aafacdd1c5a0d 100644 (file)
@@ -48,36 +48,32 @@ FileJPEG::~FileJPEG()
 
 int FileJPEG::check_sig(Asset *asset)
 {
-       FILE *stream = fopen(asset->path, "rb");
-
-       if(stream)
-       {
-               char test[10];
-               (void)fread(test, 10, 1, stream);
-               fclose(stream);
-
-               if(test[6] == 'J' && test[7] == 'F' && test[8] == 'I' && test[9] == 'F')
-               {
-                       return 1;
+       FILE *fp = fopen(asset->path, "r");
+       if( !fp ) return 0;
+       char test[10];
+       int result = -1;
+       if( fread(test, 1, sizeof(test), fp) == sizeof(test) ) {
+               if( test[6] == 'J' && test[7] == 'F' && test[8] == 'I' && test[9] == 'F' ) {
+                       fseek(fp, 0, SEEK_SET);
+                       int w = 0, h = 0;
+                       result = read_header(fp, w, h);
                }
-               else
-               if(test[0] == 'J' && test[1] == 'P' && test[2] == 'E' && test[3] == 'G' &&
-                       test[4] == 'L' && test[5] == 'I' && test[6] == 'S' && test[7] == 'T')
-               {
-                       return 1;
+               else if(test[0] == 'J' && test[1] == 'P' && test[2] == 'E' && test[3] == 'G' &&
+                       test[4] == 'L' && test[5] == 'I' && test[6] == 'S' && test[7] == 'T') {
+                       result = 0;
                }
        }
+       fclose(fp);
 
-       if(strlen(asset->path) > 4)
-       {
-               int len = strlen(asset->path);
-               if(!strncasecmp(asset->path + len - 4, ".jpg", 4)) return 1;
+       if( result < 0 ) {
+               int i = strlen(asset->path) - 4;
+               if( i >= 0 && !strcasecmp(asset->path+i, ".jpg") )
+                       result = 0;
        }
-       return 0;
+       return !result ? 1 : 0;
 }
 
 
-
 void FileJPEG::get_parameters(BC_WindowBase *parent_window,
        Asset *asset,
        BC_WindowBase* &format_window,
@@ -187,51 +183,49 @@ int FileJPEG::write_frame(VFrame *frame, VFrame *data, FrameWriterUnit *unit)
 
 int FileJPEG::read_frame_header(char *path)
 {
-       int result = 0;
-
-
-       FILE *stream;
-
-       if(!(stream = fopen(path, "rb")))
-       {
+       FILE *fp = fopen(path, "rb");
+       if( !fp ) {
                eprintf("FileJPEG::read_frame_header %s: %m\n", path);
                return 1;
        }
-
-
+       int w = 0, h = 0, result = 1;
        unsigned char test[2];
-       (void)fread(test, 2, 1, stream);
-       if(test[0] != 0xff || test[1] != 0xd8)
-       {
-               eprintf("FileJPEG::read_frame_header %s bad header %02x%02x\n",
-                       path, test[0], test[1]);
-               fclose(stream);
-               return 1;
+       if( fread(test, 1, sizeof(test), fp) == sizeof(test) &&
+           test[0] == 0xff && test[1] == 0xd8 ) {
+               fseek(fp, 0, SEEK_SET);
+               result = read_header(fp, w, h);
        }
-       fseek(stream, 0, SEEK_SET);
+       fclose(fp);
+       if( !result ) {
+               asset->width = w;  asset->height = h;
+               asset->interlace_mode = ILACE_MODE_NOTINTERLACED;
+       }
+       else
+               eprintf("FileJPEG::read_frame_header %s bad header\n", path);
+       return result;
+}
 
-       struct jpeg_decompress_struct jpeg_decompress;
+int FileJPEG::read_header(FILE *fp, int &w, int &h)
+{
+       int result = 0;
        struct jpeg_error_mgr jpeg_error;
-
+       struct jpeg_decompress_struct jpeg_decompress;
        jpeg_decompress.err = jpeg_std_error(&jpeg_error);
        jpeg_create_decompress(&jpeg_decompress);
-
-       jpeg_stdio_src(&jpeg_decompress, stream);
-       jpeg_read_header(&jpeg_decompress, TRUE);
-
-       asset->width = jpeg_decompress.image_width;
-       asset->height = jpeg_decompress.image_height;
-
-       asset->interlace_mode = ILACE_MODE_NOTINTERLACED;
-
+       jpeg_stdio_src(&jpeg_decompress, fp);
+       if( jpeg_read_header(&jpeg_decompress, TRUE) != JPEG_HEADER_OK ) result = 1;
+       if( !result && jpeg_decompress.jpeg_color_space != JCS_YCbCr ) result = 1;
+       if( !result && jpeg_decompress.comp_info[0].h_samp_factor > 2 ) result = 1;
+       if( !result && jpeg_decompress.comp_info[0].v_samp_factor > 2 ) result = 1;
+       if( !result ) {
+               w = jpeg_decompress.image_width;
+               h = jpeg_decompress.image_height;
+       }
        jpeg_destroy((j_common_ptr)&jpeg_decompress);
-       fclose(stream);
-
        return result;
 }
 
 
-
 int FileJPEG::read_frame(VFrame *output, VFrame *input)
 {
        if(input->get_compressed_size() < 2 ||