Changeset 3025

Show
Ignore:
Timestamp:
12/21/99 15:33:11 (14 years ago)
Author:
ucacoxh
Message:

- Add failure return option for pattern matches used in skew detection.

Location:
rat/trunk
Files:
2 modified

Legend:

Unmodified
Added
Removed
  • rat/trunk/MODS

    r3024 r3025  
    10131013        - Add check audio in adjusted playout point packets can be played out 
    10141014          and correct if would be dropped. 
     1015        - Add failure return option for pattern matches used in skew detection. 
    10151016 
    10161017TODO -- They're features not bugs dammit! 
  • rat/trunk/source.c

    r3024 r3025  
    901901} 
    902902 
    903 static uint16_t 
     903static int16_t 
    904904find_local_match(sample *buffer, uint16_t wstart, uint16_t wlen, uint16_t sstart, uint16_t send, uint16_t channels) 
    905905{ 
     
    921921                return i_min; 
    922922        } 
    923         return 0; 
     923        return -1; 
    924924} 
    925925 
     
    928928/* dropping samples (TRUE) or inserting (FALSE).                             */ 
    929929 
    930 static ts_t 
    931 recommend_skew_adjust_dur(media_data *md, int drop)  
    932 { 
    933         uint16_t matchlen; 
     930static int32_t 
     931recommend_skew_adjust_dur(media_data *md, int drop, ts_t *adjust)  
     932{ 
     933        int16_t matchlen; 
    934934        uint16_t rate, channels, samples; 
    935935        sample *buffer; 
     
    956956                                            (samples - SOURCE_COMPARE_WINDOW_SIZE) * channels, 
    957957                                            channels); 
     958                if (matchlen == -1) { 
     959                        return FALSE; 
     960                } 
    958961        } else { 
    959962                /* match with last samples of frame.  Start at the start of   */ 
     
    962965                                            (samples - SOURCE_COMPARE_WINDOW_SIZE) * channels,     /* wstart */ 
    963966                                            SOURCE_COMPARE_WINDOW_SIZE * channels,                 /* wlen   */ 
    964                                             0,                                           /* sstart */ 
     967                                            0,                                                     /* sstart */ 
    965968                                            (samples - 2 * SOURCE_COMPARE_WINDOW_SIZE) * channels, /* slen   */ 
    966969                                            channels); 
    967970                /* Want to measure from where frames will overlap.            */ 
     971                if (matchlen == -1) { 
     972                        return FALSE; 
     973                } 
    968974                matchlen = samples - matchlen - SOURCE_COMPARE_WINDOW_SIZE; 
    969975        } 
    970976 
    971         return ts_map32(rate, matchlen); 
     977        *adjust = ts_map32(rate, matchlen); 
     978        return TRUE; 
    972979} 
    973980 
     
    990997 
    991998        assert(i != -1); 
    992  
     999         
    9931000        drop_dur     = ts_convert(rate, drop_dur); 
    9941001        drop_samples = channels * drop_dur.ticks; 
     
    9971004        new_start = (sample*)md->rep[i]->data + drop_samples; 
    9981005        old_start = (sample*)md->rep[i]->data; 
    999  
     1006         
    10001007        merge_len = SOURCE_MERGE_LEN_SAMPLES * channels; 
    10011008        for (i = 0; i < merge_len; i++) { 
     
    10171024        int32_t tmp, a, b, i, merge_len; 
    10181025        sample *dst, *src; 
    1019  
     1026         
    10201027        assert(omd != NULL); 
    10211028        assert(imd != NULL); 
    1022  
     1029         
    10231030        for (i = omd->nrep - 1; i >= 0; i--) { 
    10241031                if (codec_get_native_info(omd->rep[i]->id, &rate, &channels)) { 
     
    10301037        a         = omd->rep[i]->data_len / sizeof(sample) * channels - merge_len; 
    10311038        dst       = (sample*)omd->rep[i]->data + a; 
    1032  
     1039         
    10331040        for (i = imd->nrep - 1; i >= 0; i--) { 
    10341041                if (codec_get_native_info(imd->rep[i]->id, &rate, &channels)) { 
     
    11031110        uint16_t rate, channels; 
    11041111        ts_t adjustment, frame_dur; 
    1105  
     1112         
    11061113        assert(src); 
    11071114        assert(md); 
     
    11341141                 * otherwise we might discard something we have not 
    11351142                 * classified.  */ 
    1136  
     1143                 
    11371144                if (ts_gt(skew_limit, src->skew_adjust)) { 
    1138                         adjustment = recommend_skew_adjust_dur(md, TRUE);  
     1145                        if (recommend_skew_adjust_dur(md, TRUE, &adjustment) == FALSE) { 
     1146                                /* No suitable adjustment found, and         */ 
     1147                                /* adjustment is not urgent so bail here...  */  
     1148                                return src->skew; 
     1149                        } 
    11391150                } else { 
    11401151                        /* Things are really skewed.  We're more than        */ 
     
    11811192                ts_t        insert_playout; 
    11821193 
    1183                 adjustment = recommend_skew_adjust_dur(md, FALSE); 
    1184                 if (adjustment.ticks == 152) { 
     1194                if (recommend_skew_adjust_dur(md, FALSE, &adjustment) == FALSE) { 
    11851195                        debug_msg("bad match\n"); 
    11861196                        return src->skew; 
    11871197                } 
     1198 
    11881199                debug_msg("Insert %d samples\n", adjustment.ticks); 
    11891200                pb_shift_units_back_after(src->media,   playout, adjustment);