C 视频4 Linux 2读取MMAP地址
我试图写出我从video 4 linux 2示例程序中获得的内存。但是,它不起作用。我在尝试访问指针时遇到分段错误。我希望这不是一个愚蠢的错误,因为我已经为此花了几天时间。下面是代码:(它没有格式化,因为与html冲突太多。) 我的计算机正在使用执行的C 视频4 Linux 2读取MMAP地址,c,static,v4l2,C,Static,V4l2,我试图写出我从video 4 linux 2示例程序中获得的内存。但是,它不起作用。我在尝试访问指针时遇到分段错误。我希望这不是一个愚蠢的错误,因为我已经为此花了几天时间。下面是代码:(它没有格式化,因为与html冲突太多。) 我的计算机正在使用执行的mmap分支。它在这一行的writeFile()中识别故障: mRGB=mScreen->像素[像素] 我使用的是在这里找到的v4l2示例代码 以下是我所做的更改: 在第497行我换了 fmt.fmt.pix.pixelformat = V4L2
mmap
分支。它在这一行的writeFile()
中识别故障:
mRGB=mScreen->像素[像素]
我使用的是在这里找到的v4l2示例代码
以下是我所做的更改:
在第497行我换了
fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_RGB332;
fmt.fmt.pix.field = V4L2_FIELD_NONE;
我还在某个地方的704号线附近的main(…)上添加了一条线
close_device();
writeFile();
fprintf(stderr, "\n");
我插入了下面指定的writeFile()
方法:
typedef struct Screen {
unsigned char pixels[640*480];
} Screen;
static void writeFile() {
const int dimx = 640, dimy = 480;
int mNumPixels = dimx * dimy;
Screen *mScreen;
int i, pixel;
FILE *file = fopen("output","w");
if (file == NULL) return;
/* shift the bits around */
(void)fprintf(file, "P6\n%d %d\n255\n", dimx, dimy);
for (i = 1; i < n_buffers; i++) {
mScreen = buffers[i].start;
printf("\npointer to mScreen is: %p\n", mScreen);
for (pixel = 0; pixel < 640*480; pixel++) {
static unsigned char color[3];
unsigned char mRGB = 0;
printf("%d:%x\n", pixel, mRGB);
fflush(stdout);
mRGB = mScreen->pixels[pixel];
color[0] = (mRGB & 0xE0) >> 5;
color[1] = (mRGB & 0x1D) >> 2;
color[2] = mRGB & 0x03;
fwrite(color, sizeof(unsigned char)*3, 1, file);
}
}
fclose(file);
}
typedef结构屏幕{
无符号字符像素[640*480];
}屏幕;
静态void writeFile(){
常数int dimx=640,dimy=480;
int mNumPixels=dimx*dimy;
屏幕*mScreen;
inti,像素;
FILE*FILE=fopen(“输出”,“w”);
if(file==NULL)返回;
/*移位*/
(无效)fprintf(文件“P6\n%d%d\n255\n”,dimx,dimy);
对于(i=1;i像素[像素];
颜色[0]=(mRGB&0xE0)>>5;
颜色[1]=(mRGB&0x1D)>>2;
颜色[2]=mRGB&0x03;
fwrite(颜色,sizeof(无符号字符)*3,1,文件);
}
}
fclose(文件);
}
示例代码的uninit\u device()修改可用内存,使指针不再可用。必须在调用此方法/函数之前调用writeFile()方法。从哪里得到指针大小为2个字符的信息???尝试malloc(sizeof(char*))
。而且你从来没有释放过这个内存。@PaulOgilvie这个指针显然从未使用过,所以这是内存泄漏,但它可能也在调试海报中留下的东西。像素循环不应该转到10,而应该转到缓冲区[i]。长度。我找不到屏幕
的定义。确保它被定义为一个结构
,有一个成员,像素
,这是一个无符号字符数组
@JohnByrne。您应该向我们展示您在哪里更改示例程序来调用writeFile()函数。您是否在调试器中运行了它,以找出导致错误的指针访问?抱歉,这是调试代码,我从未取消分配它。所以这将是一个内存泄漏。另外,我还包括了Screen的结构定义。