~ubuntu-branches/ubuntu/trusty/gst-plugins-base1.0/trusty-proposed

« back to all changes in this revision

Viewing changes to gst/videoconvert/videoconvert.c

  • Committer: Package Import Robot
  • Author(s): Sebastian Dröge
  • Date: 2013-09-24 16:24:47 UTC
  • mfrom: (1.1.18) (17.1.2 sid)
  • Revision ID: package-import@ubuntu.com-20130924162447-0s1qfyjlaswtp1jg
* New upstream stable release:
  + debian/rules,
    debian/build-deps.in:
    - Build-depend on GStreamer >= 1.2.0.

Show diffs side-by-side

added added

removed removed

Lines of Context:
378
378
  }
379
379
}
380
380
 
 
381
static void
 
382
alloc_tmplines (VideoConvert * convert, guint lines, gint width)
 
383
{
 
384
  gint i;
 
385
 
 
386
  convert->n_tmplines = lines;
 
387
  convert->tmplines = g_malloc (lines * sizeof (gpointer));
 
388
  for (i = 0; i < lines; i++)
 
389
    convert->tmplines[i] = g_malloc (sizeof (guint16) * (width + 8) * 4);
 
390
}
 
391
 
381
392
static gboolean
382
393
videoconvert_convert_compute_resample (VideoConvert * convert)
383
394
{
384
395
  GstVideoInfo *in_info, *out_info;
385
396
  const GstVideoFormatInfo *sfinfo, *dfinfo;
386
 
  gint lines, i;
387
397
  gint width;
388
398
 
389
399
  in_info = &convert->in_info;
394
404
 
395
405
  width = convert->width;
396
406
 
397
 
  convert->upsample = gst_video_chroma_resample_new (0,
398
 
      in_info->chroma_site, 0, sfinfo->unpack_format, sfinfo->w_sub[2],
399
 
      sfinfo->h_sub[2]);
 
407
  if (sfinfo->w_sub[2] != dfinfo->w_sub[2] ||
 
408
      sfinfo->h_sub[2] != dfinfo->h_sub[2] ||
 
409
      in_info->chroma_site != out_info->chroma_site) {
 
410
    convert->upsample = gst_video_chroma_resample_new (0,
 
411
        in_info->chroma_site, 0, sfinfo->unpack_format, sfinfo->w_sub[2],
 
412
        sfinfo->h_sub[2]);
 
413
 
 
414
 
 
415
    convert->downsample = gst_video_chroma_resample_new (0,
 
416
        out_info->chroma_site, 0, dfinfo->unpack_format, -dfinfo->w_sub[2],
 
417
        -dfinfo->h_sub[2]);
 
418
 
 
419
  } else {
 
420
    convert->upsample = NULL;
 
421
    convert->downsample = NULL;
 
422
  }
 
423
 
400
424
  if (convert->upsample) {
401
425
    gst_video_chroma_resample_get_info (convert->upsample,
402
426
        &convert->up_n_lines, &convert->up_offset);
404
428
    convert->up_n_lines = 1;
405
429
    convert->up_offset = 0;
406
430
  }
407
 
  GST_DEBUG ("upsample: %p, offset %d, n_lines %d", convert->upsample,
408
 
      convert->up_offset, convert->up_n_lines);
409
 
 
410
 
  convert->downsample = gst_video_chroma_resample_new (0,
411
 
      out_info->chroma_site, 0, dfinfo->unpack_format, -dfinfo->w_sub[2],
412
 
      -dfinfo->h_sub[2]);
413
431
  if (convert->downsample) {
414
432
    gst_video_chroma_resample_get_info (convert->downsample,
415
433
        &convert->down_n_lines, &convert->down_offset);
417
435
    convert->down_n_lines = 1;
418
436
    convert->down_offset = 0;
419
437
  }
420
 
 
421
 
  GST_DEBUG ("downsample: %p, offset %d, n_lines %d", convert->downsample,
422
 
      convert->down_offset, convert->down_n_lines);
423
 
 
424
 
  lines = MAX (convert->down_n_lines, convert->up_n_lines);
425
 
 
426
 
  convert->n_tmplines = lines;
427
 
  convert->tmplines = g_malloc (lines * sizeof (gpointer));
428
 
  for (i = 0; i < lines; i++)
429
 
    convert->tmplines[i] = g_malloc (sizeof (guint16) * (width + 8) * 4);
 
438
  GST_DEBUG ("upsample: %p, site: %d, offset %d, n_lines %d", convert->upsample,
 
439
      in_info->chroma_site, convert->up_offset, convert->up_n_lines);
 
440
  GST_DEBUG ("downsample: %p, site: %d, offset %d, n_lines %d",
 
441
      convert->downsample, out_info->chroma_site, convert->down_offset,
 
442
      convert->down_n_lines);
 
443
 
 
444
  alloc_tmplines (convert, convert->down_n_lines + convert->up_n_lines, width);
430
445
 
431
446
  return TRUE;
432
447
}
498
513
  up_offset = convert->up_offset;
