From 55657a6a74c94e98e61f101047bc890502a0572a Mon Sep 17 00:00:00 2001 From: wangxiake Date: Wed, 3 Sep 2025 15:41:50 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=B0=86MPEGPS=E5=8A=A0=E5=85=A5=E5=88=B0A?= =?UTF-8?q?VI=E5=85=BC=E5=AE=B9=E6=96=B9=E6=A1=88=E9=87=8C=20Signed-off-by?= =?UTF-8?q?:=20wangxiake=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/media_engine/filters/demuxer_filter.cpp | 6 +++--- services/media_engine/filters/video_decoder_adapter.cpp | 4 ++-- services/media_engine/modules/demuxer/media_demuxer.cpp | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/services/media_engine/filters/demuxer_filter.cpp b/services/media_engine/filters/demuxer_filter.cpp index da7ec476b..bab4aaf13 100644 --- a/services/media_engine/filters/demuxer_filter.cpp +++ b/services/media_engine/filters/demuxer_filter.cpp @@ -722,9 +722,9 @@ Status DemuxerFilter::LinkNext(const std::shared_ptr &nextFilter, Stream nextFiltersMap_[outType].push_back(nextFilter_); meta->SetData(Tag::REGULAR_TRACK_ID, trackId); - if (fileType == FileType::AVI) { - MEDIA_LOG_I("File type is AVI " PUBLIC_LOG_D32, static_cast(FileType::AVI)); - meta->SetData(Tag::MEDIA_FILE_TYPE, FileType::AVI); + if (fileType == FileType::AVI || fileType == FileType::MPEGPS) { + MEDIA_LOG_I("File type is " PUBLIC_LOG_D32, static_cast(fileType)); + meta->SetData(Tag::MEDIA_FILE_TYPE, fileType); } std::shared_ptr userInfo = demuxer_->GetUserMeta(); std::string enhanceflag; diff --git a/services/media_engine/filters/video_decoder_adapter.cpp b/services/media_engine/filters/video_decoder_adapter.cpp index 63763578e..6cc1fc2f5 100644 --- a/services/media_engine/filters/video_decoder_adapter.cpp +++ b/services/media_engine/filters/video_decoder_adapter.cpp @@ -316,7 +316,7 @@ void VideoDecoderAdapter::AquireAvailableInputBuffer() std::unique_lock lock(mutex_); std::shared_ptr tmpBuffer; if (inputBufferQueueConsumer_->AcquireBuffer(tmpBuffer) == Status::OK) { - if (fileType_ == static_cast(FileType::AVI)) { + if (fileType_ == static_cast(FileType::AVI) || fileType_ == static_cast(FileType::MPEGPS)) { GetInputBufferDts(tmpBuffer); } FALSE_RETURN_MSG(tmpBuffer->meta_ != nullptr, "tmpBuffer is nullptr."); @@ -427,7 +427,7 @@ void VideoDecoderAdapter::OnOutputBufferAvailable(uint32_t index, std::shared_pt MEDIA_LOG_D_SHORT("OnOutputBufferAvailable start. buffer is nullptr, index: %{public}u", index); } FALSE_RETURN_MSG(buffer != nullptr, "buffer is nullptr"); - if (fileType_ == static_cast(FileType::AVI)) { + if (fileType_ == static_cast(FileType::AVI || fileType_ == static_cast(FileType::MPEGPS)) { SetOutputBufferPts(buffer); } FALSE_RETURN_MSG(callback_ != nullptr, "callback_ is nullptr"); diff --git a/services/media_engine/modules/demuxer/media_demuxer.cpp b/services/media_engine/modules/demuxer/media_demuxer.cpp index 14ba64a8a..2a0eaaf9e 100644 --- a/services/media_engine/modules/demuxer/media_demuxer.cpp +++ b/services/media_engine/modules/demuxer/media_demuxer.cpp @@ -2515,7 +2515,7 @@ Status MediaDemuxer::HandleReadSample(int32_t trackId) lastVideoPts_ = trackId == videoTrackId_ ? bufferMap_[trackId]->pts_ : lastVideoPts_; lastAudioPtsInMute_ = trackId == audioTrackId_ ? bufferMap_[trackId]->pts_ : lastAudioPtsInMute_; bool isDroppable = IsBufferDroppable(bufferMap_[trackId], trackId); - if (fileType_ == FileType::AVI && trackId == videoTrackId_) { + if ((fileType_ == FileType::AVI || fileType_ == FileType::MPEGPS) && trackId == videoTrackId_) { SetOutputBufferPts(bufferMap_[trackId]); } FALSE_GOON_NOEXEC(isTranscoderMode_, TranscoderUpdateOutputBufferPts(trackId, bufferMap_[trackId])); -- Gitee From 18af3c4fa13ec27c952002dc1ff3ed686b3315e6 Mon Sep 17 00:00:00 2001 From: wangxiake Date: Wed, 3 Sep 2025 16:20:35 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=A2=9E=E5=8A=A0mpegps=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=20Signed-off-by:=20wangxiake=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/media_engine/filters/video_decoder_adapter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/media_engine/filters/video_decoder_adapter.cpp b/services/media_engine/filters/video_decoder_adapter.cpp index 6cc1fc2f5..713182ee5 100644 --- a/services/media_engine/filters/video_decoder_adapter.cpp +++ b/services/media_engine/filters/video_decoder_adapter.cpp @@ -427,7 +427,7 @@ void VideoDecoderAdapter::OnOutputBufferAvailable(uint32_t index, std::shared_pt MEDIA_LOG_D_SHORT("OnOutputBufferAvailable start. buffer is nullptr, index: %{public}u", index); } FALSE_RETURN_MSG(buffer != nullptr, "buffer is nullptr"); - if (fileType_ == static_cast(FileType::AVI || fileType_ == static_cast(FileType::MPEGPS)) { + if (fileType_ == static_cast(FileType::AVI) || fileType_ == static_cast(FileType::MPEGPS)) { SetOutputBufferPts(buffer); } FALSE_RETURN_MSG(callback_ != nullptr, "callback_ is nullptr"); -- Gitee From 4b23245e3959d17ef748594f5f749dcb0cc497ea Mon Sep 17 00:00:00 2001 From: wxkkk Date: Fri, 5 Sep 2025 01:33:49 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=88=9B=E5=BB=BA=E5=AE=B9=E5=99=A8?= =?UTF-8?q?=E5=85=BC=E5=AE=B9=E5=A4=9A=E7=A7=8D=E6=96=87=E4=BB=B6=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wxkkk --- services/media_engine/filters/demuxer_filter.cpp | 7 ++++++- .../media_engine/filters/video_decoder_adapter.cpp | 9 +++++++-- .../media_engine/modules/demuxer/media_demuxer.cpp | 8 +++++++- .../ffmpeg_adapter/demuxer/ffmpeg_format_helper.cpp | 11 +++++++++++ .../ffmpeg_adapter/demuxer/ffmpeg_format_helper.h | 1 + 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/services/media_engine/filters/demuxer_filter.cpp b/services/media_engine/filters/demuxer_filter.cpp index bab4aaf13..2b35cf680 100644 --- a/services/media_engine/filters/demuxer_filter.cpp +++ b/services/media_engine/filters/demuxer_filter.cpp @@ -39,6 +39,11 @@ namespace Pipeline { using namespace MediaAVCodec; using MediaType = OHOS::Media::Plugins::MediaType; using FileType = OHOS::Media::Plugins::FileType; + +namespace OHOS::Media::Plugins::Ffmpeg { + bool IsSpecialFileType(FileType filetype); +} // namespace OHOS::Media::Plugins::Ffmpeg + namespace { const std::string MIME_IMAGE = "image"; const uint32_t DEFAULT_CACHE_LIMIT = 50 * 1024 * 1024; // 50M @@ -722,7 +727,7 @@ Status DemuxerFilter::LinkNext(const std::shared_ptr &nextFilter, Stream nextFiltersMap_[outType].push_back(nextFilter_); meta->SetData(Tag::REGULAR_TRACK_ID, trackId); - if (fileType == FileType::AVI || fileType == FileType::MPEGPS) { + if (IsSpecialFileType(fileType)) { MEDIA_LOG_I("File type is " PUBLIC_LOG_D32, static_cast(fileType)); meta->SetData(Tag::MEDIA_FILE_TYPE, fileType); } diff --git a/services/media_engine/filters/video_decoder_adapter.cpp b/services/media_engine/filters/video_decoder_adapter.cpp index 713182ee5..575fcfca6 100644 --- a/services/media_engine/filters/video_decoder_adapter.cpp +++ b/services/media_engine/filters/video_decoder_adapter.cpp @@ -41,6 +41,11 @@ namespace OHOS { namespace Media { using namespace MediaAVCodec; using FileType = OHOS::Media::Plugins::FileType; + +namespace OHOS::Media::Plugins::Ffmpeg { + bool IsSpecialFileType(FileType filetype); +} // namespace OHOS::Media::Plugins::Ffmpeg + const std::string VIDEO_INPUT_BUFFER_QUEUE_NAME = "VideoDecoderInputBufferQueue"; constexpr uint64_t DECODER_USAGE = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA | BUFFER_USAGE_VIDEO_DECODER; @@ -316,7 +321,7 @@ void VideoDecoderAdapter::AquireAvailableInputBuffer() std::unique_lock lock(mutex_); std::shared_ptr tmpBuffer; if (inputBufferQueueConsumer_->AcquireBuffer(tmpBuffer) == Status::OK) { - if (fileType_ == static_cast(FileType::AVI) || fileType_ == static_cast(FileType::MPEGPS)) { + if (IsSpecialFileType(static_cast(fileType_))) { GetInputBufferDts(tmpBuffer); } FALSE_RETURN_MSG(tmpBuffer->meta_ != nullptr, "tmpBuffer is nullptr."); @@ -427,7 +432,7 @@ void VideoDecoderAdapter::OnOutputBufferAvailable(uint32_t index, std::shared_pt MEDIA_LOG_D_SHORT("OnOutputBufferAvailable start. buffer is nullptr, index: %{public}u", index); } FALSE_RETURN_MSG(buffer != nullptr, "buffer is nullptr"); - if (fileType_ == static_cast(FileType::AVI) || fileType_ == static_cast(FileType::MPEGPS)) { + if (IsSpecialFileType(static_cast(fileType_))) { SetOutputBufferPts(buffer); } FALSE_RETURN_MSG(callback_ != nullptr, "callback_ is nullptr"); diff --git a/services/media_engine/modules/demuxer/media_demuxer.cpp b/services/media_engine/modules/demuxer/media_demuxer.cpp index 2a0eaaf9e..821b4a814 100644 --- a/services/media_engine/modules/demuxer/media_demuxer.cpp +++ b/services/media_engine/modules/demuxer/media_demuxer.cpp @@ -74,6 +74,12 @@ std::map TRACK_TO_STREAM_MAP = namespace OHOS { namespace Media { + +namespace OHOS::Media::Plugins::Ffmpeg { + bool IsSpecialFileType(FileType filetype); +} // namespace OHOS::Media::Plugins::Ffmpeg + + constexpr uint32_t REQUEST_BUFFER_TIMEOUT = 0; // Requesting buffer overtimes 0ms means no retry constexpr int32_t START = 1; constexpr int32_t PAUSE = 2; @@ -2515,7 +2521,7 @@ Status MediaDemuxer::HandleReadSample(int32_t trackId) lastVideoPts_ = trackId == videoTrackId_ ? bufferMap_[trackId]->pts_ : lastVideoPts_; lastAudioPtsInMute_ = trackId == audioTrackId_ ? bufferMap_[trackId]->pts_ : lastAudioPtsInMute_; bool isDroppable = IsBufferDroppable(bufferMap_[trackId], trackId); - if ((fileType_ == FileType::AVI || fileType_ == FileType::MPEGPS) && trackId == videoTrackId_) { + if (IsSpecialFileType(fileType_) && trackId == videoTrackId_) { SetOutputBufferPts(bufferMap_[trackId]); } FALSE_GOON_NOEXEC(isTranscoderMode_, TranscoderUpdateOutputBufferPts(trackId, bufferMap_[trackId])); diff --git a/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.cpp b/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.cpp index bf9c52f09..b2ddadfe6 100644 --- a/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.cpp +++ b/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include "ffmpeg_converter.h" #include "meta/meta_key.h" #include "meta/media_types.h" @@ -159,6 +160,11 @@ static std::map g_convertFfmpegFileType = { #endif }; +static std::unordered_set g_specialFileTypes = { + FileType::AVI, + FileType::MPEGPS +}; + static std::map g_formatToString = { {"title", Tag::MEDIA_TITLE}, {"artist", Tag::MEDIA_ARTIST}, @@ -1304,6 +1310,11 @@ bool FFmpegFormatHelper::IsValidCodecId(const AVCodecID &codecId) { return (g_codecIdToMime.count(codecId) > 0) || (IsPCMStream(codecId)); } + +bool FFmpegFormatHelper::IsSpecialFileType(FileType filetype) +{ + return g_specialFileTypes.find(filetype) != g_specialFileTypes.end(); +} } // namespace Ffmpeg } // namespace Plugins } // namespace Media diff --git a/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.h b/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.h index 82271bca0..1aea90b5f 100644 --- a/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.h +++ b/services/media_engine/plugins/ffmpeg_adapter/demuxer/ffmpeg_format_helper.h @@ -74,6 +74,7 @@ public: static bool IsAudioType(const AVStream &avStream); static bool IsMpeg4File(FileType filetype); static bool IsValidCodecId(const AVCodecID &codecId); + static bool IsSpecialFileType(FileType filetype); private: FFmpegFormatHelper() = delete; ~FFmpegFormatHelper() = delete; -- Gitee From 77388cda4308ed00471cd0e072f6dd6e76dedc3d Mon Sep 17 00:00:00 2001 From: wxkkk Date: Fri, 5 Sep 2025 01:58:07 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=94=B9=E5=8F=98=E5=91=BD=E5=90=8D?= =?UTF-8?q?=E7=A9=BA=E9=97=B4=E5=86=99=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wxkkk --- services/media_engine/filters/demuxer_filter.cpp | 9 ++++----- .../media_engine/filters/video_decoder_adapter.cpp | 9 ++++----- .../media_engine/modules/demuxer/media_demuxer.cpp | 10 ++++------ 3 files changed, 12 insertions(+), 16 deletions(-) diff --git a/services/media_engine/filters/demuxer_filter.cpp b/services/media_engine/filters/demuxer_filter.cpp index 2b35cf680..b40ee49c4 100644 --- a/services/media_engine/filters/demuxer_filter.cpp +++ b/services/media_engine/filters/demuxer_filter.cpp @@ -39,11 +39,6 @@ namespace Pipeline { using namespace MediaAVCodec; using MediaType = OHOS::Media::Plugins::MediaType; using FileType = OHOS::Media::Plugins::FileType; - -namespace OHOS::Media::Plugins::Ffmpeg { - bool IsSpecialFileType(FileType filetype); -} // namespace OHOS::Media::Plugins::Ffmpeg - namespace { const std::string MIME_IMAGE = "image"; const uint32_t DEFAULT_CACHE_LIMIT = 50 * 1024 * 1024; // 50M @@ -64,6 +59,10 @@ static std::map g_sampleFormatBeToLe = { {AudioSampleFormat::SAMPLE_F64BE, AudioSampleFormat::SAMPLE_F32LE}, }; +namespace Plugins::Ffmpeg { + bool IsSpecialFileType(FileType filetype); +} // namespace OHOS::Media::Plugins::Ffmpeg + class DemuxerFilterLinkCallback : public FilterLinkCallback { public: explicit DemuxerFilterLinkCallback(std::shared_ptr demuxerFilter) diff --git a/services/media_engine/filters/video_decoder_adapter.cpp b/services/media_engine/filters/video_decoder_adapter.cpp index 575fcfca6..5e0c03438 100644 --- a/services/media_engine/filters/video_decoder_adapter.cpp +++ b/services/media_engine/filters/video_decoder_adapter.cpp @@ -41,16 +41,15 @@ namespace OHOS { namespace Media { using namespace MediaAVCodec; using FileType = OHOS::Media::Plugins::FileType; - -namespace OHOS::Media::Plugins::Ffmpeg { - bool IsSpecialFileType(FileType filetype); -} // namespace OHOS::Media::Plugins::Ffmpeg - const std::string VIDEO_INPUT_BUFFER_QUEUE_NAME = "VideoDecoderInputBufferQueue"; constexpr uint64_t DECODER_USAGE = BUFFER_USAGE_CPU_READ | BUFFER_USAGE_CPU_WRITE | BUFFER_USAGE_MEM_DMA | BUFFER_USAGE_VIDEO_DECODER; static const int64_t CODEC_START_WARNING_MS = 50; +namespace Plugins::Ffmpeg { + bool IsSpecialFileType(FileType filetype); +} // namespace OHOS::Media::Plugins::Ffmpeg + VideoDecoderCallback::VideoDecoderCallback(std::shared_ptr videoDecoder) { MEDIA_LOG_D_SHORT("VideoDecoderCallback instances create."); diff --git a/services/media_engine/modules/demuxer/media_demuxer.cpp b/services/media_engine/modules/demuxer/media_demuxer.cpp index 821b4a814..729339cde 100644 --- a/services/media_engine/modules/demuxer/media_demuxer.cpp +++ b/services/media_engine/modules/demuxer/media_demuxer.cpp @@ -74,12 +74,6 @@ std::map TRACK_TO_STREAM_MAP = namespace OHOS { namespace Media { - -namespace OHOS::Media::Plugins::Ffmpeg { - bool IsSpecialFileType(FileType filetype); -} // namespace OHOS::Media::Plugins::Ffmpeg - - constexpr uint32_t REQUEST_BUFFER_TIMEOUT = 0; // Requesting buffer overtimes 0ms means no retry constexpr int32_t START = 1; constexpr int32_t PAUSE = 2; @@ -130,6 +124,10 @@ enum SceneCode : int32_t { */ AV_META_SCENE_PARSE_REF_FOR_DRAGGING_PLAY = 3 // scene code of parser ref for dragging play is 3 }; + +namespace Plugins::Ffmpeg { + bool IsSpecialFileType(FileType filetype); +} // namespace OHOS::Media::Plugins::Ffmpeg class MediaDemuxer::AVBufferQueueProducerListener : public IRemoteStub { public: -- Gitee