1
0

DecklinkOutput.cpp 2.3 KB

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