From f27269a67d27a89bc60ff865fa57f8cf30a08bd1 Mon Sep 17 00:00:00 2001 From: X512 Date: Tue, 14 Jul 2020 21:39:11 +0900 Subject: [PATCH] MediaPlayer: fix reporting wrong format Now it allows to connect MediaPlayer video producer to differnt node in Cortex. Change-Id: I7ee598ea64d10e8fa876259e7a4480a650a0e189 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3034 Reviewed-by: Adrien Destugues --- .../video/VideoProducer.cpp | 24 ++++++++++++------- .../video/VideoSupplier.h | 2 ++ .../supplier/ProxyVideoSupplier.cpp | 7 ++++++ .../mediaplayer/supplier/ProxyVideoSupplier.h | 1 + 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/apps/mediaplayer/media_node_framework/video/VideoProducer.cpp b/src/apps/mediaplayer/media_node_framework/video/VideoProducer.cpp index 43f802b66c..863b41fe82 100644 --- a/src/apps/mediaplayer/media_node_framework/video/VideoProducer.cpp +++ b/src/apps/mediaplayer/media_node_framework/video/VideoProducer.cpp @@ -357,14 +357,22 @@ VideoProducer::PrepareToConnect(const media_source& source, return B_MEDIA_BAD_FORMAT; } - if (format->u.raw_video.display.line_width == 0) - format->u.raw_video.display.line_width = 384; - if (format->u.raw_video.display.line_count == 0) - format->u.raw_video.display.line_count = 288; - if (format->u.raw_video.field_rate == 0) - format->u.raw_video.field_rate = 25.0; - if (format->u.raw_video.display.bytes_per_row == 0) - format->u.raw_video.display.bytes_per_row = format->u.raw_video.display.line_width * 4; + if (format->u.raw_video.display.line_width == 0) { + format->u.raw_video.display.line_width + = fSupplier->Format().u.raw_video.display.line_width; + } + if (format->u.raw_video.display.line_count == 0) { + format->u.raw_video.display.line_count + = fSupplier->Format().u.raw_video.display.line_count; + } + if (format->u.raw_video.field_rate == 0) { + format->u.raw_video.field_rate + = fSupplier->Format().u.raw_video.field_rate; + } + if (format->u.raw_video.display.bytes_per_row == 0) { + format->u.raw_video.display.bytes_per_row + = fSupplier->Format().u.raw_video.display.bytes_per_row; + } *outSource = fOutput.source; strcpy(outName, fOutput.name); diff --git a/src/apps/mediaplayer/media_node_framework/video/VideoSupplier.h b/src/apps/mediaplayer/media_node_framework/video/VideoSupplier.h index ae57e4122e..70d3031da8 100644 --- a/src/apps/mediaplayer/media_node_framework/video/VideoSupplier.h +++ b/src/apps/mediaplayer/media_node_framework/video/VideoSupplier.h @@ -8,6 +8,7 @@ #include +#include struct media_raw_video_format; @@ -18,6 +19,7 @@ public: VideoSupplier(); virtual ~VideoSupplier(); + virtual const media_format& Format() const = 0; virtual status_t FillBuffer(int64 startFrame, void* buffer, const media_raw_video_format& format, bool forceGeneration, bool& wasCached) = 0; diff --git a/src/apps/mediaplayer/supplier/ProxyVideoSupplier.cpp b/src/apps/mediaplayer/supplier/ProxyVideoSupplier.cpp index 1fc2d960ce..8db2d8e7d4 100644 --- a/src/apps/mediaplayer/supplier/ProxyVideoSupplier.cpp +++ b/src/apps/mediaplayer/supplier/ProxyVideoSupplier.cpp @@ -28,6 +28,13 @@ ProxyVideoSupplier::~ProxyVideoSupplier() } +const media_format& +ProxyVideoSupplier::Format() const +{ + return fSupplier->Format(); +} + + status_t ProxyVideoSupplier::FillBuffer(int64 startFrame, void* buffer, const media_raw_video_format& format, bool forceGeneration, diff --git a/src/apps/mediaplayer/supplier/ProxyVideoSupplier.h b/src/apps/mediaplayer/supplier/ProxyVideoSupplier.h index 0995e97d83..9dc3771d24 100644 --- a/src/apps/mediaplayer/supplier/ProxyVideoSupplier.h +++ b/src/apps/mediaplayer/supplier/ProxyVideoSupplier.h @@ -18,6 +18,7 @@ public: ProxyVideoSupplier(); virtual ~ProxyVideoSupplier(); + virtual const media_format& Format() const; virtual status_t FillBuffer(int64 startFrame, void* buffer, const media_raw_video_format& format, bool forceGeneration, bool& wasCached);