1 // Copyright 2019 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "media/gpu/chromeos/image_processor_backend.h"
6 
7 #include <memory>
8 #include <ostream>
9 #include <sstream>
10 
11 #include "base/bind.h"
12 #include "base/strings/stringprintf.h"
13 #include "base/task/post_task.h"
14 #include "base/task/task_traits.h"
15 #include "media/gpu/macros.h"
16 
17 namespace media {
18 
19 namespace {
20 
21 template <class T>
VectorToString(const std::vector<T> & vec)22 std::string VectorToString(const std::vector<T>& vec) {
23   std::ostringstream result;
24   std::string delim;
25   result << "[";
26   for (const T& v : vec) {
27     result << delim << v;
28     if (delim.size() == 0)
29       delim = ", ";
30   }
31   result << "]";
32   return result.str();
33 }
34 
35 }  // namespace
36 
37 ImageProcessorBackend::PortConfig::PortConfig(const PortConfig&) = default;
38 
PortConfig(Fourcc fourcc,const gfx::Size & size,const std::vector<ColorPlaneLayout> & planes,const gfx::Rect & visible_rect,const std::vector<VideoFrame::StorageType> & preferred_storage_types)39 ImageProcessorBackend::PortConfig::PortConfig(
40     Fourcc fourcc,
41     const gfx::Size& size,
42     const std::vector<ColorPlaneLayout>& planes,
43     const gfx::Rect& visible_rect,
44     const std::vector<VideoFrame::StorageType>& preferred_storage_types)
45     : fourcc(fourcc),
46       size(size),
47       planes(planes),
48       visible_rect(visible_rect),
49       preferred_storage_types(preferred_storage_types) {}
50 
51 ImageProcessorBackend::PortConfig::~PortConfig() = default;
52 
ToString() const53 std::string ImageProcessorBackend::PortConfig::ToString() const {
54   return base::StringPrintf(
55       "PortConfig(format:%s, size:%s, planes: %s, visible_rect:%s, "
56       "storage_types:%s)",
57       fourcc.ToString().c_str(), size.ToString().c_str(),
58       VectorToString(planes).c_str(), visible_rect.ToString().c_str(),
59       VectorToString(preferred_storage_types).c_str());
60 }
61 
ImageProcessorBackend(const PortConfig & input_config,const PortConfig & output_config,OutputMode output_mode,VideoRotation relative_rotation,ErrorCB error_cb,scoped_refptr<base::SequencedTaskRunner> backend_task_runner)62 ImageProcessorBackend::ImageProcessorBackend(
63     const PortConfig& input_config,
64     const PortConfig& output_config,
65     OutputMode output_mode,
66     VideoRotation relative_rotation,
67     ErrorCB error_cb,
68     scoped_refptr<base::SequencedTaskRunner> backend_task_runner)
69     : input_config_(input_config),
70       output_config_(output_config),
71       output_mode_(output_mode),
72       relative_rotation_(relative_rotation),
73       error_cb_(error_cb),
74       backend_task_runner_(std::move(backend_task_runner)) {
75   DETACH_FROM_SEQUENCE(backend_sequence_checker_);
76 }
77 
78 ImageProcessorBackend::~ImageProcessorBackend() = default;
79 
Destroy()80 void ImageProcessorBackend::Destroy() {
81   DCHECK_CALLED_ON_VALID_SEQUENCE(backend_sequence_checker_);
82 
83   delete this;
84 }
85 
ProcessLegacy(scoped_refptr<VideoFrame> frame,LegacyFrameReadyCB cb)86 void ImageProcessorBackend::ProcessLegacy(scoped_refptr<VideoFrame> frame,
87                                           LegacyFrameReadyCB cb) {
88   DCHECK_CALLED_ON_VALID_SEQUENCE(backend_sequence_checker_);
89 
90   NOTIMPLEMENTED();
91 }
92 
Reset()93 void ImageProcessorBackend::Reset() {
94   DVLOGF(3);
95   DCHECK_CALLED_ON_VALID_SEQUENCE(backend_sequence_checker_);
96   // Do nothing as the default action.
97 }
98 
99 }  // namespace media
100 
101 namespace std {
102 
operator ()(media::ImageProcessorBackend * ptr) const103 void default_delete<media::ImageProcessorBackend>::operator()(
104     media::ImageProcessorBackend* ptr) const {
105   ptr->Destroy();
106 }
107 
108 }  // namespace std
109