1 /*
2 * Copyright (c) 2023-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 #define HST_LOG_TAG "BaseStreamDemuxer"
17
18 #include "base_stream_demuxer.h"
19
20 #include <algorithm>
21 #include <map>
22 #include <memory>
23
24 #include "avcodec_common.h"
25 #include "avcodec_trace.h"
26 #include "cpp_ext/type_traits_ext.h"
27 #include "buffer/avallocator.h"
28 #include "common/event.h"
29 #include "common/log.h"
30 #include "meta/media_types.h"
31 #include "meta/meta.h"
32 #include "osal/utils/dump_buffer.h"
33 #include "plugin/plugin_buffer.h"
34 #include "plugin/plugin_info.h"
35 #include "plugin/plugin_time.h"
36
37 namespace {
38 constexpr OHOS::HiviewDFX::HiLogLabel LABEL = { LOG_CORE, LOG_DOMAIN_SYSTEM_PLAYER, "BaseStreamDemuxer" };
39 }
40
41 namespace OHOS {
42 namespace Media {
43
BaseStreamDemuxer()44 BaseStreamDemuxer::BaseStreamDemuxer()
45 {
46 MEDIA_LOG_D("BaseStreamDemuxer called");
47 seekable_ = Plugins::Seekable::UNSEEKABLE;
48 }
49
~BaseStreamDemuxer()50 BaseStreamDemuxer::~BaseStreamDemuxer()
51 {
52 MEDIA_LOG_D("~BaseStreamDemuxer called");
53 }
54
SetSource(const std::shared_ptr<Source> & source)55 void BaseStreamDemuxer::SetSource(const std::shared_ptr<Source>& source)
56 {
57 MEDIA_LOG_D("BaseStreamDemuxer::SetSource");
58 source_ = source;
59 source_->GetSize(mediaDataSize_);
60 seekable_ = source_->GetSeekable();
61 isDataSrcNoSeek_ = (seekable_ == Plugins::Seekable::UNSEEKABLE && sourceType_ == SourceType::SOURCE_TYPE_STREAM);
62 isDataSrc_ = sourceType_ == SourceType::SOURCE_TYPE_STREAM;
63 MEDIA_LOG_I("mediaDataSize_: " PUBLIC_LOG_U64 ", seekable_: " PUBLIC_LOG_D32 ", source_->GetSourceType(): "
64 PUBLIC_LOG_D32 ", isDataSrcNoSeek_: " PUBLIC_LOG_D32, mediaDataSize_, seekable_, sourceType_, isDataSrcNoSeek_);
65 }
66
GetIsDataSrcNoSeek()67 bool BaseStreamDemuxer::GetIsDataSrcNoSeek()
68 {
69 return isDataSrcNoSeek_;
70 }
71
SetSourceType(SourceType type)72 void BaseStreamDemuxer::SetSourceType(SourceType type)
73 {
74 sourceType_ = type;
75 }
76
SnifferMediaType(int32_t streamID)77 std::string BaseStreamDemuxer::SnifferMediaType(int32_t streamID)
78 {
79 MediaAVCodec::AVCodecTrace trace("BaseStreamDemuxer::SnifferMediaType");
80 MEDIA_LOG_D("BaseStreamDemuxer::SnifferMediaType called");
81 typeFinder_ = std::make_shared<TypeFinder>();
82 typeFinder_->Init(uri_, mediaDataSize_, checkRange_, peekRange_, streamID);
83 std::string type = typeFinder_->FindMediaType();
84 std::unique_lock<std::mutex> lock(typeFinderMutex_);
85 typeFinder_ = nullptr;
86 MEDIA_LOG_D("SnifferMediaType result type: " PUBLIC_LOG_S, type.c_str());
87 return type;
88 }
89
SetDemuxerState(int32_t streamId,DemuxerState state)90 void BaseStreamDemuxer::SetDemuxerState(int32_t streamId, DemuxerState state)
91 {
92 pluginStateMap_[streamId] = state;
93 if ((IsDash() || streamId == 0) && state == DemuxerState::DEMUXER_STATE_PARSE_FRAME) {
94 source_->SetDemuxerState(streamId);
95 }
96 }
97
SetBundleName(const std::string & bundleName)98 void BaseStreamDemuxer::SetBundleName(const std::string& bundleName)
99 {
100 MEDIA_LOG_I_SHORT("SetBundleName bundleName: " PUBLIC_LOG_S, bundleName.c_str());
101 bundleName_ = bundleName;
102 }
103
SetInterruptState(bool isInterruptNeeded)104 void BaseStreamDemuxer::SetInterruptState(bool isInterruptNeeded)
105 {
106 MEDIA_LOG_D("BaseStreamDemuxer onInterrupted %{public}d", isInterruptNeeded);
107 isInterruptNeeded_ = isInterruptNeeded;
108 TypeFinderInterrupt(isInterruptNeeded);
109 }
110
TypeFinderInterrupt(bool isInterruptNeeded)111 void BaseStreamDemuxer::TypeFinderInterrupt(bool isInterruptNeeded)
112 {
113 std::unique_lock<std::mutex> lock(typeFinderMutex_);
114 if (typeFinder_ != nullptr) {
115 typeFinder_->SetInterruptState(isInterruptNeeded);
116 }
117 }
118
SetIsIgnoreParse(bool state)119 void BaseStreamDemuxer::SetIsIgnoreParse(bool state)
120 {
121 return isIgnoreParse_.store(state);
122 }
123
GetIsIgnoreParse()124 bool BaseStreamDemuxer::GetIsIgnoreParse()
125 {
126 return isIgnoreParse_.load();
127 }
128
GetSeekable()129 Plugins::Seekable BaseStreamDemuxer::GetSeekable()
130 {
131 return source_->GetSeekable();
132 }
133
IsDash() const134 bool BaseStreamDemuxer::IsDash() const
135 {
136 return isDash_;
137 }
SetIsDash(bool flag)138 void BaseStreamDemuxer::SetIsDash(bool flag)
139 {
140 isDash_ = flag;
141 }
142
SetNewVideoStreamID(int32_t streamID)143 Status BaseStreamDemuxer::SetNewVideoStreamID(int32_t streamID)
144 {
145 MEDIA_LOG_I_SHORT("SetNewVideoStreamID id: " PUBLIC_LOG_D32, streamID);
146 SetChangeFlag(false);
147 newVideoStreamID_.store(streamID);
148 return Status::OK;
149 }
150
SetNewAudioStreamID(int32_t streamID)151 Status BaseStreamDemuxer::SetNewAudioStreamID(int32_t streamID)
152 {
153 MEDIA_LOG_D_SHORT("SetNewAudioStreamID id: " PUBLIC_LOG_D32, streamID);
154 SetChangeFlag(false);
155 newAudioStreamID_.store(streamID);
156 return Status::OK;
157 }
158
SetNewSubtitleStreamID(int32_t streamID)159 Status BaseStreamDemuxer::SetNewSubtitleStreamID(int32_t streamID)
160 {
161 MEDIA_LOG_I("SetNewSubtitleStreamID id: " PUBLIC_LOG_D32, streamID);
162 SetChangeFlag(false);
163 newSubtitleStreamID_.store(streamID);
164 return Status::OK;
165 }
166
GetNewVideoStreamID()167 int32_t BaseStreamDemuxer::GetNewVideoStreamID()
168 {
169 return newVideoStreamID_.load();
170 }
171
GetNewAudioStreamID()172 int32_t BaseStreamDemuxer::GetNewAudioStreamID()
173 {
174 return newAudioStreamID_.load();
175 }
176
GetNewSubtitleStreamID()177 int32_t BaseStreamDemuxer::GetNewSubtitleStreamID()
178 {
179 return newSubtitleStreamID_.load();
180 }
181
CanDoChangeStream()182 bool BaseStreamDemuxer::CanDoChangeStream()
183 {
184 return changeStreamFlag_.load();
185 }
186
SetChangeFlag(bool flag)187 void BaseStreamDemuxer::SetChangeFlag(bool flag)
188 {
189 return changeStreamFlag_.store(flag);
190 }
191
SetSourceInitialBufferSize(int32_t offset,int32_t size)192 bool BaseStreamDemuxer::SetSourceInitialBufferSize(int32_t offset, int32_t size)
193 {
194 return source_->SetInitialBufferSize(offset, size);
195 }
196 } // namespace Media
197 } // namespace OHOS
198