今天在项目中用到SDL2.0的库做视频显示用,在其中出现不少问题,这里一一记录下来,并作为以后的参考。

同一个窗口句柄在多次使用SDL_CreateWindowFrom和SDL_DestroyWindow以后,发现程序运行正常,但视频显示不出来的问题。

第一次将Hwnd传递给SDL_CreateWindowFrom,创建一个显示窗口给SDL,随后在不使用的时候,调用SDL_DestroyWindow,将刚刚创建的显示窗口销毁,释放显示相关资源之后,然后在再次使用SDL_CreateWindowFrom的时候,将同一个句柄传递给SDL_CreateWindowFrom,返回成功,后续的操作也全部正常进行,但视频在窗口上始终显示不出来。

对于其中的原因,我找了好久,后面从SDL的源码中才慢慢推测并怀疑一些问题,SDL源码如下:

 void
SDL_DestroyWindow(SDL_Window * window)
{
SDL_VideoDisplay *display; CHECK_WINDOW_MAGIC(window, ); /* Restore video mode, etc. */
SDL_HideWindow(window);/*注意这个地方哦*/ /* Make sure this window no longer has focus */
if (SDL_GetKeyboardFocus() == window) {
SDL_SetKeyboardFocus(NULL);
}
if (SDL_GetMouseFocus() == window) {
SDL_SetMouseFocus(NULL);
} /* make no context current if this is the current context window. */
if (window->flags & SDL_WINDOW_OPENGL) {
if (_this->current_glwin == window) {
SDL_GL_MakeCurrent(window, NULL);
}
} if (window->surface) {
window->surface->flags &= ~SDL_DONTFREE;
SDL_FreeSurface(window->surface);
}
if (_this->DestroyWindowFramebuffer) {
_this->DestroyWindowFramebuffer(_this, window);
}
if (_this->DestroyWindow) {
_this->DestroyWindow(_this, window);
}
if (window->flags & SDL_WINDOW_OPENGL) {
SDL_GL_UnloadLibrary();
} display = SDL_GetDisplayForWindow(window);
if (display->fullscreen_window == window) {
display->fullscreen_window = NULL;
} /* Now invalidate magic */
window->magic = NULL; /* Free memory associated with the window */
SDL_free(window->title);
SDL_FreeSurface(window->icon);
SDL_free(window->gamma);
while (window->data) {
SDL_WindowUserData *data = window->data; window->data = data->next;
SDL_free(data->name);
SDL_free(data);
} /* Unlink the window from the list */
if (window->next) {
window->next->prev = window->prev;
}
if (window->prev) {
window->prev->next = window->next;
} else {
_this->windows = window->next;
} SDL_free(window);
}

从上面的代码,我开始怀疑是不是在调用SDL_DestroyWindow以后,SDL将窗口给隐藏了,导致在上面显示视频的时候,始终显示不出来的问题。

于是我在自己的测试代码中加入如下语句,在调用SDL_DestroyWindow以后,我一句:

vDisplay.ShowWindow(SW_SHOWNORMAL);//想显示窗口给显示出来,show出来
其中vDisplay对应于显示的窗口控件对象。

在测试的项目代码中加入这行代码以后,就完美的解决了项目的问题。

=============================================================

问题2:

当我在MFC的UI消息相应函数中创建显示窗口的一些相关资源,在后台创建的单独线程,用于刷新和更新显示数据,然后在UI的关闭消息响应中释放和销毁SDL窗口相关资源。

问题来了,当我使用全屏的时候,出现了后台更新数据线程一直报错:

     if(o_pSdlHelper->SDL_RenderClear(pDispContext->pStruOut->pRender)<)
{
char outstr[]={};
const char *pbuf=o_pSdlHelper->SDL_GetError();
_snprintf(outstr,sizeof(outstr),"%s \n",pbuf);//这里出错信息为:Reset(): INVALIDCALL
OutputDebugStringA(outstr);
memset(outstr,,sizeof(outstr)); return PCI_MC_UNKNOWN_ERR;
}

这就让我奇怪了,之前我全屏的时候,没有错误啊,现在为什么有错?而且显示窗口画面也没有显示刷新了!!

于是我想了下和之前的代码有什么不同,唯一的不同在于,我调用创建窗口和创建渲染,纹理等等这些操作等资源放在了和更新数据的同一个线程中,没办法,不知道原因,只有改回原来的代码,将创建的代码从UI消息响应中调入和后台刷新数据同一个线程中。结果奇怪的是,居然这样全屏操作能运行?

见鬼了,这是啥原因?

//这个原因,还有待查证相关资料和SDL源码才能知道。暂时解决了,但不知道原因何在。

=========================================

最近使用sdl老是出现莫名其妙的错误,后面从sdl源码中知道:

https://bugzilla.libsdl.org/show_bug.cgi?id=1995

/////////////////////////////////////////////////////////////////////////////////////////

sdl做视频显示的时候,在不断调整窗口大小的时候,会出现sdl崩溃,后面跟踪发现崩溃在sdl的windowsizechange消息,render->updateview这个函数上.

不过这个崩溃,貌似也只是会在部分机器上崩溃,具体原因还不得而知,但目前我的解决方法是sdl的消息响应处理函数给注释掉了:

 #ifdef GWLP_WNDPROC
