1 // Copyright 2016 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 <stddef.h>
6 
7 #include <sstream>
8 
9 #include "base/logging.h"
10 #include "base/numerics/safe_math.h"
11 #include "media/gpu/ipc/common/media_param_traits.h"
12 
13 namespace IPC {
14 
Write(base::Pickle * m,const param_type & p)15 void ParamTraits<media::BitstreamBuffer>::Write(base::Pickle* m,
16                                                 const param_type& p) {
17   WriteParam(m, p.id());
18   WriteParam(m, static_cast<uint64_t>(p.size()));
19   DCHECK_GE(p.offset(), 0);
20   WriteParam(m, static_cast<uint64_t>(p.offset()));
21   WriteParam(m, p.presentation_timestamp());
22   WriteParam(m, p.key_id());
23   if (!p.key_id().empty()) {
24     WriteParam(m, p.iv());
25     WriteParam(m, p.subsamples());
26   }
27   WriteParam(m, p.DuplicateRegion());
28 }
29 
Read(const base::Pickle * m,base::PickleIterator * iter,param_type * r)30 bool ParamTraits<media::BitstreamBuffer>::Read(const base::Pickle* m,
31                                                base::PickleIterator* iter,
32                                                param_type* r) {
33   DCHECK(r);
34   uint64_t size = 0;
35   uint64_t offset = 0;
36   if (!(ReadParam(m, iter, &r->id_) && ReadParam(m, iter, &size) &&
37         ReadParam(m, iter, &offset) &&
38         ReadParam(m, iter, &r->presentation_timestamp_) &&
39         ReadParam(m, iter, &r->key_id_)))
40     return false;
41 
42   base::CheckedNumeric<size_t> checked_size(size);
43   if (!checked_size.IsValid()) {
44     DLOG(ERROR) << "Invalid size: " << size;
45     return false;
46   }
47   r->size_ = checked_size.ValueOrDie();
48 
49   base::CheckedNumeric<off_t> checked_offset(offset);
50   if (!checked_offset.IsValid()) {
51     DLOG(ERROR) << "Invalid offset: " << offset;
52     return false;
53   }
54   r->offset_ = checked_offset.ValueOrDie();
55 
56   if (!r->key_id_.empty()) {
57     if (!(ReadParam(m, iter, &r->iv_) && ReadParam(m, iter, &r->subsamples_)))
58       return false;
59   }
60 
61   return ReadParam(m, iter, &r->region_);
62 }
63 
Log(const param_type & p,std::string * l)64 void ParamTraits<media::BitstreamBuffer>::Log(const param_type& p,
65                                               std::string* l) {
66   std::ostringstream oss;
67   oss << "id=" << p.id() << ", size=" << p.size() << ", presentation_timestamp="
68       << p.presentation_timestamp().ToInternalValue();
69   l->append(oss.str());
70 }
71 
72 }  // namespace IPC
73 
74 // Generate param traits write methods.
75 #include "ipc/param_traits_write_macros.h"
76 namespace IPC {
77 #undef MEDIA_GPU_IPC_COMMON_MEDIA_PARAM_TRAITS_MACROS_H_
78 #include "media/gpu/ipc/common/media_param_traits_macros.h"
79 }  // namespace IPC
80 
81 // Generate param traits read methods.
82 #include "ipc/param_traits_read_macros.h"
83 namespace IPC {
84 #undef MEDIA_GPU_IPC_COMMON_MEDIA_PARAM_TRAITS_MACROS_H_
85 #include "media/gpu/ipc/common/media_param_traits_macros.h"
86 }  // namespace IPC
87 
88 // Generate param traits log methods.
89 #include "ipc/param_traits_log_macros.h"
90 namespace IPC {
91 #undef MEDIA_GPU_IPC_COMMON_MEDIA_PARAM_TRAITS_MACROS_H_
92 #include "media/gpu/ipc/common/media_param_traits_macros.h"
93 }  // namespace IPC
94