• 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_SHORT("BaseStreamDemuxer called");
47     seekable_ = Plugins::Seekable::UNSEEKABLE;
48 }
49 
~BaseStreamDemuxer()50 BaseStreamDemuxer::~BaseStreamDemuxer()
51 {
52     MEDIA_LOG_D_SHORT("~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_SHORT("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     MEDIA_LOG_I("mediaDataSize_: " PUBLIC_LOG_U64 ", seekable_: " PUBLIC_LOG_D32 ", source_->GetSourceType(): "
63         PUBLIC_LOG_D32 ", isDataSrcNoSeek_: " PUBLIC_LOG_D32, mediaDataSize_, seekable_, sourceType_, isDataSrcNoSeek_);
64 }
65 
GetIsDataSrcNoSeek()66 bool BaseStreamDemuxer::GetIsDataSrcNoSeek()
67 {
68     return isDataSrcNoSeek_;
69 }
70 
SetSourceType(SourceType type)71 void BaseStreamDemuxer::SetSourceType(SourceType type)
72 {
73     sourceType_ = type;
74 }
75 
SnifferMediaType(int32_t streamID)76 std::string BaseStreamDemuxer::SnifferMediaType(int32_t streamID)
77 {
78     MediaAVCodec::AVCodecTrace trace("BaseStreamDemuxer::SnifferMediaType");
79     MEDIA_LOG_I_SHORT("BaseStreamDemuxer::SnifferMediaType called");
80     typeFinder_ = std::make_shared<TypeFinder>();
81     typeFinder_->Init(uri_, mediaDataSize_, checkRange_, peekRange_, streamID);
82     std::string type = typeFinder_->FindMediaType();
83     std::unique_lock<std::mutex> lock(typeFinderMutex_);
84     typeFinder_ = nullptr;
85     MEDIA_LOG_D_SHORT("SnifferMediaType result type: " PUBLIC_LOG_S, type.c_str());
86     return type;
87 }
88 
SetDemuxerState(int32_t streamId,DemuxerState state)89 void BaseStreamDemuxer::SetDemuxerState(int32_t streamId, DemuxerState state)
90 {
91     pluginStateMap_[streamId] = state;
92     if ((IsDash() || streamId == 0) && state == DemuxerState::DEMUXER_STATE_PARSE_FRAME) {
93         source_->SetDemuxerState(streamId);
94     }
95 }
96 
SetBundleName(const std::string & bundleName)97 void BaseStreamDemuxer::SetBundleName(const std::string& bundleName)
98 {
99     MEDIA_LOG_I_SHORT("SetBundleName bundleName: " PUBLIC_LOG_S, bundleName.c_str());
100     bundleName_ = bundleName;
101 }
102 
SetInterruptState(bool isInterruptNeeded)103 void BaseStreamDemuxer::SetInterruptState(bool isInterruptNeeded)
104 {
105     MEDIA_LOG_D("BaseStreamDemuxer onInterrupted %{public}d", isInterruptNeeded);
106     isInterruptNeeded_ = isInterruptNeeded;
107     TypeFinderInterrupt(isInterruptNeeded);
108 }
109 
TypeFinderInterrupt(bool isInterruptNeeded)110 void BaseStreamDemuxer::TypeFinderInterrupt(bool isInterruptNeeded)
111 {
112     std::unique_lock<std::mutex> lock(typeFinderMutex_);
113     if (typeFinder_ != nullptr) {
114         typeFinder_->SetInterruptState(isInterruptNeeded);
115     }
116 }
117 
SetIsIgnoreParse(bool state)118 void BaseStreamDemuxer::SetIsIgnoreParse(bool state)
119 {
120     return isIgnoreParse_.store(state);
121 }
122 
GetIsIgnoreParse()123 bool BaseStreamDemuxer::GetIsIgnoreParse()
124 {
125     return isIgnoreParse_.load();
126 }
127 
GetSeekable()128 Plugins::Seekable BaseStreamDemuxer::GetSeekable()
129 {
130     return source_->GetSeekable();
131 }
132 
IsDash() const133 bool BaseStreamDemuxer::IsDash() const
134 {
135     return isDash_;
136 }
SetIsDash(bool flag)137 void BaseStreamDemuxer::SetIsDash(bool flag)
138 {
139     isDash_ = flag;
140 }
141 
SetNewVideoStreamID(int32_t streamID)142 Status BaseStreamDemuxer::SetNewVideoStreamID(int32_t streamID)
143 {
144     MEDIA_LOG_I_SHORT("SetNewVideoStreamID id: " PUBLIC_LOG_D32, streamID);
145     SetChangeFlag(false);
146     newVideoStreamID_.store(streamID);
147     return Status::OK;
148 }
149 
SetNewAudioStreamID(int32_t streamID)150 Status BaseStreamDemuxer::SetNewAudioStreamID(int32_t streamID)
151 {
152     MEDIA_LOG_I("SetNewAudioStreamID id: " PUBLIC_LOG_D32, streamID);
153     SetChangeFlag(false);
154     newAudioStreamID_.store(streamID);
155     return Status::OK;
156 }
157 
SetNewSubtitleStreamID(int32_t streamID)158 Status BaseStreamDemuxer::SetNewSubtitleStreamID(int32_t streamID)
159 {
160     MEDIA_LOG_I("SetNewSubtitleStreamID id: " PUBLIC_LOG_D32, streamID);
161     SetChangeFlag(false);
162     newSubtitleStreamID_.store(streamID);
163     return Status::OK;
164 }
165 
GetNewVideoStreamID()166 int32_t BaseStreamDemuxer::GetNewVideoStreamID()
167 {
168     return newVideoStreamID_.load();
169 }
170 
GetNewAudioStreamID()171 int32_t BaseStreamDemuxer::GetNewAudioStreamID()
172 {
173     return newAudioStreamID_.load();
174 }
175 
GetNewSubtitleStreamID()176 int32_t BaseStreamDemuxer::GetNewSubtitleStreamID()
177 {
178     return newSubtitleStreamID_.load();
179 }
180 
CanDoChangeStream()181 bool BaseStreamDemuxer::CanDoChangeStream()
182 {
183     return changeStreamFlag_.load();
184 }
185 
SetChangeFlag(bool flag)186 void BaseStreamDemuxer::SetChangeFlag(bool flag)
187 {
188     return changeStreamFlag_.store(flag);
189 }
190 
SetSourceInitialBufferSize(int32_t offset,int32_t size)191 bool BaseStreamDemuxer::SetSourceInitialBufferSize(int32_t offset, int32_t size)
192 {
193     return source_->SetInitialBufferSize(offset, size);
194 }
195 } // namespace Media
196 } // namespace OHOS
197