From ad2a98a34fb54cb4acb27881849dc021df3b6ae3 Mon Sep 17 00:00:00 2001 From: Mark Reid Date: Fri, 31 Jan 2025 18:17:08 +1100 Subject: [PATCH] Use getMediaFromContext to pick media to generate ImageStructureInfo. Fixes color inspector not working on FileSources that have has multiple video sources with different orientations Signed-off-by: Mark Reid --- src/lib/ip/IPBaseNodes/FileSourceIPNode.cpp | 38 ++++++------------- .../IPBaseNodes/FileSourceIPNode.h | 9 +++-- 2 files changed, 16 insertions(+), 31 deletions(-) diff --git a/src/lib/ip/IPBaseNodes/FileSourceIPNode.cpp b/src/lib/ip/IPBaseNodes/FileSourceIPNode.cpp index 6ccdc40fa..7a74bc98a 100644 --- a/src/lib/ip/IPBaseNodes/FileSourceIPNode.cpp +++ b/src/lib/ip/IPBaseNodes/FileSourceIPNode.cpp @@ -724,7 +724,7 @@ namespace IPCore FileSourceIPNode::MediaPointer FileSourceIPNode::getMediaFromContext(ImageComponent& selection, - const Context& context) + const Context& context) const { selection = selectComponentFromContext(context); @@ -755,7 +755,7 @@ namespace IPCore FileSourceIPNode::MediaPointer FileSourceIPNode::mediaForComponent(ImageComponent& c, - const Context& context) + const Context& context) const { if (!c.isValid()) return nullptr; @@ -888,7 +888,7 @@ namespace IPCore return nullptr; } - FileSourceIPNode::MediaPointer FileSourceIPNode::defaultMedia(int eye) + FileSourceIPNode::MediaPointer FileSourceIPNode::defaultMedia(int eye) const { const QReadLocker readLock(&m_mediaMutex); @@ -922,7 +922,8 @@ namespace IPCore } FileSourceIPNode::Movie* - FileSourceIPNode::movieForThread(const Media* media, const Context& context) + FileSourceIPNode::movieForThread(const Media* media, + const Context& context) const { if (!media) return 0; @@ -1812,35 +1813,24 @@ namespace IPCore int ha = 0; int w = 0; int h = 0; - int na = 0; - int nv = 0; float pa = 1.0; Mat44f O; + ImageComponent selection; + MediaPointer media = getMediaFromContext(selection, context); - for (size_t i = 0; i < m_mediaVector.size(); i++) + if (media) { - Movie* mov = m_mediaVector[i]->primaryMovie(); - bool audio = mov->hasAudio() - && (!mov->hasVideo() || !m_noMovieAudio->front()); - bool video = mov->hasVideo(); - + Movie* mov = media->primaryMovie(); const MovieInfo& info = mov->info(); const int iw = info.uncropWidth; const int ih = info.uncropHeight; const float ipa = info.pixelAspect; - if (audio && !video) - { - na++; - wa = max(wa, iw); - ha = max(ha, ih); - } - - if (video) + if (mov->hasVideo()) { - nv++; w = max(w, iw); h = max(h, ih); + // // pixelaspect may be < or > 1.0 so just adopt any // value that is interesting. @@ -1852,12 +1842,6 @@ namespace IPCore } } - if (!nv && na) - { - w = wa; - h = ha; - } - return ImageStructureInfo(w * (pa > 1.0 ? pa : 1.0), h / (pa < 1.0 ? pa : 1.0), pa, O); } diff --git a/src/lib/ip/IPBaseNodes/IPBaseNodes/FileSourceIPNode.h b/src/lib/ip/IPBaseNodes/IPBaseNodes/FileSourceIPNode.h index 0af117a81..0794094cd 100644 --- a/src/lib/ip/IPBaseNodes/IPBaseNodes/FileSourceIPNode.h +++ b/src/lib/ip/IPBaseNodes/IPBaseNodes/FileSourceIPNode.h @@ -215,10 +215,11 @@ namespace IPCore const SharedMediaPointer& proxySharedMedia = SharedMediaPointer()); MediaPointer getMediaFromContext(ImageComponent& selection, - const Context& context); - MediaPointer mediaForComponent(ImageComponent&, const Context& context); - MediaPointer defaultMedia(int); - Movie* movieForThread(const Media*, const Context&); + const Context& context) const; + MediaPointer mediaForComponent(ImageComponent&, + const Context& context) const; + MediaPointer defaultMedia(int) const; + Movie* movieForThread(const Media*, const Context&) const; void setupRequest(const Movie*, const ImageComponent&, const Context&, Movie::ReadRequest& request);