1/*
2 * Copyright (c) 2023 Shenzhen Kaihong Digital Industry Development 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#ifndef OHOS_SHARING_FRAME_H
17#define OHOS_SHARING_FRAME_H
18
19#include <list>
20#include <map>
21#include <memory>
22#include <mutex>
23#include <string>
24#include "common/const_def.h"
25#include "utils/data_buffer.h"
26
27namespace OHOS {
28namespace Sharing {
29class CodecInfo {
30public:
31    using Ptr = std::shared_ptr<CodecInfo>;
32
33    CodecInfo() = default;
34    virtual ~CodecInfo() = default;
35
36    TrackType GetTrackType();
37    virtual CodecId GetCodecId() = 0;
38};
39
40class Frame : public DataBuffer,
41              public CodecInfo {
42public:
43    using Ptr = std::shared_ptr<Frame>;
44
45    Frame() = default;
46    explicit Frame(DataBuffer &&dataBuffer) : DataBuffer(std::move(dataBuffer)) {}
47
48    ~Frame() override {};
49
50    virtual uint32_t Dts() = 0;
51
52    virtual uint32_t Pts()
53    {
54        return Dts();
55    }
56
57    virtual bool KeyFrame() = 0;
58    virtual bool ConfigFrame() = 0;
59    virtual size_t PrefixSize() = 0;
60
61    virtual bool CacheAble()
62    {
63        return true;
64    }
65
66    virtual bool DropAble()
67    {
68        return false;
69    }
70
71    virtual bool DecodeAble()
72    {
73        if (GetTrackType() != TRACK_VIDEO) {
74            return true;
75        }
76
77        return !ConfigFrame();
78    }
79};
80
81class FrameImpl : public Frame {
82public:
83    using Ptr = std::shared_ptr<FrameImpl>;
84
85    static std::shared_ptr<FrameImpl> Create()
86    {
87        return std::make_shared<FrameImpl>();
88    }
89
90    explicit FrameImpl(DataBuffer &&dataBuffer) : Frame(std::move(dataBuffer)) {}
91
92    static std::shared_ptr<FrameImpl> CreateFrom(DataBuffer &&dataBuffer)
93    {
94        return std::make_shared<FrameImpl>(std::move(dataBuffer));
95    }
96
97    uint32_t Dts() override
98    {
99        return dts_;
100    }
101
102    uint32_t Pts() override
103    {
104        return pts_ ? pts_ : dts_;
105    }
106
107    size_t PrefixSize() override
108    {
109        return prefixSize_;
110    }
111
112    CodecId GetCodecId() override
113    {
114        return codecId_;
115    }
116
117    bool KeyFrame() override
118    {
119        return false;
120    }
121
122    bool ConfigFrame() override
123    {
124        return false;
125    }
126
127    FrameImpl() = default;
128
129public:
130    uint32_t dts_ = 0;
131    uint32_t pts_ = 0;
132
133    size_t prefixSize_ = 0;
134    CodecId codecId_ = CODEC_NONE;
135};
136} // namespace Sharing
137} // namespace OHOS
138#endif