返回信息流文件是一个有两百多帧的视频流,读取大小是一帧内容,读取到数组以后对其进行各种运算,输出一帧的结果,但是输出结果只有一百多帧。。。我把代码贴上来吧,不知道有木有好心人耐心看看~
最后会输出程序中的“comput over”,但是还有一个segmentation fault~我搜了下,这个是因为指针的问题造成的,我看了半天也没有发现哪里的指针有问题啊,是不是访问了非法内存啊~
写的很粗糙,小细节方面就不要喷了哈,多谢多谢!
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(int n, char *cl[])
{
FILE *f1, *f2;
int i,j,k,l, N = 0, x,y,yuv,inc,Y, F;
int sum=0,temp=0;
double sumtemp,sportlevel=0.0,meanlevel;
unsigned char *b1, *b2;
if (n != 6 && n != 5) {
puts("psnr x y <YUV format> <src.yuv> <dst.yuv> [multiplex]");
puts(" x\t\tframe width");
puts(" y\t\tframe height");
puts(" YUV format\t420, 422, etc.");
puts(" src.yuv\tsource video");
puts(" dst.yuv\tdistorted video");
puts(" [multiplex]\toptional");
return EXIT_FAILURE;
}
if ((f1 = fopen(cl[4],"rb")) == 0) goto A;
if (!(x = strtoul(cl[1], 0, 10)) ||
!(y = strtoul(cl[2], 0, 10))) goto C;
if ((yuv = strtoul(cl[3], 0, 10)) > 444) goto D;
if (cl[6] && !strcmp(cl[5], "multiplex")) inc = 2;
Y = x * y;
switch (yuv) {
case 400: F = Y; break;
case 422: F = Y * 2; break;
case 444: F = Y * 3; break;
default :
case 420: F = Y * 3 / 2; break;
}
if (!(b1 = malloc(F))) goto E;
if (!(b2 = malloc(F))) goto E;
fread(b2,F,1,f1);
for (;;) {
if (1 != fread(b1, F, 1, f1) || 1 != fread(b2, F, 1, f1)) break;
for(l=0;l<36;l++)
for(k=0;k<44;k++)
{
{
for(j=0;j<8;j++)
for(i=8*(352*l+k)+352*j;i<8*(352*l+k)+8+352*j;i++)
{if(i>Y) printf("out of the range!!\n");
//printf("i %d\n",i);
temp=b2[i]-b1[i];
if(temp<0) temp=(-1)*temp;
sum+=temp;}
}
sumtemp=sum;
sum=0;
sportlevel+=exp(sumtemp/4080);
//printf("k %d\n",k);
}//一帧检测结束
printf("i %d\n",i);
meanlevel=sportlevel/1584;
sportlevel=0;
printf("meanlevel\t%f\n",meanlevel);
// printf("frame %d\n",N++);
if(feof(f1)) {printf("the end of the file\n");break;}
}
printf("comput is over\n");
free(b1);free(b2);
fclose(f1);
fclose(f2);
return 0;
A: fprintf(stderr, " Error opening sourcefile.\n"); goto X;
C: fprintf(stderr, " Invalid width or height.\n"); goto X;
D: fprintf(stderr, " Invalid YUV format.\n"); goto X;
E: fprintf(stderr, " Not enough memory.\n");
X: return EXIT_FAILURE;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #32437同步于 2009/11/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
读取文件的时候没读取完整,得到部分结果的情况下怎么办啊
Elaine99
2009/11/30镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
fread(b2,F,1,f1);
for (;;) {
if (1 != fread(b1, F, 1, f1) || 1 != fread(b2, F, 1, f1)) break;
.........
}
【 在 Elaine99 的大作中提到: 】
: 文件是一个有两百多帧的视频流,读取大小是一帧内容,读取到数组以后对其进行各种运算,输出一帧的结果,但是输出结果只有一百多帧。。。我把代码贴上来吧,不知道有木有好心人耐心看看~
: 最后会输出程序中的“comput over”,但是还有一个segmentation fault~我搜了下,这个是因为指针的问题造成的,我看了半天也没有发现哪里的指针有问题啊,是不是访问了非法内存啊~
: 写的很粗糙,小细节方面就不要喷了哈,多谢多谢!
: ...................
这个是因为b2要定位到后一帧,b1是前一帧,所以干脆就让b2先读取一帧~不知道我这么想的,程序是不是也这么想的[em17]
【 在 Randy 的大作中提到: 】
: fread(b2,F,1,f1);
: for (;;) {
: if (1 != fread(b1, F, 1, f1) || 1 != fread(b2, F, 1, f1)) break;
: ...................
问题解决了,我把参数扩大了一个,就是设了两个文件指针,分别指向了内容相同但是名字不同的实质上是一个文件的两个文件,然后就所有帧都出来了
难道两个文件指针不能指向同一个文件但是地方不同吗?会引起混乱?改了之后运算结果也不同了。觉得把文件复制一遍改个名字这种方法好傻