0

YUYV 形式から YUV422p 形式に並べ替えて配列しようとしています。現在、配列は次のようになっています。

[y1][cb1][y2][cr1][y3][cb2][y4][cr2][y5][cb3][y6][cr3][y7][cb4][y8][cr4] .. .[yn][cbn+1/2][yn+1][crn+1/2]

次のように並べ替える必要があります。

[y1][y2][y3][y4][y5][y6][y7][y8][yn][yn+1]..[cb1][cb2][cb3][cb4][cbn+1] /2]..[cr1][cr2][cr3][cr4][crn+1/2]

すべての y が一緒で、すべての cb が一緒で、すべての cr が一緒である必要があります。

私はこのセクションをできるだけ効率的にし、最小限の時間で済むようにしています。

これが私がこれまでに行ったことです:

    inline const void YUYV_to_YUV422P_1280x960( char* yuyv, char* yuv422p)
    {
         const unsigned int height = 960;
         const unsigned int width  = 1280;
         int loopCount1 = height*width/2;
         int loopCount2 = height*width;
         char* yComponent   = yuv422p;
         char* cbComponent  = yuv422p + loopCount2;
         char* crComponent  = yuv422p + loopCount1 + loopCount2; 

         int i;
         for( i = (loopCount1 - 1); i != 0; --i )
         {
           cbComponent[ i ] = yuyv[ i*4 + 1 ];
           crComponent[ i ] = yuyv[ i*4 + 3 ];
         }

         for( i = (loopCount2 -1); i != 0; --i )
         {
           yComponent[ i ] = yuyv[ i*2 ];
         }
    }

これをより効率的かつ高速にする方法についての考えがあれば教えてください。

4

1 に答える 1

0

アドバイスは、いつものように測定してから、十分に速いかどうかを判断することです。3 GHz PC でこれを実行している場合、数マイクロ秒の節約が問題になりますか?

一般に、この種のタスクではメモリ I/O が制限されるため、最高のキャッシュ パフォーマンスを実現するように記述することが重要です。画像のサイズとハードウェアによっては、画像を一度に 1 行ずつ処理して、キャッシュに入力画像行と出力画像行を保持するのが最適な場合があります。

最新の CPU を使用している場合は、SSE2 で高速化し、複数のピクセルに対してこれらの多くの操作を同時に実行できます。

于 2012-06-12T20:44:16.797 に答える