499
514
  down_n_lines = convert->down_n_lines;
500
515
  down_offset = convert->down_offset;
501
 
  max_lines = MAX (down_n_lines, up_n_lines);
 
516
  max_lines = convert->n_tmplines;
502
517
 
503
518
  in_lines = 0;
504
519
  out_lines = 0;
514
529
    idx = CLAMP (start_offset, 0, height);
515
530
    in_tmplines[in_lines] = convert->tmplines[idx % max_lines];
516
531
    out_tmplines[out_lines] = in_tmplines[in_lines];
517
 
    GST_DEBUG ("start_offset %d, %d, idx %u, in %d, out %d", start_offset,
518
 
        up_offset, idx, in_lines, out_lines);
 
532
    GST_DEBUG ("start_offset %d/%d, %d, idx %u, in %d, out %d", start_offset,
 
533
        stop_offset, up_offset, idx, in_lines, out_lines);
519
534
 
520
535
    up_line = up_offset + in_lines;
521
536
 
522
537
    /* extract the next line */
523
538
    if (up_line >= 0 && up_line < height) {
524
 
      GST_DEBUG ("unpack line %d", up_line);
 
539
      GST_DEBUG ("unpack line %d into %d", up_line, in_lines);
525
540
      UNPACK_FRAME (src, in_tmplines[in_lines], up_line, width);
526
541
    }
527
542
 
573
588
 
574
589
    start = 0;
575
590
    while (out_lines >= down_n_lines) {
576
 
      GST_DEBUG ("doing downsample %u", start);
577
 
      if (convert->downsample)
 
591
      if (convert->downsample) {
 
592
        GST_DEBUG ("doing downsample %u", start);
578
593
        gst_video_chroma_resample (convert->downsample,
579
594
            &out_tmplines[start], width);
 
595
      }
580
596
 
581
597
      for (j = 0; j < down_n_lines; j += lines) {
582
598
        idx = down_offset + j;
591
607
      start += down_n_lines;
592
608
      out_lines -= down_n_lines;
593
609
    }
 
610
    /* we didn't process these lines, move them up for the next round */
 
611
    for (j = 0; j < out_lines; j++) {
 
612
      GST_DEBUG ("move line %d->%d", j + start, j);
 
613
      out_tmplines[j] = out_tmplines[j + start];
 
614
    }
 
615
 
594
616
    up_offset += up_n_lines;
595
617
  }
