Я полностью потерял себя в представлении вашего кода.Это ни в коем случае не хороший вопрос, и это может быть неправильный ответ или, может быть, он правильный, но может быть что-то не так ....
Почему вы делаете это:
YCbCr_MCU[0]= &(color[x].YCbCr_MCU[0]);
YCbCr_MCU[1]= &(color[x].YCbCr_MCU[1]);
YCbCr_MCU[2]= &(color[x].YCbCr_MCU[2]);
Похоже, ваши три указателя в массиве указывают на переменные, упорядоченные в массиве.Для этого достаточно одного указателя.
uint8_t *YCbCr_MCU = &(color[x].YCbCr_MCU[0])
с этого момента вы можете обращаться ко всем членам только по указателю, и эти условия будут выполняться:
YCbCr_MCU[0] == color[x].YCbCr_MCU[0];
YCbCr_MCU[1] == color[x].YCbCr_MCU[1];
YCbCr_MCU[2] == color[x].YCbCr_MCU[2];
Это сделает егопроще работать с кодом.
Реальная проблема, кажется, здесь:
uint8_t *MCU_Y = YCbCr_MCU[0]; // here YCbCr_MCU[0] is a pointer so this is valid.
....
index = i * (8 * nb_MCU_H) + j;
R = (MCU_Cr[index] - 128) * 1.402f + MCU_Y[index]; // look at the MCU_Y here
для каждого индекса, отличного от 0
, это недопустимо (можно быть более точным 1
и 2
будет нормально получить color[x].YCbCr_MCU[1];
или color[x].YCbCr_MCU[1];