Hi3519V101移植SDL+FreeType+SDL_ttf

https://blog.csdn.net/whereisdog/article/details/82769222  海思osd+freetype+SDL+SDL_ttf字体

 

 

本文链接:https://blog.csdn.net/simonforfuture/article/details/78629905
目录
文章目录
目录
前言
源码下载
SDL+FreeType+SDL_ttf库编译过程
freeType编译过程
SDL编译过程
SDL_ttf编译过程
测试
总结
番外
前言
刚开始接触海思的时候要实现的功能就是OSD显示,虽然功能简单,但是要花了很长的时间,主要是对海思平台不够了解,同时对交叉编译测试还不太明白(虽然现在也不怎么明白),特此记录一下!当然也会抽时间把Hifb实现OSD的方式整理一下。毕竟Hifb是图形层叠加,而SDL+FreeType+SDL_ttf的方式是直接叠加在视频层,如果加上缩放就不好用了!
本文参考易百纳论坛,在这个论坛中找到许多解决问题的方法,希望以后有能力帮助别人吧!虽然对海思平台接触也不多!

源码下载
这里使用的就是易百纳论坛提供的源码文件。

SDL+FreeType+SDL_ttf库编译过程
freeType编译过程
解压:tar -xvf freetype-2.4.10.tar.gz
进入freeType目录:
./configure CC=arm-hisiv500-linux-gcc --host=arm-hisiv500-linux
1
make
make install
SDL编译过程
解压:tar -xvf SDL-1.2.15.tar.gz
进入SDL目录:
./configure CC=arm-hisiv500-linux-gcc --host=arm-hisiv500-linux --disable-alsa --disable-pulseaudio --enable-esd=no --prefix=/opt/sdl/install
1
出现问题1:

./src/audio/esd/SDL_esdaudio.c:30:17: fatal error: esd.h: 没有那个文件或目录
1
解决方法1:
加上--enable-esd=no,这个错误好像是音频相关的错误,这里直接关掉音频。

make
make install
SDL_ttf编译过程
解压:tar xvf SDL_ttf-2.0.11.tar.gz
进入SDL_ttf-2.0.11目录:
./configure CC=arm-hisiv500-linux-gcc --host=arm-hisiv500-linux
1
若上述过程成功,会在/usr/local目录下生成相应文件:
在/usr/local目录下执行tree -L 2(ps:有时间要研究下tree命令),结果如下:

.
├── bin
│   ├── freetype-config
│   └── sdl-config
├── etc
├── games
├── include
│   ├── freetype2
│   ├── ft2build.h
│   └── SDL
├── lib
│   ├── libfreetype.a
│   ├── libfreetype.la
│   ├── libfreetype.so -> libfreetype.so.6.9.0
│   ├── libfreetype.so.6 -> libfreetype.so.6.9.0
│   ├── libfreetype.so.6.9.0
│   ├── libSDL-1.2.so.0 -> libSDL-1.2.so.0.11.4
│   ├── libSDL-1.2.so.0.11.4
│   ├── libSDL.a
│   ├── libSDL.la
│   ├── libSDLmain.a
│   ├── libSDLmain.la
│   ├── libSDL.so -> libSDL-1.2.so.0.11.4
│   ├── libSDL_ttf-2.0.so.0 -> libSDL_ttf-2.0.so.0.10.1
│   ├── libSDL_ttf-2.0.so.0.10.1
│   ├── libSDL_ttf.a
│   ├── libSDL_ttf.la
│   ├── libSDL_ttf.so -> libSDL_ttf-2.0.so.0.10.1
│   ├── pkgconfig
│   ├── python2.7
│   └── python3.5
├── man -> share/man
├── sbin
├── share
│   ├── aclocal
│   ├── ca-certificates
│   ├── emacs
│   ├── fonts
│   ├── man
│   ├── sgml
│   └── xml
└── src

拷贝生成sdl库
mkdir -C /opt/sdl_lib
cd /opt/sdl_lib
cp /usr/local/include/ ./ -rf
cp /usr/local/lib/ ./ -rf 
1
2
3
4
测试
ps:这个程序不是我写的,感谢作者Sues

/*************************************************************************
  > File Name: test.c
  > Author: Sues
  > Mail: sumory.kaka@foxmail.com 
  > Created Time: 2017年02月28日 星期二 21时47分05秒
 ************************************************************************/

#include <stdio.h>
#include "SDL.h"
#include "SDL_ttf.h"

int main(int argc, const char *argv[])
{
    char * pstr = "hello";
    SDL_PixelFormat *fmt;
    TTF_Font *font;  
    SDL_Surface *text, *temp;  

    if (TTF_Init() < 0 ) 
    {  
        fprintf(stderr, "Couldn't initialize TTF: %s\n", SDL_GetError());  
        SDL_Quit();
    }  

    font = TTF_OpenFont("./simhei.ttf", 48); 
    if ( font == NULL ) 
    {  
        fprintf(stderr, "Couldn't load %d pt font from %s: %s\n", 18, "ptsize", SDL_GetError());  
    }  

    SDL_Color forecol = { 0xff, 0xff, 0xff, 0xff };  
    text = TTF_RenderUTF8_Solid(font, pstr, forecol);

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

    temp = SDL_ConvertSurface(text,fmt,0);
    SDL_SaveBMP(temp, "save.bmp"); 

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

    return 0;
}

编译命令:

arm-hisiv500-linux-gcc test.c `sdl-config --cflags --libs` -I/opt/sdl_lib/include -I/opt/sdl_lib/include/SDL -L/opt/sdl_lib/lib -lSDL -lSDL_ttf -Wl,-rpath -o test
1
在开发板上执行test,会生成save.bmp,打开后可以发现是Hello!
注意:执行需要

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/sdl_lib/lib #/opt/sdl_lib/lib目录是我存放动态库文件的地方
# 同时需要在test文件下防止simhei.ttf文件,这样才能找到字体
1
2
总结
参考的是如下博主的资源,感谢这位博主的分享!
参考链接

番外
因为BMP图片不能设置透明,所以显示的图在视频帧上会导致视频的背景是黑色的,而且无法去除。这个问题我纠结了好久,最后也是在易百纳论坛找到的解决方法!
重点在于zhuangweiye大神的回答:


s32Ret = SAMPLE_RGN_UpdateCanvas("sys_time.bmp", &stBitmap, HI_TRUE, 0x8000, &stSize, stCanvasInfo.u32Stride, stRgnAttrSet.unAttr.stOverlayEx.enPixelFmt);
1
2
有时间再把区域+SDL的方法显示位图这一部分搞上来,暂时还是写写编译的东西吧!
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值