596
618
  if ((pal =
774
796
convert_YUY2_I420 (VideoConvert * convert, GstVideoFrame * dest,
775
797
    const GstVideoFrame * src)
776
798
{
777
 
  int i, h;
 
799
  int i;
778
800
  gint width = convert->width;
779
801
  gint height = convert->height;
780
802
  gboolean interlaced = GST_VIDEO_FRAME_IS_INTERLACED (src);
781
803
  gint l1, l2;
782
804
 
783
 
  h = height;
784
 
  if (width & 1)
785
 
    h--;
786
 
 
787
 
  for (i = 0; i < h; i += 2) {
 
805
  for (i = 0; i < GST_ROUND_DOWN_2 (height); i += 2) {
788
806
    GET_LINE_OFFSETS (interlaced, i, l1, l2);
789
807
 
790
808
    video_convert_orc_convert_YUY2_I420 (FRAME_GET_Y_LINE (dest, l1),
810
828
 
811
829
  video_convert_orc_convert_YUY2_AYUV (FRAME_GET_LINE (dest, 0),
812
830
      FRAME_GET_STRIDE (dest), FRAME_GET_LINE (src, 0),
813
 
      FRAME_GET_STRIDE (src), (width + 1) / 2,
814
 
      height & 1 ? height - 1 : height);
815
 
 
816
 
  /* now handle last line */
817
 
  if (height & 1) {
818
 
    UNPACK_FRAME (src, convert->tmplines[0], height - 1, width);
819
 
    PACK_FRAME (dest, convert->tmplines[0], height - 1, width);
820
 
  }
 
831
      FRAME_GET_STRIDE (src), (width + 1) / 2, height);
821
832
}
822
833
 
823
834
static void
885
896
 
886
897
  video_convert_orc_convert_UYVY_AYUV (FRAME_GET_LINE (dest, 0),
887
898
      FRAME_GET_STRIDE (dest), FRAME_GET_LINE (src, 0),
888
 
      FRAME_GET_STRIDE (src), (width + 1) / 2,
889
 
      height & 1 ? height - 1 : height);
890
 
 
891
 
  /* now handle last line */
892
 
  if (height & 1) {
893
 
    UNPACK_FRAME (src, convert->tmplines[0], height - 1, width);
894
 
    PACK_FRAME (dest, convert->tmplines[0], height - 1, width);
895
 
  }
 
899
      FRAME_GET_STRIDE (src), (width + 1) / 2, height);
896
900
}
897
901
 
898
902
static void
942
946
  gint width = convert->width;
943
947
  gint height = convert->height;
944
948
 
 
949
  /* only for even width/height */
945
950
  video_convert_orc_convert_AYUV_I420 (FRAME_GET_Y_LINE (dest, 0),
946
951
      2 * FRAME_GET_Y_STRIDE (dest), FRAME_GET_Y_LINE (dest, 1),
947
952
      2 * FRAME_GET_Y_STRIDE (dest), FRAME_GET_U_LINE (dest, 0),
958
963
  gint width = convert->width;
959
964
  gint height = convert->height;
960
965
 
 
966
  /* only for even width */
961
967
  video_convert_orc_convert_AYUV_YUY2 (FRAME_GET_LINE (dest, 0),
962
968
      FRAME_GET_STRIDE (dest), FRAME_GET_LINE (src, 0),
963
969
      FRAME_GET_STRIDE (src), width / 2, height);
970
976
  gint width = convert->width;
971
977
  gint height = convert->height;
972
978
 
 
979
  /* only for even width */
973
980
  video_convert_orc_convert_AYUV_UYVY (FRAME_GET_LINE (dest, 0),
974
981
      FRAME_GET_STRIDE (dest), FRAME_GET_LINE (src, 0),
975
982
      FRAME_GET_STRIDE (src), width / 2, height);
982
989
  gint width = convert->width;
983
990
  gint height = convert->height;
984
991
 
 
992
  /* only works for even width */
985
993
  video_convert_orc_convert_AYUV_Y42B (FRAME_GET_Y_LINE (dest, 0),
986
994
      FRAME_GET_Y_STRIDE (dest), FRAME_GET_U_LINE (dest, 0),
987
995
      FRAME_GET_U_STRIDE (dest), FRAME_GET_V_LINE (dest, 0),
988
996
      FRAME_GET_V_STRIDE (dest), FRAME_GET_LINE (src, 0),
989
 
      FRAME_GET_STRIDE (src), (width + 1) / 2,
990
 
      height & 1 ? height - 1 : height);
991
 
 
992
 
  /* now handle last line */
993
 
  if (height & 1) {
994
 
    UNPACK_FRAME (src, convert->tmplines[0], height - 1, width);
995
 
    PACK_FRAME (dest, convert->tmplines[0], height - 1, width);
996
 
  }
 
997
      FRAME_GET_STRIDE (src), width / 2, height);
997
998
}
998
999
 
999
1000
static void
1093
1094
  gint width = convert->width;
1094
1095
  gint height = convert->height;
1095
1096
 
 
1097
  /* only for even width */
1096
1098
  video_convert_orc_convert_Y42B_AYUV (FRAME_GET_LINE (dest, 0),
1097
1099
      FRAME_GET_STRIDE (dest), FRAME_GET_Y_LINE (src, 0),
1098
1100
      FRAME_GET_Y_STRIDE (src), FRAME_GET_U_LINE (src, 0),
1099
1101
      FRAME_GET_U_STRIDE (src), FRAME_GET_V_LINE (src, 0),
1100
 
      FRAME_GET_V_STRIDE (src), (width) / 2, height);
 
1102
      FRAME_GET_V_STRIDE (src), width / 2, height);
