Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1993)

Unified Diff: content/renderer/media/video_track_adapter.cc

Issue 2870413004: Detect frames from rotated devices in VideoTrackAdapter on Android. (Closed)
Patch Set: address comment by tommi@ Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/media/video_track_adapter.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/renderer/media/video_track_adapter.cc
diff --git a/content/renderer/media/video_track_adapter.cc b/content/renderer/media/video_track_adapter.cc
index b5a742bd84d3e56f168fe7ee2888a696dce201ba..e471b115ad3ca1508590171e07db899230a357ac 100644
--- a/content/renderer/media/video_track_adapter.cc
+++ b/content/renderer/media/video_track_adapter.cc
@@ -18,6 +18,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
+#include "build/build_config.h"
#include "content/public/common/content_switches.h"
#include "media/base/bind_to_current_loop.h"
#include "media/base/video_util.h"
@@ -102,6 +103,7 @@ class VideoTrackAdapter::VideoFrameResolutionAdapter
const scoped_refptr<base::SingleThreadTaskRunner> renderer_task_runner_;
const gfx::Size max_frame_size_;
+ base::Optional<gfx::Size> expected_native_size_;
const double min_aspect_ratio_;
const double max_aspect_ratio_;
@@ -122,6 +124,7 @@ VideoTrackAdapter::VideoFrameResolutionAdapter::VideoFrameResolutionAdapter(
const VideoTrackAdapterSettings& settings)
: renderer_task_runner_(render_message_loop),
max_frame_size_(settings.max_width, settings.max_height),
+ expected_native_size_(settings.expected_native_size),
min_aspect_ratio_(settings.min_aspect_ratio),
max_aspect_ratio_(settings.max_aspect_ratio),
frame_rate_(MediaStreamVideoSource::kDefaultFrameRate),
@@ -216,9 +219,19 @@ void VideoTrackAdapter::VideoFrameResolutionAdapter::DeliverFrame(
}
scoped_refptr<media::VideoFrame> video_frame(frame);
+ bool is_rotated = false;
+#if defined(OS_ANDROID)
+ // TODO(guidou): Use actual device information instead of this heuristic to
+ // detect frames from rotated devices. http://crbug.com/722748
+ if (expected_native_size_ &&
+ frame->natural_size().width() == expected_native_size_->height() &&
+ frame->natural_size().height() == expected_native_size_->width()) {
+ is_rotated = true;
+ }
+#endif
gfx::Size desired_size;
- CalculateTargetSize(frame->natural_size(), max_frame_size_, min_aspect_ratio_,
- max_aspect_ratio_, &desired_size);
+ CalculateTargetSize(is_rotated, frame->natural_size(), max_frame_size_,
+ min_aspect_ratio_, max_aspect_ratio_, &desired_size);
if (desired_size != frame->natural_size()) {
// Get the largest centered rectangle with the same aspect ratio of
// |desired_size| that fits entirely inside of |frame->visible_rect()|.
@@ -250,7 +263,8 @@ bool VideoTrackAdapter::VideoFrameResolutionAdapter::SettingsMatch(
max_frame_size_.height() == settings.max_height &&
min_aspect_ratio_ == settings.min_aspect_ratio &&
max_aspect_ratio_ == settings.max_aspect_ratio &&
- max_frame_rate_ == settings.max_frame_rate;
+ max_frame_rate_ == settings.max_frame_rate &&
+ expected_native_size_ == settings.expected_native_size;
}
bool VideoTrackAdapter::VideoFrameResolutionAdapter::IsEmpty() const {
@@ -329,18 +343,22 @@ VideoTrackAdapterSettings::VideoTrackAdapterSettings()
std::numeric_limits<int>::max(),
0.0,
std::numeric_limits<double>::max(),
- 0.0) {}
-
-VideoTrackAdapterSettings::VideoTrackAdapterSettings(int max_width,
- int max_height,
- double min_aspect_ratio,
- double max_aspect_ratio,
- double max_frame_rate)
+ 0.0,
+ base::Optional<gfx::Size>()) {}
+
+VideoTrackAdapterSettings::VideoTrackAdapterSettings(
+ int max_width,
+ int max_height,
+ double min_aspect_ratio,
+ double max_aspect_ratio,
+ double max_frame_rate,
+ const base::Optional<gfx::Size>& expected_native_size)
: max_width(max_width),
max_height(max_height),
min_aspect_ratio(min_aspect_ratio),
max_aspect_ratio(max_aspect_ratio),
- max_frame_rate(max_frame_rate) {
+ max_frame_rate(max_frame_rate),
+ expected_native_size(expected_native_size) {
DCHECK_GE(max_width, 1);
DCHECK_GE(max_height, 1);
DCHECK_GE(min_aspect_ratio, 0.0);
@@ -348,6 +366,11 @@ VideoTrackAdapterSettings::VideoTrackAdapterSettings(int max_width,
DCHECK_GE(max_frame_rate, 0.0);
}
+VideoTrackAdapterSettings::VideoTrackAdapterSettings(
+ const VideoTrackAdapterSettings& other) = default;
+VideoTrackAdapterSettings& VideoTrackAdapterSettings::operator=(
+ const VideoTrackAdapterSettings& other) = default;
+
VideoTrackAdapter::VideoTrackAdapter(
scoped_refptr<base::SingleThreadTaskRunner> io_task_runner)
: io_task_runner_(io_task_runner),
@@ -419,11 +442,18 @@ void VideoTrackAdapter::StopFrameMonitoring() {
}
// static
-void VideoTrackAdapter::CalculateTargetSize(const gfx::Size& input_size,
- const gfx::Size& max_frame_size,
- double min_aspect_ratio,
- double max_aspect_ratio,
- gfx::Size* desired_size) {
+void VideoTrackAdapter::CalculateTargetSize(
+ bool is_rotated,
+ const gfx::Size& original_input_size,
+ const gfx::Size& max_frame_size,
+ double min_aspect_ratio,
+ double max_aspect_ratio,
+ gfx::Size* desired_size) {
+ const gfx::Size& input_size =
+ is_rotated
+ ? gfx::Size(original_input_size.height(), original_input_size.width())
+ : original_input_size;
+
// If |frame| has larger width or height than requested, or the aspect ratio
// does not match the requested, we want to create a wrapped version of this
// frame with a size that fulfills the constraints.
@@ -454,9 +484,10 @@ void VideoTrackAdapter::CalculateTargetSize(const gfx::Size& input_size,
desired_width = (desired_width + 1) & ~1;
}
- *desired_size = gfx::Size(desired_width, desired_height);
+ *desired_size = is_rotated ? gfx::Size(desired_height, desired_width)
+ : gfx::Size(desired_width, desired_height);
} else {
- *desired_size = input_size;
+ *desired_size = original_input_size;
}
}
« no previous file with comments | « content/renderer/media/video_track_adapter.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698