main.cpp 2.4 KB
#include "FFNvDecoderManager.h"
#include <iostream>

#include "cuda_kernels.h"

#include "NvJpegEncoder.h"

unsigned char *pHwRgb = nullptr;


void postDecoded(const void * userPtr, AVFrame * gpuFrame){
    FFNvDecoder* decoder = (FFNvDecoder*)userPtr;
    if (decoder!= nullptr)
    {
        cout << decoder->getName() << endl;
        const char* gpu_pixfmt = av_get_pix_fmt_name((AVPixelFormat)gpuFrame->format);
        cout << "pixfmt: " << gpu_pixfmt << endl;
        cout << "keyframe: " << gpuFrame->key_frame << " width: " << gpuFrame->width << " height: "<< gpuFrame->height << endl;
        cout << "decode successed ✿✿ヽ(°▽°)ノ✿ " << endl;

        if (gpuFrame->format == AV_PIX_FMT_CUDA)
        {
             cudaError_t cudaStatus;
            if(pHwRgb == nullptr){
                cudaStatus = cudaMalloc((void **)&pHwRgb, 3 * gpuFrame->width * gpuFrame->height * sizeof(unsigned char));
            }
            cudaStatus = cuda_common::CUDAToBGR((CUdeviceptr)gpuFrame->data[0],(CUdeviceptr)gpuFrame->data[1], gpuFrame->linesize[0], gpuFrame->linesize[1], pHwRgb, gpuFrame->width, gpuFrame->height);
            cudaDeviceSynchronize();
            if (cudaStatus != cudaSuccess) {
                cout << "CUDAToBGR failed !!!" << endl;
                return;
            }
            saveJpeg("/home/cmhu/FFNvDecoder/a.jpg", pHwRgb, gpuFrame->width, gpuFrame->height);  // 验证 CUDAToRGB 
        }
    }
}

int main(){

    cuda_common::setColorSpace2( ITU709, 0 );

    FFNvDecoderManager* pDecManager = FFNvDecoderManager::getInstance();
    // FFNvDecoder* decoder = pDecManager->createDecoder("rtmp://192.168.10.56:1935/objecteye/1",postDecoded,"dec1");
    // if (!decoder)
    // {
    //     return 1;
    // }
    // pDecManager->setUserPtr("dec1", decoder);
    // pDecManager->startDecodeByName("dec1");

    FFNvDecoder* dec2 = pDecManager->createDecoder("/home/cmhu/data/duan1.avi",postDecoded,"dec2");
    if (!dec2)
    {
        return 1;
    }
    pDecManager->setUserPtr("dec2", dec2);
    pDecManager->startDecodeByName("dec2");

    // while (getchar() != 'q');  

    // // pDecManager->closeDecoderByName("dec1");
    // // pDecManager->pauseDecoder("dec1");
    // pDecManager->pauseDecoder("dec2");

    // while (getchar() != 'q');

    // // pDecManager->resumeDecoder("dec1");
    // pDecManager->resumeDecoder("dec2");

    while (getchar() != 'q');

    pDecManager->closeAllDecoder();
}