[FFmpeg-devel] Image sequence file names
    Robert Petka 
    robert.petka at gmail.com
       
    Wed Aug 24 22:02:17 CEST 2011
    
    
  
Hi all,
recently I`ve been solving issue mentioned in following ticket 
http://avcodec.org/trac/ffmpeg/ticket/247.
I had to solve this issue for my project, so I want to share a solution 
with you. I was able to compile this code on MinGW under windows, but I 
do not have opportunity to try it on other platforms. This solution is 
not maybe nicest, kind a brute-force, but seems to work (it is also fast).
static void get_directory_from_path(const char* inPath, char* dirPath)
{
     int length, i;
     length = strlen(inPath);
     for(i=length-1;i>=0;i--)
     {
         if(inPath[i] == '\\' || inPath[i] =='/')
             break;
     }
     strncpy(dirPath, inPath, i + 1);
     dirPath[i + 1] = '\0';
}
static int get_index_for_file(const char* path)
{
     int length, i, last_digit, first_digit, index;
     length = strlen(path);
     first_digit = -1;
     last_digit = -1;
     for(i=length-1;i>=0;i--)
     {
         if(last_digit == -1)
         {
             if(isdigit(path[i]))
                 last_digit = i;
         }
         else
         {
             if(isdigit(path[i]))
                 first_digit = i;
             else
                 break;
         }
     }
     index = -1;
     if(first_digit != -1)
     {
         sscanf(path + first_digit,"%d%*s",&index);
     }
     return index;
}
/* return -1 if no image found */
static int find_image_range(int *pfirst_index, int *plast_index,
                             const char *path)
{
     char buf[1024];
     int range, last_index, range1, first_index;
     /* find the first image */
     //ROBO: Find the first image in extended range
     DIR *dp;
     struct dirent *ep;
     char dirPath[MAX_PATH];
     first_index = -1;
     get_directory_from_path(path, dirPath);
     dp = opendir (dirPath);
     if (dp != NULL)
     {
         int min_index;
         min_index = INT_MAX;
         while (ep = readdir (dp))
         {
             int file_index;
             file_index = get_index_for_file(ep->d_name);
             if(file_index != -1)
             {
                 if(file_index < min_index)
                     min_index = file_index;
             }
         }
         closedir(dp);
         first_index = min_index;
     }
     if(first_index == -1)
     {
         *pfirst_index = *plast_index = 1;
         goto fail;
     }
     /* find the last image */
     last_index = first_index;
     for(;;) {
         range = 0;
         for(;;) {
             if (!range)
                 range1 = 1;
             else
                 range1 = 2 * range;
             if (av_get_frame_filename(buf, sizeof(buf), path,
                                       last_index + range1) < 0)
                 goto fail;
             if (!url_exist(buf))
                 break;
             range = range1;
             /* just in case... */
             if (range >= (1 << 30))
                 goto fail;
         }
         /* we are sure than image last_index + range exists */
         if (!range)
             break;
         last_index += range;
     }
     *pfirst_index = first_index;
     *plast_index = last_index;
     return 0;
  fail:
     return -1;
}
Regards,
Robert
    
    
More information about the ffmpeg-devel
mailing list