OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2011, 2012 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 // SHOULD be ignored by the UA. | 191 // SHOULD be ignored by the UA. |
192 } | 192 } |
193 } | 193 } |
194 m_fragments.clear(); | 194 m_fragments.clear(); |
195 } | 195 } |
196 | 196 |
197 bool MediaFragmentURIParser::parseNPTFragment(const LChar* timeString, unsigned
length, double& startTime, double& endTime) | 197 bool MediaFragmentURIParser::parseNPTFragment(const LChar* timeString, unsigned
length, double& startTime, double& endTime) |
198 { | 198 { |
199 unsigned offset = 0; | 199 unsigned offset = 0; |
200 if (length >= nptIdentiferLength && timeString[0] == 'n' && timeString[1] ==
'p' && timeString[2] == 't' && timeString[3] == ':') | 200 if (length >= nptIdentiferLength && timeString[0] == 'n' && timeString[1] ==
'p' && timeString[2] == 't' && timeString[3] == ':') |
201 offset += nptIdentiferLength; | 201 offset += nptIdentiferLength; |
202 | 202 |
203 if (offset == length) | 203 if (offset == length) |
204 return false; | 204 return false; |
205 | 205 |
206 // http://www.w3.org/2008/WebVideo/Fragments/WD-media-fragments-spec/#naming
-time | 206 // http://www.w3.org/2008/WebVideo/Fragments/WD-media-fragments-spec/#naming
-time |
207 // If a single number only is given, this corresponds to the begin time exce
pt if it is preceded | 207 // If a single number only is given, this corresponds to the begin time exce
pt if it is preceded |
208 // by a comma that would in this case indicate the end time. | 208 // by a comma that would in this case indicate the end time. |
209 if (timeString[offset] == ',') | 209 if (timeString[offset] == ',') { |
210 startTime = 0; | 210 startTime = 0; |
211 else { | 211 } else { |
212 if (!parseNPTTime(timeString, length, offset, startTime)) | 212 if (!parseNPTTime(timeString, length, offset, startTime)) |
213 return false; | 213 return false; |
214 } | 214 } |
215 | 215 |
216 if (offset == length) | 216 if (offset == length) |
217 return true; | 217 return true; |
218 | 218 |
219 if (timeString[offset] != ',') | 219 if (timeString[offset] != ',') |
220 return false; | 220 return false; |
221 if (++offset == length) | 221 if (++offset == length) |
222 return false; | 222 return false; |
223 | 223 |
224 if (!parseNPTTime(timeString, length, offset, endTime)) | 224 if (!parseNPTTime(timeString, length, offset, endTime)) |
225 return false; | 225 return false; |
226 | 226 |
227 if (offset != length) | 227 if (offset != length) |
228 return false; | 228 return false; |
229 | 229 |
230 if (startTime >= endTime) | 230 if (startTime >= endTime) |
231 return false; | 231 return false; |
232 | 232 |
233 return true; | 233 return true; |
234 } | 234 } |
235 | 235 |
236 bool MediaFragmentURIParser::parseNPTTime(const LChar* timeString, unsigned leng
th, unsigned& offset, double& time) | 236 bool MediaFragmentURIParser::parseNPTTime(const LChar* timeString, unsigned leng
th, unsigned& offset, double& time) |
237 { | 237 { |
238 enum Mode { minutes, hours }; | 238 enum Mode { Minutes, Hours }; |
239 Mode mode = minutes; | 239 Mode mode = Minutes; |
240 | 240 |
241 if (offset >= length || !isASCIIDigit(timeString[offset])) | 241 if (offset >= length || !isASCIIDigit(timeString[offset])) |
242 return false; | 242 return false; |
243 | 243 |
244 // http://www.w3.org/2008/WebVideo/Fragments/WD-media-fragments-spec/#npttim
edef | 244 // http://www.w3.org/2008/WebVideo/Fragments/WD-media-fragments-spec/#npttim
edef |
245 // Normal Play Time can either be specified as seconds, with an optional | 245 // Normal Play Time can either be specified as seconds, with an optional |
246 // fractional part to indicate miliseconds, or as colon-separated hours, | 246 // fractional part to indicate miliseconds, or as colon-separated hours, |
247 // minutes and seconds (again with an optional fraction). Minutes and | 247 // minutes and seconds (again with an optional fraction). Minutes and |
248 // seconds must be specified as exactly two digits, hours and fractional | 248 // seconds must be specified as exactly two digits, hours and fractional |
249 // seconds can be any number of digits. The hours, minutes and seconds | 249 // seconds can be any number of digits. The hours, minutes and seconds |
(...skipping 23 matching lines...) Expand all Loading... |
273 return true; | 273 return true; |
274 String digits = collectFraction(timeString, length, offset); | 274 String digits = collectFraction(timeString, length, offset); |
275 fraction = digits.toDouble(); | 275 fraction = digits.toDouble(); |
276 time = value1 + fraction; | 276 time = value1 + fraction; |
277 return true; | 277 return true; |
278 } | 278 } |
279 | 279 |
280 if (digits1.length() < 2) | 280 if (digits1.length() < 2) |
281 return false; | 281 return false; |
282 if (digits1.length() > 2) | 282 if (digits1.length() > 2) |
283 mode = hours; | 283 mode = Hours; |
284 | 284 |
285 // Collect the next sequence of 0-9 after ':' | 285 // Collect the next sequence of 0-9 after ':' |
286 if (offset >= length || timeString[offset++] != ':') | 286 if (offset >= length || timeString[offset++] != ':') |
287 return false; | 287 return false; |
288 if (offset >= length || !isASCIIDigit(timeString[(offset)])) | 288 if (offset >= length || !isASCIIDigit(timeString[(offset)])) |
289 return false; | 289 return false; |
290 String digits2 = collectDigits(timeString, length, offset); | 290 String digits2 = collectDigits(timeString, length, offset); |
291 int value2 = digits2.toInt(); | 291 int value2 = digits2.toInt(); |
292 if (digits2.length() != 2) | 292 if (digits2.length() != 2) |
293 return false; | 293 return false; |
294 | 294 |
295 // Detect whether this timestamp includes hours. | 295 // Detect whether this timestamp includes hours. |
296 int value3; | 296 int value3; |
297 if (mode == hours || (offset < length && timeString[offset] == ':')) { | 297 if (mode == Hours || (offset < length && timeString[offset] == ':')) { |
298 if (offset >= length || timeString[offset++] != ':') | 298 if (offset >= length || timeString[offset++] != ':') |
299 return false; | 299 return false; |
300 if (offset >= length || !isASCIIDigit(timeString[offset])) | 300 if (offset >= length || !isASCIIDigit(timeString[offset])) |
301 return false; | 301 return false; |
302 String digits3 = collectDigits(timeString, length, offset); | 302 String digits3 = collectDigits(timeString, length, offset); |
303 if (digits3.length() != 2) | 303 if (digits3.length() != 2) |
304 return false; | 304 return false; |
305 value3 = digits3.toInt(); | 305 value3 = digits3.toInt(); |
306 } else { | 306 } else { |
307 value3 = value2; | 307 value3 = value2; |
308 value2 = value1; | 308 value2 = value1; |
309 value1 = 0; | 309 value1 = 0; |
310 } | 310 } |
311 | 311 |
312 if (offset < length && timeString[offset] == '.') | 312 if (offset < length && timeString[offset] == '.') |
313 fraction = collectFraction(timeString, length, offset).toDouble(); | 313 fraction = collectFraction(timeString, length, offset).toDouble(); |
314 | 314 |
315 time = (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + fr
action; | 315 time = (value1 * secondsPerHour) + (value2 * secondsPerMinute) + value3 + fr
action; |
316 return true; | 316 return true; |
317 } | 317 } |
318 | 318 |
319 } | 319 } |
OLD | NEW |