Changeset 1773


Ignore:
Timestamp:
Feb 2, 2008 4:37:43 PM (17 years ago)
Author:
nanang
Message:

Ticket #461:
Fixed bug in find_matched_window(), the ref pointer is not correctly set.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/jbuf2/pjmedia/src/pjmedia/jbuf2.c

    r1770 r1773  
    452452{ 
    453453    PJ_UNUSED_ARG(jb); 
     454    PJ_ASSERT_RETURN(jb, PJ_EINVAL); 
    454455 
    455456    return PJ_SUCCESS; 
     
    881882} 
    882883 
    883  
    884 /* Find matching samples pattern */ 
     884/* Window len for matching samples */ 
    885885#define MATCH_WINDOW_LEN    8 
    886886 
     887/* Find matching samples pattern, longest possible distance for !left_ref */ 
    887888static pj_status_t find_matched_window(jb_vbuf *buf, pj_bool_t left_ref,  
     889                                       int pref_dist, 
     890                                       unsigned *ref_, unsigned *match_) 
     891{ 
     892    const int MATCH_THRESHOLD = MATCH_WINDOW_LEN*1200; 
     893    unsigned ref, ptr, end; 
     894    int i, similarity, s1, s2; 
     895 
     896    if (buf->size/2 < MATCH_WINDOW_LEN * 2) { 
     897        TRACE__((THIS_FILE, "Buf size too small (%d) to perform matching", 
     898                 buf->size)); 
     899        return PJ_ENOTFOUND; 
     900    } 
     901 
     902    /* Check minimum distance */ 
     903    pj_assert(pref_dist >= MATCH_WINDOW_LEN); 
     904 
     905    if (left_ref) { 
     906        ref = 0; 
     907        end = MATCH_WINDOW_LEN - 1; 
     908        if (buf->size/2 > pref_dist + MATCH_WINDOW_LEN) 
     909            ptr = pref_dist; 
     910        else 
     911            ptr = buf->size/2 - MATCH_WINDOW_LEN; 
     912    } else { 
     913        ref = buf->size/2 - MATCH_WINDOW_LEN; 
     914 
     915        /* do not +1, this is for insertion, inserting 0 sample is no use */ 
     916        end = ref - MATCH_WINDOW_LEN; 
     917        if ((int)ref > pref_dist) 
     918            ptr = ref - pref_dist; 
     919        else 
     920            ptr = 0; 
     921    } 
     922 
     923    *ref_ = ref; 
     924 
     925    while (ptr != end) { 
     926        similarity = 0; 
     927        for (i = 0; i < MATCH_WINDOW_LEN; ++i) { 
     928            s1 = jb_vbuf_get_sample(buf, ref+i); 
     929            s2 = jb_vbuf_get_sample(buf, ptr+i); 
     930            similarity += PJ_ABS(s1 - s2); 
     931            if (similarity >= MATCH_THRESHOLD) 
     932                break; 
     933        } 
     934 
     935        if (similarity <= MATCH_THRESHOLD) { 
     936            *match_ = ptr; 
     937            return PJ_SUCCESS; 
     938        } 
     939        ptr += left_ref ? -1 : 1; 
     940    } 
     941 
     942    return PJ_ENOTFOUND; 
     943} 
     944 
     945/* Find matching samples pattern, shortest possible distance for !left_ref */ 
     946static pj_status_t find_matched_window2(jb_vbuf *buf, pj_bool_t left_ref,  
    888947                                       int pref_dist, 
    889948                                       unsigned *ref_, unsigned *match_) 
     
    910969            ptr = buf->size/2 - MATCH_WINDOW_LEN - 1; 
    911970    } else { 
    912         ref = buf->size/2 - MATCH_WINDOW_LEN - 1; 
    913  
    914         /* do not +1, this is for insertion, inserting 0 sample is no use */ 
    915         end = ref - MATCH_WINDOW_LEN; 
    916         if ((int)ref > pref_dist) 
    917             ptr = ref - pref_dist; 
    918         else 
    919             ptr = 0; 
     971        ref = buf->size/2 - MATCH_WINDOW_LEN; 
     972        end = -1; 
     973        ptr = ref - MATCH_WINDOW_LEN; 
    920974    } 
    921975 
     
    936990            return PJ_SUCCESS; 
    937991        } 
    938         ptr += left_ref ? -1 : 1; 
     992        ptr += left_ref ? -1 : -1; 
    939993    } 
    940994 
Note: See TracChangeset for help on using the changeset viewer.