11yichengming

11yichengming

1个粉丝

9

问答

0

专栏

0

资料

11yichengming  发布于  2016-09-19 21:03:20
采纳率 0%
9个问答
4946

SDL编译通过,但是SDL_SaveBMP直接段错误(Segmentation fault)

 

如题,想实现动态的OSD功能,即能够在不同的时段内更换不同的位图,freetype 、sdl 、 sdl_ttf均已经交叉编译通过,但是写了个demo,直接段错误。 参考的这个帖子: http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=11465

我来回答
回答13个
时间排序
认可量排序

11yichengming

1个粉丝

9

问答

0

专栏

0

资料

11yichengming 2016-09-19 21:04:51
认可0
[code]#include                                                                                                                                                                                           
#include
#include "SDL.h"
#include "SDL_ttf.h"


int main(int argc,char **argv)
{
    fprintf(stdout, "main starting..\n");
    TTF_Font *font;
    SDL_Surface *text, *temp;
    /* Initialize the TTF library */
    if ( TTF_Init() < 0 ) {
        fprintf(stderr, "Couldn't initialize TTF: %s\n",SDL_GetError());
        SDL_Quit();
        return -1;
    }

    fprintf(stdout, "TTF_Init finished\n");

    SDL_Color forecol= { 0x00, 0x00, 0x00, 0 };
    //char *string="你好啊";
    char *string="yicm";

    fprintf(stdout, "variant init finished\n");

    if(!(text = TTF_RenderUTF8_Solid(font, string, forecol))) {
        // handle error here, perhaps print TTF_GetError at least
        fprintf(stderr, "TTF_RenderUTF8_Sold error\n");
        SDL_Quit();
        return -1;
    } else {
        // SDL_BlitSurface(text_surface,NULL,screen,NULL);
        // perhaps we can reuse it, but I assume not for simplicity.
        // SDL_FreeSurface(text_surface);
    }

    SDL_LockSurface(text);
    if(SDL_SaveBMP(text, "1.bmp") != 0)
    {
        fprintf(stderr, "SDL_SaveBMP() Failed.\n");
        SDL_UnlockSurface(text);
        SDL_FreeSurface(text);
        SDL_Quit();
        return -1;
    }
    SDL_UnlockSurface(text);
    //SDL_SaveBMP(text, "1.bmp");

    SDL_FreeSurface(text);
    TTF_CloseFont(font);
    TTF_Quit();

    return 0;
}      [/code]

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-20 08:12:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38007&ptid=12702]11yichengming 发表于 2016-9-19 21:04[/url]
[/quote]

楼主好像没给font赋值就直接用了

是不是缺了类似如下的工作
      font = TTF_OpenFont("./simhei.ttf", 48);
      if ( font == NULL )
      {
         printf("load font error ! \n");
      }

wahuqeir

0个粉丝

1

问答

0

专栏

1

资料

wahuqeir 2016-09-20 09:32:35
认可0
段错误一般都是指针操作产生,楼主可以在代码中加点打印,定位出现错误的位置,再往前追溯相关指针的定义和使用,如指针定义初始化,指针使用判空,指针释放等

11yichengming

1个粉丝

9

问答

0

专栏

0

资料

11yichengming 2016-09-20 16:01:07
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38028&ptid=12702]zhuangweiye 发表于 2016-9-20 08:12[/url]
楼主好像没给font赋值就直接用了

是不是缺了类似如下的工作
[/quote]

加上了,但是还是一样的地方段错误。这种是直接在SDL_SaveBMP里面段错误的,不是我的上层demo出问题了,不知道编译库通过了是不是少了啥东西。。

11yichengming

1个粉丝

9

问答

0

专栏

0

资料

11yichengming 2016-09-20 16:02:01
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38034&ptid=12702]wahuqeir 发表于 2016-9-20 09:32[/url]
段错误一般都是指针操作产生,楼主可以在代码中加点打印,定位出现错误的位置,再往前追溯相关指针的定义和 ...[/quote]

感谢回复,这种是在SDL_SaveBMP里面段错误的,那问题在编译出的库上出问题了。

11yichengming

1个粉丝

9

问答

0

专栏

0

资料

11yichengming 2016-09-21 01:43:16
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38028&ptid=12702]zhuangweiye 发表于 2016-9-20 08:12[/url]
楼主好像没给font赋值就直接用了

是不是缺了类似如下的工作
[/quote]