1101
1103
}
1102
1104
 
1103
1105
static void
1114
1116
  video_convert_orc_planar_chroma_444_420 (FRAME_GET_U_LINE (dest, 0),
1115
1117
      FRAME_GET_U_STRIDE (dest), FRAME_GET_U_LINE (src, 0),
1116
1118
      2 * FRAME_GET_U_STRIDE (src), FRAME_GET_U_LINE (src, 1),
1117
 
      2 * FRAME_GET_U_STRIDE (src), (width + 1) / 2, height / 2);
 
1119
      2 * FRAME_GET_U_STRIDE (src), width / 2, height / 2);
1118
1120
 
1119
1121
  video_convert_orc_planar_chroma_444_420 (FRAME_GET_V_LINE (dest, 0),
1120
1122
      FRAME_GET_V_STRIDE (dest), FRAME_GET_V_LINE (src, 0),
1121
1123
      2 * FRAME_GET_V_STRIDE (src), FRAME_GET_V_LINE (src, 1),
1122
 
      2 * FRAME_GET_V_STRIDE (src), (width + 1) / 2, height / 2);
 
1124
      2 * FRAME_GET_V_STRIDE (src), width / 2, height / 2);
1123
1125
 
1124
1126
  /* now handle last line */
1125
1127
  if (height & 1) {
1141
1143
 
1142
1144
  video_convert_orc_planar_chroma_444_422 (FRAME_GET_U_LINE (dest, 0),
1143
1145
      FRAME_GET_U_STRIDE (dest), FRAME_GET_U_LINE (src, 0),
1144
 
      FRAME_GET_U_STRIDE (src), (width + 1) / 2, height);
 
1146
      FRAME_GET_U_STRIDE (src), width / 2, height);
1145
1147
 
1146
1148
  video_convert_orc_planar_chroma_444_422 (FRAME_GET_V_LINE (dest, 0),
1147
1149
      FRAME_GET_V_STRIDE (dest), FRAME_GET_V_LINE (src, 0),
1148
 
      FRAME_GET_V_STRIDE (src), (width + 1) / 2, height);
 
1150
      FRAME_GET_V_STRIDE (src), width / 2, height);
1149
1151
}
1150
1152
 
1151
1153
static void
1159
1161
      FRAME_GET_STRIDE (dest), FRAME_GET_Y_LINE (src, 0),
1160
1162
      FRAME_GET_Y_STRIDE (src), FRAME_GET_U_LINE (src, 0),
