cvStartReadSeq源碼分析

cvStartReadSeq初始化讀取部分的狀態。將指針指向seq中的起始數據快地址。

順序讀取可通過調用宏 CV_READ_SEQ_ELEM( read_elem, reader ),

逆序讀取可通過調用宏CV_REV_READ_SEQ_ELEM( read_elem, reader )。

這兩個宏都將序列元素讀進read_elem中, 並將指針移到下一個元素。

CV_IMPL void
cvStartReadSeq( const CvSeq *seq, CvSeqReader * reader, int reverse )
{
    CvSeqBlock *first_block;
    CvSeqBlock *last_block;

    CV_FUNCNAME( "cvStartReadSeq" );

    if( reader )
    {
        reader->seq = 0;                                           //初試化CvSeqReader結構體reader
        reader->block = 0;
        reader->ptr = reader->block_max = reader->block_min = 0;
    }

    __BEGIN__;

    if( !seq || !reader )
        CV_ERROR( CV_StsNullPtr, "" );

    reader->header_size = sizeof( CvSeqReader );
    reader->seq = (CvSeq*)seq;                                           //將reader->seq指向序列seq地址

    first_block = seq->first;                                             ////將first_block指向序列seq->first地址

    if( first_block )                                        //first_block是否以賦值
    {
        last_block = first_block->prev;
        reader->ptr = first_block->data;                      //reader當前指針指向first_block數據地址
        reader->prev_elem = CV_GET_LAST_ELEM( seq, last_block );
        reader->delta_index = seq->first->start_index;

        if( reverse )                                       //是正向還是反向讀數據
        {
            char *temp = reader->ptr;

            reader->ptr = reader->prev_elem;
            reader->prev_elem = temp;

            reader->block = last_block;
        }
        else
        {
            reader->block = first_block;
        }

        reader->block_min = reader->block->data;
        reader->block_max = reader->block_min + reader->block->count * seq->elem_size;
    }
    else                                     //如果first_block沒有賦值
    {
        reader->delta_index = 0;
        reader->block = 0;

        reader->ptr = reader->prev_elem = reader->block_min = reader->block_max = 0;
    }

    __END__;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章