diff --git a/services/media_engine/filters/demuxer_filter.cpp b/services/media_engine/filters/demuxer_filter.cpp index da7ec476bed3947093984d0c6d5f2bf7c67f744e..b40ee49c4b0894d843b4c1359d1cb68d1f683e81 100644 --- a/services/media_engine/filters/demuxer_filter.cpp +++ b/services/media_engine/filters/demuxer_filter.cpp @@ -59,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) @@ -722,9 +726,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 (IsSpecialFileType(fileType)) { + 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 63763578e51112db83d0eb59706f0bce5b5217a1..5e0c03438a1dda8ffb4b01c44414d17894f2bf25 100644 --- a/services/media_engine/filters/video_decoder_adapter.cpp +++ b/services/media_engine/filters/video_decoder_adapter.cpp @@ -46,6 +46,10 @@ 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."); @@ -316,7 +320,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 (IsSpecialFileType(static_cast(fileType_))) { GetInputBufferDts(tmpBuffer); } FALSE_RETURN_MSG(tmpBuffer->meta_ != nullptr, "tmpBuffer is nullptr."); @@ -427,7 +431,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 (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 14ba64a8aa65b07b3793da97fd1de1066e1bd6c3..729339cde351e409cf8e1f151f35b2565c6ad711 100644 --- a/services/media_engine/modules/demuxer/media_demuxer.cpp +++ b/services/media_engine/modules/demuxer/media_demuxer.cpp @@ -124,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: @@ -2515,7 +2519,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 (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 bf9c52f098a380f48122081f36a3db436e6cd686..b2ddadfe6eec7b7ee8298cb407e6cf8d63de3638 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 82271bca0552eee42045682d845618a3f10636b7..1aea90b5fbdc1610a148735933611a2b2633e489 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;