1161
1163
      FRAME_GET_U_STRIDE (src), FRAME_GET_V_LINE (src, 0),
1162
 
      FRAME_GET_V_STRIDE (src), (width + 1) / 2, height);
 
1164
      FRAME_GET_V_STRIDE (src), width / 2, height);
1163
1165
}
1164
1166
 
1165
1167
static void
1173
1175
      FRAME_GET_STRIDE (dest), FRAME_GET_Y_LINE (src, 0),
1174
1176
      FRAME_GET_Y_STRIDE (src), FRAME_GET_U_LINE (src, 0),
1175
1177
      FRAME_GET_U_STRIDE (src), FRAME_GET_V_LINE (src, 0),
1176
 
      FRAME_GET_V_STRIDE (src), (width + 1) / 2, height);
 
1178
      FRAME_GET_V_STRIDE (src), width / 2, height);
1177
1179
}
1178
1180
 
1179
1181
static void
1287
1289
  GstVideoColorMatrix out_matrix;
1288
1290
  gboolean keeps_color_matrix;
1289
1291
  gboolean keeps_interlaced;
 
1292
  gint width_align, height_align;
1290
1293
  void (*convert) (VideoConvert * convert, GstVideoFrame * dest,
1291
1294
      const GstVideoFrame * src);
1292
1295
} VideoTransform;
1293
1296
 
1294
1297
static const VideoTransform transforms[] = {
1295
1298
  {GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YUY2,
1296
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_I420_YUY2},
 
1299
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_I420_YUY2},
1297
1300
  {GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_UYVY,
1298
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_I420_UYVY},
 
1301
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_I420_UYVY},
1299
1302
  {GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_AYUV,
1300
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_I420_AYUV},
 
1303
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_I420_AYUV},
1301
1304
  {GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y42B,
1302
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, convert_I420_Y42B},
 
1305
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 0, 0, convert_I420_Y42B},
1303
1306
  {GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y444,
1304
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, convert_I420_Y444},
 
1307
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 0, 0, convert_I420_Y444},
 
1308
 
 
1309
  {GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YUY2,
 
1310
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_I420_YUY2},
 
1311
  {GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_UYVY,
 
1312
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_I420_UYVY},
 
1313
  {GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_AYUV,
 
1314
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_I420_AYUV},
 
1315
  {GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y42B,
 
1316
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 0, 0, convert_I420_Y42B},
 
1317
  {GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y444,
 
1318
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 0, 0, convert_I420_Y444},
1305
1319
 
1306
1320
  {GST_VIDEO_FORMAT_YUY2, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_I420,
1307
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_YUY2_I420},
 
1321
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_YUY2_I420},
 
1322
  {GST_VIDEO_FORMAT_YUY2, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YV12,
 
1323
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_YUY2_I420},
1308
1324
  {GST_VIDEO_FORMAT_YUY2, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_UYVY,
1309
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_UYVY_YUY2},   /* alias */
 
1325
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_UYVY_YUY2},     /* alias */
1310
1326
  {GST_VIDEO_FORMAT_YUY2, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_AYUV,
1311
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_YUY2_AYUV},
 
1327
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_YUY2_AYUV},
1312
1328
  {GST_VIDEO_FORMAT_YUY2, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y42B,
1313
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_YUY2_Y42B},
 
1329
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_YUY2_Y42B},
1314
1330
  {GST_VIDEO_FORMAT_YUY2, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y444,
1315
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_YUY2_Y444},
 
1331
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_YUY2_Y444},
1316
1332
 
1317
1333
  {GST_VIDEO_FORMAT_UYVY, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_I420,
1318
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_UYVY_I420},
 
1334
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_UYVY_I420},
 
1335
  {GST_VIDEO_FORMAT_UYVY, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YV12,
 
1336
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_UYVY_I420},
1319
1337
  {GST_VIDEO_FORMAT_UYVY, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YUY2,
1320
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_UYVY_YUY2},
 
