DSNetwork的讨论:其中是不是存在问题啊?

msgsnd 2008-03-28 04:08:13
进来有时间,学习了一下DSNetwork,有些疑问:
关于bufferPool中:
1、部分代码没有看懂,我觉得有泄漏,并发现很久以前一个网友的看法与我一样,参见
http://topic.csdn.net/t/20051107/08/4375646.html
内容附在后面
2、我认为这两个变量没有必要存在
LIST_ENTRY m_Buffers ;
LIST_ENTRY m_RequestPool ;
参考MSPool也只是用了一个List,何必增加另外两个。

确实没看懂,有必要讨论一下,明白的人指教一下。


在接受端,使用双缓冲的代码,总感觉不对
CBuffer *CBufferPool::GetBuffer (
IN HANDLE hEvent,
IN DWORD dwTimeout
)
{

if(!IsListEmpty (& m_Buffers)
{
.......
}
else
{
// get a request
pBlockRequest = GetRequestLocked_ () ;
if (pBlockRequest == NULL) {
// memory allocation failure most likely
Unlock_ () ;

return NULL ;
}

// non-signal the event we'll wait on
pBlockRequest -> hEvent = hEvent ;
ResetEvent (pBlockRequest -> hEvent) ;

// insert into tail of request queue
InsertTailList (& m_Request, & pBlockRequest -> ListEntry) ;

// release the lock and wait
Unlock_ () ;
r = WaitForSingleObject (hEvent, dwTimeout) ;// dwTimeout =0

// reacquire the lock
Lock_ () ;

if (r == WAIT_TIMEOUT) {
// might have timed out and blocked on the lock aquisition while
// the BLOCK_REQUEST was being completed on the other side; if
// this is the case, we succeed the call, even though we timed
// out waiting

if (pBlockRequest -> pBuffer == NULL) {

// actual timeout; recycle the BLOCK_REQUEST and punt
RemoveEntryList (& pBlockRequest -> ListEntry) ;
RecycleRequestLocked_ (pBlockRequest) ;
Unlock_ () ;

return NULL ;
}
}

// we have a buffer, whether or not we timed out in the process of
// getting it

// we'll return this
pBuffer = pBlockRequest -> pBuffer ; //这个pBlockRequest -> pBuffer我认为始终为 NULL

// recycle the request struct
RecycleRequestLocked_ (pBlockRequest) ;
}
}



CBufferPool::Recycle (
IN CBuffer * pBuffer
)
{
LIST_ENTRY * pListEntry ;
BLOCK_REQUEST * pBlockRequest ;

Lock_ () ;

// check if there are queued outstanding requests
if (!IsListEmpty (& m_Request))
{
pListEntry = RemoveHeadList (& m_RequestPool) ; ///??????????
pBlockRequest = CONTAINING_RECORD (pListEntry, BLOCK_REQUEST, ListEntry) ;

// set the buffer and addref (BLOCK_REQUEST's)
pBlockRequest -> pBuffer = pBuffer ; //我觉得程序将无法访问pBlockRequest
pBuffer -> AddRef () ;

// signal; do this last
SetEvent (pBlockRequest -> hEvent) ;
}
}
...全文
118 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
msgsnd 2008-04-08
  • 打赏
  • 举报
回复
讨论的人不少,但是认真看的不多
msgsnd 2008-04-01
  • 打赏
  • 举报
回复
其实我认真的跟踪过程序的运行,发现:
1、有疑问的两个地方都走不到
2、存在大量的丢包问题
可能我的一些参数设置的问题,不能完全发现问题。
lserlohn 2008-03-31
  • 打赏
  • 举报
回复
我没特别认真看过,不少人认为这个例子写得不太好
msgsnd 2008-03-31
  • 打赏
  • 举报
回复
是不是没有几个人认真的看过这个sample啊?
介绍:本书是“DirectShow专业著作”丛书的第二本,侧重介绍了DirectShow技术在当前主要的几个领域中的应用,包括音视频采集、视频聊天、视频点播、视频叠加、媒体播放等。在介绍各种应用的同时,辅助以大量详尽的实例源代码。这些实例,不仅具有很强的实用价值和指导意义,更让读者理论联系实践,使学习DirectShow技术变得轻松自如。本书的配套光盘提供了DirectShow SDK 9.0的安装程序及书中各章节涉及的所有实例源代码。 本书结构合理,内容丰富新颖、条理清晰,适合广大的流媒体应用开发人员、系统设计人员、以及对Windows平台上多媒体处理感兴趣的编程爱好者学习和参考。 目录: 第1章 DirectShow系统 1 1.1 系统概述 1 1.2 使用GraphEdit 3 1.3 最后的话 6 第2章 音视频采集 9 2.1 功能介绍 9 2.2 通用采集 13 2.2.1 采集设备枚举 13 2.2.2 采集设备创建 25 2.2.3 开始视频预览 29 2.2.4 使用高效的VMR 45 2.2.5 选择输入端子 55 2.2.6 采集参数设置 64 2.2.7 支持数码摄像机 76 2.2.8 支持热插拔 82 2.2.9 支持即时抓图 93 2.2.10 采集到AVI文件 114 2.2.11 视频的压缩方案 118 2.3 电视接收 121 2.3.1 预备工作 121 2.3.2 电视选台 124 2.3.3 支持VBI 125 2.4 程序导读 130 2.4.1 一种不错的设计模式 130 2.4.2 程序结构 137 2.4.3 流程概要 141 第3章 网络应用 144 3.1 网络编程基础 144 3.1.1 TCP传输 145 3.1.2 UDP传输 166 3.1.3 IP组播技术 176 3.2 视频聊天 185 3.2.1 功能介绍 185 3.2.2 实现原理 187 3.2.3 采集设备自检 190 3.2.4 角色控制实现 204 3.2.5 开发网络发送Filter 223 3.2.6 开发网络接收Filter 230 3.2.7 程序导读 240 3.3 视频点播 244 3.3.1 功能介绍 244 3.3.2 实现原理 247 3.3.3 开发网络接收Filter 250 3.3.4 支持MPEG1、MP3 261 3.3.5 支持MPEG2 268 3.3.6 支持AVI 270 3.3.7 程序导读 275 第4章 视频叠加 311 4.1 视频抠像 311 4.1.1 抠像原理 311 4.1.2 抠像算法实现 312 4.1.3 MMX算法优化 318 4.1.4 开发抠像Filter 321 4.1.5 模拟实时源 339 4.1.6 应用演示 348 4.2 字符叠加 350 4.2.1 开发字符叠加Filter 350 4.2.2 与媒体播放集成 353 第5章 SDK源码赏析 361 5.1 DSNetwork例子 361 5.1.1 程序结构分析 361 5.1.2 模拟MPEG2-TS源 372 5.1.3 应用演示 380 5.2 VMR-9典型应用 385 5.2.1 位图叠加例子BitmapMix 385 5.2.2 字符叠加例子Ticker 396 5.2.3 流混合例子Blender 405 附录A DirectShow常见问题解答 411 A.1 一般性问题 411 A.2 编程问题 413 附录B PID扩展插件开发 420 B.1 PID应用原理 420 B.2 PID插件开发 421 B.3 PID插件的使用 429 附录C DES扩展Source(实现字符叠加) 432 C.1 自动化基础 433 C.2 字符叠加基础 433 C.3 Source Filter的开发 436 C.4 Source Filter的调试 448 C.5 DES应用举例 449 附录D 让Windows Media Player播放自定义格式文件 452 D.1 播放媒体文件的Filter Graph构建过程 452 D.2 两种解决方案 454 D.3 自定义格式文件的生成 455 D.4 Source Filter的开发 457 D.5 体验QQ文件的播放 471

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