| 104 | } |
| 105 | |
| 106 | int64u Ttml_str2timecode(const char* Value, float FrameRate=0) |
| 107 | { |
| 108 | size_t Length=strlen(Value); |
| 109 | if (Length>=8 |
| 110 | && Value[0]>='0' && Value[0]<='9' |
| 111 | && Value[1]>='0' && Value[1]<='9' |
| 112 | && Value[2]==':' |
| 113 | && Value[3]>='0' && Value[3]<='9' |
| 114 | && Value[4]>='0' && Value[4]<='9' |
| 115 | && Value[5]==':' |
| 116 | && Value[6]>='0' && Value[6]<='9' |
| 117 | && Value[7]>='0' && Value[7]<='9') |
| 118 | { |
| 119 | int64u ToReturn=(int64u)(Value[0]-'0')*10*60*60*1000000000 |
| 120 | +(int64u)(Value[1]-'0') *60*60*1000000000 |
| 121 | +(int64u)(Value[3]-'0') *10*60*1000000000 |
| 122 | +(int64u)(Value[4]-'0') *60*1000000000 |
| 123 | +(int64u)(Value[6]-'0') *10*1000000000 |
| 124 | +(int64u)(Value[7]-'0') *1000000000; |
| 125 | if (Length>=9 && (Value[8]=='.' || Value[8]==',')) |
| 126 | { |
| 127 | if (Length>9+9) |
| 128 | Length=9+9; //Nanoseconds max |
| 129 | const char* Value_End=Value+Length; |
| 130 | Value+=9; |
| 131 | int64u Multiplier=100000000; |
| 132 | while (Value<Value_End) |
| 133 | { |
| 134 | ToReturn+=(int64u)(*Value-'0')*Multiplier; |
| 135 | Multiplier/=10; |
| 136 | Value++; |
| 137 | } |
| 138 | } |
| 139 | if (FrameRate && Length>=9 && Value[8]==':') |
| 140 | { |
| 141 | const char* Value_End=Value+Length; |
| 142 | Value+=9; |
| 143 | int64u FrameNumber=0; |
| 144 | while (Value<Value_End) |
| 145 | { |
| 146 | FrameNumber*=10; |
| 147 | FrameNumber+=(int64u)(*Value-'0'); |
| 148 | Value++; |
| 149 | } |
| 150 | ToReturn+=FrameNumber/FrameRate*1000000000; |
| 151 | } |
| 152 | |
| 153 | return ToReturn; |
| 154 | } |
| 155 | else if (Length>=2 |
| 156 | && Value[Length-1]=='s') |
| 157 | { |
| 158 | float64 ValueF=to_float64(Value); |
| 159 | if (ValueF<0) |
| 160 | return 0; //Npt supported |
| 161 | return (int64u)float64_int64s(ValueF*1000000000); |
| 162 | } |
| 163 | else |
no test coverage detected