ffmpegx264代码解析Word文档格式.docx
- 文档编号:8430067
- 上传时间:2023-05-11
- 格式:DOCX
- 页数:16
- 大小:19.61KB
ffmpegx264代码解析Word文档格式.docx
《ffmpegx264代码解析Word文档格式.docx》由会员分享,可在线阅读,更多相关《ffmpegx264代码解析Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
AVPicturepic_src,pic_target;
//用于sws_scale
Bufferbufs[2];
//用于mmap
typedefstructCtxCtx;
capture_open(...)打开设备[cpp]viewplaincopyprint?
void*capture_open(constchar*dev_name,intt_width,intt_height)
intid=open(dev_name,O_RDWR);
if(id&
lt;
0)return0;
Ctx*ctx=newCtx;
ctx-&
gt;
vid=id;
//toquerycaps
v4l2_capabilitycaps;
ioctl(id,VIDIOC_QUERYCAP,&
amp;
caps);
if(caps.capabilities&
V4L2_CAP_VIDEO_CAPTURE){
V4L2_CAP_READWRITE){
//TODO:
...
}
V4L2_CAP_STREAMING){
//检查是否支持MMAP,还是USERPTR
v4l2_requestbuffersbufs;
memset(&
bufs,0,sizeof(bufs));
bufs.count=2;
bufs.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
bufs.memory=V4L2_MEMORY_MMAP;
if(ioctl(id,VIDIOC_REQBUFS,&
bufs)&
0){
fprintf(stderr,"
%s:
don'
tsupportMEMORY_MMAPmode!
/n"
__func__);
close(id);
deletectx;
return0;
usingMEMORY_MMAPmode,bufcnt=%d/n"
__func__,bufs.count);
//mmap
for(inti=0;
i&
2;
i++){
v4l2_bufferbuf;
buf,0,sizeof(buf));
buf.type=bufs.type;
buf.memory=bufs.memory;
if(ioctl(id,VIDIOC_QUERYBUF,&
buf)&
VIDIOC_QUERYBUFERR/n"
bufs[i].length=buf.length;
bufs[i].start=mmap(0,buf.length,PROT_READ|PROT_WRITE,
MAP_SHARED,id,buf.m.offset);
else{
can'
tsupportread()/write()modeandstreamingmode/n"
tsupportvideocapture!
intrc;
//enumallsupportimagefmt
v4l2_fmtdescfmt_desc;
uint32_tindex=0;
//看起来,不支持planefmt,直接使用yuyv吧,然后使用libswscale转换
#if0
do{
fmt_desc.index=index;
fmt_desc.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
rc=ioctl(id,VIDIOC_ENUM_FMT,&
fmt_desc);
if(rc&
=0){
/tsupport%s/n"
fmt_desc.description);
index++;
}while(rc&
=0);
#endif//0
v4l2_formatfmt;
fmt.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
rc=ioctl(id,VIDIOC_G_FMT,&
fmt);
tVIDIOC_G_FMT.../n"
PixelFormatpixfmt=PIX_FMT_NONE;
switch(fmt.fmt.pix.pixelformat){
caseV4L2_PIX_FMT_YUYV:
pixfmt=PIX_FMT_YUYV422;
break;
if(pixfmt==PIX_FMT_NONE){
tsupport%4s/n"
__func__,(char*)&
fmt.fmt.pix.pixelformat);
//构造转换器
capture_width=%d,height=%d,stride=%d/n"
fmt.fmt.pix.width,fmt.fmt.pix.height,
fmt.fmt.pix.bytesperline);
width=t_width;
height=t_height;
sws=sws_getContext(fmt.fmt.pix.width,fmt.fmt.pix.height,pixfmt,
width,ctx-&
height,PIX_FMT_YUV420P,//PIX_FMT_YUV420P对应X264_CSP_I420
SWS_FAST_BILINEAR,0,0,0);
rows=fmt.fmt.pix.height;
bytesperrow=fmt.fmt.pix.bytesperline;
avpicture_alloc(&
ctx-&
pic_target,PIX_FMT_YUV420P,ctx-&
height);
//queuebuf
sizeof(ctx-&
bufs)/sizeof(Buffer);
buf.type=V4L2_BUF_TYPE_VIDEO_CAPTURE;
buf.memory=V4L2_MEMORY_MMAP;
buf.index=i;
if(ioctl(id,VIDIOC_QBUF,&
VIDIOC_QBUFerr/n"
exit(-1);
inttype=V4L2_BUF_TYPE_VIDEO_CAPTURE;
if(ioctl(id,VIDIOC_STREAMON,&
type)&
VIDIOC_STREAMONerr/n"
returnctx;
}
capture_get_pic()
VIDIOC_DQBUF//出列,
sws_scale//格式转换/拉伸到PIX_FMT_YUV420P,准备方便压缩
VIDIOC_QBUF//重新入列
capture_get_picture(...)从摄像头得到一帧图片[cpp]viewplaincopyprint?
intcapture_get_picture(void*id,Picture*pic)
//获取,转换
Ctx*ctx=(Ctx*)id;
if(ioctl(ctx-&
vid,VIDIOC_DQBUF,&
VIDIOC_DQBUFerr/n"
return-1;
//_save_pic(ctx-&
bufs[buf.index].start,buf.length);
//__asm("
int$3"
);
pic_src.data[0]=(unsignedchar*)ctx-&
bufs[buf.index].start;
pic_src.data[1]=ctx-&
pic_src.data[2]=ctx-&
pic_src.data[3]=0;
pic_src.linesize[0]=ctx-&
bytesperrow;
pic_src.linesize[1]=ctx-&
pic_src.linesize[2]=ctx-&
pic_src.linesize[3]=0;
//sws_scale
intrs=sws_scale(ctx-&
sws,ctx-&
pic_src.data,ctx-&
pic_src.linesize,
0,ctx-&
rows,ctx-&
pic_target.data,ctx-&
pic_target.linesize);
//out
4;
pic-&
data[i]=ctx-&
pic_target.data[i];
stride[i]=ctx-&
pic_target.linesize[i];
//requeuebuf
vid,VIDIOC_QBUF,&
return1;
2.X11的本地回显:
采用XShm,效率还行
vs_open()
XOpenDisplay()
XCreateSimpleWindow()
XCreateGC()
XMapWindow()
XShmCreateImage()
shmget()
shmat()
使用的数据结构[cpp]viewplaincopyprint?
Display*display;
intscreen;
Windowwindow;
GCgc;
XVisualInfovinfo;
XImage*image;
XShmSegmentInfosegment;
SwsContext*sws;
PixelFormattarget_pixfmt;
AVPicturepic_target;
intv_width,v_height;
intcurr_width,curr_height;
vs_open(...)打开设备[cpp]viewplaincopyprint?
void*vs_open(intv_width,intv_height)
v_width=v_width;
v_height=v_height;
//window
display=XOpenDisplay(0);
window=XCreateSimpleWindow(ctx-&
display,RootWindow(ctx-&
display,0),
100,100,v_width,v_height,0,BlackPixel(ctx-&
WhitePixel(ctx-&
display,0));
screen=0;
gc=XCreateGC(ctx-&
display,ctx-&
window,0,0);
XMapWindow(ctx-&
window);
//currentscreenpixfmt
Windowroot;
unsignedintcx,cy,border,depth;
intx,y;
XGetGeometry(ctx-&
window,&
root,&
x,&
y,&
cx,&
cy,&
border,&
depth);
//visualinfo
XMatchVisualInfo(ctx-&
screen,depth,DirectColor,&
vinfo);
//image
image=XShmCreateImage(ctx-&
vinfo.visual,depth,ZPixmap,0,
&
segment,cx,cy);
if(!
image){
tXShmCreateImage!
segment.shmid=shmget(IPC_PRIVATE,
image-&
bytes_per_line*ctx-&
height,
IPC_CREAT|0777);
if(ctx-&
segment.shmid&
shmgeterr/n"
segment.shmaddr=(char*)shmat(ctx-&
segment.shmid,0,0);
segment.shmaddr==(char*)-1){
shmaterr/n"
data=ctx-&
segment.shmaddr;
segment.readOnly=0;
XShmAttach(ctx-&
display,&
segment);
PixelFormattarget_pix_fmt=PIX_FMT_NONE;
switch(ctx-&
bits_per_pixel){
case32:
target_pix_fmt=PIX_FMT_RGB32;
case24:
target_pix_fmt=PIX_FMT_RGB24;
default:
if(target_pix_fmt==PIX_FMT_NONE){
screendepthformaterr/n"
//sws
target_pixfmt=target_pix_fmt;
curr_width=cx;
curr_height=cy;
sws=sws_getContext(v_width,v_height,PIX_FMT_YUV420P,
cx,cy,target_pix_fmt,
pic_target,target_pix_fmt,cx,cy);
XFlush(ctx-&
display);
vs_show()
sws_scale()//拉伸到当前窗口大小,转换格式
XShmPutImage()//显示,呵呵,真的很简单
vs_show(...)主要代码都是处理窗口变化的[cpp]viewplaincopyprint?
intvs_show(void*ctx,unsignedchar*data[4],intstride[4])
//首选检查sws是否有效,根据当前窗口大小决定
Ctx*c=(Ctx*)ctx;
XGetGeometry(c-&
display,c-&
if(cx!
=c-&
curr_width||cy!
curr_height){
avpicture_free(&
c-&
pic_target);
sws_freeContext(c-&
sws);
c-&
sws=sws_getContext(c-&
v_width,c-&
v_height,PIX_FMT_YUV420P,
cx,cy,c-&
target_pixfmt,
pic_target,c-&
target_pixfmt,cx,cy);
//recreateimage
XShmDetach(c-&
shmdt(c-&
segment.shmaddr);
shmctl(c-&
segment.shmid,IPC_RMID,0);
XDestroyImage(c-&
image);
image=XShmC
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ffmpegx264 代码 解析