int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,

                              int64_t wanted_timestamp, int flags)

{

    int a, b, m;

    int64_t timestamp;



    a = -1;

    b = nb_entries;



    // Optimize appending index entries at the end.

    if (b && entries[b - 1].timestamp < wanted_timestamp)

        a = b - 1;



    while (b - a > 1) {

        m         = (a + b) >> 1;



        // Search for the next non-discarded packet.

        while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b) {

            m++;

            if (m == b && entries[m].timestamp >= wanted_timestamp) {

                m = b - 1;

                break;

            }

        }



        timestamp = entries[m].timestamp;

        if (timestamp >= wanted_timestamp)

            b = m;

        if (timestamp <= wanted_timestamp)

            a = m;

    }

    m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;



    if (!(flags & AVSEEK_FLAG_ANY))

        while (m >= 0 && m < nb_entries &&

               !(entries[m].flags & AVINDEX_KEYFRAME))

            m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;



    if (m == nb_entries)

        return -1;

    return m;

}

int ff_index_search_timestamp(const AVIndexEntry *entries, int nb_entries,

                              int64_t wanted_timestamp, int flags)

{

    int a, b, m;

    int64_t timestamp;



    a = -1;

    b = nb_entries;



    

    if (b && entries[b - 1].timestamp < wanted_timestamp)

        a = b - 1;



    while (b - a > 1) {

        m         = (a + b) >> 1;



        

        while ((entries[m].flags & AVINDEX_DISCARD_FRAME) && m < b) {

            m++;

            if (m == b && entries[m].timestamp >= wanted_timestamp) {

                m = b - 1;

                break;

            }

        }



        timestamp = entries[m].timestamp;

        if (timestamp >= wanted_timestamp)

            b = m;

        if (timestamp <= wanted_timestamp)

            a = m;

    }

    m = (flags & AVSEEK_FLAG_BACKWARD) ? a : b;



    if (!(flags & AVSEEK_FLAG_ANY))

        while (m >= 0 && m < nb_entries &&

               !(entries[m].flags & AVINDEX_KEYFRAME))

            m += (flags & AVSEEK_FLAG_BACKWARD) ? -1 : 1;



    if (m == nb_entries)

        return -1;

    return m;

}

int FUNC_0(const AVIndexEntry *VAR_0, int VAR_1,

                              int64_t VAR_2, int VAR_3)

{

    int VAR_4, VAR_5, VAR_6;

    int64_t timestamp;



    VAR_4 = -1;

    VAR_5 = VAR_1;



    

    if (VAR_5 && VAR_0[VAR_5 - 1].timestamp < VAR_2)

        VAR_4 = VAR_5 - 1;



    while (VAR_5 - VAR_4 > 1) {

        VAR_6         = (VAR_4 + VAR_5) >> 1;



        

        while ((VAR_0[VAR_6].VAR_3 & AVINDEX_DISCARD_FRAME) && VAR_6 < VAR_5) {

            VAR_6++;

            if (VAR_6 == VAR_5 && VAR_0[VAR_6].timestamp >= VAR_2) {

                VAR_6 = VAR_5 - 1;

                break;

            }

        }



        timestamp = VAR_0[VAR_6].timestamp;

        if (timestamp >= VAR_2)

            VAR_5 = VAR_6;

        if (timestamp <= VAR_2)

            VAR_4 = VAR_6;

    }

    VAR_6 = (VAR_3 & AVSEEK_FLAG_BACKWARD) ? VAR_4 : VAR_5;



    if (!(VAR_3 & AVSEEK_FLAG_ANY))

        while (VAR_6 >= 0 && VAR_6 < VAR_1 &&

               !(VAR_0[VAR_6].VAR_3 & AVINDEX_KEYFRAME))

            VAR_6 += (VAR_3 & AVSEEK_FLAG_BACKWARD) ? -1 : 1;



    if (VAR_6 == VAR_1)

        return -1;

    return VAR_6;

}

int FUNC_0(const AVIndexEntry *VAR_0, int VAR_1,
int64_t VAR_2, int VAR_3)
{ int VAR_4, VAR_5, VAR_6; int64_t timestamp; VAR_4 = -1; VAR_5 = VAR_1; if (VAR_5 && VAR_0[VAR_5 - 1].timestamp < VAR_2)
VAR_4 = VAR_5 - 1; while (VAR_5 - VAR_4 > 1) { VAR_6         = (VAR_4 + VAR_5) >> 1; while ((VAR_0[VAR_6].VAR_3 & AVINDEX_DISCARD_FRAME) && VAR_6 < VAR_5) { VAR_6++; if (VAR_6 == VAR_5 && VAR_0[VAR_6].timestamp >= VAR_2) { VAR_6 = VAR_5 - 1; break; } } timestamp = VAR_0[VAR_6].timestamp; if (timestamp >= VAR_2)
VAR_5 = VAR_6; if (timestamp <= VAR_2)
VAR_4 = VAR_6; } VAR_6 = (VAR_3 & AVSEEK_FLAG_BACKWARD) ? VAR_4 : VAR_5; if (!(VAR_3 & AVSEEK_FLAG_ANY))
while (VAR_6 >= 0 && VAR_6 < VAR_1 &&
!(VAR_0[VAR_6].VAR_3 & AVINDEX_KEYFRAME))
VAR_6 += (VAR_3 & AVSEEK_FLAG_BACKWARD) ? -1 : 1; if (VAR_6 == VAR_1)
return -1; return VAR_6; }