• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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