ijk硬编码队列

typedef struct sort_queue {

    AVFrame pic; //解码后一帧

    int serial;

    int64_t sort; //如果有pts则为pts,否则为dts

    volatile struct sort_queue * nextframe; //下一帧

} sort_queue; //解码队列,排在前面的先出,根据pts排序

 volatile sort_queue      *m_sort_queue; //记录对头

volatile int32_t  m_queue_depth; //队列深度


static void SortQueuePush(Ijk_VideoToolBox_Opaque * ctx, sort_queue * newFrame) //插入一帧

{

    pthread_mutex_lock(&ctx->m_queue_mutex);

    volatile sort_queue*queueWalker = ctx->m_sort_queue;

    if(!queueWalker || (newFrame->sort< queueWalker->sort)) { //这种情况下将newFrame直接插入首端

        newFrame->nextframe= queueWalker;

        ctx->m_sort_queue= newFrame;

    }else{ //这种情况下根据sort即pts插入到合适位置

        bool frameInserted =false;

        volatile sort_queue*nextFrame =NULL;

        while(!frameInserted) {

            nextFrame = queueWalker->nextframe;

            if(!nextFrame || (newFrame->sort< nextFrame->sort)) {

                newFrame->nextframe= nextFrame;

                queueWalker->nextframe= newFrame;

                frameInserted =true;

            }

            queueWalker = nextFrame;

        }

    }

    ctx->m_queue_depth++;

    pthread_mutex_unlock(&ctx->m_queue_mutex);

}

static void SortQueuePop(Ijk_VideoToolBox_Opaque* context) //删除一帧

{

    if(!context->m_sort_queue|| context->m_queue_depth==0) {

        return;

    }

    pthread_mutex_lock(&context->m_queue_mutex);

    volatile sort_queue*top_frame = context->m_sort_queue;

    context->m_sort_queue = context->m_sort_queue->nextframe;

    context->m_queue_depth--;

    pthread_mutex_unlock(&context->m_queue_mutex);

    CVBufferRelease(top_frame->pic.opaque);

    free((void*)top_frame);

}

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容