Menu Home

linux

ffmpeg的内部Video Buffer管理和传送机制

ffmpeg的内部Video Buffer管理和传送机制 本文主要介绍ffmpeg解码器内部管理Video Buffer的原理和过程,ffmpeg的Videobuffer为内部管理,其流程大致为:注册处理函数->帧级释放->帧级申请->清空。 1 注册get_buffer()和release_buffer() FFAPI_InitCodec() avcodec_alloc_context() avcodec_alloc_context2() avcodec_get_context_default2(AVCodecContext *s,…){ …… s->get_buffer = avcodec_default_get_buffer; s->release_buffer = avcodec_default_release_buffer; …… } 2帧级的内存申请和释放调用

linux kernel driver自动创建设备

static int watchdog_init(void) { wdt_major = register_chrdev(0, “lte8718wdt”, <e8718wdt_fopts); wdt_class = class_create(THIS_MODULE, wdt_name); device_create(wdt_class, NULL, MKDEV(wdt_major, 0), NULL, wdt_name); } static int watchdog_exit(void) { device_destroy(wdt_class, MKDEV(wdt_major, 0)); class_destroy(wdt_class); unregister_chrdev(lte8718wdt_major, “lte8718wdt”); }

mac下vim + taglist + ctags

mac下vim + taglist + ctags 1 . 下载 taglist http://www.vim.org/scripts/script.php?script_id=273 2. 解压缩后拷贝 plugin和doc文件到~/.vim文件夹,进入doc文件夹,运行vim ,输入命令:helptags . 3. 因为mac自带的ctags程序不是exuberant ctags, 所以使用时会出现问题,需要自己下载ctags编译安装到非/usr/bin 目录下: http://sourceforge.net/projects/ctags/files/ctags/5.8/ctags-5.8.tar.gz/download 4.打开vimrc配置文件加入ctags路径:let Tlist_Ctags_Cmd=’/Users/xxx/bin/ctags’

LINUX下QT For ARM开发环境

LINUX下QT For ARM开发环境 OS: ubuntu 12.1 gcc: 4.6.3 arm gcc: 4.5.1 QT: qt-x11-opensource-src-4.5.3 QT-embedded: qt-embedded-linux-opensource-src-4.5.3 编译qt-x11-opensource-src-4.5.3 ./configure –qvfb make cd tools/qvfb //进入此目录,准备对它进行编译 make sudo make install 编译过程中出现的错误: error: ‘ppd_file_t’ does not name a type 解决方法: 打开src/gui/painting/qcups_p.h做如下修改: #ifndef QT_NO_CUPS #include //加入ppd头文件 QT_BEGIN_NAMESPACE 安装 arm-linux-gcc (略) 编译qt-embedded-linux-opensource-src-4.5.3 ./configure -embedded arm -qt-libpng make […]

ubuntu下设置ftp

ubuntu下设置ftp OS: ubuntu 12.04 安装vsftpd apt-get install vsftpd 编辑 /etc/vsftpd.conf listen=YES #anonymous_enable=YES local_enable=YES write_enable=YES #anon_upload_enable=YES anonymous_enable=NO #默认是允许 dirmessage_enable=YES # 允许进入文件夹 xferlog_enable=YES # 允许 ftp 日志记录允许 connect_from_port_20=YES # 允许使用20号端口作为数据传送端口 secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/private/vsftpd.pem 设置ftp文件夹 mkdir -p /home/ftp/upload mkdir -p /home/ftp/download chmod 755 /home/ftp chmod 777 /home/ftp/upload chmod 755 /home/ftp/download 设置ftp用户 增加ftp组:groupadd ftpgroup […]

linux c获取系统网卡信息

