X-Git-Url: https://git.cinelerra-gg.org/git/?a=blobdiff_plain;ds=sidebyside;f=cinelerra-5.1%2Fcinelerra%2Ffilegif.C;fp=cinelerra-5.1%2Fcinelerra%2Ffilegif.C;h=b80f741206c4b47a97e9b8020c0e049eccabce23;hb=31f931f20df22f7255200fa1e49590c38edda579;hp=bb26762bef07094251db75deeaea1b000230bcc6;hpb=c57aa3e2800e06f890e644dc54c9e0bba6d0851a;p=goodguy%2Fcinelerra.git diff --git a/cinelerra-5.1/cinelerra/filegif.C b/cinelerra-5.1/cinelerra/filegif.C index bb26762b..b80f7412 100644 --- a/cinelerra-5.1/cinelerra/filegif.C +++ b/cinelerra-5.1/cinelerra/filegif.C @@ -31,6 +31,7 @@ #include #include #include +#include //from "getarg.h" extern "C" @@ -500,6 +501,65 @@ FrameWriterUnit* FileGIFList::new_writer_unit(FrameWriter *writer) return new GIFUnit(this, writer); } +int FileGIFList::verify_file_list() +{ + // go through all .gif files in the list and + // verify their sizes match or not. + //printf("\nAsset Path: %s\n", asset->path); + FILE *stream = fopen(asset->path, "rb"); + if (stream) { + char string[BCTEXTLEN]; + int width, height, prev_width=-1, prev_height=-1; + // build the path prefix + char prefix[BCTEXTLEN], *bp = prefix, *cp = strrchr(asset->path, '/'); + for( int i=0, n=!cp ? 0 : cp-asset->path; ipath[i]; + *bp = 0; + // read entire input file + while( !feof(stream) && fgets(string, BCTEXTLEN, stream) ) { + int len = strlen(string); + if(!len || string[0] == '#' || string[0] == ' ' || isalnum(string[0])) continue; + if( string[len-1] == '\n' ) string[len-1] = 0; + // a possible .gif file path? fetch it + char path[BCTEXTLEN], *pp = path, *ep = pp + sizeof(path)-1; + if( string[0] == '.' && string[1] == '/' && prefix[0] ) + pp += snprintf(pp, ep-pp, "%s/", prefix); + snprintf(pp, ep-pp, "%s", string); + // check if a valid file exists + if(!access(path, R_OK)) { + // check file header for size + FILE *gif_file_temp = fopen(path, "rb"); + if (gif_file_temp) { + unsigned char test[16]; + int ret = fread(test, 16, 1, gif_file_temp); + fclose(gif_file_temp); + if( ret < 1 ) continue; + // get height and width of gif file + width = test[6] | (test[7] << 8); + height = test[8] | (test[9] << 8); + // test with previous + if ( (prev_width == -1) && (prev_height == -1) ) { + prev_width = width; + prev_height = height; + continue; + } + else if ( (prev_width != width) || (prev_height != height) ) { + // this is the error case we are trying to avoid + fclose(stream); + return 0; + } + } + + } + } + fclose(stream); + return 1; + } + // not sure if our function should be the one to raise not found error + perror(asset->path); + return 0; +} + + GIFUnit::GIFUnit(FileGIFList *file, FrameWriter *writer) : FrameWriterUnit(writer) {