diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-03-01 17:51:10 +0300 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-03-01 17:51:10 +0300 |
commit | 238fa4a2de68c8c7c60a37028046566821b2b49a (patch) | |
tree | df2a4be21e278f9f4600f96287163d7968eda732 /decoder | |
parent | bd703bc481b5d82b6193f29296ddf2e358443280 (diff) |
msdk_mvc: remove EOS markers from the bitstream, as they confuse the decoder
Diffstat (limited to 'decoder')
-rw-r--r-- | decoder/LAVVideo/decoders/msdk_mvc.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/decoder/LAVVideo/decoders/msdk_mvc.cpp b/decoder/LAVVideo/decoders/msdk_mvc.cpp index dce19e66..d7dae180 100644 --- a/decoder/LAVVideo/decoders/msdk_mvc.cpp +++ b/decoder/LAVVideo/decoders/msdk_mvc.cpp @@ -101,6 +101,13 @@ public: } } + void EnsureWriteable() { + if (m_pBuffer && !m_bBufferTemporary) { + m_pStorage->Append(m_pBuffer, m_nBufferSize); + m_pBuffer = nullptr; + } + } + private: GrowableArray<BYTE> * m_pStorage = nullptr; @@ -354,20 +361,29 @@ STDMETHODIMP CDecMSDKMVC::Decode(const BYTE *buffer, int buflen, REFERENCE_TIME bsBuffer.SetBuffer((BYTE *)buffer, buflen, false); } - bs.Data = bsBuffer.GetBuffer(); - bs.DataLength = bsBuffer.GetBufferSize(); - bs.MaxLength = bs.DataLength; + DbgLog((LOG_TRACE, 10, L"Frame %I64u, size %u", bs.TimeStamp, bsBuffer.GetBufferSize())); - // Check the buffer for SEI NALUs + // Check the buffer for SEI NALU, and some unwanted NALUs that need filtering // MSDK's SEI reading functionality is slightly buggy CH264Nalu nalu; - nalu.SetBuffer(bs.Data, bs.DataLength, 0); + nalu.SetBuffer(bsBuffer.GetBuffer(), bsBuffer.GetBufferSize(), 0); + BOOL bNeedFilter = FALSE; while (nalu.ReadNext()) { if (nalu.GetType() == NALU_TYPE_SEI) { ParseSEI(nalu.GetDataBuffer() + 1, nalu.GetDataLength() - 1, bs.TimeStamp); } + else if (nalu.GetType() == NALU_TYPE_EOSEQ) { + bsBuffer.EnsureWriteable(); + // This is rather ugly, and relies on the bitstream being AnnexB, so simply overwriting the EOS NAL with zero works. + // In the future a more elaborate bitstream filter might be advised + memset(bsBuffer.GetBuffer() + nalu.GetNALPos(), 0, 4); + } } + bs.Data = bsBuffer.GetBuffer(); + bs.DataLength = bsBuffer.GetBufferSize(); + bs.MaxLength = bs.DataLength; + AddFrameToGOP(bs.TimeStamp); } |