vdec_ctrls.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /*
  2. * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
  3. * Copyright (C) 2017 Linaro Ltd.
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 and
  7. * only version 2 as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. */
  15. #include <linux/types.h>
  16. #include <media/v4l2-ctrls.h>
  17. #include "core.h"
  18. #include "vdec.h"
  19. static int vdec_op_s_ctrl(struct v4l2_ctrl *ctrl)
  20. {
  21. struct venus_inst *inst = ctrl_to_inst(ctrl);
  22. struct vdec_controls *ctr = &inst->controls.dec;
  23. switch (ctrl->id) {
  24. case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
  25. ctr->post_loop_deb_mode = ctrl->val;
  26. break;
  27. case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
  28. case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
  29. case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:
  30. ctr->profile = ctrl->val;
  31. break;
  32. case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
  33. case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
  34. ctr->level = ctrl->val;
  35. break;
  36. default:
  37. return -EINVAL;
  38. }
  39. return 0;
  40. }
  41. static int vdec_op_g_volatile_ctrl(struct v4l2_ctrl *ctrl)
  42. {
  43. struct venus_inst *inst = ctrl_to_inst(ctrl);
  44. struct vdec_controls *ctr = &inst->controls.dec;
  45. union hfi_get_property hprop;
  46. u32 ptype = HFI_PROPERTY_PARAM_PROFILE_LEVEL_CURRENT;
  47. int ret;
  48. switch (ctrl->id) {
  49. case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
  50. case V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE:
  51. case V4L2_CID_MPEG_VIDEO_VP8_PROFILE:
  52. ret = hfi_session_get_property(inst, ptype, &hprop);
  53. if (!ret)
  54. ctr->profile = hprop.profile_level.profile;
  55. ctrl->val = ctr->profile;
  56. break;
  57. case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
  58. case V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL:
  59. ret = hfi_session_get_property(inst, ptype, &hprop);
  60. if (!ret)
  61. ctr->level = hprop.profile_level.level;
  62. ctrl->val = ctr->level;
  63. break;
  64. case V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER:
  65. ctrl->val = ctr->post_loop_deb_mode;
  66. break;
  67. case V4L2_CID_MIN_BUFFERS_FOR_CAPTURE:
  68. ctrl->val = inst->num_output_bufs;
  69. break;
  70. default:
  71. return -EINVAL;
  72. };
  73. return 0;
  74. }
  75. static const struct v4l2_ctrl_ops vdec_ctrl_ops = {
  76. .s_ctrl = vdec_op_s_ctrl,
  77. .g_volatile_ctrl = vdec_op_g_volatile_ctrl,
  78. };
  79. int vdec_ctrl_init(struct venus_inst *inst)
  80. {
  81. struct v4l2_ctrl *ctrl;
  82. int ret;
  83. ret = v4l2_ctrl_handler_init(&inst->ctrl_handler, 7);
  84. if (ret)
  85. return ret;
  86. ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,
  87. V4L2_CID_MPEG_VIDEO_MPEG4_PROFILE,
  88. V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_CODING_EFFICIENCY,
  89. ~((1 << V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE) |
  90. (1 << V4L2_MPEG_VIDEO_MPEG4_PROFILE_ADVANCED_SIMPLE)),
  91. V4L2_MPEG_VIDEO_MPEG4_PROFILE_SIMPLE);
  92. if (ctrl)
  93. ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
  94. ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,
  95. V4L2_CID_MPEG_VIDEO_MPEG4_LEVEL,
  96. V4L2_MPEG_VIDEO_MPEG4_LEVEL_5,
  97. 0, V4L2_MPEG_VIDEO_MPEG4_LEVEL_0);
  98. if (ctrl)
  99. ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
  100. ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,
  101. V4L2_CID_MPEG_VIDEO_H264_PROFILE,
  102. V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH,
  103. ~((1 << V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE) |
  104. (1 << V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE) |
  105. (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MAIN) |
  106. (1 << V4L2_MPEG_VIDEO_H264_PROFILE_HIGH) |
  107. (1 << V4L2_MPEG_VIDEO_H264_PROFILE_STEREO_HIGH) |
  108. (1 << V4L2_MPEG_VIDEO_H264_PROFILE_MULTIVIEW_HIGH)),
  109. V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE);
  110. if (ctrl)
  111. ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
  112. ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,
  113. V4L2_CID_MPEG_VIDEO_H264_LEVEL,
  114. V4L2_MPEG_VIDEO_H264_LEVEL_5_1,
  115. 0, V4L2_MPEG_VIDEO_H264_LEVEL_1_0);
  116. if (ctrl)
  117. ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
  118. ctrl = v4l2_ctrl_new_std_menu(&inst->ctrl_handler, &vdec_ctrl_ops,
  119. V4L2_CID_MPEG_VIDEO_VP8_PROFILE,
  120. V4L2_MPEG_VIDEO_VP8_PROFILE_3,
  121. 0, V4L2_MPEG_VIDEO_VP8_PROFILE_0);
  122. if (ctrl)
  123. ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
  124. v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,
  125. V4L2_CID_MPEG_VIDEO_DECODER_MPEG4_DEBLOCK_FILTER, 0, 1, 1, 0);
  126. ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler, &vdec_ctrl_ops,
  127. V4L2_CID_MIN_BUFFERS_FOR_CAPTURE, 1, 32, 1, 1);
  128. if (ctrl)
  129. ctrl->flags |= V4L2_CTRL_FLAG_VOLATILE;
  130. ret = inst->ctrl_handler.error;
  131. if (ret) {
  132. v4l2_ctrl_handler_free(&inst->ctrl_handler);
  133. return ret;
  134. }
  135. return 0;
  136. }
  137. void vdec_ctrl_deinit(struct venus_inst *inst)
  138. {
  139. v4l2_ctrl_handler_free(&inst->ctrl_handler);
  140. }