DecklinkOutput.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. #include "DecklinkOutput.hpp"
  2. #include <util/threading.h>
  3. DeckLinkOutput::DeckLinkOutput(obs_output_t *output,
  4. DeckLinkDeviceDiscovery *discovery_)
  5. : DecklinkBase(discovery_),
  6. output(output)
  7. {
  8. discovery->AddCallback(DeckLinkOutput::DevicesChanged, this);
  9. }
  10. DeckLinkOutput::~DeckLinkOutput(void)
  11. {
  12. discovery->RemoveCallback(DeckLinkOutput::DevicesChanged, this);
  13. Deactivate();
  14. }
  15. void DeckLinkOutput::DevicesChanged(void *param, DeckLinkDevice *device, bool)
  16. {
  17. auto *decklink = reinterpret_cast<DeckLinkOutput *>(param);
  18. std::lock_guard<std::recursive_mutex> lock(decklink->deviceMutex);
  19. blog(LOG_DEBUG, "%s", device->GetHash().c_str());
  20. }
  21. bool DeckLinkOutput::Activate(DeckLinkDevice *device, long long modeId)
  22. {
  23. std::lock_guard<std::recursive_mutex> lock(deviceMutex);
  24. DeckLinkDevice *curDevice = GetDevice();
  25. const bool same = device == curDevice;
  26. const bool isActive = instance != nullptr;
  27. if (same) {
  28. if (!isActive)
  29. return false;
  30. if (instance->GetActiveModeId() == modeId &&
  31. instance->GetActivePixelFormat() == pixelFormat &&
  32. instance->GetActiveColorSpace() == colorSpace &&
  33. instance->GetActiveColorRange() == colorRange &&
  34. instance->GetActiveChannelFormat() == channelFormat)
  35. return false;
  36. }
  37. if (isActive)
  38. instance->StopOutput();
  39. if (!same)
  40. instance.Set(new DeckLinkDeviceInstance(this, device));
  41. if (instance == nullptr)
  42. return false;
  43. DeckLinkDeviceMode *mode = GetDevice()->FindOutputMode(modeId);
  44. if (mode == nullptr) {
  45. instance = nullptr;
  46. return false;
  47. }
  48. if (!instance->StartOutput(mode)) {
  49. instance = nullptr;
  50. return false;
  51. }
  52. os_atomic_inc_long(&activateRefs);
  53. return true;
  54. }
  55. void DeckLinkOutput::Deactivate(void)
  56. {
  57. std::lock_guard<std::recursive_mutex> lock(deviceMutex);
  58. if (instance)
  59. instance->StopOutput();
  60. instance = nullptr;
  61. os_atomic_dec_long(&activateRefs);
  62. }
  63. obs_output_t *DeckLinkOutput::GetOutput(void) const
  64. {
  65. return output;
  66. }
  67. void DeckLinkOutput::UpdateVideoFrame(video_data *frame)
  68. {
  69. instance->UpdateVideoFrame(frame);
  70. }
  71. void DeckLinkOutput::WriteAudio(audio_data *frames)
  72. {
  73. instance->WriteAudio(frames);
  74. }
  75. void DeckLinkOutput::SetSize(int width, int height)
  76. {
  77. this->width = width;
  78. this->height = height;
  79. }
  80. int DeckLinkOutput::GetWidth()
  81. {
  82. return width;
  83. }
  84. int DeckLinkOutput::GetHeight()
  85. {
  86. return height;
  87. }