Add connection status overlay for the VT renderer

This commit is contained in:
Cameron Gutman 2019-03-18 20:56:53 -07:00
parent f624a1817e
commit 018e8999e2

View File

@ -22,12 +22,12 @@ public:
: m_HwContext(nullptr), : m_HwContext(nullptr),
m_DisplayLayer(nullptr), m_DisplayLayer(nullptr),
m_FormatDesc(nullptr), m_FormatDesc(nullptr),
m_StreamView(nullptr), m_StreamView(nullptr)
m_DebugOverlayTextField(nullptr)
{ {
SDL_zero(m_OverlayTextFields);
} }
virtual ~VTRenderer() virtual ~VTRenderer() override
{ {
if (m_HwContext != nullptr) { if (m_HwContext != nullptr) {
av_buffer_unref(&m_HwContext); av_buffer_unref(&m_HwContext);
@ -37,8 +37,10 @@ public:
CFRelease(m_FormatDesc); CFRelease(m_FormatDesc);
} }
if (m_DebugOverlayTextField != nullptr) { for (int i = 0; i < Overlay::OverlayMax; i++) {
[m_DebugOverlayTextField removeFromSuperview]; if (m_OverlayTextFields[i] != nullptr) {
[m_OverlayTextFields[i] removeFromSuperview];
}
} }
if (m_StreamView != nullptr) { if (m_StreamView != nullptr) {
@ -197,38 +199,68 @@ public:
return true; return true;
} }
void updateOverlayOnMainThread(Overlay::OverlayType type)
{
// Lazy initialization for the overlay
if (m_OverlayTextFields[type] == nullptr) {
m_OverlayTextFields[type] = [[NSTextField alloc] initWithFrame:m_StreamView.bounds];
[m_OverlayTextFields[type] setBezeled:NO];
[m_OverlayTextFields[type] setDrawsBackground:NO];
[m_OverlayTextFields[type] setEditable:NO];
[m_OverlayTextFields[type] setSelectable:NO];
switch (type) {
case Overlay::OverlayDebug:
[m_OverlayTextFields[type] setAlignment:NSLeftTextAlignment];
break;
case Overlay::OverlayStatusUpdate:
[m_OverlayTextFields[type] setAlignment:NSRightTextAlignment];
break;
default:
break;
}
SDL_Color color = Session::get()->getOverlayManager().getOverlayColor(type);
[m_OverlayTextFields[type] setTextColor:[NSColor colorWithSRGBRed:color.r / 255.0 green:color.g / 255.0 blue:color.b / 255.0 alpha:color.a / 255.0]];
[m_OverlayTextFields[type] setFont:[NSFont messageFontOfSize:Session::get()->getOverlayManager().getOverlayFontSize(type)]];
[m_StreamView addSubview: m_OverlayTextFields[type]];
}
// Update text contents
[m_OverlayTextFields[type] setStringValue: [NSString stringWithUTF8String:Session::get()->getOverlayManager().getOverlayText(type)]];
// Unhide if it's enabled
[m_OverlayTextFields[type] setHidden: !Session::get()->getOverlayManager().isOverlayEnabled(type)];
}
static void updateDebugOverlayOnMainThread(void* context) static void updateDebugOverlayOnMainThread(void* context)
{ {
VTRenderer* me = (VTRenderer*)context; VTRenderer* me = (VTRenderer*)context;
// Lazy initialization for the overlay me->updateOverlayOnMainThread(Overlay::OverlayDebug);
if (me->m_DebugOverlayTextField == nullptr) {
me->m_DebugOverlayTextField = [[NSTextField alloc] initWithFrame:me->m_StreamView.bounds];
[me->m_DebugOverlayTextField setBezeled:NO];
[me->m_DebugOverlayTextField setDrawsBackground:NO];
[me->m_DebugOverlayTextField setEditable:NO];
[me->m_DebugOverlayTextField setSelectable:NO];
SDL_Color color = Session::get()->getOverlayManager().getOverlayColor(Overlay::OverlayDebug);
[me->m_DebugOverlayTextField setTextColor:[NSColor colorWithSRGBRed:color.r / 255.0 green:color.g / 255.0 blue:color.b / 255.0 alpha:color.a / 255.0]];
[me->m_DebugOverlayTextField setFont:[NSFont messageFontOfSize:Session::get()->getOverlayManager().getOverlayFontSize(Overlay::OverlayDebug)]];
[me->m_StreamView addSubview: me->m_DebugOverlayTextField];
} }
// Update text contents static void updateStatusOverlayOnMainThread(void* context)
[me->m_DebugOverlayTextField setStringValue: [NSString stringWithUTF8String:Session::get()->getOverlayManager().getOverlayText(Overlay::OverlayDebug)]]; {
VTRenderer* me = (VTRenderer*)context;
// Unhide if it's enabled me->updateOverlayOnMainThread(Overlay::OverlayStatusUpdate);
[me->m_DebugOverlayTextField setHidden: !Session::get()->getOverlayManager().isOverlayEnabled(Overlay::OverlayDebug)];
} }
virtual void notifyOverlayUpdated(Overlay::OverlayType type) override virtual void notifyOverlayUpdated(Overlay::OverlayType type) override
{ {
// We must do the actual UI updates on the main thread, so queue an // We must do the actual UI updates on the main thread, so queue an
// async callback on the main thread via GCD to do the UI update. // async callback on the main thread via GCD to do the UI update.
if (type == Overlay::OverlayDebug) { switch (type) {
case Overlay::OverlayDebug:
dispatch_async_f(dispatch_get_main_queue(), this, updateDebugOverlayOnMainThread); dispatch_async_f(dispatch_get_main_queue(), this, updateDebugOverlayOnMainThread);
break;
case Overlay::OverlayStatusUpdate:
dispatch_async_f(dispatch_get_main_queue(), this, updateStatusOverlayOnMainThread);
break;
default:
break;
} }
} }
@ -269,7 +301,7 @@ private:
AVSampleBufferDisplayLayer* m_DisplayLayer; AVSampleBufferDisplayLayer* m_DisplayLayer;
CMVideoFormatDescriptionRef m_FormatDesc; CMVideoFormatDescriptionRef m_FormatDesc;
NSView* m_StreamView; NSView* m_StreamView;
NSTextField* m_DebugOverlayTextField; NSTextField* m_OverlayTextFields[Overlay::OverlayMax];
}; };
IFFmpegRenderer* VTRendererFactory::createRenderer() { IFFmpegRenderer* VTRendererFactory::createRenderer() {