1338
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_UYVY_YUY2},
1321
1339
  {GST_VIDEO_FORMAT_UYVY, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_AYUV,
1322
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_UYVY_AYUV},
 
1340
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_UYVY_AYUV},
1323
1341
  {GST_VIDEO_FORMAT_UYVY, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y42B,
1324
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_UYVY_Y42B},
 
1342
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_UYVY_Y42B},
1325
1343
  {GST_VIDEO_FORMAT_UYVY, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y444,
1326
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_UYVY_Y444},
 
1344
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_UYVY_Y444},
1327
1345
 
1328
1346
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_I420,
1329
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, convert_AYUV_I420},
 
1347
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 1, 1, convert_AYUV_I420},
 
1348
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YV12,
 
1349
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 1, 1, convert_AYUV_I420},
1330
1350
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YUY2,
1331
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_AYUV_YUY2},
 
1351
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 1, 0, convert_AYUV_YUY2},
1332
1352
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_UYVY,
1333
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_AYUV_UYVY},
 
1353
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 1, 0, convert_AYUV_UYVY},
1334
1354
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y42B,
1335
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_AYUV_Y42B},
 
1355
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 1, 0, convert_AYUV_Y42B},
1336
1356
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y444,
1337
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_AYUV_Y444},
 
1357
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_AYUV_Y444},
1338
1358
 
1339
1359
  {GST_VIDEO_FORMAT_Y42B, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_I420,
1340
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, convert_Y42B_I420},
 
1360
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 0, 0, convert_Y42B_I420},
 
1361
  {GST_VIDEO_FORMAT_Y42B, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YV12,
 
1362
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 0, 0, convert_Y42B_I420},
1341
1363
  {GST_VIDEO_FORMAT_Y42B, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YUY2,
1342
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_Y42B_YUY2},
 
1364
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_Y42B_YUY2},
1343
1365
  {GST_VIDEO_FORMAT_Y42B, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_UYVY,
1344
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_Y42B_UYVY},
 
1366
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_Y42B_UYVY},
1345
1367
  {GST_VIDEO_FORMAT_Y42B, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_AYUV,
1346
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_Y42B_AYUV},
 
1368
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 1, 0, convert_Y42B_AYUV},
1347
1369
  {GST_VIDEO_FORMAT_Y42B, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y444,
1348
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_Y42B_Y444},
 
1370
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_Y42B_Y444},
1349
1371
 
1350
1372
  {GST_VIDEO_FORMAT_Y444, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_I420,
1351
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, convert_Y444_I420},
 
1373
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 1, 0, convert_Y444_I420},
 
1374
  {GST_VIDEO_FORMAT_Y444, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YV12,
 
1375
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, FALSE, 1, 0, convert_Y444_I420},
1352
1376
  {GST_VIDEO_FORMAT_Y444, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_YUY2,
1353
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_Y444_YUY2},
 
1377
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 1, 0, convert_Y444_YUY2},
1354
1378
  {GST_VIDEO_FORMAT_Y444, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_UYVY,
1355
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_Y444_UYVY},
 
1379
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 1, 0, convert_Y444_UYVY},
1356
1380
  {GST_VIDEO_FORMAT_Y444, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_AYUV,
1357
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_Y444_AYUV},
 
1381
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 0, 0, convert_Y444_AYUV},
1358
1382
  {GST_VIDEO_FORMAT_Y444, GST_VIDEO_COLOR_MATRIX_UNKNOWN, GST_VIDEO_FORMAT_Y42B,
1359
 
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, convert_Y444_Y42B},
 
1383
      GST_VIDEO_COLOR_MATRIX_UNKNOWN, TRUE, TRUE, 1, 0, convert_Y444_Y42B},
1360
1384
 
1361
1385
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
1362
1386
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_ARGB,
1363
 
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, convert_AYUV_ARGB},
 
