Как отразить swscale PIX_FMT_YUYV422 - PullRequest
0 голосов
/ 31 января 2012

Я пытаюсь зеркально отразить горизонтальное изображение типа PIX_FMT_YUYV422.Использование простого цикла для каждой строки с 16 битами на пиксель приводит к неправильным цветам, например, синие объекты оранжевого цвета.Вот мой код:

   typedef unsigned short YUVPixel; // 16 bits per pixel
    for (int y = 0; y < outHeight; y++)
    {
        YUVPixel *p1 = (YUVPixel*)pBits + y * outWidth;
        YUVPixel *p2 = p1 + outWidth - 1;
        for (int x = 0; x < outWidth/2; x++) // outWidth is image width in pixels
        {
            // packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
            unsigned short tmp;
            tmp = *p1;
            *p1 = *p2;
            *p2 = tmp;
        }
    }

Затем я попытался переопределить YUVPixel как 32-битный тип и соответственно изменить мой цикл.Это приводит к правильным цветам, но выглядит так, как будто соседние пиксели поменялись местами.Любые идеи, я полностью потерян с этим?

1 Ответ

0 голосов
/ 31 января 2012

Ваш подход с использованием 32-битного типа YUVPixel был хорошим, вам нужно только убедиться, что вы поменяли два значения Y внутри этой пиксельной структуры после его перемещения, например:

Y0 U Y1 V
                move to new position      
          -------------------------------->
                                            Y0 U Y1 V
                                              <swap>
                                            Y1 U Y0 V

Значения U и Vоба действительны для всей 2-пиксельной структуры, значения Y должны быть перевернуты.

...