1 /*
2 * Copyright (C) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <unistd.h>
17 #include "av_shared_memory_helper.h"
18 #include "av_shared_memory_base.h"
19 #include "avsession_errors.h"
20 #include "avsession_log.h"
21
22 namespace OHOS {
23 namespace AVSession {
WriteAVSharedMemoryToParcel(const std::shared_ptr<AVSharedMemory> & memory,MessageParcel & parcel)24 int32_t WriteAVSharedMemoryToParcel(const std::shared_ptr<AVSharedMemory> &memory, MessageParcel &parcel)
25 {
26 std::shared_ptr<AVSharedMemoryBase> baseMem = std::static_pointer_cast<AVSharedMemoryBase>(memory);
27 if (baseMem == nullptr) {
28 SLOGE("memory is nullptr");
29 return AVSESSION_ERROR;
30 }
31
32 int32_t fd = baseMem->GetFd();
33 if (fd < 0) {
34 SLOGE("write fd is invalid, fd = %{public}d", fd);
35 return AVSESSION_ERROR;
36 }
37
38 int32_t size = baseMem->GetSize();
39
40 bool res = parcel.WriteFileDescriptor(fd);
41 if (!res) {
42 SLOGE("write fd is invalid, fd = %{public}d", fd);
43 return AVSESSION_ERROR;
44 }
45 parcel.WriteInt32(size);
46 parcel.WriteUint32(baseMem->GetFlags());
47 parcel.WriteString(baseMem->GetName());
48
49 return AVSESSION_SUCCESS;
50 }
51
ReadAVSharedMemoryFromParcel(MessageParcel & parcel)52 std::shared_ptr<AVSharedMemory> ReadAVSharedMemoryFromParcel(MessageParcel &parcel)
53 {
54 int32_t fd = parcel.ReadFileDescriptor();
55 if (fd < 0) {
56 SLOGE("read fd is invalid, fd = %{public}d", fd);
57 return nullptr;
58 }
59
60 int32_t size = parcel.ReadInt32();
61 uint32_t flags = parcel.ReadUint32();
62 std::string name = parcel.ReadString();
63
64 std::shared_ptr<AVSharedMemory> memory = AVSharedMemoryBase::CreateFromRemote(fd, size, flags, name);
65 if (memory == nullptr || memory->GetBase() == nullptr) {
66 SLOGE("create remote AVSharedMemoryBase failed");
67 return nullptr;
68 }
69
70 (void)::close(fd);
71 return memory;
72 }
73
ReadAVDataSrcMemoryFromParcel(MessageParcel & parcel)74 std::shared_ptr<AVSharedMemory> ReadAVDataSrcMemoryFromParcel(MessageParcel &parcel)
75 {
76 int32_t fd = parcel.ReadFileDescriptor();
77 if (fd < 0) {
78 SLOGE("read fd is invalid, fd = %{public}d", fd);
79 return nullptr;
80 }
81
82 int32_t size = parcel.ReadInt32();
83 uint32_t flags = parcel.ReadUint32();
84 std::string name = parcel.ReadString();
85
86 std::shared_ptr<AVSharedMemory> memory = AVSharedMemoryBase::CreateFromRemote(fd, size, flags, name);
87 if (memory == nullptr || memory->GetBase() == nullptr) {
88 SLOGE("create remote AVDataSrcMemory failed");
89 return nullptr;
90 }
91
92 (void)::close(fd);
93 return memory;
94 }
95 } // namespace AVSession
96 } // namespace OHOS