/* build using the folowing command: gcc xv_tester.c -lXv -lX11 -lXext -o xv_tester */ /* Original file obtained from http://bellet.info/XVideo/testxv.c */ /* ------------------------------------------- * --- XV Testcode --- * --- by AW ---*/ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include // for memset #define min(X, Y) ((X) < (Y) ? (X) : (Y)) #define YUV_PATTERN_WIDTH 32 #define YUV_PATTERN_HEIGHT 64 static unsigned char yuvPattern[3072] = { 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x10, 0xeb, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80 }; extern int XShmQueryExtension(Display*); extern int XShmGetEventBase(Display*); extern XvImage *XvShmCreateImage(Display*, XvPortID, int, char*, int, int, XShmSegmentInfo*); static void fill_yuv_pattern(XvImage * yuv_image); static void printUsage(); int main (int argc, char* argv[]) { int yuv_width = 704; int yuv_height = 480; int window_width = -1; int window_height = -1; int xv_port = -1; int user_xv_port = -1; int do_grab = 0; int initial_x=-1,initial_y=-1; int adaptor, attributes, formats; unsigned int encodings; int i, j, ret, p, _d; unsigned int _uid, _uiw, _uih; long frames; struct timeval timea,timeb; unsigned long microsectimea,microsectimeb; XvAdaptorInfo *ai; XvEncodingInfo *ei; XvAttribute *at; XvImageFormatValues *fo; XvImage *yuv_image; int vert_res_test = 0; int vert_res_test_interval = 2; #define GUID_YUV12_PLANAR 0x32315659 unsigned int p_version, p_release, p_request_base, p_event_base, p_error_base; unsigned int p_num_adaptors; Display *dpy; Window window, _dw; XSizeHints hint; XSetWindowAttributes xswa; XVisualInfo vinfo; int screen; unsigned long mask; XEvent event; GC gc; /** for shm */ int shmem_flag = 0; XShmSegmentInfo yuv_shminfo; int CompletionType; // ---------------------------------------- // Parsing command line arguments // ---------------------------------------- while (1) { int option_index = 0; // name, has_arg, flag, val static struct option long_options[] = { {"help", 0, 0, 'h'}, {"port", 1, 0, 'p'}, {"grab", 0, 0, 'g'}, {"initialpos", 1, 0, 'i'}, {"windowsize", 1, 0, 'w'}, }; int c = getopt_long(argc, argv, "hp:gi:w:", long_options, &option_index); if (c == -1) { break; } switch (c) { case 'h' : printUsage(); exit(0); break; case 'p' : { if (sscanf(optarg, "%d", &user_xv_port) != 1) { printf("Invalid port (%s).\n", optarg); exit(1); } break; } case 'i' : { if (sscanf(optarg, "%d,%d", &initial_x,&initial_y) != 2) { printf("Invalid initial x,y position (%s).\n", optarg); exit(1); } break; } case 'g' : { do_grab = 1; break; } case 'y' : { if (sscanf(optarg, "%d,%d", &yuv_width,&yuv_height) != 2) { printf("Invalid YUV size x,y (%s).\n", optarg); exit(1); } break; } case 'w' : { if (sscanf(optarg, "%d,%d", &window_width,&window_height) != 2) { printf("Invalid window size x,y (%s).\n", optarg); exit(1); } break; } default: printf("Unknown options (-%c).\n", c); exit(0); break; } } printf("starting up video testapp...\n\n"); yuv_width = YUV_PATTERN_WIDTH; yuv_height = YUV_PATTERN_HEIGHT; adaptor = -1; dpy = XOpenDisplay(NULL); if (dpy == NULL) { printf("Cannot open Display.\n"); exit (-1); } screen = DefaultScreen(dpy); /** find best display */ if (XMatchVisualInfo(dpy, screen, 24, TrueColor, &vinfo)) { printf(" found 24bit TrueColor\n"); } else if (XMatchVisualInfo(dpy, screen, 16, TrueColor, &vinfo)) { printf(" found 16bit TrueColor\n"); } else if (XMatchVisualInfo(dpy, screen, 15, TrueColor, &vinfo)) { printf(" found 15bit TrueColor\n"); } else if (XMatchVisualInfo(dpy, screen, 8, PseudoColor, &vinfo)) { printf(" found 8bit PseudoColor\n"); } else if (XMatchVisualInfo(dpy, screen, 8, GrayScale, &vinfo)) { printf(" found 8bit GrayScale\n"); } else if (XMatchVisualInfo(dpy, screen, 8, StaticGray, &vinfo)) { printf(" found 8bit StaticGray\n"); } else if (XMatchVisualInfo(dpy, screen, 1, StaticGray, &vinfo)) { printf(" found 1bit StaticGray\n"); } else { printf("requires 16 bit display\n"); exit (-1); } CompletionType = -1; if (window_width == -1) { //Unspecified window size, use the yuv one window_width = yuv_width; window_height = yuv_height; } hint.x = 1; hint.y = 1; hint.width = window_width; hint.height = window_height; hint.flags = PPosition | PSize; xswa.colormap = XCreateColormap(dpy, DefaultRootWindow(dpy), vinfo.visual, AllocNone); xswa.event_mask = StructureNotifyMask | ExposureMask; xswa.background_pixel = 0; xswa.border_pixel = 0; mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; window = XCreateWindow(dpy, DefaultRootWindow(dpy), 0, 0, window_width, window_height, 0, vinfo.depth, InputOutput, vinfo.visual, mask, &xswa); XStoreName(dpy, window, "xv_tester"); XSetIconName(dpy, window, "xv_tester"); XSelectInput(dpy, window, StructureNotifyMask); /** Map window */ XMapWindow(dpy, window); /** Wait for map. */ do { XNextEvent(dpy, &event); } while (event.type != MapNotify || event.xmap.event != window); if (XShmQueryExtension(dpy)) { shmem_flag = 1; } if (!shmem_flag) { printf("no shmem available.\n"); exit (-1); } if (shmem_flag==1) { CompletionType = XShmGetEventBase(dpy) + ShmCompletion; } /**--------------------------------- XV ------------------------------------*/ printf("beginning to parse the Xvideo extension...\n\n"); /** query and print Xvideo properties */ ret = XvQueryExtension(dpy, &p_version, &p_release, &p_request_base, &p_event_base, &p_error_base); if (ret != Success) { if (ret == XvBadExtension) { printf("XvBadExtension returned at XvQueryExtension.\n"); } } else { if (ret == XvBadAlloc) { printf("XvBadAlloc returned at XvQueryExtension.\n"); } else { printf("other error happened at XvQueryExtension.\n"); } } printf("========================================\n"); printf("XvQueryExtension returned the following:\n"); printf("p_version : %u\n", p_version); printf("p_release : %u\n", p_release); printf("p_request_base : %u\n", p_request_base); printf("p_event_base : %u\n", p_event_base); printf("p_error_base : %u\n", p_error_base); printf("========================================\n"); ret = XvQueryAdaptors(dpy, DefaultRootWindow(dpy), &p_num_adaptors, &ai); if (ret != Success) { if (ret == XvBadExtension) { printf("XvBadExtension returned at XvQueryExtension.\n"); } else { if (ret == XvBadAlloc) { printf("XvBadAlloc returned at XvQueryExtension.\n"); } else { printf("other error happaned at XvQueryAdaptors.\n"); } } } printf("=======================================\n"); printf("XvQueryAdaptors returned the following:\n"); printf("%d adaptors available.\n", p_num_adaptors); for (i = 0; i < p_num_adaptors; i++) { printf(" name: %s\n" " type: %s%s%s%s%s\n" " ports: %ld\n" " first port: %ld\n", ai[i].name, (ai[i].type & XvInputMask) ? "input | " : "", (ai[i].type & XvOutputMask) ? "output | " : "", (ai[i].type & XvVideoMask) ? "video | " : "", (ai[i].type & XvStillMask) ? "still | " : "", (ai[i].type & XvImageMask) ? "image | " : "", ai[i].num_ports, ai[i].base_id); if (user_xv_port == -1) { xv_port = ai[0].base_id; } else { xv_port = user_xv_port; } printf("adaptor %d ; format list:\n", i); for (j = 0; j < ai[i].num_formats; j++) { printf(" depth=%d, visual=%ld\n", ai[i].formats[j].depth, ai[i].formats[j].visual_id); } for (p = ai[i].base_id; p < ai[i].base_id+ai[i].num_ports; p++) { printf(" encoding list for port %d\n", p); if (XvQueryEncodings(dpy, p, &encodings, &ei) != Success) { printf("XvQueryEncodings failed.\n"); continue; } for (j = 0; j < encodings; j++) { printf(" id=%ld, name=%s, size=%ldx%ld, numerator=%d, denominator=%d\n", ei[j].encoding_id, ei[j].name, ei[j].width, ei[j].height, ei[j].rate.numerator, ei[j].rate.denominator); } XvFreeEncodingInfo(ei); printf(" attribute list for port %d\n", p); at = XvQueryPortAttributes(dpy, p, &attributes); for (j = 0; j < attributes; j++) { printf(" name: %s\n" " flags: %s%s\n" " min_color: %i\n" " max_color: %i\n", at[j].name, (at[j].flags & XvGettable) ? " get" : "", (at[j].flags & XvSettable) ? " set" : "", at[j].min_value, at[j].max_value); } if (at) { XFree(at); } printf(" image format list for port %d\n", p); fo = XvListImageFormats(dpy, p, &formats); for (j = 0; j < formats; j++) { printf(" 0x%x (%4.4s) %s\n", fo[j].id, (char *)&fo[j].id, (fo[j].format == XvPacked) ? "packed" : "planar"); } if (fo) { XFree(fo); } } printf("\n"); } if (p_num_adaptors > 0) { XvFreeAdaptorInfo(ai); } if (xv_port == -1) { exit (0); } gc = XCreateGC(dpy, window, 0, 0); if(do_grab) { int ret = XvGrabPort(dpy,xv_port,0); if (Success !=ret) { printf("Could not grab port %d\n",xv_port); exit(0); } } yuv_image = XvShmCreateImage(dpy, xv_port, GUID_YUV12_PLANAR, 0, yuv_width, yuv_height, &yuv_shminfo); yuv_shminfo.shmid = shmget(IPC_PRIVATE, yuv_image->data_size, IPC_CREAT | 0777); yuv_shminfo.shmaddr = yuv_image->data = shmat(yuv_shminfo.shmid, 0, 0); yuv_shminfo.readOnly = False; if (!XShmAttach(dpy, &yuv_shminfo)) { printf("XShmAttach failed !\n"); exit (-1); } printf ("Using Xvport = %d\n",xv_port); printf("%d\n", yuv_image->data_size); if (initial_x != -1) { printf ("Moving window to = %d,%d\n",initial_x,initial_y); XMoveWindow(dpy, window, initial_x,initial_y); } while (1) { frames=0; gettimeofday(&timea,NULL); microsectimea = timea.tv_sec*1000000+timea.tv_usec; while (frames < 500) { XGetGeometry(dpy, window, &_dw, &_d, &_d, &_uiw, &_uih, &_uid, &_uid); fill_yuv_pattern(yuv_image); { int XvRetVal = 0; printf("calling XvShmPutImage with src=0,0,%d,%d, dest=0,0,%d,%d\n",yuv_image->width,yuv_image->height,_uiw,_uih); XvRetVal = XvShmPutImage(dpy, xv_port, window, gc, yuv_image, 0, 0, yuv_image->width, yuv_image->height, 0, 0, _uiw, _uih, False); XSync(dpy,0); sleep(1); if (0 != XvRetVal) { printf("XvShmPutImage returned %d on frame %d\n",XvRetVal,(int)frames); exit(1); } } frames++; } gettimeofday(&timeb,NULL); microsectimeb = timeb.tv_sec*1000000+timeb.tv_usec; printf("%ld frames in %ld microseconds; %.4f fps\n", frames, microsectimeb-microsectimea, (double) (1000000.0*frames)/(microsectimeb-microsectimea)); } if(do_grab) { int ret = XvUngrabPort(dpy,xv_port,0); if (Success !=ret) { printf("Could not ungrab port %d\n",xv_port); exit(0); } } return 0; } void fill_yuv_pattern(XvImage * yuv_image) { char* pBaseData = NULL; unsigned char* pSrcData = NULL; const int YSizeDest = yuv_image->width*yuv_image->height; const int UVSizeDest = YSizeDest/4; const int YSizeSrc = YUV_PATTERN_WIDTH*YUV_PATTERN_HEIGHT; const int UVSizeSrc = YSizeSrc/4; pBaseData = yuv_image->data; // Y pSrcData = &yuvPattern[0]; memcpy(pBaseData,pSrcData,min(YSizeDest,YSizeSrc)); pBaseData = yuv_image->data+ YSizeDest; // U pSrcData = &yuvPattern[0] + YSizeSrc; memcpy(pBaseData,pSrcData,min(UVSizeDest,UVSizeSrc)); pBaseData = yuv_image->data+ YSizeDest+UVSizeDest; // V pSrcData = &yuvPattern[0] + YSizeSrc+UVSizeSrc; memcpy(pBaseData,pSrcData,min(UVSizeDest,UVSizeSrc)); } /*! * \brief printUsage * * Print usage. * * \return void. */ void printUsage() { printf("Usage: xv_tester [option]...\n"); printf(" -h, --help display this help and exit\n"); printf(" -p, --portN Use XV port N. Port info can be queried using xvinfo\n"); printf(" -g, --grab Enable Xv port grabbing. Default: disabled.\n"); printf(" -i, --initialposx,y Initial X,Y position of the window\n"); printf(" -w, --windowsizex,y Size of the window to use\n"); printf("\n"); }