Changeset 1019

Show
Ignore:
Timestamp:
01/21/09 22:05:25 (1 year ago)
Author:
astrange
Message:

Merge SRT/SSA/VobSub timestamp scanning code.
Allow .,: as last timestamp seperators for SRT like mplayer does.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Subtitles/SubImport.mm

    r1015 r1019  
    153153} 
    154154 
    155 static unsigned ParseSSATime(NSString *time) 
    156 
    157         unsigned hour, minute, second, millisecond; 
    158          
    159         sscanf([time UTF8String],"%u:%u:%u.%u",&hour,&minute,&second,&millisecond); 
    160          
    161         return hour * 100 * 60 * 60 + minute * 100 * 60 + second * 100 + millisecond; 
     155static unsigned ParseSubTime(const char *time, unsigned secondScale, BOOL hasSign) 
     156
     157        unsigned hour, minute, second, subsecond, timeval; 
     158        char separator; 
     159        int sign = 1; 
     160         
     161        if (hasSign && *time == '-') { 
     162                sign = -1; 
     163                time++; 
     164        } 
     165         
     166        if (sscanf(time,"%u:%u:%u%[,.:]%u",&hour,&minute,&second,&separator,&subsecond) < 5) 
     167                return 0; 
     168         
     169        timeval = hour * 60 * 60 + minute * 60 + second; 
     170        timeval = secondScale * timeval + subsecond; 
     171         
     172        return timeval * sign; 
    162173} 
    163174 
     
    185196                NSDictionary *sub = [subs objectAtIndex:i]; 
    186197                SubLine *sl = [[SubLine alloc] initWithLine:MatroskaPacketizeLine(sub, i)  
    187                                                                                           start:ParseSSATime([sub objectForKey:@"Start"]) end:ParseSSATime([sub objectForKey:@"End"])]; 
     198                                                                                          start:ParseSubTime([[sub objectForKey:@"Start"] UTF8String],100,NO) 
     199                                                                                                end:ParseSubTime([[sub objectForKey:@"End"] UTF8String],100,NO)]; 
    188200                 
    189201                [ss addLine:sl]; 
     
    208220        [sc setCharactersToBeSkipped:nil]; 
    209221         
    210         int h, m, s, ms; 
    211222        unsigned startTime=0, endTime=0; 
    212223         
     
    227238                                break; 
    228239                        case TIMESTAMP: 
    229                                 [sc scanInt:&h];  [sc scanString:@":" intoString:nil]; 
    230                                 [sc scanInt:&m];  [sc scanString:@":" intoString:nil];                           
    231                                 [sc scanInt:&s];  [sc scanString:@"," intoString:nil];                           
    232                                 [sc scanInt:&ms]; [sc scanString:@" --> " intoString:nil]; 
    233                                 startTime = ms + s*1000 + m*1000*60 + h*1000*60*60; 
    234                                 [sc scanInt:&h];  [sc scanString:@":" intoString:nil]; 
    235                                 [sc scanInt:&m];  [sc scanString:@":" intoString:nil];                           
    236                                 [sc scanInt:&s];  [sc scanString:@"," intoString:nil];                           
    237                                 [sc scanInt:&ms]; [sc scanString:@"\n" intoString:nil];  
    238                                 endTime = ms + s*1000 + m*1000*60 + h*1000*60*60; 
     240                                [sc scanUpToString:@" --> " intoString:&res]; 
     241                                [sc scanString:@" --> " intoString:nil]; 
     242                                startTime = ParseSubTime([res UTF8String], 1000, NO); 
     243                                 
     244                                [sc scanUpToString:@"\n" intoString:&res]; 
     245                                [sc scanString:@"\n" intoString:nil]; 
     246                                endTime = ParseSubTime([res UTF8String], 1000, NO); 
    239247                                state = LINES; 
    240248                                break; 
     
    671679        } 
    672680        return line; 
    673 } 
    674  
    675 //static long scanTime(NSScanner *scanner) 
    676 //{ 
    677 //      NSCharacterSet *decimalDigits = [NSCharacterSet decimalDigitCharacterSet]; 
    678 //      int hours, minutes, seconds, subSeconds, sign = 1; 
    679 //      NSString *signString = nil; 
    680 //      [scanner scanUpToCharactersFromSet:decimalDigits intoString:&signString]; 
    681 //      if([signString length]) 
    682 //      { 
    683 //              if([signString characterAtIndex:[signString length] - 1] == '-') 
    684 //                      sign = -1; 
    685 //      } 
    686 //      [scanner scanInt:&hours]; 
    687 //      [scanner scanUpToCharactersFromSet:decimalDigits intoString:nil]; 
    688 //      [scanner scanInt:&minutes]; 
    689 //      [scanner scanUpToCharactersFromSet:decimalDigits intoString:nil]; 
    690 //      [scanner scanInt:&seconds]; 
    691 //      [scanner scanUpToCharactersFromSet:decimalDigits intoString:nil]; 
    692 //      [scanner scanInt:&subSeconds]; 
    693 //       
    694 //      return sign * ((long)hours * 3600000 + (long)minutes * 60000 + (long)seconds * 1000 + (long)subSeconds); 
    695 //} 
    696  
    697 static long scanTime(const char *timeStr) 
    698 { 
    699         int hours = 0, minutes = 0, seconds = 0, milliseconds = 0, sign = 1; 
    700         if(*timeStr == '-') 
    701         { 
    702                 sign = -1; 
    703                 timeStr++; 
    704         } 
    705          
    706         sscanf(timeStr, "%d:%d:%d:%d", &hours, &minutes, &seconds, &milliseconds); 
    707         return sign * ((long)hours * 60 * 60 * 1000 + (long)minutes * 60 * 1000 + (long)seconds * 1000 + (long)milliseconds); 
    708681} 
    709682 
     
    1012985                                break; 
    1013986                        case VOB_SUB_STATE_READING_DELAY: 
    1014                                 delay = scanTime([[line substringFromIndex:7] UTF8String]); 
     987                                delay = ParseSubTime([[line substringFromIndex:7] UTF8String], 1000, YES); 
    1015988                                break; 
    1016989                        case VOB_SUB_STATE_READING_TRACK_DATA: 
     
    1019992                                unsigned int position; 
    1020993                                sscanf([line UTF8String], "timestamp: %s filepos: %x", timeStr, &position); 
    1021                                 long time = scanTime(timeStr); 
     994                                long time = ParseSubTime(timeStr, 100, YES); 
    1022995                                free(timeStr); 
    1023996                                if(position > subFileSize)