0001-add-I420.patch 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. --- a/sys/fbdev/gstfbdevsink.c 2021-07-06 16:02:46.304928800 +0800
  2. +++ b/sys/fbdev/gstfbdevsink.c 2021-07-06 16:02:11.593693100 +0800
  3. @@ -73,7 +73,7 @@
  4. static GstStateChangeReturn gst_fbdevsink_change_state (GstElement * element,
  5. GstStateChange transition);
  6. -#define VIDEO_CAPS "{ RGB, BGR, BGRx, xBGR, RGB, RGBx, xRGB, RGB15, RGB16 }"
  7. +#define VIDEO_CAPS "{ RGB, BGR, BGRx, xBGR, RGB, RGBx, xRGB, RGB15, RGB16, I420, NV12, NV21 }"
  8. static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
  9. GST_PAD_SINK,
  10. @@ -133,7 +133,10 @@
  11. /* FIXME: locking */
  12. if (!fbdevsink->framebuffer)
  13. goto done;
  14. -
  15. + if (fbdevsink->varinfo.grayscale == 1) {
  16. + format = GST_VIDEO_FORMAT_NV12;
  17. + goto common;
  18. + }
  19. bpp = fbdevsink->varinfo.bits_per_pixel;
  20. rmask = ((1 << fbdevsink->varinfo.red.length) - 1)
  21. @@ -182,6 +185,8 @@
  22. if (format == GST_VIDEO_FORMAT_UNKNOWN)
  23. goto unknown_format;
  24. +common:
  25. +
  26. caps = gst_caps_make_writable (caps);
  27. gst_caps_set_simple (caps, "format", G_TYPE_STRING,
  28. gst_video_format_to_string (format), NULL);
  29. @@ -272,12 +277,33 @@
  30. if (!gst_buffer_map (buf, &map, GST_MAP_READ))
  31. return GST_FLOW_ERROR;
  32. - for (i = 0; i < fbdevsink->lines; i++) {
  33. - memcpy (fbdevsink->framebuffer
  34. - + (i + fbdevsink->cy) * fbdevsink->fixinfo.line_length
  35. - + fbdevsink->cx * fbdevsink->bytespp,
  36. - map.data + i * fbdevsink->width * fbdevsink->bytespp,
  37. - fbdevsink->linelen);
  38. + if (fbdevsink->varinfo.grayscale == 1) {
  39. + int screen_offset = fbdevsink->varinfo.xres * fbdevsink->varinfo.yres;
  40. + int buffer_offset = fbdevsink->height * fbdevsink->width;
  41. +
  42. + for (i = 0; i < fbdevsink->lines; i++) {
  43. + memcpy (fbdevsink->framebuffer
  44. + + (i + fbdevsink->cy) * fbdevsink->varinfo.xres
  45. + + fbdevsink->cx * 1,
  46. + map.data + i * fbdevsink->width * 1,
  47. + fbdevsink->width);
  48. + }
  49. +
  50. + for (i = 0; i < fbdevsink->lines/2; i++) {
  51. + memcpy (fbdevsink->framebuffer + screen_offset
  52. + + (i + fbdevsink->cy/2) * fbdevsink->varinfo.xres
  53. + + fbdevsink->cx * 1,
  54. + map.data + buffer_offset + i * fbdevsink->width * 1,
  55. + fbdevsink->width);
  56. + }
  57. + } else {
  58. + for (i = 0; i < fbdevsink->lines; i++) {
  59. + memcpy (fbdevsink->framebuffer
  60. + + (i + fbdevsink->cy) * fbdevsink->fixinfo.line_length
  61. + + fbdevsink->cx * fbdevsink->bytespp,
  62. + map.data + i * fbdevsink->width * fbdevsink->bytespp,
  63. + fbdevsink->linelen);
  64. + }
  65. }
  66. gst_buffer_unmap (buf, &map);