1e0e9324cSopenharmony_ci/*
2e0e9324cSopenharmony_ci * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development Co., Ltd.
3e0e9324cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e0e9324cSopenharmony_ci * you may not use this file except in compliance with the License.
5e0e9324cSopenharmony_ci * You may obtain a copy of the License at
6e0e9324cSopenharmony_ci *
7e0e9324cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e0e9324cSopenharmony_ci *
9e0e9324cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e0e9324cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e0e9324cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e0e9324cSopenharmony_ci * See the License for the specific language governing permissions and
13e0e9324cSopenharmony_ci * limitations under the License.
14e0e9324cSopenharmony_ci */
15e0e9324cSopenharmony_ci
16e0e9324cSopenharmony_ci#ifndef OHOS_SHARING_FRAME_H
17e0e9324cSopenharmony_ci#define OHOS_SHARING_FRAME_H
18e0e9324cSopenharmony_ci
19e0e9324cSopenharmony_ci#include <list>
20e0e9324cSopenharmony_ci#include <map>
21e0e9324cSopenharmony_ci#include <memory>
22e0e9324cSopenharmony_ci#include <mutex>
23e0e9324cSopenharmony_ci#include <string>
24e0e9324cSopenharmony_ci#include "common/const_def.h"
25e0e9324cSopenharmony_ci#include "utils/data_buffer.h"
26e0e9324cSopenharmony_ci
27e0e9324cSopenharmony_cinamespace OHOS {
28e0e9324cSopenharmony_cinamespace Sharing {
29e0e9324cSopenharmony_ciclass CodecInfo {
30e0e9324cSopenharmony_cipublic:
31e0e9324cSopenharmony_ci    using Ptr = std::shared_ptr<CodecInfo>;
32e0e9324cSopenharmony_ci
33e0e9324cSopenharmony_ci    CodecInfo() = default;
34e0e9324cSopenharmony_ci    virtual ~CodecInfo() = default;
35e0e9324cSopenharmony_ci
36e0e9324cSopenharmony_ci    TrackType GetTrackType();
37e0e9324cSopenharmony_ci    virtual CodecId GetCodecId() = 0;
38e0e9324cSopenharmony_ci};
39e0e9324cSopenharmony_ci
40e0e9324cSopenharmony_ciclass Frame : public DataBuffer,
41e0e9324cSopenharmony_ci              public CodecInfo {
42e0e9324cSopenharmony_cipublic:
43e0e9324cSopenharmony_ci    using Ptr = std::shared_ptr<Frame>;
44e0e9324cSopenharmony_ci
45e0e9324cSopenharmony_ci    Frame() = default;
46e0e9324cSopenharmony_ci    explicit Frame(DataBuffer &&dataBuffer) : DataBuffer(std::move(dataBuffer)) {}
47e0e9324cSopenharmony_ci
48e0e9324cSopenharmony_ci    ~Frame() override {};
49e0e9324cSopenharmony_ci
50e0e9324cSopenharmony_ci    virtual uint32_t Dts() = 0;
51e0e9324cSopenharmony_ci
52e0e9324cSopenharmony_ci    virtual uint32_t Pts()
53e0e9324cSopenharmony_ci    {
54e0e9324cSopenharmony_ci        return Dts();
55e0e9324cSopenharmony_ci    }
56e0e9324cSopenharmony_ci
57e0e9324cSopenharmony_ci    virtual bool KeyFrame() = 0;
58e0e9324cSopenharmony_ci    virtual bool ConfigFrame() = 0;
59e0e9324cSopenharmony_ci    virtual size_t PrefixSize() = 0;
60e0e9324cSopenharmony_ci
61e0e9324cSopenharmony_ci    virtual bool CacheAble()
62e0e9324cSopenharmony_ci    {
63e0e9324cSopenharmony_ci        return true;
64e0e9324cSopenharmony_ci    }
65e0e9324cSopenharmony_ci
66e0e9324cSopenharmony_ci    virtual bool DropAble()
67e0e9324cSopenharmony_ci    {
68e0e9324cSopenharmony_ci        return false;
69e0e9324cSopenharmony_ci    }
70e0e9324cSopenharmony_ci
71e0e9324cSopenharmony_ci    virtual bool DecodeAble()
72e0e9324cSopenharmony_ci    {
73e0e9324cSopenharmony_ci        if (GetTrackType() != TRACK_VIDEO) {
74e0e9324cSopenharmony_ci            return true;
75e0e9324cSopenharmony_ci        }
76e0e9324cSopenharmony_ci
77e0e9324cSopenharmony_ci        return !ConfigFrame();
78e0e9324cSopenharmony_ci    }
79e0e9324cSopenharmony_ci};
80e0e9324cSopenharmony_ci
81e0e9324cSopenharmony_ciclass FrameImpl : public Frame {
82e0e9324cSopenharmony_cipublic:
83e0e9324cSopenharmony_ci    using Ptr = std::shared_ptr<FrameImpl>;
84e0e9324cSopenharmony_ci
85e0e9324cSopenharmony_ci    static std::shared_ptr<FrameImpl> Create()
86e0e9324cSopenharmony_ci    {
87e0e9324cSopenharmony_ci        return std::make_shared<FrameImpl>();
88e0e9324cSopenharmony_ci    }
89e0e9324cSopenharmony_ci
90e0e9324cSopenharmony_ci    explicit FrameImpl(DataBuffer &&dataBuffer) : Frame(std::move(dataBuffer)) {}
91e0e9324cSopenharmony_ci
92e0e9324cSopenharmony_ci    static std::shared_ptr<FrameImpl> CreateFrom(DataBuffer &&dataBuffer)
93e0e9324cSopenharmony_ci    {
94e0e9324cSopenharmony_ci        return std::make_shared<FrameImpl>(std::move(dataBuffer));
95e0e9324cSopenharmony_ci    }
96e0e9324cSopenharmony_ci
97e0e9324cSopenharmony_ci    uint32_t Dts() override
98e0e9324cSopenharmony_ci    {
99e0e9324cSopenharmony_ci        return dts_;
100e0e9324cSopenharmony_ci    }
101e0e9324cSopenharmony_ci
102e0e9324cSopenharmony_ci    uint32_t Pts() override
103e0e9324cSopenharmony_ci    {
104e0e9324cSopenharmony_ci        return pts_ ? pts_ : dts_;
105e0e9324cSopenharmony_ci    }
106e0e9324cSopenharmony_ci
107e0e9324cSopenharmony_ci    size_t PrefixSize() override
108e0e9324cSopenharmony_ci    {
109e0e9324cSopenharmony_ci        return prefixSize_;
110e0e9324cSopenharmony_ci    }
111e0e9324cSopenharmony_ci
112e0e9324cSopenharmony_ci    CodecId GetCodecId() override
113e0e9324cSopenharmony_ci    {
114e0e9324cSopenharmony_ci        return codecId_;
115e0e9324cSopenharmony_ci    }
116e0e9324cSopenharmony_ci
117e0e9324cSopenharmony_ci    bool KeyFrame() override
118e0e9324cSopenharmony_ci    {
119e0e9324cSopenharmony_ci        return false;
120e0e9324cSopenharmony_ci    }
121e0e9324cSopenharmony_ci
122e0e9324cSopenharmony_ci    bool ConfigFrame() override
123e0e9324cSopenharmony_ci    {
124e0e9324cSopenharmony_ci        return false;
125e0e9324cSopenharmony_ci    }
126e0e9324cSopenharmony_ci
127e0e9324cSopenharmony_ci    FrameImpl() = default;
128e0e9324cSopenharmony_ci
129e0e9324cSopenharmony_cipublic:
130e0e9324cSopenharmony_ci    uint32_t dts_ = 0;
131e0e9324cSopenharmony_ci    uint32_t pts_ = 0;
132e0e9324cSopenharmony_ci
133e0e9324cSopenharmony_ci    size_t prefixSize_ = 0;
134e0e9324cSopenharmony_ci    CodecId codecId_ = CODEC_NONE;
135e0e9324cSopenharmony_ci};
136e0e9324cSopenharmony_ci} // namespace Sharing
137e0e9324cSopenharmony_ci} // namespace OHOS
138e0e9324cSopenharmony_ci#endif