gst_plugins_base/gst/ffmpegcolorspace/imgconvert.c
branchRCL_3
changeset 30 7e817e7e631c
parent 29 567bb019e3e3
equal deleted inserted replaced
29:567bb019e3e3 30:7e817e7e631c
    62         /* .is_alpha       = */ 0,
    62         /* .is_alpha       = */ 0,
    63         /* .x_chroma_shift = */ 1,
    63         /* .x_chroma_shift = */ 1,
    64         /* .y_chroma_shift = */ 1,
    64         /* .y_chroma_shift = */ 1,
    65         /* .depth          = */ 8,
    65         /* .depth          = */ 8,
    66       },
    66       },
    67   /* [PIX_FMT_NV12] = */ {
       
    68         /* .format         = */ PIX_FMT_NV12,
       
    69         /* .name           = */ "nv12",
       
    70         /* .nb_channels    = */ 2,
       
    71         /* .color_type     = */ FF_COLOR_YUV,
       
    72         /* .pixel_type     = */ FF_PIXEL_PACKED,
       
    73         /* .is_alpha       = */ 0,
       
    74         /* .x_chroma_shift = */ 1,
       
    75         /* .y_chroma_shift = */ 1,
       
    76         /* .depth          = */ 8,
       
    77       },
       
    78   /* [PIX_FMT_NV21] = */ {
       
    79         /* .format         = */ PIX_FMT_NV21,
       
    80         /* .name           = */ "nv21",
       
    81         /* .nb_channels    = */ 2,
       
    82         /* .color_type     = */ FF_COLOR_YUV,
       
    83         /* .pixel_type     = */ FF_PIXEL_PACKED,
       
    84         /* .is_alpha       = */ 0,
       
    85         /* .x_chroma_shift = */ 1,
       
    86         /* .y_chroma_shift = */ 1,
       
    87         /* .depth          = */ 8,
       
    88       },
       
    89   /* [PIX_FMT_YUV422P] = */ {
    67   /* [PIX_FMT_YUV422P] = */ {
    90         /* .format         = */ PIX_FMT_YUV422P,
    68         /* .format         = */ PIX_FMT_YUV422P,
    91         /* .name           = */ "yuv422p",
    69         /* .name           = */ "yuv422p",
    92         /* .nb_channels    = */ 3,
    70         /* .nb_channels    = */ 3,
    93         /* .color_type     = */ FF_COLOR_YUV,
    71         /* .color_type     = */ FF_COLOR_YUV,
   125         /* .nb_channels    = */ 1,
   103         /* .nb_channels    = */ 1,
   126         /* .color_type     = */ FF_COLOR_YUV,
   104         /* .color_type     = */ FF_COLOR_YUV,
   127         /* .pixel_type     = */ FF_PIXEL_PACKED,
   105         /* .pixel_type     = */ FF_PIXEL_PACKED,
   128         /* .is_alpha       = */ 0,
   106         /* .is_alpha       = */ 0,
   129         /* .x_chroma_shift = */ 1,
   107         /* .x_chroma_shift = */ 1,
   130         /* .y_chroma_shift = */ 0,
       
   131         /* .depth          = */ 8,
       
   132       },
       
   133   /* [PIX_FMT_YVYU422] = */ {
       
   134         /* .format         = */ PIX_FMT_YVYU422,
       
   135         /* .name           = */ "yvyu422",
       
   136         /* .nb_channels    = */ 1,
       
   137         /* .color_type     = */ FF_COLOR_YUV,
       
   138         /* .pixel_type     = */ FF_PIXEL_PACKED,
       
   139         /* .is_alpha       = */ 0,
       
   140         /* .x_chroma_shift = */ 1,
       
   141         /* .y_chroma_shift = */ 0,
       
   142         /* .depth          = */ 8,
       
   143       },
       
   144   /* [PIX_FMT_V308] = */ {
       
   145         /* .format         = */ PIX_FMT_V308,
       
   146         /* .name           = */ "v308",
       
   147         /* .nb_channels    = */ 1,
       
   148         /* .color_type     = */ FF_COLOR_YUV,
       
   149         /* .pixel_type     = */ FF_PIXEL_PACKED,
       
   150         /* .is_alpha       = */ 0,
       
   151         /* .x_chroma_shift = */ 0,
       
   152         /* .y_chroma_shift = */ 0,
   108         /* .y_chroma_shift = */ 0,
   153         /* .depth          = */ 8,
   109         /* .depth          = */ 8,
   154       },
   110       },
   155   /* [PIX_FMT_YUV410P] = */ {
   111   /* [PIX_FMT_YUV410P] = */ {
   156         /* .format         = */ PIX_FMT_YUV410P,
   112         /* .format         = */ PIX_FMT_YUV410P,
   365         /* .is_alpha       = */ 0,
   321         /* .is_alpha       = */ 0,
   366         /* .x_chroma_shift = */ 0,
   322         /* .x_chroma_shift = */ 0,
   367         /* .y_chroma_shift = */ 0,
   323         /* .y_chroma_shift = */ 0,
   368         /* .depth          = */ 8,
   324         /* .depth          = */ 8,
   369       },
   325       },
   370   /* [PIX_FMT_GRAY16_L] = */ {
       
   371         /* .format         = */ PIX_FMT_GRAY16_L,
       
   372         /* .name           = */ "gray",
       
   373         /* .nb_channels    = */ 1,
       
   374         /* .color_type     = */ FF_COLOR_GRAY,
       
   375         /* .pixel_type     = */ FF_PIXEL_PLANAR,
       
   376         /* .is_alpha       = */ 0,
       
   377         /* .x_chroma_shift = */ 0,
       
   378         /* .y_chroma_shift = */ 0,
       
   379         /* .depth          = */ 16,
       
   380       },
       
   381   /* [PIX_FMT_GRAY16_B] = */ {
       
   382         /* .format         = */ PIX_FMT_GRAY16_B,
       
   383         /* .name           = */ "gray",
       
   384         /* .nb_channels    = */ 1,
       
   385         /* .color_type     = */ FF_COLOR_GRAY,
       
   386         /* .pixel_type     = */ FF_PIXEL_PLANAR,
       
   387         /* .is_alpha       = */ 0,
       
   388         /* .x_chroma_shift = */ 0,
       
   389         /* .y_chroma_shift = */ 0,
       
   390         /* .depth          = */ 16,
       
   391       },
       
   392   /* [PIX_FMT_MONOWHITE] = */ {
   326   /* [PIX_FMT_MONOWHITE] = */ {
   393         /* .format         = */ PIX_FMT_MONOWHITE,
   327         /* .format         = */ PIX_FMT_MONOWHITE,
   394         /* .name           = */ "monow",
   328         /* .name           = */ "monow",
   395         /* .nb_channels    = */ 1,
   329         /* .nb_channels    = */ 1,
   396         /* .color_type     = */ FF_COLOR_GRAY,
   330         /* .color_type     = */ FF_COLOR_GRAY,
   572         256 * 4);
   506         256 * 4);
   573 
   507 
   574   return size;
   508   return size;
   575 }
   509 }
   576 #endif
   510 #endif
       
   511 
   577 #ifdef __SYMBIAN32__
   512 #ifdef __SYMBIAN32__
   578 EXPORT_C
   513 EXPORT_C
   579 #endif
   514 #endif
   580 int
   515 int
   581 avpicture_get_size (int pix_fmt, int width, int height)
   516 avpicture_get_size (int pix_fmt, int width, int height)
   654   switch (pf->pixel_type) {
   589   switch (pf->pixel_type) {
   655     case FF_PIXEL_PACKED:
   590     case FF_PIXEL_PACKED:
   656       switch (pix_fmt) {
   591       switch (pix_fmt) {
   657         case PIX_FMT_YUV422:
   592         case PIX_FMT_YUV422:
   658         case PIX_FMT_UYVY422:
   593         case PIX_FMT_UYVY422:
   659         case PIX_FMT_YVYU422:
       
   660         case PIX_FMT_RGB565:
   594         case PIX_FMT_RGB565:
   661         case PIX_FMT_RGB555:
   595         case PIX_FMT_RGB555:
   662           bits = 16;
   596           bits = 16;
   663           break;
   597           break;
   664         case PIX_FMT_UYVY411:
   598         case PIX_FMT_UYVY411:
   768 static void
   702 static void
   769 img_copy (AVPicture * dst, const AVPicture * src,
   703 img_copy (AVPicture * dst, const AVPicture * src,
   770     int pix_fmt, int width, int height)
   704     int pix_fmt, int width, int height)
   771 {
   705 {
   772   int bwidth, bits, i;
   706   int bwidth, bits, i;
   773   const PixFmtInfo *pf;
   707   PixFmtInfo *pf = get_pix_fmt_info (pix_fmt);
   774 
   708 
   775   pf = get_pix_fmt_info (pix_fmt);
   709   pf = get_pix_fmt_info (pix_fmt);
   776   switch (pf->pixel_type) {
   710   switch (pf->pixel_type) {
   777     case FF_PIXEL_PACKED:
   711     case FF_PIXEL_PACKED:
   778       switch (pix_fmt) {
   712       switch (pix_fmt) {
   779         case PIX_FMT_YUV422:
   713         case PIX_FMT_YUV422:
   780         case PIX_FMT_UYVY422:
   714         case PIX_FMT_UYVY422:
   781         case PIX_FMT_YVYU422:
       
   782         case PIX_FMT_RGB565:
   715         case PIX_FMT_RGB565:
   783         case PIX_FMT_RGB555:
   716         case PIX_FMT_RGB555:
   784           bits = 16;
   717           bits = 16;
   785           break;
   718           break;
   786         case PIX_FMT_UYVY411:
   719         case PIX_FMT_UYVY411:
   877     cr1 += dst->linesize[2];
   810     cr1 += dst->linesize[2];
   878   }
   811   }
   879 }
   812 }
   880 
   813 
   881 static void
   814 static void
   882 uyvy422_to_gray (AVPicture * dst, const AVPicture * src, int width, int height)
       
   883 {
       
   884   const uint8_t *p, *p1;
       
   885   uint8_t *lum, *lum1;
       
   886   int w;
       
   887 
       
   888   p1 = src->data[0];
       
   889   lum1 = dst->data[0];
       
   890   for (; height > 0; height--) {
       
   891     p = p1;
       
   892     lum = lum1;
       
   893 
       
   894     for (w = width; w >= 2; w -= 2) {
       
   895       lum[0] = p[1];
       
   896       lum[1] = p[3];
       
   897       p += 4;
       
   898       lum += 2;
       
   899     }
       
   900     p1 += src->linesize[0];
       
   901     lum1 += dst->linesize[0];
       
   902   }
       
   903 }
       
   904 
       
   905 
       
   906 static void
       
   907 uyvy422_to_yuv420p (AVPicture * dst, const AVPicture * src,
   815 uyvy422_to_yuv420p (AVPicture * dst, const AVPicture * src,
   908     int width, int height)
   816     int width, int height)
   909 {
   817 {
   910   const uint8_t *p, *p1;
   818   const uint8_t *p, *p1;
   911   uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1;
   819   uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1;
   994     cb1 += dst->linesize[1];
   902     cb1 += dst->linesize[1];
   995     cr1 += dst->linesize[2];
   903     cr1 += dst->linesize[2];
   996   }
   904   }
   997 }
   905 }
   998 
   906 
   999 static void
       
  1000 yvyu422_to_gray (AVPicture * dst, const AVPicture * src, int width, int height)
       
  1001 {
       
  1002   const uint8_t *p, *p1;
       
  1003   uint8_t *lum, *lum1;
       
  1004   int w;
       
  1005 
       
  1006   p1 = src->data[0];
       
  1007   lum1 = dst->data[0];
       
  1008   for (; height > 0; height--) {
       
  1009     p = p1;
       
  1010     lum = lum1;
       
  1011 
       
  1012     for (w = width; w >= 2; w -= 2) {
       
  1013       lum[0] = p[0];
       
  1014       lum[1] = p[2];
       
  1015       p += 4;
       
  1016       lum += 2;
       
  1017     }
       
  1018     p1 += src->linesize[0];
       
  1019     lum1 += dst->linesize[0];
       
  1020   }
       
  1021 }
       
  1022 
       
  1023 
       
  1024 static void
       
  1025 yvyu422_to_yuv420p (AVPicture * dst, const AVPicture * src,
       
  1026     int width, int height)
       
  1027 {
       
  1028   const uint8_t *p, *p1;
       
  1029   uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1;
       
  1030   int w;
       
  1031 
       
  1032   p1 = src->data[0];
       
  1033 
       
  1034   lum1 = dst->data[0];
       
  1035   cb1 = dst->data[1];
       
  1036   cr1 = dst->data[2];
       
  1037 
       
  1038   for (; height >= 1; height -= 2) {
       
  1039     p = p1;
       
  1040     lum = lum1;
       
  1041     cb = cb1;
       
  1042     cr = cr1;
       
  1043     for (w = width; w >= 2; w -= 2) {
       
  1044       lum[0] = p[0];
       
  1045       cb[0] = p[3];
       
  1046       lum[1] = p[2];
       
  1047       cr[0] = p[1];
       
  1048       p += 4;
       
  1049       lum += 2;
       
  1050       cb++;
       
  1051       cr++;
       
  1052     }
       
  1053     if (w) {
       
  1054       lum[0] = p[0];
       
  1055       cb[0] = p[3];
       
  1056       cr[0] = p[1];
       
  1057       cb++;
       
  1058       cr++;
       
  1059     }
       
  1060     p1 += src->linesize[0];
       
  1061     lum1 += dst->linesize[0];
       
  1062     if (height > 1) {
       
  1063       p = p1;
       
  1064       lum = lum1;
       
  1065       for (w = width; w >= 2; w -= 2) {
       
  1066         lum[0] = p[0];
       
  1067         lum[1] = p[2];
       
  1068         p += 4;
       
  1069         lum += 2;
       
  1070       }
       
  1071       if (w) {
       
  1072         lum[0] = p[0];
       
  1073       }
       
  1074       p1 += src->linesize[0];
       
  1075       lum1 += dst->linesize[0];
       
  1076     }
       
  1077     cb1 += dst->linesize[1];
       
  1078     cr1 += dst->linesize[2];
       
  1079   }
       
  1080 }
       
  1081 
       
  1082 static void
       
  1083 yvyu422_to_yuv422p (AVPicture * dst, const AVPicture * src,
       
  1084     int width, int height)
       
  1085 {
       
  1086   const uint8_t *p, *p1;
       
  1087   uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1;
       
  1088   int w;
       
  1089 
       
  1090   p1 = src->data[0];
       
  1091   lum1 = dst->data[0];
       
  1092   cb1 = dst->data[1];
       
  1093   cr1 = dst->data[2];
       
  1094   for (; height > 0; height--) {
       
  1095     p = p1;
       
  1096     lum = lum1;
       
  1097     cb = cb1;
       
  1098     cr = cr1;
       
  1099     for (w = width; w >= 2; w -= 2) {
       
  1100       lum[0] = p[0];
       
  1101       cb[0] = p[3];
       
  1102       lum[1] = p[2];
       
  1103       cr[0] = p[1];
       
  1104       p += 4;
       
  1105       lum += 2;
       
  1106       cb++;
       
  1107       cr++;
       
  1108     }
       
  1109     p1 += src->linesize[0];
       
  1110     lum1 += dst->linesize[0];
       
  1111     cb1 += dst->linesize[1];
       
  1112     cr1 += dst->linesize[2];
       
  1113   }
       
  1114 }
       
  1115 
   907 
  1116 static void
   908 static void
  1117 yuv422_to_yuv422p (AVPicture * dst, const AVPicture * src,
   909 yuv422_to_yuv422p (AVPicture * dst, const AVPicture * src,
  1118     int width, int height)
   910     int width, int height)
  1119 {
   911 {
  1205     for (w = width; w >= 2; w -= 2) {
   997     for (w = width; w >= 2; w -= 2) {
  1206       p[1] = lum[0];
   998       p[1] = lum[0];
  1207       p[0] = cb[0];
   999       p[0] = cb[0];
  1208       p[3] = lum[1];
  1000       p[3] = lum[1];
  1209       p[2] = cr[0];
  1001       p[2] = cr[0];
  1210       p += 4;
       
  1211       lum += 2;
       
  1212       cb++;
       
  1213       cr++;
       
  1214     }
       
  1215     p1 += dst->linesize[0];
       
  1216     lum1 += src->linesize[0];
       
  1217     cb1 += src->linesize[1];
       
  1218     cr1 += src->linesize[2];
       
  1219   }
       
  1220 }
       
  1221 
       
  1222 static void
       
  1223 yuv422p_to_yvyu422 (AVPicture * dst, const AVPicture * src,
       
  1224     int width, int height)
       
  1225 {
       
  1226   uint8_t *p, *p1;
       
  1227   const uint8_t *lum, *cr, *cb, *lum1, *cr1, *cb1;
       
  1228   int w;
       
  1229 
       
  1230   p1 = dst->data[0];
       
  1231   lum1 = src->data[0];
       
  1232   cb1 = src->data[1];
       
  1233   cr1 = src->data[2];
       
  1234   for (; height > 0; height--) {
       
  1235     p = p1;
       
  1236     lum = lum1;
       
  1237     cb = cb1;
       
  1238     cr = cr1;
       
  1239     for (w = width; w >= 2; w -= 2) {
       
  1240       p[0] = lum[0];
       
  1241       p[3] = cb[0];
       
  1242       p[2] = lum[1];
       
  1243       p[1] = cr[0];
       
  1244       p += 4;
  1002       p += 4;
  1245       lum += 2;
  1003       lum += 2;
  1246       cb++;
  1004       cb++;
  1247       cr++;
  1005       cr++;
  1248     }
  1006     }
  1287     cb1 += dst->linesize[1];
  1045     cb1 += dst->linesize[1];
  1288     cr1 += dst->linesize[2];
  1046     cr1 += dst->linesize[2];
  1289   }
  1047   }
  1290 }
  1048 }
  1291 
  1049 
       
  1050 
  1292 static void
  1051 static void
  1293 yuv420p_to_yuv422 (AVPicture * dst, const AVPicture * src,
  1052 yuv420p_to_yuv422 (AVPicture * dst, const AVPicture * src,
  1294     int width, int height)
  1053     int width, int height)
  1295 {
  1054 {
  1296   int w, h;
  1055   int w, h;
  1344     }
  1103     }
  1345     /* odd width */
  1104     /* odd width */
  1346     if (width % 2 != 0) {
  1105     if (width % 2 != 0) {
  1347       *line1++ = *lum1++;
  1106       *line1++ = *lum1++;
  1348       *line1++ = *cb1++;
  1107       *line1++ = *cb1++;
  1349     }
       
  1350   }
       
  1351 }
       
  1352 
       
  1353 static void
       
  1354 nv12_to_nv21 (AVPicture * dst, const AVPicture * src, int width, int height)
       
  1355 {
       
  1356   const uint8_t *s_c_ptr;
       
  1357   uint8_t *d_c_ptr;
       
  1358   int w, c_wrap;
       
  1359 
       
  1360   memcpy (dst->data[0], src->data[0], src->linesize[0] * height);
       
  1361 
       
  1362   s_c_ptr = src->data[1];
       
  1363   d_c_ptr = dst->data[1];
       
  1364   c_wrap = src->linesize[1] - ((width + 1) & ~0x01);
       
  1365 
       
  1366   for (; height >= 2; height -= 2) {
       
  1367     for (w = width; w >= 2; w -= 2) {
       
  1368       d_c_ptr[0] = s_c_ptr[1];
       
  1369       d_c_ptr[1] = s_c_ptr[0];
       
  1370       s_c_ptr += 2;
       
  1371       d_c_ptr += 2;
       
  1372     }
       
  1373 
       
  1374     /* handle odd width */
       
  1375     if (w) {
       
  1376       d_c_ptr[0] = s_c_ptr[1];
       
  1377       d_c_ptr[1] = s_c_ptr[0];
       
  1378       s_c_ptr += 2;
       
  1379       d_c_ptr += 2;
       
  1380     }
       
  1381     s_c_ptr += c_wrap;
       
  1382     d_c_ptr += c_wrap;
       
  1383   }
       
  1384 
       
  1385   /* handle odd height */
       
  1386   if (height) {
       
  1387     for (w = width; w >= 2; w -= 2) {
       
  1388       d_c_ptr[0] = s_c_ptr[1];
       
  1389       d_c_ptr[1] = s_c_ptr[0];
       
  1390       s_c_ptr += 2;
       
  1391       d_c_ptr += 2;
       
  1392     }
       
  1393 
       
  1394     /* handle odd width */
       
  1395     if (w) {
       
  1396       d_c_ptr[0] = s_c_ptr[1];
       
  1397       d_c_ptr[1] = s_c_ptr[0];
       
  1398       s_c_ptr += 2;
       
  1399       d_c_ptr += 2;
       
  1400     }
       
  1401   }
       
  1402 }
       
  1403 
       
  1404 static void
       
  1405 nv12_to_yuv444p (AVPicture * dst, const AVPicture * src, int width, int height)
       
  1406 {
       
  1407   int w, h;
       
  1408   uint8_t *dst_lum1, *dst_lum2, *dst_line = dst->data[0];
       
  1409   uint8_t *dst_cb1, *dst_cb2, *dst_cb_line = dst->data[1];
       
  1410   uint8_t *dst_cr1, *dst_cr2, *dst_cr_line = dst->data[2];
       
  1411   uint8_t *lum1, *lum2, *src_lum_line = src->data[0];
       
  1412   uint8_t *src_c1, *src_c_line = src->data[1];
       
  1413   uint8_t cb, cr;
       
  1414 
       
  1415   for (h = height / 2; h--;) {
       
  1416     dst_lum1 = dst_line;
       
  1417     dst_lum2 = dst_line + dst->linesize[0];
       
  1418 
       
  1419     dst_cb1 = dst_cb_line;
       
  1420     dst_cb2 = dst_cb_line + dst->linesize[1];
       
  1421     dst_cr1 = dst_cr_line;
       
  1422     dst_cr2 = dst_cr_line + dst->linesize[2];
       
  1423 
       
  1424     lum1 = src_lum_line;
       
  1425     lum2 = src_lum_line + src->linesize[0];
       
  1426 
       
  1427     src_c1 = src_c_line;
       
  1428 
       
  1429     for (w = width / 2; w--;) {
       
  1430       cb = *src_c1++;
       
  1431       cr = *src_c1++;
       
  1432       *dst_lum1++ = *lum1++;
       
  1433       *dst_lum2++ = *lum2++;
       
  1434       *dst_cb1++ = *dst_cb2++ = cb;
       
  1435       *dst_cr1++ = *dst_cr2++ = cr;
       
  1436       *dst_lum1++ = *lum1++;
       
  1437       *dst_lum2++ = *lum2++;
       
  1438       *dst_cb1++ = *dst_cb2++ = cb;
       
  1439       *dst_cr1++ = *dst_cr2++ = cr;
       
  1440     }
       
  1441     /* odd width */
       
  1442     if (width % 2 != 0) {
       
  1443       cb = *src_c1++;
       
  1444       cr = *src_c1++;
       
  1445       *dst_lum1++ = *lum1++;
       
  1446       *dst_lum2++ = *lum2++;
       
  1447       *dst_cb1++ = *dst_cb2++ = *src_c1++;
       
  1448       *dst_cr1++ = *dst_cr2++ = *src_c1++;
       
  1449     }
       
  1450 
       
  1451     dst_line += dst->linesize[0] * 2;
       
  1452     dst_cb_line += dst->linesize[1] * 2;
       
  1453     dst_cr_line += dst->linesize[2] * 2;
       
  1454     src_lum_line += src->linesize[0] * 2;
       
  1455     src_c_line += src->linesize[1];
       
  1456   }
       
  1457 
       
  1458   /* odd height */
       
  1459   if (height % 2 != 0) {
       
  1460     dst_lum1 = dst_line;
       
  1461     lum1 = src_lum_line;
       
  1462     src_c1 = src_c_line;
       
  1463     dst_cb1 = dst_cb_line;
       
  1464     dst_cr1 = dst_cr_line;
       
  1465 
       
  1466     for (w = width / 2; w--;) {
       
  1467       cb = *src_c1++;
       
  1468       cr = *src_c1++;
       
  1469       *dst_lum1++ = *lum1++;
       
  1470       *dst_cb1++ = cb;
       
  1471       *dst_cr1++ = cr;
       
  1472       *dst_lum1++ = *lum1++;
       
  1473       *dst_cb1++ = cb;
       
  1474       *dst_cr1++ = cr;
       
  1475     }
       
  1476     /* odd width */
       
  1477     if (width % 2 != 0) {
       
  1478       cb = *src_c1++;
       
  1479       cr = *src_c1++;
       
  1480       *dst_lum1++ = *lum1++;
       
  1481       *dst_cb1++ = cb;
       
  1482       *dst_cr1++ = cr;
       
  1483     }
       
  1484   }
       
  1485 }
       
  1486 
       
  1487 #define nv21_to_nv12 nv12_to_nv21
       
  1488 
       
  1489 static void
       
  1490 nv21_to_yuv444p (AVPicture * dst, const AVPicture * src, int width, int height)
       
  1491 {
       
  1492   int w, h;
       
  1493   uint8_t *dst_lum1, *dst_lum2, *dst_line = dst->data[0];
       
  1494   uint8_t *dst_cb1, *dst_cb2, *dst_cb_line = dst->data[1];
       
  1495   uint8_t *dst_cr1, *dst_cr2, *dst_cr_line = dst->data[2];
       
  1496   uint8_t *lum1, *lum2, *src_lum_line = src->data[0];
       
  1497   uint8_t *src_c1, *src_c_line = src->data[1];
       
  1498   uint8_t cb, cr;
       
  1499 
       
  1500   for (h = height / 2; h--;) {
       
  1501     dst_lum1 = dst_line;
       
  1502     dst_lum2 = dst_line + dst->linesize[0];
       
  1503 
       
  1504     dst_cb1 = dst_cb_line;
       
  1505     dst_cb2 = dst_cb_line + dst->linesize[1];
       
  1506     dst_cr1 = dst_cr_line;
       
  1507     dst_cr2 = dst_cr_line + dst->linesize[2];
       
  1508 
       
  1509     lum1 = src_lum_line;
       
  1510     lum2 = src_lum_line + src->linesize[0];
       
  1511 
       
  1512     src_c1 = src_c_line;
       
  1513 
       
  1514     for (w = width / 2; w--;) {
       
  1515       cr = *src_c1++;
       
  1516       cb = *src_c1++;
       
  1517       *dst_lum1++ = *lum1++;
       
  1518       *dst_lum2++ = *lum2++;
       
  1519       *dst_cb1++ = *dst_cb2++ = cb;
       
  1520       *dst_cr1++ = *dst_cr2++ = cr;
       
  1521       *dst_lum1++ = *lum1++;
       
  1522       *dst_lum2++ = *lum2++;
       
  1523       *dst_cb1++ = *dst_cb2++ = cb;
       
  1524       *dst_cr1++ = *dst_cr2++ = cr;
       
  1525     }
       
  1526     /* odd width */
       
  1527     if (width % 2 != 0) {
       
  1528       cr = *src_c1++;
       
  1529       cb = *src_c1++;
       
  1530       *dst_lum1++ = *lum1++;
       
  1531       *dst_lum2++ = *lum2++;
       
  1532       *dst_cb1++ = *dst_cb2++ = *src_c1++;
       
  1533       *dst_cr1++ = *dst_cr2++ = *src_c1++;
       
  1534     }
       
  1535 
       
  1536     dst_line += dst->linesize[0] * 2;
       
  1537     dst_cb_line += dst->linesize[1] * 2;
       
  1538     dst_cr_line += dst->linesize[2] * 2;
       
  1539     src_lum_line += src->linesize[0] * 2;
       
  1540     src_c_line += src->linesize[1];
       
  1541   }
       
  1542 
       
  1543   /* odd height */
       
  1544   if (height % 2 != 0) {
       
  1545     dst_lum1 = dst_line;
       
  1546     lum1 = src_lum_line;
       
  1547     src_c1 = src_c_line;
       
  1548 
       
  1549     dst_cb1 = dst_cb_line;
       
  1550     dst_cr1 = dst_cr_line;
       
  1551 
       
  1552     for (w = width / 2; w--;) {
       
  1553       cr = *src_c1++;
       
  1554       cb = *src_c1++;
       
  1555       *dst_lum1++ = *lum1++;
       
  1556       *dst_cb1++ = cb;
       
  1557       *dst_cr1++ = cr;
       
  1558       *dst_lum1++ = *lum1++;
       
  1559       *dst_cb1++ = cb;
       
  1560       *dst_cr1++ = cr;
       
  1561     }
       
  1562     /* odd width */
       
  1563     if (width % 2 != 0) {
       
  1564       cr = *src_c1++;
       
  1565       cb = *src_c1++;
       
  1566       *dst_lum1++ = *lum1++;
       
  1567       *dst_cb1++ = cb;
       
  1568       *dst_cr1++ = cr;
       
  1569     }
  1108     }
  1570   }
  1109   }
  1571 }
  1110 }
  1572 
  1111 
  1573 #define SCALEBITS 10
  1112 #define SCALEBITS 10
  2369 #define BPP 4
  1908 #define BPP 4
  2370 
  1909 
  2371 #include "imgconvert_template.h"
  1910 #include "imgconvert_template.h"
  2372 
  1911 
  2373 static void
  1912 static void
  2374 gray_to_gray16_l (AVPicture * dst, const AVPicture * src, int width, int height)
       
  2375 {
       
  2376   const unsigned char *p;
       
  2377   unsigned char *q;
       
  2378   int dst_wrap, src_wrap;
       
  2379   int x, y;
       
  2380 
       
  2381   p = src->data[0];
       
  2382   src_wrap = src->linesize[0] - width;
       
  2383 
       
  2384   q = dst->data[0];
       
  2385   dst_wrap = dst->linesize[0] - 2 * width;
       
  2386 
       
  2387   for (y = 0; y < height; y++) {
       
  2388     for (x = 0; x < width; x++) {
       
  2389       GST_WRITE_UINT16_LE (q, (*p << 8));
       
  2390       q += 2;
       
  2391       p++;
       
  2392     }
       
  2393     p += src_wrap;
       
  2394     q += dst_wrap;
       
  2395   }
       
  2396 }
       
  2397 
       
  2398 static void
       
  2399 gray_to_gray16_b (AVPicture * dst, const AVPicture * src, int width, int height)
       
  2400 {
       
  2401   const unsigned char *p;
       
  2402   unsigned char *q;
       
  2403   int dst_wrap, src_wrap;
       
  2404   int x, y;
       
  2405 
       
  2406   p = src->data[0];
       
  2407   src_wrap = src->linesize[0] - width;
       
  2408 
       
  2409   q = dst->data[0];
       
  2410   dst_wrap = dst->linesize[0] - 2 * width;
       
  2411 
       
  2412   for (y = 0; y < height; y++) {
       
  2413     for (x = 0; x < width; x++) {
       
  2414       GST_WRITE_UINT16_BE (q, (*p << 8));
       
  2415       q += 2;
       
  2416       p++;
       
  2417     }
       
  2418     p += src_wrap;
       
  2419     q += dst_wrap;
       
  2420   }
       
  2421 }
       
  2422 
       
  2423 static void
       
  2424 gray16_l_to_gray (AVPicture * dst, const AVPicture * src, int width, int height)
       
  2425 {
       
  2426   const unsigned char *p;
       
  2427   unsigned char *q;
       
  2428   int dst_wrap, src_wrap;
       
  2429   int x, y;
       
  2430 
       
  2431   p = src->data[0];
       
  2432   src_wrap = src->linesize[0] - 2 * width;
       
  2433 
       
  2434   q = dst->data[0];
       
  2435   dst_wrap = dst->linesize[0] - width;
       
  2436 
       
  2437   for (y = 0; y < height; y++) {
       
  2438     for (x = 0; x < width; x++) {
       
  2439       q[0] = GST_READ_UINT16_LE (p) >> 8;
       
  2440       q++;
       
  2441       p += 2;
       
  2442     }
       
  2443     p += src_wrap;
       
  2444     q += dst_wrap;
       
  2445   }
       
  2446 }
       
  2447 
       
  2448 static void
       
  2449 gray16_b_to_gray (AVPicture * dst, const AVPicture * src, int width, int height)
       
  2450 {
       
  2451   const unsigned char *p;
       
  2452   unsigned char *q;
       
  2453   int dst_wrap, src_wrap;
       
  2454   int x, y;
       
  2455 
       
  2456   p = src->data[0];
       
  2457   src_wrap = src->linesize[0] - 2 * width;
       
  2458 
       
  2459   q = dst->data[0];
       
  2460   dst_wrap = dst->linesize[0] - width;
       
  2461 
       
  2462   for (y = 0; y < height; y++) {
       
  2463     for (x = 0; x < width; x++) {
       
  2464       q[0] = GST_READ_UINT16_BE (p) >> 8;
       
  2465       q++;
       
  2466       p += 2;
       
  2467     }
       
  2468     p += src_wrap;
       
  2469     q += dst_wrap;
       
  2470   }
       
  2471 }
       
  2472 
       
  2473 static void
       
  2474 gray16_b_to_gray16_l (AVPicture * dst, const AVPicture * src,
       
  2475     int width, int height)
       
  2476 {
       
  2477   const unsigned char *p;
       
  2478   unsigned char *q;
       
  2479   int dst_wrap, src_wrap;
       
  2480   int x, y;
       
  2481 
       
  2482   p = src->data[0];
       
  2483   src_wrap = src->linesize[0] - 2 * width;
       
  2484 
       
  2485   q = dst->data[0];
       
  2486   dst_wrap = dst->linesize[0] - 2 * width;
       
  2487 
       
  2488   for (y = 0; y < height; y++) {
       
  2489     for (x = 0; x < width; x++) {
       
  2490       q[0] = p[1];
       
  2491       q[1] = p[0];
       
  2492       q += 2;
       
  2493       p += 2;
       
  2494     }
       
  2495     p += src_wrap;
       
  2496     q += dst_wrap;
       
  2497   }
       
  2498 }
       
  2499 
       
  2500 static void
       
  2501 mono_to_gray (AVPicture * dst, const AVPicture * src,
  1913 mono_to_gray (AVPicture * dst, const AVPicture * src,
  2502     int width, int height, int xor_mask)
  1914     int width, int height, int xor_mask)
  2503 {
  1915 {
  2504   const unsigned char *p;
  1916   const unsigned char *p;
  2505   unsigned char *q;
  1917   unsigned char *q;
  2650   {PIX_FMT_YUV420P, PIX_FMT_RGBA32, yuv420p_to_rgba32},
  2062   {PIX_FMT_YUV420P, PIX_FMT_RGBA32, yuv420p_to_rgba32},
  2651   {PIX_FMT_YUV420P, PIX_FMT_BGRA32, yuv420p_to_bgra32},
  2063   {PIX_FMT_YUV420P, PIX_FMT_BGRA32, yuv420p_to_bgra32},
  2652   {PIX_FMT_YUV420P, PIX_FMT_ARGB32, yuv420p_to_argb32},
  2064   {PIX_FMT_YUV420P, PIX_FMT_ARGB32, yuv420p_to_argb32},
  2653   {PIX_FMT_YUV420P, PIX_FMT_ABGR32, yuv420p_to_abgr32},
  2065   {PIX_FMT_YUV420P, PIX_FMT_ABGR32, yuv420p_to_abgr32},
  2654 
  2066 
  2655   {PIX_FMT_NV12, PIX_FMT_RGB555, nv12_to_rgb555},
       
  2656   {PIX_FMT_NV12, PIX_FMT_RGB565, nv12_to_rgb565},
       
  2657   {PIX_FMT_NV12, PIX_FMT_BGR24, nv12_to_bgr24},
       
  2658   {PIX_FMT_NV12, PIX_FMT_RGB24, nv12_to_rgb24},
       
  2659   {PIX_FMT_NV12, PIX_FMT_RGB32, nv12_to_rgb32},
       
  2660   {PIX_FMT_NV12, PIX_FMT_BGR32, nv12_to_bgr32},
       
  2661   {PIX_FMT_NV12, PIX_FMT_xRGB32, nv12_to_xrgb32},
       
  2662   {PIX_FMT_NV12, PIX_FMT_BGRx32, nv12_to_bgrx32},
       
  2663   {PIX_FMT_NV12, PIX_FMT_RGBA32, nv12_to_rgba32},
       
  2664   {PIX_FMT_NV12, PIX_FMT_BGRA32, nv12_to_bgra32},
       
  2665   {PIX_FMT_NV12, PIX_FMT_ARGB32, nv12_to_argb32},
       
  2666   {PIX_FMT_NV12, PIX_FMT_ABGR32, nv12_to_abgr32},
       
  2667   {PIX_FMT_NV12, PIX_FMT_NV21, nv12_to_nv21},
       
  2668   {PIX_FMT_NV12, PIX_FMT_YUV444P, nv12_to_yuv444p},
       
  2669 
       
  2670   {PIX_FMT_NV21, PIX_FMT_RGB555, nv21_to_rgb555},
       
  2671   {PIX_FMT_NV21, PIX_FMT_RGB565, nv21_to_rgb565},
       
  2672   {PIX_FMT_NV21, PIX_FMT_BGR24, nv21_to_bgr24},
       
  2673   {PIX_FMT_NV21, PIX_FMT_RGB24, nv21_to_rgb24},
       
  2674   {PIX_FMT_NV21, PIX_FMT_RGB32, nv21_to_rgb32},
       
  2675   {PIX_FMT_NV21, PIX_FMT_BGR32, nv21_to_bgr32},
       
  2676   {PIX_FMT_NV21, PIX_FMT_xRGB32, nv21_to_xrgb32},
       
  2677   {PIX_FMT_NV21, PIX_FMT_BGRx32, nv21_to_bgrx32},
       
  2678   {PIX_FMT_NV21, PIX_FMT_RGBA32, nv21_to_rgba32},
       
  2679   {PIX_FMT_NV21, PIX_FMT_BGRA32, nv21_to_bgra32},
       
  2680   {PIX_FMT_NV21, PIX_FMT_ARGB32, nv21_to_argb32},
       
  2681   {PIX_FMT_NV21, PIX_FMT_ABGR32, nv21_to_abgr32},
       
  2682   {PIX_FMT_NV21, PIX_FMT_YUV444P, nv21_to_yuv444p},
       
  2683   {PIX_FMT_NV21, PIX_FMT_NV12, nv21_to_nv12},
       
  2684 
       
  2685   {PIX_FMT_YUV422P, PIX_FMT_YUV422, yuv422p_to_yuv422},
  2067   {PIX_FMT_YUV422P, PIX_FMT_YUV422, yuv422p_to_yuv422},
  2686   {PIX_FMT_YUV422P, PIX_FMT_UYVY422, yuv422p_to_uyvy422},
  2068   {PIX_FMT_YUV422P, PIX_FMT_UYVY422, yuv422p_to_uyvy422},
  2687   {PIX_FMT_YUV422P, PIX_FMT_YVYU422, yuv422p_to_yvyu422},
       
  2688 
  2069 
  2689   {PIX_FMT_YUV444P, PIX_FMT_RGB24, yuv444p_to_rgb24},
  2070   {PIX_FMT_YUV444P, PIX_FMT_RGB24, yuv444p_to_rgb24},
  2690 
  2071 
  2691   {PIX_FMT_YUVJ420P, PIX_FMT_RGB555, yuvj420p_to_rgb555},
  2072   {PIX_FMT_YUVJ420P, PIX_FMT_RGB555, yuvj420p_to_rgb555},
  2692   {PIX_FMT_YUVJ420P, PIX_FMT_RGB565, yuvj420p_to_rgb565},
  2073   {PIX_FMT_YUVJ420P, PIX_FMT_RGB565, yuvj420p_to_rgb565},
  2706   {PIX_FMT_YUV422, PIX_FMT_YUV420P, yuv422_to_yuv420p},
  2087   {PIX_FMT_YUV422, PIX_FMT_YUV420P, yuv422_to_yuv420p},
  2707   {PIX_FMT_YUV422, PIX_FMT_YUV422P, yuv422_to_yuv422p},
  2088   {PIX_FMT_YUV422, PIX_FMT_YUV422P, yuv422_to_yuv422p},
  2708 
  2089 
  2709   {PIX_FMT_UYVY422, PIX_FMT_YUV420P, uyvy422_to_yuv420p},
  2090   {PIX_FMT_UYVY422, PIX_FMT_YUV420P, uyvy422_to_yuv420p},
  2710   {PIX_FMT_UYVY422, PIX_FMT_YUV422P, uyvy422_to_yuv422p},
  2091   {PIX_FMT_UYVY422, PIX_FMT_YUV422P, uyvy422_to_yuv422p},
  2711   {PIX_FMT_UYVY422, PIX_FMT_GRAY8, uyvy422_to_gray},
       
  2712 
       
  2713   {PIX_FMT_YVYU422, PIX_FMT_YUV420P, yvyu422_to_yuv420p},
       
  2714   {PIX_FMT_YVYU422, PIX_FMT_YUV422P, yvyu422_to_yuv422p},
       
  2715   {PIX_FMT_YVYU422, PIX_FMT_GRAY8, yvyu422_to_gray},
       
  2716 
  2092 
  2717   {PIX_FMT_RGB24, PIX_FMT_YUV420P, rgb24_to_yuv420p},
  2093   {PIX_FMT_RGB24, PIX_FMT_YUV420P, rgb24_to_yuv420p},
  2718   {PIX_FMT_RGB24, PIX_FMT_NV12, rgb24_to_nv12},
       
  2719   {PIX_FMT_RGB24, PIX_FMT_NV21, rgb24_to_nv21},
       
  2720   {PIX_FMT_RGB24, PIX_FMT_RGB565, rgb24_to_rgb565},
  2094   {PIX_FMT_RGB24, PIX_FMT_RGB565, rgb24_to_rgb565},
  2721   {PIX_FMT_RGB24, PIX_FMT_RGB555, rgb24_to_rgb555},
  2095   {PIX_FMT_RGB24, PIX_FMT_RGB555, rgb24_to_rgb555},
  2722   {PIX_FMT_RGB24, PIX_FMT_RGB32, rgb24_to_rgb32},
  2096   {PIX_FMT_RGB24, PIX_FMT_RGB32, rgb24_to_rgb32},
  2723   {PIX_FMT_RGB24, PIX_FMT_BGR32, rgb24_to_bgr32},
  2097   {PIX_FMT_RGB24, PIX_FMT_BGR32, rgb24_to_bgr32},
  2724   {PIX_FMT_RGB24, PIX_FMT_xRGB32, rgb24_to_xrgb32},
  2098   {PIX_FMT_RGB24, PIX_FMT_xRGB32, rgb24_to_xrgb32},
  2727   {PIX_FMT_RGB24, PIX_FMT_BGR24, rgb24_to_bgr24},
  2101   {PIX_FMT_RGB24, PIX_FMT_BGR24, rgb24_to_bgr24},
  2728   {PIX_FMT_RGB24, PIX_FMT_BGRA32, rgb24_to_bgra32},
  2102   {PIX_FMT_RGB24, PIX_FMT_BGRA32, rgb24_to_bgra32},
  2729   {PIX_FMT_RGB24, PIX_FMT_ARGB32, rgb24_to_argb32},
  2103   {PIX_FMT_RGB24, PIX_FMT_ARGB32, rgb24_to_argb32},
  2730   {PIX_FMT_RGB24, PIX_FMT_ABGR32, rgb24_to_abgr32},
  2104   {PIX_FMT_RGB24, PIX_FMT_ABGR32, rgb24_to_abgr32},
  2731   {PIX_FMT_RGB24, PIX_FMT_GRAY8, rgb24_to_gray},
  2105   {PIX_FMT_RGB24, PIX_FMT_GRAY8, rgb24_to_gray},
  2732   {PIX_FMT_RGB24, PIX_FMT_GRAY16_L, rgb24_to_gray16_l},
       
  2733   {PIX_FMT_RGB24, PIX_FMT_GRAY16_B, rgb24_to_gray16_b},
       
  2734   {PIX_FMT_RGB24, PIX_FMT_PAL8, rgb24_to_pal8},
  2106   {PIX_FMT_RGB24, PIX_FMT_PAL8, rgb24_to_pal8},
  2735   {PIX_FMT_RGB24, PIX_FMT_YUV444P, rgb24_to_yuv444p},
  2107   {PIX_FMT_RGB24, PIX_FMT_YUV444P, rgb24_to_yuv444p},
  2736   {PIX_FMT_RGB24, PIX_FMT_YUVJ420P, rgb24_to_yuvj420p},
  2108   {PIX_FMT_RGB24, PIX_FMT_YUVJ420P, rgb24_to_yuvj420p},
  2737   {PIX_FMT_RGB24, PIX_FMT_YUVJ444P, rgb24_to_yuvj444p},
  2109   {PIX_FMT_RGB24, PIX_FMT_YUVJ444P, rgb24_to_yuvj444p},
  2738   {PIX_FMT_RGB24, PIX_FMT_AYUV4444, rgb24_to_ayuv4444},
  2110   {PIX_FMT_RGB24, PIX_FMT_AYUV4444, rgb24_to_ayuv4444},
  2739   {PIX_FMT_RGB24, PIX_FMT_V308, rgb24_to_v308},
       
  2740 
  2111 
  2741   {PIX_FMT_RGB32, PIX_FMT_RGB24, rgb32_to_rgb24},
  2112   {PIX_FMT_RGB32, PIX_FMT_RGB24, rgb32_to_rgb24},
  2742   {PIX_FMT_RGB32, PIX_FMT_RGB555, rgba32_to_rgb555},
  2113   {PIX_FMT_RGB32, PIX_FMT_RGB555, rgba32_to_rgb555},
  2743   {PIX_FMT_RGB32, PIX_FMT_PAL8, rgb32_to_pal8},
  2114   {PIX_FMT_RGB32, PIX_FMT_PAL8, rgb32_to_pal8},
  2744   {PIX_FMT_RGB32, PIX_FMT_YUV420P, rgb32_to_yuv420p},
  2115   {PIX_FMT_RGB32, PIX_FMT_YUV420P, rgb32_to_yuv420p},
  2745   {PIX_FMT_RGB32, PIX_FMT_NV12, rgb32_to_nv12},
       
  2746   {PIX_FMT_RGB32, PIX_FMT_NV21, rgb32_to_nv21},
       
  2747   {PIX_FMT_RGB32, PIX_FMT_GRAY8, rgb32_to_gray},
  2116   {PIX_FMT_RGB32, PIX_FMT_GRAY8, rgb32_to_gray},
  2748   {PIX_FMT_RGB32, PIX_FMT_GRAY16_L, rgb32_to_gray16_l},
       
  2749   {PIX_FMT_RGB32, PIX_FMT_GRAY16_B, rgb32_to_gray16_b},
       
  2750 
  2117 
  2751   {PIX_FMT_xRGB32, PIX_FMT_RGB24, xrgb32_to_rgb24},
  2118   {PIX_FMT_xRGB32, PIX_FMT_RGB24, xrgb32_to_rgb24},
  2752   {PIX_FMT_xRGB32, PIX_FMT_PAL8, xrgb32_to_pal8},
  2119   {PIX_FMT_xRGB32, PIX_FMT_PAL8, xrgb32_to_pal8},
  2753   {PIX_FMT_xRGB32, PIX_FMT_YUV420P, xrgb32_to_yuv420p},
  2120   {PIX_FMT_xRGB32, PIX_FMT_YUV420P, xrgb32_to_yuv420p},
  2754   {PIX_FMT_xRGB32, PIX_FMT_NV12, xrgb32_to_nv12},
       
  2755   {PIX_FMT_xRGB32, PIX_FMT_NV21, xrgb32_to_nv21},
       
  2756   {PIX_FMT_xRGB32, PIX_FMT_GRAY8, xrgb32_to_gray},
  2121   {PIX_FMT_xRGB32, PIX_FMT_GRAY8, xrgb32_to_gray},
  2757   {PIX_FMT_xRGB32, PIX_FMT_GRAY16_L, xrgb32_to_gray16_l},
       
  2758   {PIX_FMT_xRGB32, PIX_FMT_GRAY16_B, xrgb32_to_gray16_b},
       
  2759 
  2122 
  2760   {PIX_FMT_RGBA32, PIX_FMT_BGRA32, rgba32_to_bgra32},
  2123   {PIX_FMT_RGBA32, PIX_FMT_BGRA32, rgba32_to_bgra32},
  2761   {PIX_FMT_RGBA32, PIX_FMT_ABGR32, rgba32_to_abgr32},
  2124   {PIX_FMT_RGBA32, PIX_FMT_ABGR32, rgba32_to_abgr32},
  2762   {PIX_FMT_RGBA32, PIX_FMT_ARGB32, rgba32_to_argb32},
  2125   {PIX_FMT_RGBA32, PIX_FMT_ARGB32, rgba32_to_argb32},
  2763   {PIX_FMT_RGBA32, PIX_FMT_BGR32, rgba32_to_bgr32},
  2126   {PIX_FMT_RGBA32, PIX_FMT_BGR32, rgba32_to_bgr32},
  2765   {PIX_FMT_RGBA32, PIX_FMT_ABGR32, rgba32_to_abgr32},
  2128   {PIX_FMT_RGBA32, PIX_FMT_ABGR32, rgba32_to_abgr32},
  2766   {PIX_FMT_RGBA32, PIX_FMT_RGB24, rgba32_to_rgb24},
  2129   {PIX_FMT_RGBA32, PIX_FMT_RGB24, rgba32_to_rgb24},
  2767   {PIX_FMT_RGBA32, PIX_FMT_RGB555, rgba32_to_rgb555},
  2130   {PIX_FMT_RGBA32, PIX_FMT_RGB555, rgba32_to_rgb555},
  2768   {PIX_FMT_RGBA32, PIX_FMT_PAL8, rgba32_to_pal8},
  2131   {PIX_FMT_RGBA32, PIX_FMT_PAL8, rgba32_to_pal8},
  2769   {PIX_FMT_RGBA32, PIX_FMT_YUV420P, rgba32_to_yuv420p},
  2132   {PIX_FMT_RGBA32, PIX_FMT_YUV420P, rgba32_to_yuv420p},
  2770   {PIX_FMT_RGBA32, PIX_FMT_NV12, rgba32_to_nv12},
       
  2771   {PIX_FMT_RGBA32, PIX_FMT_NV21, rgba32_to_nv21},
       
  2772   {PIX_FMT_RGBA32, PIX_FMT_GRAY8, rgba32_to_gray},
  2133   {PIX_FMT_RGBA32, PIX_FMT_GRAY8, rgba32_to_gray},
  2773   {PIX_FMT_RGBA32, PIX_FMT_GRAY16_L, rgba32_to_gray16_l},
       
  2774   {PIX_FMT_RGBA32, PIX_FMT_GRAY16_B, rgba32_to_gray16_b},
       
  2775   {PIX_FMT_RGBA32, PIX_FMT_AYUV4444, rgba32_to_ayuv4444},
  2134   {PIX_FMT_RGBA32, PIX_FMT_AYUV4444, rgba32_to_ayuv4444},
  2776 
  2135 
  2777   {PIX_FMT_BGR24, PIX_FMT_RGB24, bgr24_to_rgb24},
  2136   {PIX_FMT_BGR24, PIX_FMT_RGB24, bgr24_to_rgb24},
  2778   {PIX_FMT_BGR24, PIX_FMT_YUV420P, bgr24_to_yuv420p},
  2137   {PIX_FMT_BGR24, PIX_FMT_YUV420P, bgr24_to_yuv420p},
  2779   {PIX_FMT_BGR24, PIX_FMT_NV12, bgr24_to_nv12},
       
  2780   {PIX_FMT_BGR24, PIX_FMT_NV21, bgr24_to_nv21},
       
  2781   {PIX_FMT_BGR24, PIX_FMT_GRAY8, bgr24_to_gray},
  2138   {PIX_FMT_BGR24, PIX_FMT_GRAY8, bgr24_to_gray},
  2782   {PIX_FMT_BGR24, PIX_FMT_GRAY16_L, bgr24_to_gray16_l},
       
  2783   {PIX_FMT_BGR24, PIX_FMT_GRAY16_B, bgr24_to_gray16_b},
       
  2784 
  2139 
  2785   {PIX_FMT_BGR32, PIX_FMT_RGB24, bgr32_to_rgb24},
  2140   {PIX_FMT_BGR32, PIX_FMT_RGB24, bgr32_to_rgb24},
  2786   {PIX_FMT_BGR32, PIX_FMT_RGBA32, bgr32_to_rgba32},
  2141   {PIX_FMT_BGR32, PIX_FMT_RGBA32, bgr32_to_rgba32},
  2787   {PIX_FMT_BGR32, PIX_FMT_YUV420P, bgr32_to_yuv420p},
  2142   {PIX_FMT_BGR32, PIX_FMT_YUV420P, bgr32_to_yuv420p},
  2788   {PIX_FMT_BGR32, PIX_FMT_NV12, bgr32_to_nv12},
       
  2789   {PIX_FMT_BGR32, PIX_FMT_NV21, bgr32_to_nv21},
       
  2790   {PIX_FMT_BGR32, PIX_FMT_GRAY8, bgr32_to_gray},
  2143   {PIX_FMT_BGR32, PIX_FMT_GRAY8, bgr32_to_gray},
  2791   {PIX_FMT_BGR32, PIX_FMT_GRAY16_L, bgr32_to_gray16_l},
       
  2792   {PIX_FMT_BGR32, PIX_FMT_GRAY16_B, bgr32_to_gray16_b},
       
  2793 
  2144 
  2794   {PIX_FMT_BGRx32, PIX_FMT_RGB24, bgrx32_to_rgb24},
  2145   {PIX_FMT_BGRx32, PIX_FMT_RGB24, bgrx32_to_rgb24},
  2795   {PIX_FMT_BGRx32, PIX_FMT_RGBA32, bgrx32_to_rgba32},
  2146   {PIX_FMT_BGRx32, PIX_FMT_RGBA32, bgrx32_to_rgba32},
  2796   {PIX_FMT_BGRx32, PIX_FMT_YUV420P, bgrx32_to_yuv420p},
  2147   {PIX_FMT_BGRx32, PIX_FMT_YUV420P, bgrx32_to_yuv420p},
  2797   {PIX_FMT_BGRx32, PIX_FMT_NV12, bgrx32_to_nv12},
       
  2798   {PIX_FMT_BGRx32, PIX_FMT_NV21, bgrx32_to_nv21},
       
  2799   {PIX_FMT_BGRx32, PIX_FMT_GRAY8, bgrx32_to_gray},
  2148   {PIX_FMT_BGRx32, PIX_FMT_GRAY8, bgrx32_to_gray},
  2800   {PIX_FMT_BGRx32, PIX_FMT_GRAY16_L, bgrx32_to_gray16_l},
       
  2801   {PIX_FMT_BGRx32, PIX_FMT_GRAY16_B, bgrx32_to_gray16_b},
       
  2802 
  2149 
  2803   {PIX_FMT_BGRA32, PIX_FMT_RGB24, bgra32_to_rgb24},
  2150   {PIX_FMT_BGRA32, PIX_FMT_RGB24, bgra32_to_rgb24},
  2804   {PIX_FMT_BGRA32, PIX_FMT_RGBA32, bgra32_to_rgba32},
  2151   {PIX_FMT_BGRA32, PIX_FMT_RGBA32, bgra32_to_rgba32},
  2805   {PIX_FMT_BGRA32, PIX_FMT_YUV420P, bgra32_to_yuv420p},
  2152   {PIX_FMT_BGRA32, PIX_FMT_YUV420P, bgra32_to_yuv420p},
  2806   {PIX_FMT_BGRA32, PIX_FMT_NV12, bgra32_to_nv12},
       
  2807   {PIX_FMT_BGRA32, PIX_FMT_NV21, bgra32_to_nv21},
       
  2808   {PIX_FMT_BGRA32, PIX_FMT_GRAY8, bgra32_to_gray},
  2153   {PIX_FMT_BGRA32, PIX_FMT_GRAY8, bgra32_to_gray},
  2809   {PIX_FMT_BGRA32, PIX_FMT_GRAY16_L, bgra32_to_gray16_l},
       
  2810   {PIX_FMT_BGRA32, PIX_FMT_GRAY16_B, bgra32_to_gray16_b},
       
  2811   {PIX_FMT_BGRA32, PIX_FMT_AYUV4444, bgra32_to_ayuv4444},
  2154   {PIX_FMT_BGRA32, PIX_FMT_AYUV4444, bgra32_to_ayuv4444},
  2812 
  2155 
  2813   {PIX_FMT_ABGR32, PIX_FMT_RGB24, abgr32_to_rgb24},
  2156   {PIX_FMT_ABGR32, PIX_FMT_RGB24, abgr32_to_rgb24},
  2814   {PIX_FMT_ABGR32, PIX_FMT_RGBA32, abgr32_to_rgba32},
  2157   {PIX_FMT_ABGR32, PIX_FMT_RGBA32, abgr32_to_rgba32},
  2815   {PIX_FMT_ABGR32, PIX_FMT_YUV420P, abgr32_to_yuv420p},
  2158   {PIX_FMT_ABGR32, PIX_FMT_YUV420P, abgr32_to_yuv420p},
  2816   {PIX_FMT_ABGR32, PIX_FMT_NV12, abgr32_to_nv12},
       
  2817   {PIX_FMT_ABGR32, PIX_FMT_NV21, abgr32_to_nv21},
       
  2818   {PIX_FMT_ABGR32, PIX_FMT_GRAY8, abgr32_to_gray},
  2159   {PIX_FMT_ABGR32, PIX_FMT_GRAY8, abgr32_to_gray},
  2819   {PIX_FMT_ABGR32, PIX_FMT_GRAY16_L, abgr32_to_gray16_l},
       
  2820   {PIX_FMT_ABGR32, PIX_FMT_GRAY16_B, abgr32_to_gray16_b},
       
  2821 
  2160 
  2822   {PIX_FMT_ARGB32, PIX_FMT_RGB24, argb32_to_rgb24},
  2161   {PIX_FMT_ARGB32, PIX_FMT_RGB24, argb32_to_rgb24},
  2823   {PIX_FMT_ARGB32, PIX_FMT_RGBA32, argb32_to_rgba32},
  2162   {PIX_FMT_ARGB32, PIX_FMT_RGBA32, argb32_to_rgba32},
  2824   {PIX_FMT_ARGB32, PIX_FMT_YUV420P, argb32_to_yuv420p},
  2163   {PIX_FMT_ARGB32, PIX_FMT_YUV420P, argb32_to_yuv420p},
  2825   {PIX_FMT_ARGB32, PIX_FMT_NV12, argb32_to_nv12},
       
  2826   {PIX_FMT_ARGB32, PIX_FMT_NV21, argb32_to_nv21},
       
  2827   {PIX_FMT_ARGB32, PIX_FMT_GRAY8, argb32_to_gray},
  2164   {PIX_FMT_ARGB32, PIX_FMT_GRAY8, argb32_to_gray},
  2828   {PIX_FMT_ARGB32, PIX_FMT_GRAY16_L, argb32_to_gray16_l},
       
  2829   {PIX_FMT_ARGB32, PIX_FMT_GRAY16_B, argb32_to_gray16_b},
       
  2830 
  2165 
  2831   {PIX_FMT_RGB555, PIX_FMT_RGB24, rgb555_to_rgb24},
  2166   {PIX_FMT_RGB555, PIX_FMT_RGB24, rgb555_to_rgb24},
  2832   {PIX_FMT_RGB555, PIX_FMT_RGB32, rgb555_to_rgba32},
  2167   {PIX_FMT_RGB555, PIX_FMT_RGB32, rgb555_to_rgba32},
  2833   {PIX_FMT_RGB555, PIX_FMT_RGBA32, rgb555_to_rgba32},
  2168   {PIX_FMT_RGB555, PIX_FMT_RGBA32, rgb555_to_rgba32},
  2834   {PIX_FMT_RGB555, PIX_FMT_YUV420P, rgb555_to_yuv420p},
  2169   {PIX_FMT_RGB555, PIX_FMT_YUV420P, rgb555_to_yuv420p},
  2835   {PIX_FMT_RGB555, PIX_FMT_NV12, rgb555_to_nv12},
       
  2836   {PIX_FMT_RGB555, PIX_FMT_NV21, rgb555_to_nv21},
       
  2837   {PIX_FMT_RGB555, PIX_FMT_GRAY8, rgb555_to_gray},
  2170   {PIX_FMT_RGB555, PIX_FMT_GRAY8, rgb555_to_gray},
  2838   {PIX_FMT_RGB555, PIX_FMT_GRAY16_L, rgb555_to_gray16_l},
       
  2839   {PIX_FMT_RGB555, PIX_FMT_GRAY16_B, rgb555_to_gray16_b},
       
  2840 
  2171 
  2841   {PIX_FMT_RGB565, PIX_FMT_RGB24, rgb565_to_rgb24},
  2172   {PIX_FMT_RGB565, PIX_FMT_RGB24, rgb565_to_rgb24},
  2842   {PIX_FMT_RGB565, PIX_FMT_YUV420P, rgb565_to_yuv420p},
  2173   {PIX_FMT_RGB565, PIX_FMT_YUV420P, rgb565_to_yuv420p},
  2843   {PIX_FMT_RGB565, PIX_FMT_NV12, rgb565_to_nv12},
       
  2844   {PIX_FMT_RGB565, PIX_FMT_NV21, rgb565_to_nv21},
       
  2845   {PIX_FMT_RGB565, PIX_FMT_GRAY8, rgb565_to_gray},
  2174   {PIX_FMT_RGB565, PIX_FMT_GRAY8, rgb565_to_gray},
  2846   {PIX_FMT_RGB565, PIX_FMT_GRAY16_L, rgb565_to_gray16_l},
       
  2847   {PIX_FMT_RGB565, PIX_FMT_GRAY16_B, rgb565_to_gray16_b},
       
  2848 
  2175 
  2849   {PIX_FMT_GRAY8, PIX_FMT_RGB555, gray_to_rgb555},
  2176   {PIX_FMT_GRAY8, PIX_FMT_RGB555, gray_to_rgb555},
  2850   {PIX_FMT_GRAY8, PIX_FMT_RGB565, gray_to_rgb565},
  2177   {PIX_FMT_GRAY8, PIX_FMT_RGB565, gray_to_rgb565},
  2851   {PIX_FMT_GRAY8, PIX_FMT_RGB24, gray_to_rgb24},
  2178   {PIX_FMT_GRAY8, PIX_FMT_RGB24, gray_to_rgb24},
  2852   {PIX_FMT_GRAY8, PIX_FMT_BGR24, gray_to_bgr24},
  2179   {PIX_FMT_GRAY8, PIX_FMT_BGR24, gray_to_bgr24},
  2858   {PIX_FMT_GRAY8, PIX_FMT_BGRA32, gray_to_bgra32},
  2185   {PIX_FMT_GRAY8, PIX_FMT_BGRA32, gray_to_bgra32},
  2859   {PIX_FMT_GRAY8, PIX_FMT_ARGB32, gray_to_argb32},
  2186   {PIX_FMT_GRAY8, PIX_FMT_ARGB32, gray_to_argb32},
  2860   {PIX_FMT_GRAY8, PIX_FMT_ABGR32, gray_to_abgr32},
  2187   {PIX_FMT_GRAY8, PIX_FMT_ABGR32, gray_to_abgr32},
  2861   {PIX_FMT_GRAY8, PIX_FMT_MONOWHITE, gray_to_monowhite},
  2188   {PIX_FMT_GRAY8, PIX_FMT_MONOWHITE, gray_to_monowhite},
  2862   {PIX_FMT_GRAY8, PIX_FMT_MONOBLACK, gray_to_monoblack},
  2189   {PIX_FMT_GRAY8, PIX_FMT_MONOBLACK, gray_to_monoblack},
  2863   {PIX_FMT_GRAY8, PIX_FMT_GRAY16_L, gray_to_gray16_l},
       
  2864   {PIX_FMT_GRAY8, PIX_FMT_GRAY16_B, gray_to_gray16_b},
       
  2865 
  2190 
  2866   {PIX_FMT_MONOWHITE, PIX_FMT_GRAY8, monowhite_to_gray},
  2191   {PIX_FMT_MONOWHITE, PIX_FMT_GRAY8, monowhite_to_gray},
  2867 
  2192 
  2868   {PIX_FMT_MONOBLACK, PIX_FMT_GRAY8, monoblack_to_gray},
  2193   {PIX_FMT_MONOBLACK, PIX_FMT_GRAY8, monoblack_to_gray},
  2869 
       
  2870   {PIX_FMT_GRAY16_L, PIX_FMT_GRAY8, gray16_l_to_gray},
       
  2871   {PIX_FMT_GRAY16_L, PIX_FMT_RGB555, gray16_l_to_rgb555},
       
  2872   {PIX_FMT_GRAY16_L, PIX_FMT_RGB565, gray16_l_to_rgb565},
       
  2873   {PIX_FMT_GRAY16_L, PIX_FMT_BGR24, gray16_l_to_bgr24},
       
  2874   {PIX_FMT_GRAY16_L, PIX_FMT_RGB24, gray16_l_to_rgb24},
       
  2875   {PIX_FMT_GRAY16_L, PIX_FMT_BGR32, gray16_l_to_bgr32},
       
  2876   {PIX_FMT_GRAY16_L, PIX_FMT_RGB32, gray16_l_to_rgb32},
       
  2877   {PIX_FMT_GRAY16_L, PIX_FMT_xRGB32, gray16_l_to_xrgb32},
       
  2878   {PIX_FMT_GRAY16_L, PIX_FMT_BGRx32, gray16_l_to_bgrx32},
       
  2879   {PIX_FMT_GRAY16_L, PIX_FMT_ABGR32, gray16_l_to_abgr32},
       
  2880   {PIX_FMT_GRAY16_L, PIX_FMT_ARGB32, gray16_l_to_argb32},
       
  2881   {PIX_FMT_GRAY16_L, PIX_FMT_BGRA32, gray16_l_to_bgra32},
       
  2882   {PIX_FMT_GRAY16_L, PIX_FMT_RGBA32, gray16_l_to_rgba32},
       
  2883   {PIX_FMT_GRAY16_L, PIX_FMT_GRAY16_B, gray16_b_to_gray16_l},
       
  2884 
       
  2885   {PIX_FMT_GRAY16_B, PIX_FMT_GRAY8, gray16_b_to_gray},
       
  2886   {PIX_FMT_GRAY16_B, PIX_FMT_RGB555, gray16_b_to_rgb555},
       
  2887   {PIX_FMT_GRAY16_B, PIX_FMT_RGB565, gray16_b_to_rgb565},
       
  2888   {PIX_FMT_GRAY16_B, PIX_FMT_BGR24, gray16_b_to_bgr24},
       
  2889   {PIX_FMT_GRAY16_B, PIX_FMT_RGB24, gray16_b_to_rgb24},
       
  2890   {PIX_FMT_GRAY16_B, PIX_FMT_BGR32, gray16_b_to_bgr32},
       
  2891   {PIX_FMT_GRAY16_B, PIX_FMT_RGB32, gray16_b_to_rgb32},
       
  2892   {PIX_FMT_GRAY16_B, PIX_FMT_xRGB32, gray16_b_to_xrgb32},
       
  2893   {PIX_FMT_GRAY16_B, PIX_FMT_BGRx32, gray16_b_to_bgrx32},
       
  2894   {PIX_FMT_GRAY16_B, PIX_FMT_ABGR32, gray16_b_to_abgr32},
       
  2895   {PIX_FMT_GRAY16_B, PIX_FMT_ARGB32, gray16_b_to_argb32},
       
  2896   {PIX_FMT_GRAY16_B, PIX_FMT_BGRA32, gray16_b_to_bgra32},
       
  2897   {PIX_FMT_GRAY16_B, PIX_FMT_RGBA32, gray16_b_to_rgba32},
       
  2898   {PIX_FMT_GRAY16_B, PIX_FMT_GRAY16_L, gray16_b_to_gray16_l},
       
  2899 
  2194 
  2900   {PIX_FMT_PAL8, PIX_FMT_RGB555, pal8_to_rgb555},
  2195   {PIX_FMT_PAL8, PIX_FMT_RGB555, pal8_to_rgb555},
  2901   {PIX_FMT_PAL8, PIX_FMT_RGB565, pal8_to_rgb565},
  2196   {PIX_FMT_PAL8, PIX_FMT_RGB565, pal8_to_rgb565},
  2902   {PIX_FMT_PAL8, PIX_FMT_BGR24, pal8_to_bgr24},
  2197   {PIX_FMT_PAL8, PIX_FMT_BGR24, pal8_to_bgr24},
  2903   {PIX_FMT_PAL8, PIX_FMT_RGB24, pal8_to_rgb24},
  2198   {PIX_FMT_PAL8, PIX_FMT_RGB24, pal8_to_rgb24},
  2910   {PIX_FMT_PAL8, PIX_FMT_ARGB32, pal8_to_argb32},
  2205   {PIX_FMT_PAL8, PIX_FMT_ARGB32, pal8_to_argb32},
  2911   {PIX_FMT_PAL8, PIX_FMT_ABGR32, pal8_to_abgr32},
  2206   {PIX_FMT_PAL8, PIX_FMT_ABGR32, pal8_to_abgr32},
  2912 
  2207 
  2913   {PIX_FMT_UYVY411, PIX_FMT_YUV411P, uyvy411_to_yuv411p},
  2208   {PIX_FMT_UYVY411, PIX_FMT_YUV411P, uyvy411_to_yuv411p},
  2914 
  2209 
  2915   {PIX_FMT_V308, PIX_FMT_RGB24, v308_to_rgb24},
       
  2916 
       
  2917   {PIX_FMT_AYUV4444, PIX_FMT_RGBA32, ayuv4444_to_rgba32},
  2210   {PIX_FMT_AYUV4444, PIX_FMT_RGBA32, ayuv4444_to_rgba32},
  2918   {PIX_FMT_AYUV4444, PIX_FMT_RGB24, ayuv4444_to_rgb24},
  2211 
       
  2212   {PIX_FMT_AYUV4444, PIX_FMT_RGB24, ayuv4444_to_rgb24}
  2919 };
  2213 };
  2920 
  2214 
  2921 static ConvertEntry *
  2215 static ConvertEntry *
  2922 get_convert_table_entry (int src_pix_fmt, int dst_pix_fmt)
  2216 get_convert_table_entry (int src_pix_fmt, int dst_pix_fmt)
  2923 {
  2217 {
  3154 
  2448 
  3155   /* try to use an intermediate format */
  2449   /* try to use an intermediate format */
  3156   if (src_pix_fmt == PIX_FMT_YUV422 || dst_pix_fmt == PIX_FMT_YUV422) {
  2450   if (src_pix_fmt == PIX_FMT_YUV422 || dst_pix_fmt == PIX_FMT_YUV422) {
  3157     /* specific case: convert to YUV422P first */
  2451     /* specific case: convert to YUV422P first */
  3158     int_pix_fmt = PIX_FMT_YUV422P;
  2452     int_pix_fmt = PIX_FMT_YUV422P;
  3159   } else if (src_pix_fmt == PIX_FMT_UYVY422 || dst_pix_fmt == PIX_FMT_UYVY422 ||
  2453   } else if (src_pix_fmt == PIX_FMT_UYVY422 || dst_pix_fmt == PIX_FMT_UYVY422) {
  3160       src_pix_fmt == PIX_FMT_YVYU422 || dst_pix_fmt == PIX_FMT_YVYU422) {
       
  3161     /* specific case: convert to YUV422P first */
  2454     /* specific case: convert to YUV422P first */
  3162     int_pix_fmt = PIX_FMT_YUV422P;
  2455     int_pix_fmt = PIX_FMT_YUV422P;
  3163   } else if (src_pix_fmt == PIX_FMT_UYVY411 || dst_pix_fmt == PIX_FMT_UYVY411) {
  2456   } else if (src_pix_fmt == PIX_FMT_UYVY411 || dst_pix_fmt == PIX_FMT_UYVY411) {
  3164     /* specific case: convert to YUV411P first */
  2457     /* specific case: convert to YUV411P first */
  3165     int_pix_fmt = PIX_FMT_YUV411P;
  2458     int_pix_fmt = PIX_FMT_YUV411P;
  3241 #endif
  2534 #endif
  3242 
  2535 
  3243 int
  2536 int
  3244 img_get_alpha_info (const AVPicture * src, int pix_fmt, int width, int height)
  2537 img_get_alpha_info (const AVPicture * src, int pix_fmt, int width, int height)
  3245 {
  2538 {
  3246   const PixFmtInfo *pf;
  2539   PixFmtInfo *pf = get_pix_fmt_info (pix_fmt);
  3247   int ret;
  2540   int ret;
  3248 
  2541 
  3249   pf = get_pix_fmt_info (pix_fmt);
  2542   pf = get_pix_fmt_info (pix_fmt);
  3250   /* no alpha can be represented in format */
  2543   /* no alpha can be represented in format */
  3251   if (!pf->is_alpha)
  2544   if (!pf->is_alpha)
  3383     lum += 4;
  2676     lum += 4;
  3384     dst += 4;
  2677     dst += 4;
  3385   }
  2678   }
  3386 #endif
  2679 #endif
  3387 }
  2680 }
  3388 
       
  3389 static void
  2681 static void
  3390 deinterlace_line_inplace (uint8_t * lum_m4, uint8_t * lum_m3, uint8_t * lum_m2,
  2682 deinterlace_line_inplace (uint8_t * lum_m4, uint8_t * lum_m3, uint8_t * lum_m2,
  3391     uint8_t * lum_m1, uint8_t * lum, int size)
  2683     uint8_t * lum_m1, uint8_t * lum, int size)
  3392 {
  2684 {
  3393 #ifndef HAVE_MMX
  2685 #ifndef HAVE_MMX