Skip to content

Commit

Permalink
MpegSplitter - добавлена специальная обработка дополнительной, второй…
Browse files Browse the repository at this point in the history
…, видео-дорожки HEVC Dolby Vision. В результате на выходе будет 1 видео-дорожка но уже с Dolby Vision RPU данными.
  • Loading branch information
Aleksoid1978 committed Jun 28, 2024
1 parent 641eddc commit d34637d
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 6 deletions.
40 changes: 36 additions & 4 deletions src/filters/parser/MpegSplitter/MpegSplitter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -741,6 +741,29 @@ HRESULT CMpegSplitterFilter::DeliverPacket(std::unique_ptr<CPacket> p)
return __super::DeliverPacket(std::move(p));
}

return S_OK;
} else if (m_bHandleDVStream) {
if (TrackNumber == m_dwMasterDVTrackNumber) {
m_MasterDVStreamPacket = std::move(p);
} else if (TrackNumber == m_dwSecondaryDVTrackNumber && m_MasterDVStreamPacket) {
if (p->rtStart == m_MasterDVStreamPacket->rtStart) {
CH265Nalu Nalu;
Nalu.SetBuffer(p->data(), p->size());
while (Nalu.ReadNext()) {
auto nalu_type = Nalu.GetType();
if (nalu_type == NALU_TYPE_HEVC_UNSPEC62) {
// Dolby Vision RPU
// TODO - check for NALU_TYPE_HEVC_EOSEQ
m_MasterDVStreamPacket->AppendData(Nalu.GetNALBuffer(), Nalu.GetLength());
}
}

return __super::DeliverPacket(std::move(m_MasterDVStreamPacket));
}
} else {
return __super::DeliverPacket(std::move(p));
}

return S_OK;
}

Expand Down Expand Up @@ -860,7 +883,7 @@ HRESULT CMpegSplitterFilter::DemuxNextPacket(const REFERENCE_TIME rtStartOffset)

if (h.payload && ISVALIDPID(h.pid)) {
const DWORD TrackNumber = h.pid;
if (GetOutputPin(TrackNumber) || TrackNumber == m_dwMVCExtensionTrackNumber) {
if (GetOutputPin(TrackNumber) || TrackNumber == m_dwMVCExtensionTrackNumber || TrackNumber == m_dwSecondaryDVTrackNumber) {
const __int64 pos = m_pFile->GetPos();
CMpegSplitterFile::peshdr peshdr;
if (h.payloadstart
Expand Down Expand Up @@ -1034,14 +1057,16 @@ void CMpegSplitterFilter::HandleStream(CMpegSplitterFile::stream& s, CString fNa
if (SUCCEEDED(CreateAVCfromH264(&mt))) {
s.mts.push_back(mt);
}
}

if (mt.subtype == MEDIASUBTYPE_AMVC) {
} else if (mt.subtype == MEDIASUBTYPE_AMVC) {
s.mts.push_back(mt);
s.mt.subtype = MEDIASUBTYPE_H264;
if (SUCCEEDED(CreateAVCfromH264(&mt))) {
s.mts.push_back(mt);
}
} else if (s.codec == CMpegSplitterFile::stream_codec::HEVC_DV_SECONDARY) {
m_bHandleDVStream = TRUE;
m_dwMasterDVTrackNumber = m_pFile->m_streams[CMpegSplitterFile::stream_type::video].front();
m_dwSecondaryDVTrackNumber = s;
}

s.mts.push_back(s.mt);
Expand Down Expand Up @@ -1257,6 +1282,13 @@ HRESULT CMpegSplitterFilter::CreateOutputs(IAsyncReader* pAsyncReader)
}
}

auto& streams = m_pFile->m_streams[CMpegSplitterFile::stream_type::video];
if (streams.size() == 2 && streams.back().codec == CMpegSplitterFile::stream_codec::HEVC_DV_SECONDARY) {
// Remove Dolby Vision stream from streams list
auto it = streams.begin(); ++it;
streams.erase(it);
}

for (int type = CMpegSplitterFile::stream_type::video; type <= CMpegSplitterFile::stream_type::subpic; type++) {
int stream_idx = 0;

Expand Down
5 changes: 5 additions & 0 deletions src/filters/parser/MpegSplitter/MpegSplitter.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,11 @@ class __declspec(uuid("DC257063-045F-4BE2-BD5B-E12279C464F0"))
DWORD m_dwMasterH264TrackNumber = DWORD_MAX;
DWORD m_dwMVCExtensionTrackNumber = DWORD_MAX;

BOOL m_bHandleDVStream = FALSE;
DWORD m_dwMasterDVTrackNumber = DWORD_MAX;
DWORD m_dwSecondaryDVTrackNumber = DWORD_MAX;
std::unique_ptr<CPacket> m_MasterDVStreamPacket;

std::vector<SyncPoint> m_sps;

HRESULT CreateOutputs(IAsyncReader* pAsyncReader);
Expand Down
23 changes: 21 additions & 2 deletions src/filters/parser/MpegSplitter/MpegSplitterFile.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -924,7 +924,9 @@ DWORD CMpegSplitterFile::AddStream(const WORD pid, BYTE pesid, const BYTE ext_id
return s;
}

if (m_ClipInfo.IsHdmv() && !m_ClipInfo.FindStream(s.pid)) {
constexpr WORD DV_SECONDARY_STREAM_PID_START = 4117;

if (m_ClipInfo.IsHdmv() && s.pid < DV_SECONDARY_STREAM_PID_START && !m_ClipInfo.FindStream(s.pid)) {
return s;
}

Expand Down Expand Up @@ -1026,7 +1028,24 @@ DWORD CMpegSplitterFile::AddStream(const WORD pid, BYTE pesid, const BYTE ext_id
Seek(start);
auto& hevc = hevc_streams[s];
if (!m_streams[stream_type::video].Find(s) && Read(hevc.h, len, hevc.pData, &s.mt)) {
s.codec = stream_codec::HEVC;
bool bIsDVStream = false;
if (s.pid >= DV_SECONDARY_STREAM_PID_START && m_streams[stream_type::video].size() == 1 && m_streams[stream_type::video].front().codec == stream_codec::HEVC) {
CH265Nalu Nalu;
Nalu.SetBuffer(hevc.pData.data(), hevc.pData.size());
while (Nalu.ReadNext()) {
auto nalu_type = Nalu.GetType();
if (nalu_type == NALU_TYPE_HEVC_UNSPEC62) {
// Dolby Vision RPU
bIsDVStream = true;
break;
}
}

if (!bIsDVStream && hevc.pData.size() < MEGABYTE) {
return s;
}
}
s.codec = bIsDVStream ? stream_codec::HEVC_DV_SECONDARY : stream_codec::HEVC;
type = stream_type::video;
}
}
Expand Down
1 change: 1 addition & 0 deletions src/filters/parser/MpegSplitter/MpegSplitterFile.h
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,7 @@ class CMpegSplitterFile : public CBaseSplitterFileEx
H264,
MVC,
HEVC,
HEVC_DV_SECONDARY,
MPEG,
VC1,
OPUS,
Expand Down

0 comments on commit d34637d

Please sign in to comment.