X-Git-Url: http://git.cinelerra-gg.org/git/?p=goodguy%2Fhistory.git;a=blobdiff_plain;f=cinelerra-5.1%2Fcinelerra%2Ffilelist.C;h=f44d11a8711f196a4eb554b60f6262e99167bacb;hp=a7861e14d60b933524af1bb86ba525615ffe5139;hb=48c313de28fe6d39d9431dbe2dca6ffb176541ff;hpb=49f85559268fc040fe7ba5611cc0520793cf728b diff --git a/cinelerra-5.1/cinelerra/filelist.C b/cinelerra-5.1/cinelerra/filelist.C index a7861e14..f44d11a8 100644 --- a/cinelerra-5.1/cinelerra/filelist.C +++ b/cinelerra-5.1/cinelerra/filelist.C @@ -21,6 +21,7 @@ #include "asset.h" #include "bcsignals.h" +#include "cstrdup.h" #include "file.h" #include "filelist.h" #include "guicast.h" @@ -34,6 +35,7 @@ #include #include +#include #include #include #include @@ -75,22 +77,27 @@ int FileList::reset_parameters_derived() int FileList::open_file(int rd, int wr) { - int result = 0; + int result = 1; // skip header for write if(file->wr) { + int fd = open(asset->path, O_CREAT+O_TRUNC+O_RDWR, 0777); + if( fd >= 0 ) { + close(fd); + result = 0; // Frame files are created in write_frame and list index is created when // file is closed. // Look for the starting number in the path but ignore the starting character // and total digits since these are used by the header. - Render::get_starting_number(asset->path, - first_number, - number_start, - number_digits); - path_list.remove_all_objects(); - writer = new FrameWriter(this, + Render::get_starting_number(asset->path, + first_number, number_start, number_digits); + path_list.remove_all_objects(); + writer = new FrameWriter(this, asset->format == list_type ? file->cpus : 1); + } + else + eprintf(_("Error while opening \"%s\" for writing. \n%m\n"), asset->path); } else if(file->rd) @@ -131,15 +138,16 @@ int FileList::open_file(int rd, int wr) asset->frame_rate = 1; asset->video_length = -1; } + result = 0; } + else + eprintf(_("Error while opening \"%s\" for reading. \n%m\n"), asset->path); } else { Render::get_starting_number(asset->path, - first_number, - number_start, - number_digits, - 6); + first_number, number_start, number_digits, 6); + result = 0; } } @@ -171,6 +179,7 @@ int FileList::close_file() int FileList::write_list_header() { FILE *stream = fopen(asset->path, "w"); + if( !stream ) return 1; // Use sprintf instead of fprintf for VFS. char string[BCTEXTLEN]; sprintf(string, "%s\n", list_prefix); @@ -207,59 +216,51 @@ int FileList::write_list_header() int FileList::read_list_header() { - char string[BCTEXTLEN], *new_entry; + char string[BCTEXTLEN]; FILE *stream = fopen(asset->path, "r"); - - - if(stream) - { + if( !stream ) return 1; // Get information about the frames - do - { - (void)fgets(string, BCTEXTLEN, stream); - }while(!feof(stream) && (string[0] == '#' || string[0] == ' ' || isalpha(string[0]))); + do { + if( feof(stream) || !fgets(string, BCTEXTLEN, stream) ) return 1; + } while(string[0] == '#' || string[0] == ' ' || isalpha(string[0])); // Don't want a user configured frame rate to get destroyed - if(asset->frame_rate == 0) - asset->frame_rate = atof(string); - - do - { - (void)fgets(string, BCTEXTLEN, stream); - }while(!feof(stream) && (string[0] == '#' || string[0] == ' ')); - asset->width = atol(string); - - do - { - (void)fgets(string, BCTEXTLEN, stream); - }while(!feof(stream) && (string[0] == '#' || string[0] == ' ')); - asset->height = atol(string); - - asset->interlace_mode = ILACE_MODE_UNDETECTED; // May be good to store the info in the list? - asset->layers = 1; - asset->audio_data = 0; - asset->video_data = 1; + if(asset->frame_rate == 0) + asset->frame_rate = atof(string); + + do { + if( feof(stream) || !fgets(string, BCTEXTLEN, stream) ) return 1; + } while(string[0] == '#' || string[0] == ' '); + if( (asset->width = atol(string)) <= 0 ) return 1; + + do { + if( feof(stream) || !fgets(string, BCTEXTLEN, stream) ) return 1; + } while(string[0] == '#' || string[0] == ' '); + if( (asset->height = atol(string)) <= 0 ) return 1; + + asset->interlace_mode = ILACE_MODE_UNDETECTED; + asset->layers = 1; + asset->audio_data = 0; + asset->video_data = 1; // Get all the paths - while(!feof(stream)) - { - (void)fgets(string, BCTEXTLEN, stream); - if(strlen(string) && string[0] != '#' && string[0] != ' ' && !feof(stream)) - { - string[strlen(string) - 1] = 0; - path_list.append(new_entry = new char[strlen(string) + 1]); - strcpy(new_entry, string); - } - } - -//for(int i = 0; i < path_list.total; i++) printf("%s\n", path_list.values[i]); - fclose(stream); - asset->video_length = path_list.total; + int missing = 0; + while(!feof(stream) && fgets(string, BCTEXTLEN, stream) ) { + int len = strlen(string); + if( !len || string[0] == '#' || string[0] == ' ') continue; + string[len-1] = 0; + if( access(string,R_OK) && !missing++ ) + eprintf(_("%s:no such file"), string); + path_list.append(cstrdup(string)); } - else - return 1; +//for(int i = 0; i < path_list.total; i++) printf("%s\n", path_list.values[i]); + fclose(stream); + if( !(asset->video_length = path_list.total) ) + eprintf(_("%s:\nlist empty"), asset->path); + if( missing ) + eprintf(_("%s:\n%d files not found"), asset->path, missing); return 0; } @@ -295,7 +296,7 @@ int FileList::read_frame(VFrame *frame) FILE *in; -// Fix path for VFS +// Fix path for VFS. Not used anymore. if(!strncmp(asset->path, RENDERFARM_FS_PREFIX, strlen(RENDERFARM_FS_PREFIX))) sprintf(string, "%s%s", RENDERFARM_FS_PREFIX, path); else @@ -367,12 +368,8 @@ int FileList::read_frame(VFrame *frame) data->allocate_compressed_data(ostat.st_size); data->set_compressed_size(ostat.st_size); (void)fread(data->get_data(), ostat.st_size, 1, fd); - temp = new VFrame(0, - -1, - asset->width, - asset->height, - frame->get_color_model(), - -1); + temp = new VFrame(asset->width, asset->height, + frame->get_color_model(), 0); read_frame(temp, data); break; } @@ -387,50 +384,16 @@ int FileList::read_frame(VFrame *frame) } else { - temp = new VFrame(0, - -1, - asset->width, - asset->height, - frame->get_color_model(), - -1); + temp = new VFrame(asset->width, asset->height, frame->get_color_model(), 0); read_frame(temp, asset->path); } } if(!temp) return result; -// printf("FileList::read_frame frame=%d temp=%d\n", -// frame->get_color_model(), -// temp->get_color_model()); - if(frame->get_color_model() == temp->get_color_model()) - { - frame->copy_from(temp); - } - else - { -// Never happens - BC_CModels::transfer(frame->get_rows(), /* Leave NULL if non existent */ - temp->get_rows(), - frame->get_y(), /* Leave NULL if non existent */ - frame->get_u(), - frame->get_v(), - temp->get_y(), /* Leave NULL if non existent */ - temp->get_u(), - temp->get_v(), - 0, /* Dimensions to capture from input frame */ - 0, - asset->width, - asset->height, - 0, /* Dimensions to project on output frame */ - 0, - asset->width, - asset->height, - temp->get_color_model(), - frame->get_color_model(), - 0, /* When transfering BC_RGBA8888 to non-alpha this is the background color in 0xRRGGBB hex */ - temp->get_w(), /* For planar use the luma rowspan */ - frame->get_w()); - } +//printf("FileList::read_frame frame=%d temp=%d\n", +// frame->get_color_model(), // temp->get_color_model()); + frame->transfer_from(temp); }