[FFmpeg-devel] Image sequence file names

Robert Petka robert.petka at gmail.com
Thu Sep 8 23:05:43 CEST 2011


Dňa 3. 9. 2011 23:31, Michael Niedermayer  wrote / napísal(a):
> Hi robert
>
> On Wed, Aug 31, 2011 at 10:43:17PM +0200, Robert Petka wrote:
>> Dňa 31. 8. 2011 0:59, Michael Niedermayer  wrote / napísal(a):
>>> On Wed, Aug 31, 2011 at 12:08:56AM +0200, Robert Petka wrote:
>>> when you do, please write the implementation so as to avoid known
>>> bugs in dirname.
>>>
>>> the manpage says (dunno if you have the manpages on msys)
>>>    BUGS
>>>          In the glibc implementation of the POSIX versions of these functions they modify their argument, and segfault when called with a static string like "/usr/".  Before glibc 2.2.1, the  glibc  version
>>>          of dirname() did not correctly handle pathnames with trailing '/' characters, and generated a segfault if given a NULL argument.
>>>
>>>
>>> [...]
>>>
>>>
>>>
>>> _______________________________________________
>>> ffmpeg-devel mailing list
>>> ffmpeg-devel at ffmpeg.org
>>> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>> Here's the modified patch file with dirname usage.
>>
>> Robert
>>   img2.c |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++----------
>>   1 file changed, 61 insertions(+), 10 deletions(-)
>> 3d2e9a948755cdeb1b940f8f86381bb5982ee492  image_range.diff
>> diff --git a/libavformat/img2.c b/libavformat/img2.c
>> index 77145cb..2b2c37c 100644
>> --- a/libavformat/img2.c
>> +++ b/libavformat/img2.c
>> @@ -30,6 +30,10 @@
>>   #include "avio_internal.h"
>>   #include "internal.h"
>>   #include<strings.h>
>> +#include<stdio.h>
>> +#include<sys/types.h>
>> +#include<dirent.h>
>> +#include<libgen.h>
>>
>>   typedef struct {
>>       const AVClass *class;  /**<  Class for private options. */
>> @@ -133,27 +137,74 @@ static enum CodecID av_str2id(const IdStrMap *tags, const char *str)
>>       return CODEC_ID_NONE;
>>   }
>>
>> +static int get_index_for_file(const char* path)
>> +{
>> +    int i, last_digit, first_digit, index;
>> +
>> +    first_digit = -1;
>> +    last_digit = -1;
>> +
>> +    for (i=strlen(path)-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",&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;
>> +    DIR *dp = 0;
>> +    struct dirent *ep = 0;
>> +    char dirPath[MAX_PATH], pathCopy[MAX_PATH];
>> +    char *directory = 0;
>>
>>       /* find the first image */
>> -    for(first_index = 0; first_index<  5; first_index++) {
>> -        if (av_get_frame_filename(buf, sizeof(buf), path, first_index)<  0){
>> -            *pfirst_index =
>> -            *plast_index = 1;
>> -            if (avio_check(buf, AVIO_FLAG_READ)>  0)
>> -                return 0;
>> -            return -1;
>> +    first_index = -1;
>> +
>> +    /* get files directory */
>> +    av_strlcpy(pathCopy, path, FFMIN(sizeof(pathCopy),strlen(path) + 1));
>> +    directory = dirname(pathCopy);
>> +    av_strlcpy(dirPath, directory, FFMIN(sizeof(dirPath),strlen(directory) + 1));
> the FFMIN and strlen seem unneeded
>
>
>> +
>> +    dp = opendir (dirPath);
> this code should only be run when the underlaying protocol is file,
> it should for example not be used with http://
>
>
>> +    if (dp) {
>> +        int min_index;
>> +        min_index = INT_MAX;
> could be merged
>
>
>> +
>> +        while (ep = readdir (dp)) {
>> +            int file_index;
>> +            file_index = get_index_for_file(ep->d_name);
>> +
>> +            if (file_index != -1) {
>> +                min_index = FFMIN(min_index, file_index);
>> +            }
> if the "fail" value is INT_MAX instead of -1 then the if() is unneeded
>
>
> [...]
>
>
>
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
Hi,
I'll get back to this as soon as I manage some free time.

Robert


More information about the ffmpeg-devel mailing list