Я занимаюсь некоторыми вычислениями в необработанном видео YUV-файле. Идея состоит в том, чтобы переместить окно 8x8 по всему кадру, пиксель за пикселем. Вот мой код:Исключение нарушения прав доступа при чтении файла
while ((frameNumber < maxFrame) &&
(fread_s(frame1, frameSize, 1, frameSize, file1)== frameSize) &&
(fread_s(frame2, frameSize, 1, frameSize, file2)) == frameSize)
{
unsigned char *p1 = frame1; //pointer to indicate start of a window
unsigned char *p2 = frame2;
unsigned char *p8_1 = NULL; //pointer used to navigate accross 8x8window
unsigned char *p8_2 = NULL;
for (int i = 0; i < countY; i += stepSize)
{
p1 += i*width; //move to next line
p2 += i*width;
for (int j = 0; j < countX; j += stepSize)
{
meanLuma1 = 0;
meanLuma2 = 0;
//8x8 window loop
for (int k = 0; k < windowSize; k++)
{
p8_1 = p1 + k*width; //move to next line of a window
p8_2 = p2 + k*width;
for (int l = 0; l < windowSize; l++)
{
meanLuma1 += *p8_1;
meanLuma2 += *p8_2; //Access violation here at i=60, others are 0
++p8_1;
++p8_2;
}
}
meanLuma1 = meanLuma1/(windowSize*windowSize);
meanLuma2 = meanLuma2/(windowSize*windowSize);
++p1;
++p2;
}
я получаю исключение нарушения прав доступа на p8_2
(I = 60, J, K, L = 0). Я думаю, что это странно, что p8_1
верно оценивает его значение, но p8_2
этого не делает, поскольку оба файла имеют одинаковые размеры и размеры. Переменные состояния следующие:
width=352;
height=288;
stepSize=4;
windowSize=8;
И я вычисляя максимальное число шагов, как следующее:
int countX = ((width - windowSize)/stepSize)+1;
int countY = ((height - windowSize)/stepSize)+1;
Вторая странность в том, что, если я изложу windowSize = 16
и stepSize = 8
, он успешно компилируется.
Разве вы не видите каких-либо очевидных проблем? Я изо всех сил пытаюсь найти ошибку.