OS:ubuntu 12.04 int getNetCardCount() { int nCount = 0; FILE *file = fopen(“/proc/net/dev”, “r”); if(!file) { debug(“Open /proc/net/dev failed by %s !\n”, strerror(errno)); return nCount; } char szLine[512]; fgets(szLine, sizeof(szLine), file); fgets(szLine, sizeof(szLine), file); while(fgets(szLine, sizeof(szLine), file)) { char szName[128] = {0}; sscanf(szLine, “%s”, szName); int nLen = strlen(szName); if(nLen <= […]

APUE的编译问题

APUE的编译问题 本文解决一些APUE一书中例子编译过程中的问题 OS: ubuntu 12.04 问题 /usr/include/bits/timex.h:31:7:error: expect ‘:’ , ‘,’ , ‘;’ , ‘}’ or ‘__attribute__’ 解决 apue.2e/ipp/ipp.h中 #define status u.st 与 timex.h中的 status 冲突,更改 #define Status u.st 问题 ARG_MAX 未定义 解决 在include/apue.h中加入 #define ARG_MAX 4096 在threadctl/getenv1.c 加入 #include “../include/apue.h” 在threadctl/getenv3.c 加入 #include “../include/apue.h” OS: mac os 10.7.4 问题 […]

使用modeline强制屏幕分辨率

OS:ubuntu 12.04 生成Modeline cvt 1440 900 60 #命令格式:横向分辨率 纵向分辨率 刷新率 输出结果可能如下,其中Modeline行即是我们需要的: # 1440×900 59.89 Hz (CVT 1.30MA) hsync: 55.93 kHz; pclk: 106.50 MHz Modeline “1440x900_60.00” 106.50 1440 1528 1672 1904 900 903 909 934 -hsync +vsync 查看系统当前的屏幕输出端口 xrandr 我的输出结果如下: HDMI-1 connected 1920×1080+0+0 (normal left inverted right x axis y axis) […]

编译单个linux kernel 模块

kernel 编译单个模块 假设需要单独编译resiserfs内核模块: 1)make menuconfig load 一下当前目录下的.config 文件 进入文件系统选项,选择reiserfs 模块,使其前面有个M 保存退出 2)make prepare 不运行该命令make 时将会报错 3)make scripts 4)make M=fs/reiserfs 开始编译单个模块,编译完成后模块生成在fs/reiserfs.ko

确定wifi网卡是否支持hostap

确定wifi网卡是否支持hostap 对老网卡(没有使用mac80211驱动的) ethtool  -i  wlan0 sudo iwconfig wlan0  mode  master 输出: Error for wireless request “Set Mode” (8B06) : SET failed on device wlan0 ; Invalid argument. 表示不支持 对新网卡(使用mac80211驱动的) iw list  |  grep Supported   输出: * AP 表示支持hostap

iptables 代理上网

iptables 代理上网 OS : opensuse 11.4 需求 eth0 (出外网) : 192.168.1.105   gataway : 192.168.1.1 wlan0 : 192.168.8.1 解决方法 echo 1 > /proc/sys/net/ipv4/ip_forward iptabes -t nat -A POSTROUTING -o eth0 -s 192.168.80/24 -j SNAT –to 192.168.1.105

ubuntu升级nvidia driver

buntu升级nvidia driver ubuntu升级nvidia显卡驱动分以下几步完成: 删除旧版本驱动: apt-get – -purge remove nvidia-* 删除系统自带的显卡驱动: apt-get – -purge remove xserver-xorg-video-nouveau 停止ubuntu的桌面环境: /etc/init.d/lightdm stop 切换到字符终端台 安装下载的新版nvidia驱动 重启桌面环境: /etc/init.d/lightdm start

FFMPEG + SDL音频播放分析