1387
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, 0, 0, convert_AYUV_ARGB},
1364
1388
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_BGRA,
1365
 
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, convert_AYUV_BGRA},
 
1389
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, 0, 0, convert_AYUV_BGRA},
1366
1390
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_xRGB,
1367
 
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, convert_AYUV_ARGB},      /* alias */
 
1391
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, 0, 0, convert_AYUV_ARGB},        /* alias */
1368
1392
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_BGRx,
1369
 
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, convert_AYUV_BGRA},      /* alias */
 
1393
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, 0, 0, convert_AYUV_BGRA},        /* alias */
1370
1394
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_ABGR,
1371
 
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, convert_AYUV_ABGR},
 
1395
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, 0, 0, convert_AYUV_ABGR},
1372
1396
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_RGBA,
1373
 
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, convert_AYUV_RGBA},
 
1397
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, 0, 0, convert_AYUV_RGBA},
1374
1398
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_xBGR,
1375
 
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, convert_AYUV_ABGR},      /* alias */
 
1399
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, 0, 0, convert_AYUV_ABGR},        /* alias */
1376
1400
  {GST_VIDEO_FORMAT_AYUV, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_RGBx,
1377
 
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, convert_AYUV_RGBA},      /* alias */
 
1401
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, TRUE, 0, 0, convert_AYUV_RGBA},        /* alias */
1378
1402
 
1379
1403
  {GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_BGRA,
1380
 
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, FALSE, convert_I420_BGRA},
 
1404
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, FALSE, 0, 0, convert_I420_BGRA},
 
1405
  {GST_VIDEO_FORMAT_I420, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_BGRx,
 
1406
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, FALSE, 0, 0, convert_I420_BGRA},
 
1407
  {GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_BGRA,
 
1408
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, FALSE, 0, 0, convert_I420_BGRA},
 
1409
  {GST_VIDEO_FORMAT_YV12, GST_VIDEO_COLOR_MATRIX_BT601, GST_VIDEO_FORMAT_BGRx,
 
1410
      GST_VIDEO_COLOR_MATRIX_RGB, FALSE, FALSE, 0, 0, convert_I420_BGRA},
1381
1411
#endif
1382
1412
};
1383
1413
 
1388
1418
  GstVideoFormat in_format, out_format;
1389
1419
  GstVideoColorMatrix in_matrix, out_matrix;
1390
1420
  gboolean interlaced;
 
1421
  gint width, height;
1391
1422
 
1392
1423
  in_format = GST_VIDEO_INFO_FORMAT (&convert->in_info);
1393
1424
  out_format = GST_VIDEO_INFO_FORMAT (&convert->out_info);
1394
1425
 
 
1426
  width = GST_VIDEO_INFO_WIDTH (&convert->in_info);
 
1427
  height = GST_VIDEO_INFO_HEIGHT (&convert->in_info);
 
1428
 
1395
1429
  in_matrix = convert->in_info.colorimetry.matrix;
1396
1430
  out_matrix = convert->out_info.colorimetry.matrix;
1397
1431
 
1404
1438
        (transforms[i].keeps_color_matrix ||
1405
1439
            (transforms[i].in_matrix == in_matrix &&
1406
1440
                transforms[i].out_matrix == out_matrix)) &&
1407
 
        (transforms[i].keeps_interlaced || !interlaced)) {
 
1441
        (transforms[i].keeps_interlaced || !interlaced) &&
 
1442
        (transforms[i].width_align & width) == 0 &&
 
1443
        (transforms[i].height_align & height) == 0) {
1408
1444
      GST_DEBUG ("using fastpath");
1409
1445
      convert->convert = transforms[i].convert;
 
1446
      alloc_tmplines (convert, 1, GST_VIDEO_INFO_WIDTH (&convert->in_info));
1410
1447
      return TRUE;
1411
1448
    }
1412
1449
  }