如何将GPU设备ID传递给NVENC

时间:2013-08-12 16:35:26

标签: encoding gpu nvidia

我们正在使用与NVIDIA的给定样本松散相似的库。但是,这些示例是针对单个GPU场景而设计的。

在我们的服务器上,我们有8个Kepler K10 GPU,我们希望将参数作为设备ID作为输入传递,然后将其传递给库中的NVENC API。有没有办法做到这一点?

这是init函数:

static av_cold int NVENC_init(AVCodecContext *avctx)
{

        NVENCContext *x4 = avctx->priv_data;

        x4->p_nv264IntefaceCtxt = (nv264InterfaceCtxt *)av_malloc(sizeof(nv264InterfaceCtxt));

        x4->p_nv264IntefaceCtxt->width       = avctx->width;
        x4->p_nv264IntefaceCtxt->height      = avctx->height;
        if (avctx->bit_rate) {
                x4->p_nv264IntefaceCtxt->avgBitRate  = avctx->bit_rate;
        }else
        {
                x4->p_nv264IntefaceCtxt->avgBitRate = 128000;
        }
        x4->p_nv264IntefaceCtxt->peakBitRate = 1.1*(x4->p_nv264IntefaceCtxt->avgBitRate);
        if (avctx->gop_size >= 0)
        {
                x4->p_nv264IntefaceCtxt->gopLength = avctx->gop_size;
        }
        else
        {
                x4->p_nv264IntefaceCtxt->gopLength = 30;
        }

        x4->p_nv264IntefaceCtxt->frameRateNum = x4->frameRateNum ;
        x4->p_nv264IntefaceCtxt->frameRateDen = x4->frameRateDen;
        x4->p_nv264IntefaceCtxt->rc_mode = x4->rc_mode;
        x4->p_nv264IntefaceCtxt->idr_period = x4->p_nv264IntefaceCtxt->gopLength;
        x4->p_nv264IntefaceCtxt->insertSEIMessage = x4->insertSEIMessage;
        x4->p_nv264IntefaceCtxt->cabacenable      = x4->cabacenable;
        x4->p_nv264IntefaceCtxt->profile          = x4->profile;
        x4->p_nv264IntefaceCtxt->gpu_number       = x4->gpu_number;

        x4->opStreamBufAllocSize = (avctx->width) * (avctx->height);
        x4->p_opStream = (unsigned char *)malloc(x4->opStreamBufAllocSize*sizeof(unsigned char));
        if(NULL == x4->p_opStream)
        {
                return -1;
        }

        if(0 != nv264Enc_Init(x4->p_nv264IntefaceCtxt))
        {
                return -1;
        }

        // copy the extradate to appropriate structure
        if ((avctx->flags & CODEC_FLAG_GLOBAL_HEADER) && (x4->p_nv264IntefaceCtxt->spsSize > 0)) {
                uint8_t *p;

                avctx->extradata = p = av_malloc(x4->p_nv264IntefaceCtxt->spsSize);
         memcpy(p,x4->p_nv264IntefaceCtxt->spsbuffer,x4->p_nv264IntefaceCtxt->spsSize);
                avctx->extradata_size = x4->p_nv264IntefaceCtxt->spsSize;
        }
        return 0;
}

1 个答案:

答案 0 :(得分:0)

检查nv264Enc_Init(x4-> p_nv264IntefaceCtxt))函数。

你的答案就是这个功能。 :)