我想直接用这三个行数可以实现吗?我的思路是对的吧?region绑定vpss的方式,然后用SDL直接获取bitmap并Update,求大神指导。
[code]HI_S32 ST_COMM_OSD_Init()
{
    RGN_HANDLE Handle;

    HI_S32 s32Ret = HI_SUCCESS;
   // 默认设置为0
    Handle = 0;

    RGN_ATTR_S stRgnAttr;
    stRgnAttr.enType = OVERLAYEX_RGN;
   
    stRgnAttr.unAttr.stOverlayEx.enPixelFmt = PIXEL_FORMAT_RGB_1555;
    stRgnAttr.unAttr.stOverlayEx.stSize.u32Width = 96;
    stRgnAttr.unAttr.stOverlayEx.stSize.u32Height = 32;
    stRgnAttr.unAttr.stOverlayEx.u32BgColor = 0x0000ffff;
   
    // Create Region
    s32Ret = HI_MPI_RGN_Create(Handle, &stRgnAttr);
    if(HI_SUCCESS != s32Ret)
    {
        fprintf(stderr, "HI_MPI_RGN_Create error with 0x%x\n", s32Ret);

        return -1;
    }

    return 0;
}


static SDL_Surface* ST_COMM_OSD_SDL_String2Bitmap(const char *str)
{
    /*
    if(!str || !bitmap)
    {
        fprintf(stderr, "ST_COMM_OSD_String2Bitmap is failed with : input param is invalid\n");
        return NULL;
    }
    */
    if(TTF_Init() < 0 )
    {  
        fprintf(stderr, "Couldn't initialize TTF: %s\n", SDL_GetError());
        SDL_Quit();
        return NULL;
    }

    TTF_Font *font = TTF_OpenFont("./font/fzlth.ttf", 12);
    if ( font == NULL )
    {   
        fprintf(stderr, "ST_COMM_OSD_SDL_Init load font is error! \n");

        return NULL;
    }

    SDL_Color forecol = {0xff, 0xff, 0xff, 0xff};
    SDL_Surface *text;
    text = TTF_RenderUTF8_Solid(font, str, forecol);

    SDL_PixelFormat *fmt;
    fmt = (SDL_PixelFormat*)malloc(sizeof(SDL_PixelFormat));
    memset(fmt,0,sizeof(SDL_PixelFormat));
    fmt->BitsPerPixel = 16;
    fmt->BytesPerPixel = 2;

    SDL_Surface *temp = SDL_ConvertSurface(text, fmt, 0);
    //stBitmap->u32Width = temp->w;
    //stBitmap->u32Height = temp->h;
    //memcpy(stBitmap, temp->pixels, (temp->pitch * temp->h));
    //stBitmap->pData= temp->pixels;

    //stBitmap.enPixelFormat= PIXEL_FORMAT_RGB_1555;

    SDL_FreeSurface(text);  
    //SDL_FreeSurface(temp);
    free(fmt);
    TTF_CloseFont(font);  
    TTF_Quit();

    return temp;
}

