vimc-core.h 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. * vimc-core.h Virtual Media Controller Driver
  3. *
  4. * Copyright (C) 2015-2017 Helen Koike <helen.fornazier@gmail.com>
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. */
  17. #ifndef _VIMC_CORE_H_
  18. #define _VIMC_CORE_H_
  19. #include <linux/slab.h>
  20. #include <media/v4l2-device.h>
  21. /**
  22. * struct vimc_pix_map - maps media bus code with v4l2 pixel format
  23. *
  24. * @code: media bus format code defined by MEDIA_BUS_FMT_* macros
  25. * @bbp: number of bytes each pixel occupies
  26. * @pixelformat: pixel format devined by V4L2_PIX_FMT_* macros
  27. *
  28. * Struct which matches the MEDIA_BUS_FMT_* codes with the corresponding
  29. * V4L2_PIX_FMT_* fourcc pixelformat and its bytes per pixel (bpp)
  30. */
  31. struct vimc_pix_map {
  32. unsigned int code;
  33. unsigned int bpp;
  34. u32 pixelformat;
  35. };
  36. /**
  37. * struct vimc_ent_device - core struct that represents a node in the topology
  38. *
  39. * @ent: the pointer to struct media_entity for the node
  40. * @pads: the list of pads of the node
  41. * @destroy: callback to destroy the node
  42. * @process_frame: callback send a frame to that node
  43. *
  44. * Each node of the topology must create a vimc_ent_device struct. Depending on
  45. * the node it will be of an instance of v4l2_subdev or video_device struct
  46. * where both contains a struct media_entity.
  47. * Those structures should embedded the vimc_ent_device struct through
  48. * v4l2_set_subdevdata() and video_set_drvdata() respectivaly, allowing the
  49. * vimc_ent_device struct to be retrieved from the corresponding struct
  50. * media_entity
  51. */
  52. struct vimc_ent_device {
  53. struct media_entity *ent;
  54. struct media_pad *pads;
  55. void (*destroy)(struct vimc_ent_device *);
  56. void (*process_frame)(struct vimc_ent_device *ved,
  57. struct media_pad *sink, const void *frame);
  58. };
  59. /**
  60. * vimc_propagate_frame - propagate a frame through the topology
  61. *
  62. * @src: the source pad where the frame is being originated
  63. * @frame: the frame to be propagated
  64. *
  65. * This function will call the process_frame callback from the vimc_ent_device
  66. * struct of the nodes directly connected to the @src pad
  67. */
  68. int vimc_propagate_frame(struct media_pad *src, const void *frame);
  69. /**
  70. * vimc_pads_init - initialize pads
  71. *
  72. * @num_pads: number of pads to initialize
  73. * @pads_flags: flags to use in each pad
  74. *
  75. * Helper functions to allocate/initialize pads
  76. */
  77. struct media_pad *vimc_pads_init(u16 num_pads,
  78. const unsigned long *pads_flag);
  79. /**
  80. * vimc_pads_cleanup - free pads
  81. *
  82. * @pads: pointer to the pads
  83. *
  84. * Helper function to free the pads initialized with vimc_pads_init
  85. */
  86. static inline void vimc_pads_cleanup(struct media_pad *pads)
  87. {
  88. kfree(pads);
  89. }
  90. /**
  91. * vimc_pix_map_by_code - get vimc_pix_map struct by media bus code
  92. *
  93. * @code: media bus format code defined by MEDIA_BUS_FMT_* macros
  94. */
  95. const struct vimc_pix_map *vimc_pix_map_by_code(u32 code);
  96. /**
  97. * vimc_pix_map_by_pixelformat - get vimc_pix_map struct by v4l2 pixel format
  98. *
  99. * @pixelformat: pixel format devined by V4L2_PIX_FMT_* macros
  100. */
  101. const struct vimc_pix_map *vimc_pix_map_by_pixelformat(u32 pixelformat);
  102. #endif