[vlc-devel] [Patch] Adding an helper to convert iso8601 durations to seconds
Hugo Beauzée-Luyssen
beauze.h at gmail.com
Wed Nov 30 14:45:07 CET 2011
On Wed, Nov 30, 2011 at 2:08 PM, Tobias Güntner <fatbull at web.de> wrote:
> Am 30.11.2011 11:05, schrieb Hugo Beauzée-Luyssen:
>> +/*
>> + Decodes a duration as defined by ISO 8601
>> + http://en.wikipedia.org/wiki/ISO_8601#Durations
>> + @param str A null-terminated string to convert
>
> Perhaps a short example of a valid input string would be useful, so
> readers can see at first glance what kind of data this function expects,
> without looking it up.
>
Yep I'm going to write some tests in a this afternoon or tomorrow, but
I could add a link to the format description and an exemple in the
comments.
>> + @return: The duration in seconds. 0 if an error occured.
>
> This function usually does not return 0 if the input is invalid.
>
Yep i'm going to change the return type as a signed int 64, so -1 is an error.
>> + */
>> +uint64_t str_iso8601_duration_to_seconds( const char *psz_duration )
>> +{
>> + bool timeDesignatorReached = false;
>> + double mul = 0;
>
> I think an integer should be fine.
>
Well in the exemple file I've got
(http://www-itec.uni-klu.ac.at/ftp/datasets/mmsys12/Selected_VLC_Plugin_MPDs/BigBuckBunny_15s_DASH_VLC_Compatible_4-Representations_720p.mpd)
there are some decimal values, so I try to reduce the loss of
precision when converting by using doubles.
>> + mtime_t res = 0;
>
> Shouldn't this type and the return type be the same?
>
I was using mtime_t at first, it seems I forgot to change this one, my bad.
Since the line below is a direct pointer dereferencement without any
prior check, this was intended, but a check could be added.
>> +
>> + if ( *psz_duration++ != 'P' )
>> + return 0;
>> + for ( const char* nptr = psz_duration; *psz_duration; ++psz_duration )
>> + {
>> + switch( *psz_duration )
>> + {
>> + case 'M':
>> + {
>
> I find this a little confusing because letters normally follow numbers
> in the input, yet you somehow parse letters first. ;)
>
That is absolutely right...
>> + //M can mean month or minutes, if the 'T' flag has been reached.
>> + //We don't handle months though.
>> + if ( timeDesignatorReached == true )
>> + mul = 60.0;
>> + break ;
>> + }
>> + case 'Y':
>> + case 'W':
>> + break ; //Don't handle this duration.
>
> Maybe return an error here?
>
I don't really know... warning should be mandatory, an error may be to
agressive...
>> + case 'D':
>> + mul = 86400.0;
>> + break ;
>> + case 'T':
>> + timeDesignatorReached = true;
>> + break ;
>> + case 'H':
>> + mul = 3600.0;
>> + break ;
>> + case 'S':
>> + mul = 1.0;
>> + break ;
>> + default:
>> + continue ;
>> + }
>> + //It means we went trough some digits. So we must compute a number
>> + if ( nptr != psz_duration )
>> + {
>> + double tmp = strtold( nptr, NULL );
>
> I think you can achieve a slightly cleaner design if you utilize the
> second parameter of that function. The strtoX functions store the
> address of the first invalid character in there, so all you have to do
> is basically:
>
Yep since I'm doing it in the wrong way, using the second parameter
makes a lot of sense now :D
> 1. Call strtoul(psz_duration, &endptr, 10)
> 2. Check the character at *endptr
> 3. Repeat with psz_duration = endptr + 1
>
>> + res += (uint64_t)(tmp * mul);
>> + nptr = psz_duration;
>> + }
>> + nptr++;
>> + }
>> + return res;
>> +}
>
> Regards,
> Tobias
>
Thanks for the review!
Regards,
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> http://mailman.videolan.org/listinfo/vlc-devel
--
Hugo Beauzée-Luyssen
More information about the vlc-devel
mailing list