output.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:37k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "../libmpeg3.h"
  2. #include "mpeg3video.h"
  3. #include <string.h>
  4. #define CLIP(x)  ((x) >= 0 ? ((x) < 255 ? (x) : 255) : 0)
  5. #ifndef _MSC_VER
  6. static long long mpeg3_MMX_0 = 0L;
  7. #else
  8. static __int64 mpeg3_MMX_0 = 0L;
  9. #endif
  10. static unsigned long  mpeg3_MMX_10w[]         = {0x00100010, 0x00100010};                     /*dd    00010 0010h, 000100010h */
  11. static unsigned long  mpeg3_MMX_80w[]         = {0x00800080, 0x00800080};                     /*dd    00080 0080h, 000800080h */
  12. static unsigned long  mpeg3_MMX_00FFw[]       = {0x00ff00ff, 0x00ff00ff};                     /*dd    000FF 00FFh, 000FF00FFh */
  13. static unsigned short mpeg3_MMX_Ublucoeff[]   = {0x81, 0x81, 0x81, 0x81};                     /*dd    00081 0081h, 000810081h */
  14. static unsigned short mpeg3_MMX_Vredcoeff[]   = {0x66, 0x66, 0x66, 0x66};                     /*dd    00066 0066h, 000660066h */
  15. static unsigned short mpeg3_MMX_Ugrncoeff[]   = {0xffe8, 0xffe8, 0xffe8, 0xffe8};             /*dd    0FFE7 FFE7h, 0FFE7FFE7h */
  16. static unsigned short mpeg3_MMX_Vgrncoeff[]   = {0xffcd, 0xffcd, 0xffcd, 0xffcd};             /*dd    0FFCC FFCCh, 0FFCCFFCCh */
  17. static unsigned short mpeg3_MMX_Ycoeff[]      = {0x4a, 0x4a, 0x4a, 0x4a};                     /*dd    0004A 004Ah, 0004A004Ah */
  18. static unsigned short mpeg3_MMX_redmask[]     = {0xf800, 0xf800, 0xf800, 0xf800};             /*dd    07c00 7c00h, 07c007c00h */
  19. static unsigned short mpeg3_MMX_grnmask[]     = {0x7e0, 0x7e0, 0x7e0, 0x7e0};                 /*dd    003e0 03e0h, 003e003e0h */
  20. static unsigned char mpeg3_601_to_rgb[256];
  21. /* Algorithm */
  22. /*  r = (int)(*y + 1.371 * (*cr - 128)); */
  23. /*  g = (int)(*y - 0.698 * (*cr - 128) - 0.336 * (*cb - 128)); */
  24. /*  b = (int)(*y + 1.732 * (*cb - 128)); */
  25. #ifdef HAVE_MMX
  26. inline void mpeg3video_rgb16_mmx(unsigned char *lum, 
  27. unsigned char *cr, 
  28. unsigned char *cb,
  29.             unsigned char *out, 
  30. int rows, 
  31. int cols, 
  32. int mod)
  33. {
  34. unsigned short *row1;
  35. int x;
  36.     unsigned char *y;
  37. int col1;
  38. row1 = (unsigned short *)out;
  39.     col1 = cols + mod;
  40.     mod += cols + mod;
  41.     mod *= 2;
  42. y = lum + cols * rows;
  43.     x = 0;
  44.     __asm__ __volatile__(
  45.         ".align 8n"
  46.         "1:n"
  47.             "movd           (%1),                   %%mm0n"  /* 4 Cb   0  0  0  0 u3 u2 u1 u0 */
  48.             "pxor           %%mm7,                  %%mm7n"
  49.             "movd           (%0),                   %%mm1n"  /* 4 Cr   0  0  0  0 v3 v2 v1 v0 */
  50.             "punpcklbw      %%mm7,                  %%mm0n"  /* 4 W cb   0 u3  0 u2  0 u1  0 u0 */
  51.             "punpcklbw      %%mm7,                  %%mm1n"  /* 4 W cr   0 v3  0 v2  0 v1  0 v0 */
  52.             "psubw          mpeg3_MMX_80w,          %%mm0n"
  53.             "psubw          mpeg3_MMX_80w,          %%mm1n"
  54.             "movq           %%mm0,                  %%mm2n"  /* Cb    0 u3  0 u2  0 u1  0 u0 */
  55.             "movq           %%mm1,                  %%mm3n"  /* Cr */
  56.             "pmullw         mpeg3_MMX_Ugrncoeff,    %%mm2n"  /* Cb2green 0 R3  0 R2  0 R1  0 R0 */
  57.             "movq           (%2),                   %%mm6n"  /* L1   l7 L6 L5 L4 L3 L2 L1 L0 */
  58.             "pmullw         mpeg3_MMX_Ublucoeff,    %%mm0n"  /* Cb2blue */
  59.             "pand           mpeg3_MMX_00FFw,        %%mm6n"  /* L1   00 L6 00 L4 00 L2 00 L0 */
  60.             "pmullw         mpeg3_MMX_Vgrncoeff,    %%mm3n"  /* Cr2green */
  61.             "movq           (%2),                   %%mm7n"  /* L2 */
  62.             "pmullw         mpeg3_MMX_Vredcoeff,    %%mm1n"  /* Cr2red */
  63.             "psrlw          $8,                     %%mm7n"  /* L2   00 L7 00 L5 00 L3 00 L1 */
  64.             "pmullw         mpeg3_MMX_Ycoeff,       %%mm6n"  /* lum1 */
  65.             "paddw          %%mm3,                  %%mm2n"  /* Cb2green + Cr2green == green */
  66.             "pmullw         mpeg3_MMX_Ycoeff,       %%mm7n"  /* lum2 */
  67.             "movq           %%mm6,                  %%mm4n"  /* lum1 */
  68.             "paddw          %%mm0,                  %%mm6n"  /* lum1 +blue  00 B6 00 B4 00 B2 00 B0 */
  69.             "movq           %%mm4,                  %%mm5n"  /* lum1 */
  70.             "paddw          %%mm1,                  %%mm4n"  /* lum1 +red   00 R6 00 R4 00 R2 00 R0 */
  71.             "paddw          %%mm2,                  %%mm5n"  /* lum1 +green 00 G6 00 G4 00 G2 00 G0 */
  72.             "psraw          $6,                     %%mm4n"  /* R1 0 .. 64 */
  73.             "movq           %%mm7,                  %%mm3n"  /* lum2                       00 L7 00 L5 00 L3 00 L1 */
  74.             "psraw          $6,                     %%mm5n"  /* G1  - .. + */
  75.             "paddw          %%mm0,                  %%mm7n"  /* Lum2 +blue 00 B7 00 B5 00 B3 00 B1 */
  76.             "psraw          $6,                     %%mm6n"  /* B1         0 .. 64 */
  77.             "packuswb       %%mm4,                  %%mm4n"  /* R1 R1 */
  78.             "packuswb       %%mm5,                  %%mm5n"  /* G1 G1 */
  79.             "packuswb       %%mm6,                  %%mm6n"  /* B1 B1 */
  80.             "punpcklbw      %%mm4,                  %%mm4n"
  81.             "punpcklbw      %%mm5,                  %%mm5n"
  82.             "pand           mpeg3_MMX_redmask,      %%mm4n"
  83.             "psllw          $3,                     %%mm5n"  /* GREEN       1 */
  84.             "punpcklbw      %%mm6,                  %%mm6n"
  85.             "pand           mpeg3_MMX_grnmask,      %%mm5n"
  86.             "pand           mpeg3_MMX_redmask,      %%mm6n"
  87.             "por            %%mm5,                  %%mm4n"  /* */
  88.             "psrlw          $11,                    %%mm6n"  /* BLUE  1 */
  89.             "movq           %%mm3,                  %%mm5n"  /* lum2 */
  90.             "paddw          %%mm1,                  %%mm3n"  /* lum2 +red  00 R7 00 R5 00 R3 00 R1 */
  91.             "paddw          %%mm2,                  %%mm5n"  /* lum2 +green 00 G7 00 G5 00 G3 00 G1 */
  92.             "psraw          $6,                     %%mm3n"  /* R2 */
  93.             "por            %%mm6,                  %%mm4n"  /* MM4 */
  94.             "psraw          $6,                     %%mm5n"  /* G2 */
  95.             "movq           (%2, %3),               %%mm6n"  /* L3 */
  96.             "psraw          $6,                     %%mm7n"
  97.             "packuswb       %%mm3,                  %%mm3n"
  98.             "packuswb       %%mm5,                  %%mm5n"
  99.             "packuswb       %%mm7,                  %%mm7n"
  100.             "pand           mpeg3_MMX_00FFw,        %%mm6n"  /* L3 */
  101.             "punpcklbw      %%mm3,                  %%mm3n"
  102.             "punpcklbw      %%mm5,                  %%mm5n"
  103.             "pmullw         mpeg3_MMX_Ycoeff,       %%mm6n"  /* lum3 */
  104.             "punpcklbw      %%mm7,                  %%mm7n"
  105.             "psllw          $3,                     %%mm5n"  /* GREEN 2 */
  106.             "pand           mpeg3_MMX_redmask,      %%mm7n"
  107.             "pand           mpeg3_MMX_redmask,      %%mm3n"
  108.             "psrlw          $11,                    %%mm7n"  /* BLUE  2 */
  109.             "pand           mpeg3_MMX_grnmask,      %%mm5n"
  110.             "por            %%mm7,   %%mm3n"
  111.             "movq           (%2,%3), %%mm7n"  /* L4 */
  112.             "por            %%mm5,   %%mm3n"  /* */
  113.             "psrlw          $8,                     %%mm7n"    /* L4 */
  114.             "movq           %%mm4,   %%mm5n"
  115.             "punpcklwd      %%mm3,                  %%mm4n"
  116.             "pmullw         mpeg3_MMX_Ycoeff,       %%mm7n"    /* lum4 */
  117.             "punpckhwd      %%mm3,                  %%mm5n"
  118.             "movq           %%mm4,   (%4)n"
  119.             "movq           %%mm5,   8(%4)n"
  120.             "movq           %%mm6,   %%mm4n" /* Lum3 */
  121.             "paddw          %%mm0,                  %%mm6n"                /* Lum3 +blue */
  122.             "movq           %%mm4,   %%mm5n" /* Lum3 */
  123.             "paddw          %%mm1,                  %%mm4n"       /* Lum3 +red */
  124.             "paddw          %%mm2,                  %%mm5n"                        /* Lum3 +green */
  125.             "psraw          $6,      %%mm4n"
  126.             "movq           %%mm7,        %%mm3n" /* Lum4 */
  127.             "psraw          $6,      %%mm5n"
  128.             "paddw          %%mm0,                  %%mm7n"                   /* Lum4 +blue */
  129.             "psraw          $6,                     %%mm6n"                        /* Lum3 +blue */
  130.             "movq           %%mm3,                  %%mm0n"  /* Lum4 */
  131.             "packuswb       %%mm4,                  %%mm4n"
  132.             "paddw          %%mm1,                  %%mm3n"  /* Lum4 +red */
  133.             "packuswb       %%mm5,                  %%mm5n"
  134.             "paddw          %%mm2,                  %%mm0n"         /* Lum4 +green */
  135.             "packuswb       %%mm6,                  %%mm6n"
  136.             "punpcklbw      %%mm4,                  %%mm4n"
  137.             "punpcklbw      %%mm5,                  %%mm5n"
  138.             "punpcklbw      %%mm6,                  %%mm6n"
  139.             "psllw          $3,                     %%mm5n" /* GREEN 3 */
  140.             "pand           mpeg3_MMX_redmask,      %%mm4n"
  141.             "psraw          $6,          %%mm3n" /* psr 6 */
  142.             "psraw          $6,          %%mm0n"
  143.             "pand           mpeg3_MMX_redmask,      %%mm6n" /* BLUE */
  144.             "pand           mpeg3_MMX_grnmask,      %%mm5n"
  145.             "psrlw          $11,                    %%mm6n"  /* BLUE  3 */
  146.             "por            %%mm5,   %%mm4n"
  147.             "psraw          $6,                     %%mm7n"
  148.             "por            %%mm6,       %%mm4n"
  149.             "packuswb       %%mm3,                  %%mm3n"
  150.             "packuswb       %%mm0,                  %%mm0n"
  151.             "packuswb       %%mm7,                  %%mm7n"
  152.             "punpcklbw      %%mm3,                  %%mm3n"
  153.             "punpcklbw      %%mm0,                  %%mm0n"
  154.             "punpcklbw      %%mm7,                  %%mm7n"
  155.             "pand           mpeg3_MMX_redmask,      %%mm3n"
  156.             "pand           mpeg3_MMX_redmask,      %%mm7n" /* BLUE */
  157.             "psllw          $3,                     %%mm0n" /* GREEN 4 */
  158.             "psrlw          $11,                    %%mm7n"
  159.             "pand           mpeg3_MMX_grnmask,      %%mm0n"
  160.             "por            %%mm7,                  %%mm3n"
  161.             "addl           $8,                             %6n"
  162.             "por            %%mm0,                  %%mm3n"
  163.             "movq           %%mm4,                  %%mm5n"
  164.             "punpcklwd      %%mm3,                  %%mm4n"
  165.             "punpckhwd      %%mm3,                  %%mm5n"
  166.             "movq           %%mm4,                  (%4,%5,2)n"
  167.             "movq           %%mm5,                  8(%4,%5,2)n"
  168.             "addl           $8,                     %2n"
  169.             "addl           $4,                     %0n"
  170.             "addl           $4,                     %1n"
  171.             "cmpl           %3,                     %6n"
  172.             "leal           16(%4),                 %4n"
  173.         "jl             1bn"
  174.         "addl           %3,     %2n"                   /* lum += cols */
  175.         "addl           %7,     %4n"                   /* row1 += mod */
  176.         "movl           $0,     %6n"
  177.         "cmpl           %8,     %2n"
  178.         "jl             1bn"
  179.         : : "r" (cr), 
  180. "r" (cb), 
  181. "r" (lum), 
  182. "r" (cols), 
  183. "r" (row1) ,
  184. "r" (col1), 
  185. "m" (x), 
  186. "m" (mod), 
  187. "m" (y)
  188. );
  189. }
  190. static unsigned long long  mpeg3_MMX_U_80 = 0x0000008000800000;
  191. static unsigned long long  mpeg3_MMX_V_80 = 0x0000000000800080;
  192. static long long  mpeg3_MMX_U_COEF        = 0x00000058ffd30000;
  193. static long long  mpeg3_MMX_V_COEF        = 0x00000000ffea006f;
  194. static long long  mpeg3_MMX_601_Y_COEF    = 0x0000004800480048;
  195. static long long  mpeg3_MMX_601_Y_DIFF    = 0x0000000000000010;
  196. inline void mpeg3_bgra32_mmx(unsigned long y, 
  197. unsigned long u, 
  198. unsigned long v, 
  199. unsigned long *output)
  200. {
  201. asm(
  202. /* Output will be 0x00rrggbb with the 00 trailing so this can also be used */
  203. /* for bgr24. */
  204. "movd (%0), %%mm0;n"          /* Load y   0x00000000000000yy */
  205. "movd (%1), %%mm1;n"          /* Load u    0x00000000000000cr */
  206. "movq %%mm0, %%mm3;n"         /* Copy y to temp */
  207. "psllq $16, %%mm1;n"          /* Shift u   0x0000000000cr0000 */
  208. "movd (%2), %%mm2;n"          /* Load v    0x00000000000000cb */
  209. "psllq $16, %%mm3;n"          /* Shift y */
  210. "movq %%mm1, %%mm4;n"         /* Copy u to temp */
  211. "por %%mm3, %%mm0;n"          /* Overlay new y byte 0x0000000000yy00yy */
  212. "psllq $16, %%mm4;n"          /* Shift u */
  213. "movq %%mm2, %%mm5;n"         /* Copy v to temp */
  214. "psllq $16, %%mm3;n"          /* Shift y  */
  215. "por %%mm4, %%mm1;n"          /* Overlay new u byte 0x000000cr00cr0000 */
  216. "psllq $16, %%mm5;n"          /* Shift v  */
  217. "por %%mm3, %%mm0;n"          /* Overlay new y byte 0x000000yy00yy00yy */
  218. "por %%mm5, %%mm2;n"          /* Overlay new v byte 0x0000000000cb00cb */
  219. /* mm0: 0x000000yy00yy00yy mm1: 0x000000uu00uu0000 mm2: 0x0000000000vv00vv */
  220.   "psubw mpeg3_MMX_U_80, %%mm1;n"    /* Subtract 128 from u 0x000000uu00uu0000 */
  221.   "pmullw mpeg3_MMX_U_COEF, %%mm1;n" /* Multiply u coeffs 0x0000uuuuuuuu0000 */
  222.   "psllw $6, %%mm0;n"                /* Shift y coeffs 0x0000yyy0yyy0yyy0 */
  223.   "psubw mpeg3_MMX_V_80, %%mm2;n"    /* Subtract 128 from v 0x0000000000cb00cb */
  224.   "pmullw mpeg3_MMX_V_COEF, %%mm2;n" /* Multiply v coeffs 0x0000crcrcrcrcrcr */
  225. /* mm0: 0x000000yy00yy00yy mm1: 0x0000uuuuuuuu0000 mm2: 0x00000000vvvvvvvv */
  226. "paddsw %%mm1, %%mm0;n"        /* Add u to result */
  227. "paddsw %%mm2, %%mm0;n"        /* Add v to result 0x0000rrrrggggbbbb */
  228. "psraw $6, %%mm0;n"           /* Demote precision */
  229. "packuswb %%mm0, %%mm0;n"     /* Pack into ARGB 0x0000000000rrggbb */
  230. "movd %%mm0, (%3);n"          /* Store output */
  231. :
  232. : "r" (&y), "r" (&u), "r" (&v), "r" (output));
  233. }
  234. inline void mpeg3_601_bgra32_mmx(unsigned long y, 
  235. unsigned long u, 
  236. unsigned long v, 
  237. unsigned long *output)
  238. {
  239. asm(
  240. /* Output will be 0x00rrggbb with the 00 trailing so this can also be used */
  241. /* for bgr24. */
  242. "movd (%0), %%mm0;n"          /* Load y   0x00000000000000yy */
  243. "psubsw mpeg3_MMX_601_Y_DIFF, %%mm0;n"      /* Subtract 16 from y */
  244. "movd (%1), %%mm1;n"          /* Load u    0x00000000000000cr */
  245. "movq %%mm0, %%mm3;n"         /* Copy y to temp */
  246. "psllq $16, %%mm1;n"          /* Shift u   0x0000000000cr0000 */
  247. "movd (%2), %%mm2;n"          /* Load v    0x00000000000000cb */
  248. "psllq $16, %%mm3;n"          /* Shift y */
  249. "movq %%mm1, %%mm4;n"         /* Copy u to temp */
  250. "por %%mm3, %%mm0;n"          /* Overlay new y byte 0x0000000000yy00yy */
  251. "psllq $16, %%mm4;n"          /* Shift u */
  252. "movq %%mm2, %%mm5;n"         /* Copy v to temp */
  253. "psllq $16, %%mm3;n"          /* Shift y  */
  254. "por %%mm4, %%mm1;n"          /* Overlay new u byte 0x000000cr00cr0000 */
  255. "psllq $16, %%mm5;n"          /* Shift v  */
  256. "por %%mm3, %%mm0;n"          /* Overlay new y byte 0x000000yy00yy00yy */
  257. "por %%mm5, %%mm2;n"          /* Overlay new v byte 0x0000000000cb00cb */
  258. /* mm0: 0x000000yy00yy00yy mm1: 0x000000uu00uu0000 mm2: 0x0000000000vv00vv */
  259. "pmullw mpeg3_MMX_601_Y_COEF, %%mm0;n" /* Scale and shift y coeffs */
  260. "psubw mpeg3_MMX_U_80, %%mm1;n"     /* Subtract 128 from u 0x000000uu00uu0000 */
  261.   "pmullw mpeg3_MMX_U_COEF, %%mm1;n"  /* Multiply u coeffs 0x0000uuuuuuuu0000 */
  262. "psubw mpeg3_MMX_V_80, %%mm2;n"     /* Subtract 128 from v 0x0000000000cb00cb */
  263.   "pmullw mpeg3_MMX_V_COEF, %%mm2;n"  /* Multiply v coeffs 0x0000crcrcrcrcrcr */
  264. /* mm0: 0x000000yy00yy00yy mm1: 0x0000uuuuuuuu0000 mm2: 0x00000000vvvvvvvv */
  265. "paddsw %%mm1, %%mm0;n"        /* Add u to result */
  266. "paddsw %%mm2, %%mm0;n"        /* Add v to result 0x0000rrrrggggbbbb */
  267. "psraw $6, %%mm0;n"           /* Demote precision */
  268. "packuswb %%mm0, %%mm0;n"     /* Pack into ARGB 0x0000000000rrggbb */
  269. "movd %%mm0, (%3);n"          /* Store output */
  270. :
  271. : "r" (&y), "r" (&u), "r" (&v), "r" (output));
  272. }
  273. static unsigned long long  mpeg3_MMX_U_80_RGB    = 0x0000000000800080;
  274. static unsigned long long  mpeg3_MMX_V_80_RGB    = 0x0000008000800000;
  275. static long long  mpeg3_MMX_U_COEF_RGB    = 0x00000000ffd30058;
  276. static long long  mpeg3_MMX_V_COEF_RGB    = 0x0000006fffea0000;
  277. inline void mpeg3_rgba32_mmx(unsigned long y, 
  278. unsigned long u, 
  279. unsigned long v, 
  280. unsigned long *output)
  281. {
  282. asm(
  283. /* Output will be 0x00bbggrr with the 00 trailing so this can also be used */
  284. /* for rgb24. */
  285. "movd (%0), %%mm0;n"          /* Load y   0x00000000000000yy */
  286. "movd (%1), %%mm1;n"          /* Load v    0x00000000000000vv */
  287. "movq %%mm0, %%mm3;n"         /* Copy y to temp */
  288. "psllq $16, %%mm1;n"          /* Shift v   0x0000000000vv0000 */
  289. "movd (%2), %%mm2;n"          /* Load u    0x00000000000000uu */
  290. "psllq $16, %%mm3;n"          /* Shift y */
  291. "movq %%mm1, %%mm4;n"         /* Copy v to temp */
  292. "por %%mm3, %%mm0;n"          /* Overlay new y byte 0x0000000000yy00yy */
  293. "psllq $16, %%mm4;n"          /* Shift v */
  294. "movq %%mm2, %%mm5;n"         /* Copy u to temp */
  295. "psllq $16, %%mm3;n"          /* Shift y  */
  296. "por %%mm4, %%mm1;n"          /* Overlay new v byte 0x000000vv00vv0000 */
  297. "psllq $16, %%mm5;n"          /* Shift u  */
  298. "por %%mm3, %%mm0;n"          /* Overlay new y byte 0x000000yy00yy00yy */
  299. "por %%mm5, %%mm2;n"          /* Overlay new u byte 0x0000000000uu00uu */
  300. /* mm0: 0x000000yy00yy00yy mm1: 0x000000vv00vv0000 mm2: 0x0000000000uu00uu */
  301.   "psubw mpeg3_MMX_V_80_RGB, %%mm1;n"    /* Subtract 128 from v 0x000000vv00vv0000 */
  302.   "pmullw mpeg3_MMX_V_COEF_RGB, %%mm1;n" /* Multiply v coeffs 0x0000vvvvvvvv0000 */
  303.   "psllw $6, %%mm0;n"                /* Shift y coeffs 0x0000yyy0yyy0yyy0 */
  304.   "psubw mpeg3_MMX_U_80_RGB, %%mm2;n"    /* Subtract 128 from u 0x0000000000uu00uu */
  305.   "pmullw mpeg3_MMX_U_COEF_RGB, %%mm2;n" /* Multiply u coeffs 0x0000uuuuuuuuuuuu */
  306. /* mm0: 0x000000yy00yy00yy mm1: 0x0000vvvvvvvv0000 mm2: 0x00000000uuuuuuuu */
  307. "paddsw %%mm1, %%mm0;n"        /* Add v to result */
  308. "paddsw %%mm2, %%mm0;n"        /* Add u to result 0x0000bbbbggggrrrr */
  309. "psraw $6, %%mm0;n"           /* Demote precision */
  310. "packuswb %%mm0, %%mm0;n"     /* Pack into RGBA 0x0000000000bbggrr */
  311. "movd %%mm0, (%3);n"          /* Store output */
  312. :
  313. : "r" (&y), "r" (&v), "r" (&u), "r" (output));
  314. }
  315. inline void mpeg3_601_rgba32_mmx(unsigned long y, 
  316. unsigned long u, 
  317. unsigned long v, 
  318. unsigned long *output)
  319. {
  320. asm(
  321. /* Output will be 0x00bbggrr with the 00 trailing so this can also be used */
  322. /* for rgb24. */
  323. "movd (%0), %%mm0;n"          /* Load y   0x00000000000000yy */
  324. "psubsw mpeg3_MMX_601_Y_DIFF, %%mm0;n"      /* Subtract 16 from y */
  325. "movd (%1), %%mm1;n"          /* Load v    0x00000000000000vv */
  326. "movq %%mm0, %%mm3;n"         /* Copy y to temp */
  327. "psllq $16, %%mm1;n"          /* Shift v   0x0000000000vv0000 */
  328. "movd (%2), %%mm2;n"          /* Load u    0x00000000000000uu */
  329. "psllq $16, %%mm3;n"          /* Shift y */
  330. "movq %%mm1, %%mm4;n"         /* Copy v to temp */
  331. "por %%mm3, %%mm0;n"          /* Overlay new y byte 0x0000000000yy00yy */
  332. "psllq $16, %%mm4;n"          /* Shift v */
  333. "movq %%mm2, %%mm5;n"         /* Copy u to temp */
  334. "psllq $16, %%mm3;n"          /* Shift y  */
  335. "por %%mm4, %%mm1;n"          /* Overlay new v byte 0x000000vv00vv0000 */
  336. "psllq $16, %%mm5;n"          /* Shift u  */
  337. "por %%mm3, %%mm0;n"          /* Overlay new y byte 0x000000yy00yy00yy */
  338. "por %%mm5, %%mm2;n"          /* Overlay new u byte 0x0000000000uu00uu */
  339. /* mm0: 0x000000yy00yy00yy     mm1: 0x000000vv00vv0000     mm2: 0x0000000000uu00uu */
  340. "pmullw mpeg3_MMX_601_Y_COEF, %%mm0;n"     /* Scale y coeffs */
  341.   "psubw mpeg3_MMX_V_80_RGB, %%mm1;n"    /* Subtract 128 from v 0x000000vv00vv0000 */
  342.   "pmullw mpeg3_MMX_V_COEF_RGB, %%mm1;n" /* Multiply v coeffs 0x0000vvvvvvvv0000 */
  343.   "psubw mpeg3_MMX_U_80_RGB, %%mm2;n"    /* Subtract 128 from u 0x0000000000uu00uu */
  344.   "pmullw mpeg3_MMX_U_COEF_RGB, %%mm2;n" /* Multiply u coeffs 0x0000uuuuuuuuuuuu */
  345. /* mm0: 0x000000yy00yy00yy mm1: 0x0000vvvvvvvv0000 mm2: 0x00000000uuuuuuuu */
  346. "paddsw %%mm1, %%mm0;n"        /* Add v to result */
  347. "paddsw %%mm2, %%mm0;n"        /* Add u to result 0x0000bbbbggggrrrr */
  348. "psraw $6, %%mm0;n"           /* Demote precision */
  349. "packuswb %%mm0, %%mm0;n"     /* Pack into RGBA 0x0000000000bbggrr */
  350. "movd %%mm0, (%3);n"          /* Store output */
  351. :
  352. : "r" (&y), "r" (&v), "r" (&u), "r" (output));
  353. }
  354. #endif
  355. #define DITHER_ROW_HEAD 
  356. for(h = 0; h < video->out_h; h++) 
  357. y_in = &src[0][(video->y_table[h] + video->in_y) * 
  358. video->coded_picture_width] + 
  359. video->in_x; 
  360. if(video->chroma_format == CHROMA420) 
  361. cb_in = &src[1][((video->y_table[h] + video->in_y) >> 1) * 
  362. video->chrom_width] + 
  363. (video->in_x >> 1); 
  364. cr_in = &src[2][((video->y_table[h] + video->in_y) >> 1) * 
  365. video->chrom_width] + 
  366. (video->in_x >> 1); 
  367. else 
  368. cb_in = &src[1][(video->y_table[h] + video->in_y) * 
  369. video->chrom_width] + 
  370. (video->in_x >> 1); 
  371. cr_in = &src[2][(video->y_table[h] + video->in_y) * 
  372. video->chrom_width] + 
  373. (video->in_x >> 1); 
  374. data = output_rows[h];
  375. #define DITHER_ROW_TAIL 
  376. }
  377. #define DITHER_SCALE_HEAD 
  378. for(w = 0; w < video->out_w; w++) 
  379. uv_subscript = video->x_table[w] / 2; 
  380. y_l = y_in[video->x_table[w]]; 
  381. y_l <<= 16; 
  382. r_l = (y_l + video->cr_to_r[cr_in[uv_subscript]]) >> 16; 
  383. g_l = (y_l + video->cr_to_g[cr_in[uv_subscript]] + video->cb_to_g[cb_in[uv_subscript]]) >> 16; 
  384. b_l = (y_l + video->cb_to_b[cb_in[uv_subscript]]) >> 16;
  385. #define DITHER_SCALE_601_HEAD 
  386. for(w = 0; w < video->out_w; w++) 
  387. uv_subscript = video->x_table[w] / 2; 
  388. y_l = mpeg3_601_to_rgb[y_in[video->x_table[w]]]; 
  389. y_l <<= 16; 
  390. r_l = (y_l + video->cr_to_r[cr_in[uv_subscript]]) >> 16; 
  391. g_l = (y_l + video->cr_to_g[cr_in[uv_subscript]] + video->cb_to_g[cb_in[uv_subscript]]) >> 16; 
  392. b_l = (y_l + video->cb_to_b[cb_in[uv_subscript]]) >> 16;
  393. #define DITHER_SCALE_TAIL 
  394. }
  395. #define DITHER_MMX_SCALE_HEAD 
  396. for(w = 0; w < video->out_w; w++) 
  397. uv_subscript = video->x_table[w] / 2;
  398. #define DITHER_MMX_SCALE_TAIL 
  399. data += step; 
  400. }
  401. #define DITHER_MMX_HEAD 
  402. for(w = 0; w < video->out_w; w += 2) 
  403. {
  404. #define DITHER_MMX_TAIL 
  405. data += step; 
  406.         cr_in++; 
  407.         cb_in++; 
  408. }
  409. #define DITHER_HEAD 
  410.     for(w = 0; w < video->horizontal_size; w++) 
  411. y_l = *y_in++; 
  412. y_l <<= 16; 
  413. r_l = (y_l + video->cr_to_r[*cr_in]) >> 16; 
  414. g_l = (y_l + video->cr_to_g[*cr_in] + video->cb_to_g[*cb_in]) >> 16; 
  415. b_l = (y_l + video->cb_to_b[*cb_in]) >> 16;
  416. #define DITHER_601_HEAD 
  417.     for(w = 0; w < video->horizontal_size; w++) 
  418. y_l = mpeg3_601_to_rgb[*y_in++]; 
  419. y_l <<= 16; 
  420. r_l = (y_l + video->cr_to_r[*cr_in]) >> 16; 
  421. g_l = (y_l + video->cr_to_g[*cr_in] + video->cb_to_g[*cb_in]) >> 16; 
  422. b_l = (y_l + video->cb_to_b[*cb_in]) >> 16;
  423. #define DITHER_TAIL 
  424.      if(w & 1) 
  425.          cr_in++; 
  426.          cb_in++; 
  427.      } 
  428.     }
  429. #define STORE_PIXEL_BGR888 
  430. *data++ = CLIP(b_l); 
  431. *data++ = CLIP(g_l); 
  432. *data++ = CLIP(r_l);
  433. #define STORE_PIXEL_BGRA8888 
  434. *data++ = CLIP(b_l); 
  435. *data++ = CLIP(g_l); 
  436. *data++ = CLIP(r_l); 
  437. *data++ = 0;
  438. #define STORE_PIXEL_RGB565 
  439. *((unsigned short*)data)++ = 
  440. ((CLIP(r_l) & 0xf8) << 8) | 
  441. ((CLIP(g_l) & 0xfc) << 3) | 
  442. ((CLIP(b_l) & 0xf8) >> 3);
  443. #define STORE_PIXEL_RGB888 
  444. *data++ = CLIP(r_l); 
  445. *data++ = CLIP(g_l); 
  446. *data++ = CLIP(b_l);
  447. #define STORE_PIXEL_RGBA8888 
  448. *data++ = CLIP(r_l); 
  449. *data++ = CLIP(g_l); 
  450. *data++ = CLIP(b_l); 
  451. *data++ = 0;
  452. #define STORE_PIXEL_RGBA16161616 
  453. *data_s++ = CLIP(r_l); 
  454. *data_s++ = CLIP(g_l); 
  455. *data_s++ = CLIP(b_l); 
  456. *data_s++ = 0;
  457. /* Only good for YUV 4:2:0 */
  458. int mpeg3video_ditherframe(mpeg3video_t *video, 
  459. unsigned char **src, 
  460. unsigned char **output_rows)
  461. {
  462. int h = 0;
  463. register unsigned char *y_in, *cb_in, *cr_in;
  464. long y_l, r_l, b_l, g_l;
  465. register unsigned char *data;
  466. register int uv_subscript, step, w = -1;
  467. #ifdef HAVE_MMX
  468. /* =================================== MMX ===================================== */
  469. if(/* video->have_mmx */ 1 &&
  470. video->out_w == video->horizontal_size &&
  471. video->out_h == video->vertical_size &&
  472. video->in_w == video->out_w &&
  473. video->in_h == video->out_h &&
  474. video->in_x == 0 &&
  475. video->in_y == 0 &&
  476. (video->color_model == MPEG3_RGB565 || 
  477. video->color_model == MPEG3_601_RGB565) && 
  478. video->chroma_format == CHROMA420)
  479. {
  480. /* Unscaled 16 bit from NIST */
  481. mpeg3video_rgb16_mmx(src[0], 
  482. src[2], 
  483. src[1], 
  484. output_rows[0], 
  485. video->out_h, 
  486. video->out_w, 
  487. (output_rows[1] - output_rows[0]) / 2 - video->out_w);
  488. }
  489. else
  490. if(/* video->have_mmx */ 1 && 
  491. (video->color_model == MPEG3_BGRA8888 || 
  492. video->color_model == MPEG3_BGR888 ||
  493. /* video->color_model == MPEG3_RGB888 || */
  494. video->color_model == MPEG3_RGBA8888 ||
  495. video->color_model == MPEG3_601_BGR888 ||
  496. video->color_model == MPEG3_601_BGRA8888 ||
  497. video->color_model == MPEG3_601_RGB888 ||
  498. video->color_model == MPEG3_601_RGBA8888))
  499. {
  500. /* Original MMX */
  501. if(video->color_model == MPEG3_BGRA8888 ||
  502. video->color_model == MPEG3_RGBA8888 ||
  503. video->color_model == MPEG3_601_BGRA8888 ||
  504. video->color_model == MPEG3_601_RGBA8888) step = 4;
  505. else
  506. if(video->color_model == MPEG3_BGR888 ||
  507. video->color_model == MPEG3_RGB888 ||
  508. video->color_model == MPEG3_601_BGR888 ||
  509. video->color_model == MPEG3_601_RGB888) step = 3;
  510. DITHER_ROW_HEAD
  511. /* Transfer row with scaling */
  512. if(video->out_w != video->horizontal_size)
  513. {
  514. switch(video->color_model)
  515. {
  516. case MPEG3_BGRA8888:
  517. case MPEG3_BGR888:
  518. DITHER_MMX_SCALE_HEAD
  519. mpeg3_bgra32_mmx(y_in[video->x_table[w]], 
  520. cr_in[uv_subscript], 
  521. cb_in[uv_subscript], 
  522. (unsigned long*)data);
  523. DITHER_MMX_SCALE_TAIL
  524. break;
  525. case MPEG3_601_BGRA8888:
  526. case MPEG3_601_BGR888:
  527. DITHER_MMX_SCALE_HEAD
  528. mpeg3_601_bgra32_mmx(y_in[video->x_table[w]], 
  529. cr_in[uv_subscript], 
  530. cb_in[uv_subscript], 
  531. (unsigned long*)data);
  532. DITHER_MMX_SCALE_TAIL
  533. break;
  534. case MPEG3_RGBA8888:
  535. case MPEG3_RGB888:
  536. DITHER_MMX_SCALE_HEAD
  537. mpeg3_rgba32_mmx(y_in[video->x_table[w]], 
  538. cr_in[uv_subscript], 
  539. cb_in[uv_subscript], 
  540. (unsigned long*)data);
  541. DITHER_MMX_SCALE_TAIL
  542. break;
  543. case MPEG3_601_RGBA8888:
  544. case MPEG3_601_RGB888:
  545. DITHER_MMX_SCALE_HEAD
  546. mpeg3_601_rgba32_mmx(y_in[video->x_table[w]], 
  547. cr_in[uv_subscript], 
  548. cb_in[uv_subscript], 
  549. (unsigned long*)data);
  550. DITHER_MMX_SCALE_TAIL
  551. break;
  552. }
  553. }
  554. else
  555. /* Transfer row unscaled */
  556. {
  557. switch(video->color_model)
  558. {
  559. /* MMX byte swap 24 and 32 bit */
  560. case MPEG3_BGRA8888:
  561. case MPEG3_BGR888:
  562. DITHER_MMX_HEAD
  563. mpeg3_bgra32_mmx(*y_in++, 
  564. *cr_in, 
  565. *cb_in, 
  566. (unsigned long*)data);
  567. data += step;
  568. mpeg3_bgra32_mmx(*y_in++, 
  569. *cr_in, 
  570. *cb_in, 
  571. (unsigned long*)data);
  572. DITHER_MMX_TAIL
  573. break;
  574. /* MMX 601 byte swap 24 and 32 bit */
  575. case MPEG3_601_BGRA8888:
  576. case MPEG3_601_BGR888:
  577. DITHER_MMX_HEAD
  578. mpeg3_601_bgra32_mmx(*y_in++, 
  579. *cr_in, 
  580. *cb_in, 
  581. (unsigned long*)data);
  582. data += step;
  583. mpeg3_601_bgra32_mmx(*y_in++, 
  584. *cr_in, 
  585. *cb_in, 
  586. (unsigned long*)data);
  587. DITHER_MMX_TAIL
  588. break;
  589. /* MMX 24 and 32 bit no byte swap */
  590. case MPEG3_RGBA8888:
  591. case MPEG3_RGB888:
  592. DITHER_MMX_HEAD
  593. mpeg3_rgba32_mmx(*y_in++, 
  594. *cr_in, 
  595. *cb_in, 
  596. (unsigned long*)data);
  597. data += step;
  598. mpeg3_rgba32_mmx(*y_in++, 
  599. *cr_in, 
  600. *cb_in, 
  601. (unsigned long*)data);
  602. DITHER_MMX_TAIL
  603. break;
  604. /* MMX 601 24 and 32 bit no byte swap */
  605. case MPEG3_601_RGBA8888:
  606. case MPEG3_601_RGB888:
  607. DITHER_MMX_HEAD
  608. mpeg3_601_rgba32_mmx(*y_in++, 
  609. *cr_in, 
  610. *cb_in, 
  611. (unsigned long*)data);
  612. data += step;
  613. mpeg3_601_rgba32_mmx(*y_in++, 
  614. *cr_in, 
  615. *cb_in, 
  616. (unsigned long*)data);
  617. DITHER_MMX_TAIL
  618. break;
  619. }
  620. }
  621. DITHER_ROW_TAIL
  622. }
  623. else
  624. #endif
  625. /* ================================== NO MMX ==================================== */
  626. {
  627. DITHER_ROW_HEAD
  628. /* Transfer row with scaling */
  629. if(video->out_w != video->horizontal_size)
  630. {
  631. switch(video->color_model)
  632. {
  633. case MPEG3_BGR888:
  634. DITHER_SCALE_HEAD
  635. STORE_PIXEL_BGR888
  636. DITHER_SCALE_TAIL
  637. break;
  638. case MPEG3_BGRA8888:
  639. DITHER_SCALE_HEAD
  640. STORE_PIXEL_BGRA8888
  641. DITHER_SCALE_TAIL
  642. break;
  643. case MPEG3_RGB565:
  644. DITHER_SCALE_HEAD
  645. STORE_PIXEL_RGB565
  646. DITHER_SCALE_TAIL
  647. break;
  648. case MPEG3_RGB888:
  649. DITHER_SCALE_HEAD
  650. STORE_PIXEL_RGB888
  651. DITHER_SCALE_TAIL
  652. break;
  653. case MPEG3_RGBA8888:
  654. DITHER_SCALE_HEAD
  655. STORE_PIXEL_RGBA8888
  656. DITHER_SCALE_TAIL
  657. break;
  658. case MPEG3_601_BGR888:
  659. DITHER_SCALE_601_HEAD
  660. STORE_PIXEL_BGR888
  661. DITHER_SCALE_TAIL
  662. break;
  663. case MPEG3_601_BGRA8888:
  664. DITHER_SCALE_601_HEAD
  665. STORE_PIXEL_BGRA8888
  666. DITHER_SCALE_TAIL
  667. break;
  668. case MPEG3_601_RGB565:
  669. DITHER_SCALE_601_HEAD
  670. STORE_PIXEL_RGB565
  671. DITHER_SCALE_TAIL
  672. break;
  673. case MPEG3_601_RGB888:
  674. DITHER_SCALE_601_HEAD
  675. STORE_PIXEL_RGB888
  676. DITHER_SCALE_TAIL
  677. break;
  678. case MPEG3_601_RGBA8888:
  679. DITHER_SCALE_601_HEAD
  680. STORE_PIXEL_RGBA8888
  681. DITHER_SCALE_TAIL
  682. break;
  683. case MPEG3_RGBA16161616:
  684. {
  685. register unsigned short *data_s = (unsigned short*)data;
  686. DITHER_SCALE_HEAD
  687. STORE_PIXEL_RGBA16161616
  688. DITHER_SCALE_TAIL
  689. }
  690. break;
  691. }
  692. }
  693. else
  694. {
  695. /* Transfer row unscaled */
  696. switch(video->color_model)
  697. {
  698. case MPEG3_BGR888:
  699. DITHER_HEAD
  700. STORE_PIXEL_BGR888
  701. DITHER_TAIL
  702. break;
  703. case MPEG3_BGRA8888:
  704. DITHER_HEAD
  705. STORE_PIXEL_BGRA8888
  706. DITHER_TAIL
  707. break;
  708. case MPEG3_RGB565:
  709. DITHER_HEAD
  710. STORE_PIXEL_RGB565
  711. DITHER_TAIL
  712. break;
  713. case MPEG3_RGB888:
  714. DITHER_HEAD
  715. STORE_PIXEL_RGB888
  716. DITHER_TAIL
  717. break;
  718. case MPEG3_RGBA8888:
  719. DITHER_HEAD
  720. STORE_PIXEL_RGBA8888
  721. DITHER_TAIL
  722. break;
  723. case MPEG3_601_BGR888:
  724. DITHER_601_HEAD
  725. STORE_PIXEL_BGR888
  726. DITHER_TAIL
  727. break;
  728. case MPEG3_601_BGRA8888:
  729. DITHER_601_HEAD
  730. STORE_PIXEL_BGRA8888
  731. DITHER_TAIL
  732. break;
  733. case MPEG3_601_RGB565:
  734. DITHER_601_HEAD
  735. STORE_PIXEL_RGB565
  736. DITHER_TAIL
  737. break;
  738. case MPEG3_601_RGB888:
  739. DITHER_601_HEAD
  740. STORE_PIXEL_RGB888
  741. DITHER_TAIL
  742. break;
  743. case MPEG3_601_RGBA8888:
  744. DITHER_601_HEAD
  745. STORE_PIXEL_RGBA8888
  746. DITHER_TAIL
  747. break;
  748. case MPEG3_RGBA16161616:
  749. {
  750. register unsigned short *data_s = (unsigned short*)data;
  751. DITHER_HEAD
  752. STORE_PIXEL_RGBA16161616
  753. DITHER_TAIL
  754. }
  755. break;
  756. }
  757. }
  758. DITHER_ROW_TAIL
  759. } /* End of non-MMX */
  760. #ifdef HAVE_MMX
  761. if(video->have_mmx)
  762. __asm__ __volatile__ ("emms");
  763. #endif
  764. return 0;
  765. }
  766. int mpeg3video_ditherframe444(mpeg3video_t *video, unsigned char *src[])
  767. {
  768. return 0;
  769. }
  770. int mpeg3video_dithertop(mpeg3video_t *video, unsigned char *src[])
  771. {
  772. return mpeg3video_ditherframe(video, src, video->output_rows);
  773. }
  774. int mpeg3video_dithertop444(mpeg3video_t *video, unsigned char *src[])
  775. {
  776. return 0;
  777. }
  778. int mpeg3video_ditherbot(mpeg3video_t *video, unsigned char *src[])
  779. {
  780. return 0;
  781. }
  782. int mpeg3video_ditherbot444(mpeg3video_t *video, unsigned char *src[])
  783. {
  784. return 0;
  785. }
  786. void memcpy_fast(unsigned char *output, unsigned char *input, long len)
  787. {
  788. int i, len2;
  789. /* 8 byte alignment */
  790. /*
  791.  *  if(!((long)input & 0x7))
  792.  *  {
  793.  *  len2 = len >> 4;
  794.  *  for(i = 0; i < len2; )
  795.  *  {
  796.  *  ((int64_t*)output)[i] = ((int64_t*)input)[i];
  797.  *  i++;
  798.  *  ((int64_t*)output)[i] = ((int64_t*)input)[i];
  799.  *  i++;
  800.  *  }
  801.  * 
  802.  *  for(i *= 16; i < len; i++)
  803.  *  {
  804.  *  output[i] = input[i];
  805.  *  }
  806.  *  }
  807.  *  else
  808.  */
  809. memcpy(output, input, len);
  810. }
  811. int mpeg3video_init_output()
  812. {
  813. int i, value;
  814. for(i = 0; i < 256; i++)
  815. {
  816. value = (int)(1.1644 * i - 255 * 0.0627 + 0.5);
  817. if(value < 0) value = 0;
  818. else
  819. if(value > 255) value = 255;
  820. mpeg3_601_to_rgb[i] = value;
  821. }
  822. return 0;
  823. }
  824. int mpeg3video_present_frame(mpeg3video_t *video)
  825. {
  826. int i, j, k, l;
  827. unsigned char **src = video->output_src;
  828. /* Copy YUV buffers */
  829. if(video->want_yvu)
  830. {
  831. long size0, size1;
  832. long offset0, offset1;
  833. int chroma_denominator;
  834. if(video->chroma_format == CHROMA420)
  835. chroma_denominator = 2;
  836. else
  837. chroma_denominator = 1;
  838. /* Drop a frame */
  839. if(!video->y_output) return 0;
  840. /* Copy a frame */
  841. /* Three blocks */
  842. if(video->in_x == 0 && 
  843. video->in_w >= video->coded_picture_width &&
  844. video->row_span == video->coded_picture_width)
  845. {
  846. size0 = video->coded_picture_width * video->in_h;
  847. size1 = video->chrom_width * (int)((float)video->in_h / chroma_denominator + 0.5);
  848. offset0 = video->coded_picture_width * video->in_y;
  849. offset1 = video->chrom_width * (int)((float)video->in_y / chroma_denominator + 0.5);
  850. printf("mpeg3video_present_frame 1n");
  851. /*
  852.  *  if(video->in_y > 0)
  853.  *  {
  854.  *  offset[1] += video->chrom_width / 2;
  855.  *  size[1] += video->chrom_width / 2;
  856.  *  }
  857.  */
  858. memcpy(video->y_output, src[0] + offset0, size0);
  859. memcpy(video->u_output, src[1] + offset1, size1);
  860. memcpy(video->v_output, src[2] + offset1, size1);
  861. }
  862. else
  863. /* One block per row */
  864. {
  865. //printf("mpeg3video_present_frame 2 %d %d %dn", video->in_w, video->coded_picture_width, video->chrom_width);
  866. int row_span = video->in_w;
  867. int row_span0;
  868. int row_span1;
  869. if(video->row_span)
  870. row_span = video->row_span;
  871. row_span0 = row_span;
  872. row_span1 = (row_span >> 1);
  873. size0 = video->in_w;
  874. size1 = (video->in_w >> 1);
  875. offset0 = video->coded_picture_width * video->in_y;
  876. offset1 = video->chrom_width * video->in_y / chroma_denominator;
  877. for(i = 0; i < video->in_h; i++)
  878. {
  879. memcpy(video->y_output + i * row_span0, 
  880. src[0] + offset0 + video->in_x, 
  881. size0);
  882. offset0 += video->coded_picture_width;
  883. if(chroma_denominator == 1 || !(i % 2))
  884. {
  885. memcpy(video->u_output + i / chroma_denominator * row_span1, 
  886. src[1] + offset1 + (video->in_x >> 1), 
  887. size1);
  888. memcpy(video->v_output + i / chroma_denominator * row_span1, 
  889. src[2] + offset1 + (video->in_x >> 1), 
  890. size1);
  891. if(video->horizontal_size < video->in_w)
  892. {
  893. memset(video->u_output + 
  894. i / chroma_denominator * row_span1 +
  895. (video->horizontal_size >> 1),
  896. 0x80,
  897. (video->in_w >> 1) - 
  898. (video->horizontal_size >> 1));
  899. memset(video->v_output + 
  900. i / chroma_denominator * row_span1 +
  901. (video->horizontal_size >> 1),
  902. 0x80,
  903. (video->in_w >> 1) - 
  904. (video->horizontal_size >> 1));
  905. }
  906. }
  907. if(chroma_denominator == 1 || (i % 2))
  908. offset1 += video->chrom_width;
  909. }
  910. }
  911. return 0;
  912. }
  913. /* Want RGB buffer */
  914. /* Copy the frame to the output with YUV to RGB conversion */
  915.    if(video->prog_seq)
  916. {
  917.      if(video->chroma_format != CHROMA444)
  918. {
  919.      mpeg3video_ditherframe(video, src, video->output_rows);
  920.      }
  921.      else
  922.         mpeg3video_ditherframe444(video, src);
  923.    }
  924. else
  925. {
  926.     if((video->pict_struct == FRAME_PICTURE && video->topfirst) || 
  927. video->pict_struct == BOTTOM_FIELD)
  928. {
  929. /* top field first */
  930.      if(video->chroma_format != CHROMA444)
  931. {
  932.          mpeg3video_dithertop(video, src);
  933.          mpeg3video_ditherbot(video, src);
  934.      }
  935.      else 
  936. {
  937.          mpeg3video_dithertop444(video, src);
  938.          mpeg3video_ditherbot444(video, src);
  939.      }
  940.      }
  941.      else 
  942. {
  943. /* bottom field first */
  944.      if(video->chroma_format != CHROMA444)
  945. {
  946.          mpeg3video_ditherbot(video, src);
  947.          mpeg3video_dithertop(video, src);
  948.      }
  949.      else 
  950. {
  951.          mpeg3video_ditherbot444(video, src);
  952.          mpeg3video_dithertop444(video, src);
  953.      }
  954.      }
  955.    }
  956. return 0;
  957. }
  958. int mpeg3video_display_second_field(mpeg3video_t *video)
  959. {
  960. /* Not used */
  961. return 0;
  962. }