HI_S32 ST_COMM_OSD_Update(RGN_HANDLE Handle)
{
    HI_S32 s32Ret = HI_SUCCESS;

    RGN_ATTR_S stRgnAttr;

    s32Ret = HI_MPI_RGN_GetAttr(Handle,&stRgnAttr);
    if(s32Ret != HI_SUCCESS)
    {
        fprintf(stderr, "HI_MPI_RGN_GetAttr error with 0x%x\n", s32Ret);

        return s32Ret;
    }

    stRgnAttr.unAttr.stOverlayEx.u32BgColor = 0x0000cccc;
    RGN_CANVAS_INFO_S JYOsdCanvasInfo;

    s32Ret = HI_MPI_RGN_GetCanvasInfo(Handle, &JYOsdCanvasInfo);
    if(HI_SUCCESS != s32Ret)
    {
        fprintf(stderr, "HI_MPI_RGN_GetCanvasInfo error with 0x%x\n", s32Ret);
        return s32Ret;
    }
    fprintf(stdout, "HI_MPI_RGN_GetCanvasInfo : width, %u height, %u\n", JYOsdCanvasInfo.stSize.u32Width, JYOsdCanvasInfo.stSize.u32Height);

    BITMAP_S JYstBitmap;
    SIZE_S JYSize;

    JYstBitmap.pData = (HI_VOID*)JYOsdCanvasInfo.u32VirtAddr;
    JYSize.u32Width  = JYOsdCanvasInfo.stSize.u32Width;
    JYSize.u32Height = JYOsdCanvasInfo.stSize.u32Height;

    // -----S
    SDL_Surface *surface = ST_COMM_OSD_SDL_String2Bitmap("1111111111111111");
    JYstBitmap.u32Width = surface->w;
    JYstBitmap.u32Height = surface->h;
    fprintf(stdout, "surface->w, %u surface->h,%u\n", JYstBitmap.u32Width, JYstBitmap.u32Height);
    JYstBitmap.pData= surface->pixels;

    JYstBitmap.enPixelFormat= PIXEL_FORMAT_RGB_1555;
    s32Ret = HI_MPI_RGN_SetBitMap(Handle, &JYstBitmap);
    if(s32Ret)
    {
        fprintf(stderr, "HI_MPI_RGN_SetBitMap is failed: 0x%x\n");
    }
    // -----E


    s32Ret = HI_MPI_RGN_UpdateCanvas(Handle);
    if(HI_SUCCESS != s32Ret)
    {
        printf("HI_MPI_RGN_UpdateCanvas error! jeeyinOsd.cpp \n");

        return s32Ret;
    }

    SDL_FreeSurface(surface);
    return HI_SUCCESS;
}[/code]

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-21 08:15:52
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38102&ptid=12702]11yichengming 发表于 2016-9-21 01:43[/url]
我想直接用这三个行数可以实现吗?我的思路是对的吧?region绑定vpss的方式,然后用SDL直接获取bitmap并U ...[/quote]

VPSS上贴OSD还不太多见, 难道不用编子码流? 通常VPSS上贴cover/mosaic

如果是编码, 通常OSD贴在VENC上

11yichengming

1个粉丝

9

问答

0

专栏

0

资料

11yichengming 2016-09-21 12:24:33
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38104&ptid=12702]zhuangweiye 发表于 2016-9-21 08:15[/url]
VPSS上贴OSD还不太多见, 难道不用编子码流? 通常VPSS上贴cover/mosaic

如果是编码, 通常OSD贴在VENC上[/quote]

对,论坛上大多都是OSD Venc的方式,我能够用VPSS load bmp图片文件显示成功,但是加入SDL就不行了。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-21 13:55:13
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38123&ptid=12702]11yichengming 发表于 2016-9-21 12:24[/url]
对,论坛上大多都是OSD Venc的方式,我能够用VPSS load bmp图片文件显示成功,但是加入SDL就不行了。[/quote]

不行是啥概念?

程序运行有错误? 那么把相关代码和错误信息放上来

显示不正确? 那么放个图看看

11yichengming

1个粉丝

9

问答

0

专栏

0

资料

11yichengming 2016-09-21 17:10:00
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38126&ptid=12702]zhuangweiye 发表于 2016-9-21 13:55[/url]
不行是啥概念?

程序运行有错误? 那么把相关代码和错误信息放上来
[/quote]

就是啥都没有。加入SDL的程序就是楼上的那些代码。。运行的时候出现HI_MPI_RGN_SetBitMap:该操作不允许,如试图修改静态配置参数的错误。

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-09-21 17:21:47
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38153&ptid=12702]11yichengming 发表于 2016-9-21 17:10[/url]
就是啥都没有。加入SDL的程序就是楼上的那些代码。。运行的时候出现HI_MPI_RGN_SetBitMap:该操作不允许 ...[/quote]

这个不是问题呀

既然是静态的属性, 那需要改就要销毁重新创建

11yichengming

1个粉丝

9

问答

0

专栏

0

资料

11yichengming 2016-09-22 12:22:41
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38156&ptid=12702]zhuangweiye 发表于 2016-9-21 17:21[/url]
这个不是问题呀

既然是静态的属性, 那需要改就要销毁重新创建[/quote]

?有点不明白这句话,可以详解吗?谢谢。

JACK_ZHANG

0个粉丝

5

问答

0

专栏

0

资料

JACK_ZHANG 2016-09-23 14:43:21
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=38193&ptid=12702]11yichengming 发表于 2016-9-22 12:22[/url]
?有点不明白这句话,可以详解吗?谢谢。[/quote]

就是不让改的不要改,要用的话,创建它的时候用,如果已经创建了,就销毁再重新创建,字面是这么解释的
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区