使用libde265直接显示过滤器
Direct Show Filter using libde265
嘿,我正在研究一个解码器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中图片的解码顺序与显示顺序不一致。这意味着解码器有时必须延迟帧的输出,直到达到其显示位置。因此,对于某些帧,它将不输出任何内容,而对于其他帧,它将一次输出多个(缓冲的)帧。您可以使用用户数据来识别哪个帧来自哪个输入。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 字符串-C++后显示的随机字符
- 继承期间显示未知行为的子类
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 带过滤器的现代迭代c++集合
- 程序崩溃并显示"std::out_of_range"错误
- 如何在C++中用std::cout正确显示带十六进制的字符串文本
- 为什么在C的循环中使用printf的Rust代码不显示输出,而在C++的循环中显示std::cout
- 从数据库实时显示QT c++中的数据
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 显示错误输出的简单数组排序程序
- Qt自定义QPush按钮未显示在布局上
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- Qt:事件过滤器在显示 QCompleter 时不接收按键
- 如何显示视频捕获过滤器对话框(亮度,曝光等相机设置)
- 直接显示过滤器错误"Class is not registered"
- 添加视频过滤器直接显示项目
- 叉直接显示三通过滤器
- 使用libde265直接显示过滤器