使用libde265直接显示过滤器

Direct Show Filter using libde265

本文关键字:显示 过滤器 libde265 使用      更新时间:2023-10-16

嘿,我正在研究一个解码器directshow过滤器。我使用libde265库用于此目的。但我面临着一些问题:

HRESULT decoder::Transform(IMediaSample *pIn, IMediaSample *pOut)
{
    FILE * fh;
    tn++;
    long    sizein = 0;
    BYTE    *bufin;
    BYTE *bufout;
    BYTE *central_buffer;
    int counter_tobuff = 0;
    unsigned long   nSrcDataSize;
    unsigned long   nMaxDestSize;
    int totalbytes;
    totalbytes = 0;
    HRESULT         hr;
    // get the input and output buffers 
    pIn->GetPointer(&bufin);
    pOut->GetPointer(&bufout);
    nSrcDataSize = pIn->GetActualDataLength();

    /**************************************de265.cc******************************************************/
    de265_error err;


        /********Intilializing the decoder*******/
        if (tn == 1)
        {
            Init_decoder();
            //de265_start_worker_threads(ctx, 1);
            //de265_set_parameter_bool(ctx, DE265_DECODER_PARAM_DUMP_PPS_HEADERS, false);
        }
        /********Setting the parameters ********/

        /*de265_set_parameter_bool(ctx, DE265_DECODER_PARAM_DUMP_PPS_HEADERS, true);*/



        err = de265_push_data(ctx, bufin,nSrcDataSize, 1, NULL);

        pos += nSrcDataSize;
        if (!de265_isOK(err)) {
        }
        int more = 0;
        const de265_image * img;
        do {
            err = de265_decode(ctx, &more);
            if (err == DE265_OK)
            {
                img = de265_get_next_picture(ctx);
                if (img)
                {

                    set_output_filename("D:\testnotcreated.yuv");
                    write_picture(img);
                    more = 0;
                }
            }
            else
            {
                memcpy(bufout, bufin, nSrcDataSize);
                more = 0;
            }

        } while (more);
        counter_tobuff = 0;

    /***************************************************************************************************/
        //nMaxDestSize = pOut->GetSize();
    hr = pOut->SetActualDataLength(nSrcDataSize);
    //free(bufin);
    if (FAILED(hr))
    {
        //m_pDbg->SendDbg(APP_ID_RGB2YUY2, DBG_ERROR, "CRGB2YUY2::Transform SetActualDataLength failed");
        return S_FALSE;
    }
    return S_OK;
}

我假设的是bufin不断接收样本,我必须将其传递给push_data函数,然后解码并写入文件。但事实并非如此。这不是解码。有时它解码一个或两个帧。虽然这段代码是在exe中测试的,但不同之处在于,在exe中,我们是从文件中读取数据,而这里我们是在连续流上工作。因此,在处理数据时是否存在任何问题,因为它是连续的实时编码视频流。所以我能做些什么来整理它,使它解码好,并写在一个文件。任何帮助将是非常感激的,因为我卡住了。

H.265中图片的解码顺序与显示顺序不一致。这意味着解码器有时必须延迟帧的输出,直到达到其显示位置。因此,对于某些帧,它将不输出任何内容,而对于其他帧,它将一次输出多个(缓冲的)帧。您可以使用用户数据来识别哪个帧来自哪个输入。