data->wndproc = (WNDPROC) GetWindowLongPtr(hwnd, GWLP_WNDPROC);
if (data->wndproc == WIN_WindowProc) {
data->wndproc = NULL;
} else {//modefy by lhp-20150720
//SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG_PTR) WIN_WindowProc);
}
#else
data->wndproc = (WNDPROC) GetWindowLong(hwnd, GWL_WNDPROC);
if (data->wndproc == WIN_WindowProc) {
data->wndproc = NULL;
} else {//modefy by lhp-20150720-注释这个sdl消息接管函数
//SetWindowLong(hwnd, GWL_WNDPROC, (LONG_PTR) WIN_WindowProc);
}
#endif

出自:http://www.cnblogs.com/lihaiping/p/4324315.html

(原)SDL调试心得的更多相关文章

  1. LPC2478_调试心得(转)

    1.在调试“E:\htwang\smart2200v201\ARM嵌入式系统实验教程(二)\开发板出厂编程程序\液晶显示程序\LCM_Disp”的程序时,想使用外部RAM进行仿真调试,在将ADS1.2 ...

  2. MIPI接口LCD屏调试心得(转)

    源: MIPI接口LCD屏调试心得

  3. VGA调试心得

    以前自己调试过视频信号,无非就时钟加行场同步加数据线,如果视频信号出问题,第一看现象,第二测频率,反正出问题不是消隐信号出问题,就是时钟频率出问题.通过这种方式也调试成功过几个显示屏,然后就以为自己对 ...

  4. (原)阅读Android-Camera2Video的demo源码和调试心得

    转载请注明出处:http://www.cnblogs.com/lihaiping/p/6142512.html   最近因为项目需要使用到camera的功能,所以针对官方的demo源码进行一番阅读,并 ...

  5. js断点调试心得

    虽然网上已经有多的数不清的调试教程了,但仍然没有发现哪篇文章写的通俗易懂,索性自己尝试写写自己的一些使用习惯或者说是心得,希望对那些还不是很懂得使用断点调试的孩子有一些帮助(大神请无视~). 1.断点 ...

  6. React Native调试心得

    在做React Native开发时,少不了的需要对React Native程序进行调试.调试程序是每一位开发者的基本功,高效的调试不仅能提高开发效率,也能降低Bug率.本文将向大家分享React Na ...

  7. Pycharm Debug调试心得

    1.操作步骤: 1-1.添加断点:直接在标记处点击鼠标左键即可.(删除断点只需再点击断点处即可) 1-2.Debug下运行代码 1-3.按照所需调试进行代码调试.Debug的调试方式如下所示: 分别为 ...

  8. IE漏洞的调试心得

    在调试漏洞的过程中,个人感觉最棘手的就是ie浏览器的漏洞和flash player的漏洞了.这里打算记录一下学习过程中的心得(主要是基于uaf类),以方便新人学习. 首先,ie漏洞与众不同的是,程序的 ...

  9. iOS 调试心得

    修复 bug 占用我们日常开发的大部分时间,熟练的使用调试工具可以给我们节约大部分的时间. LLDB 的常用命令 expression expresion 是一个非常常用的命令,我们可以通过这个命令来 ...

随机推荐

  1. C++11 constexpr使用

    C++11为了提高代码执行效率做了一些改善.这种改善之一就是:生成常量表达式,允许程序利用编译时的计算能力.假如你熟悉模板元编程,你将发现constexpr使这一切变得更加简单.constexpr使我 ...

  2. 【驱动】LCD驱动(FrameBuffer)分析

    背景知识 在多媒体的推动下,彩色LCD越来越多地应用到嵌入式系统中,PDA和手机等大多都采用LCD作为显示器材,因此LCD的应用很有实际意义! LCD工作的硬件需求:要使一块LCD正常的显示文字或图像 ...

  3. ubuntu14 安装 端口转发工具rinetd

    1,下载  第一中方式 用 apt-get install rinetd  或者从官网下载http://www.boutell.com/rinetd/ 2,配置,端口转发的配置在 /etc/rinet ...

  4. openfire聊天记录插件

    package com.sqj.openfire.chat.logs; import java.io.File; import java.util.Date; import java.util.Lis ...

  5. pthread之线程堆栈

    转:http://blog.csdn.net/horstlinux/article/details/7666032 //先来讲说线程内存相关的东西,主要有下面几条: //进程中的所有的线程共享相同的地 ...

  6. python 使用pillow将图片转换为webp格式

    1.webp格式 webp格式是谷歌开发的一种旨在加快图片加载速度的格式,将图片转为webp格式后,体积约为原来的2/3,这可以节省大量的服务器带宽,微信公众号文章里的图片就是这种格式的. 2.使用p ...

  7. Python3求栈最小元素

    [本文出自天外归云的博客园] 思路:入栈时靠辅助栈记住主栈元素中最小的,出栈时一直pop主栈元素直到辅助栈栈顶元素出现. 代码如下(定义栈.超级栈): class Stack(object): def ...

  8. JAVA-数据库之查询记录

    相关资料:<21天学通Java Web开发> ResultSet结果集1.使用exectteQuery()方法查询数据.2.exectueQuery()方法接收一个查询SQL语句.3.返回 ...

  9. ARKit从入门到精通(3)-ARKit自定义实现

    转载:http://blog.csdn.net/u013263917/article/details/73038566 在上一小节中ARKit从入门到精通(2)-ARKit工作原理及流程介绍,我们完整 ...

  10. iOS提示The app icon set named "AppIcon" did not have any applicable content 错误

    按照您的错误提示您应该是,这样设置的吧,看下下图: 如果是的话,请确保您将错有的Icon图片都拽进了Images.xcassets这个文件夹中,如下图所示: 如果您的Icon图片并没有在Images. ...