Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mpc-hc/LAVFilters.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2016-03-01 17:51:10 +0300
committerHendrik Leppkes <h.leppkes@gmail.com>2016-03-01 17:51:10 +0300
commit238fa4a2de68c8c7c60a37028046566821b2b49a (patch)
treedf2a4be21e278f9f4600f96287163d7968eda732 /decoder
parentbd703bc481b5d82b6193f29296ddf2e358443280 (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.cpp26
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);
}