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