抽象流程: 设置SDL的音频参数 —-> 打开声音设备,播放静音 —-> ffmpeg读取音频流中数据放入队列 —-> SDL调用用户设置的函数来获取音频数据 —-> 播放音频 SDL内部维护了一个buffer来存放解码后的数据,这个buffer中的数据来源是我们注册的回调函数(audio_callback),audio_callback调用audio_decode_frame来做具体的音频解码工作,需要引起注意的是:从流中读取出的一个音频包(avpacket)可能含有多个音频桢(avframe),所以需要多次调用avcodec_decode_audio4来完成整个包的解码,解码出来的数据存放在我们自己的缓冲中(audio_buf2)。SDL每一次回调都会引起数据从audio_buf2拷贝到SDL内部缓冲区,当audio_buf2中的数据大于SDL的缓冲区大小时,需要分多次拷贝。 关键实现: main()函数 int main(int argc, char **argv){ SDL_Event event; //SDL事件变量 VideoState *is; // 纪录视频及解码器等信息的大结构体 is = (VideoState*) av_mallocz(sizeof(VideoState)); if(argc < 2){ fprintf(stderr, “Usage: play <file>\n”); exit(1); } av_register_all(); //注册所有ffmpeg的解码器 /* 初始化SDL,这里只实用了AUDIO,如果有视频,好需要SDL_INIT_VIDEO等等 */ if(SDL_Init(SDL_INIT_AUDIO)){ fprintf(stderr, “Count not initialize SDL – […]

jpeg转换OpenGL Texture

jpeg转换OpenGL Texture #include <stdio.h> #include <unistd.h> #include <jpeglib.h> #include <stdlib.h> #include <GL/gl.h> #include <GL/glut.h> void LoadJpgTextureGL(char *file) { FILE *jpegFile; int sizebuf; unsigned char* buffer; unsigned char* texturebuf; struct jpeg_decompress_struct cinfo; struct jpeg_error_mgr jerr; cinfo.err = jpeg_std_error(&jerr); jpeg_create_decompress(&cinfo); if((jpegfile = fopen(file,”rb”))==NULL) { perror(“fopen jpeg”); return; } jpeg_stdio_src(&cinfo,jpefile); jpeg_read_header(&cinfo,TRUE); jpeg_start_decompress(&cinfo); sizebuf […]

png转换OpenGL Texture

bool loadPngImage(char *name, int *outWidth, int *outHeight, bool *outHasAlpha, GLubyte **outData) { png_structp png_ptr; png_infop info_ptr; unsigned int sig_read = false; int color_type, interlace_type; FILE *fp; printf(“png file : %s\n”, name); if((fp = fopen(name, “rb”)) == NULL) { printf(“%s: open png file error: \n”, __FILE__); perror(“open filed:\n”); return false; } […]

LINUX网卡(设置千兆网卡速度及模式)

Ethtool命令: 摘要 ethtool ethX #查询ethX网口基本设置 ethtool –h #显示ethtool的命令帮助(help) ethtool –i ethX #查询ethX网口的相关信息 ethtool –d ethX #查询ethX网口注册性信息 ethtool –r ethX #重置ethX网口到自适应模式 ethtool –S ethX #查询ethX网口收发包统计 ethtool –s ethX [speed 10|100|1000] #设置网口速率10/100/1000M [duplex half|full] #设置网口半/全双工 [autoneg on|off] #设置网口是否自协商 [port tp|aui|bnc|mii] #设置网口类型 [phyad N] [xcvr internal|exteral] [wol p|u|m|b|a|g|s|d…] [sopass xx:yy:zz:aa:bb:cc] [msglvl N] 举例 […]

linux多线程之pthread_detach

pthread_detach(pthread_self()) linux线程执行和windows不同,pthread有两种状态joinable状态和unjoinable状态, 如果线程是joinable状态,当线程函数自己返回退出时或pthread_exit时都不会释放线程所占用堆栈和线程描述符(总计8K多)。只有当你调用了pthread_join之后这些资源才会被释放。 若是unjoinable状态的线程,这些资源在线程函数退出时或pthread_exit时自动会被释放。 unjoinable属性可以在pthread_create时指定,或在线程创建后在线程中pthread_detach自己, 如:pthread_detach(pthread_self()),将状态改为unjoinable状态,确保资源的释放。或者将线程置为 joinable,然后适时调用pthread_join。(网络资料) pthread_attr_t attr; pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); pthread_create(pID, &attr, func,NULL); pthread_attr_destroy(&attr); 在func函数中使用: pthread_detach(pthread_self()); //分离thread,释放线程资源