Skip to content

Commit dbf151e

Browse files
authored
Merge pull request #167 from jdibenes/sqtest
rm square pixels, buffering, vlc patch
2 parents cc03a20 + 17b959b commit dbf151e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

54 files changed

+2345
-699
lines changed

etc/rm_listing.txt

Lines changed: 1127 additions & 0 deletions
Large diffs are not rendered by default.

hl2ss/hl2ss/Package.appxmanifest

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<Identity
1010
Name="eaaf3af3-1402-4e5b-b6a1-5d0fbb7c1ba8"
1111
Publisher="CN=jcds"
12-
Version="1.0.36.0" />
12+
Version="1.0.37.0" />
1313
<mp:PhoneIdentity PhoneProductId="eaaf3af3-1402-4e5b-b6a1-5d0fbb7c1ba8" PhonePublisherId="00000000-0000-0000-0000-000000000000"/>
1414
<Properties>
1515
<DisplayName>hl2ss</DisplayName>

hl2ss/hl2ss/custom_encoder.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11

22
#include <mfapi.h>
33
#include "custom_encoder.h"
4+
#include "extended_execution.h"
5+
#include "lock.h"
46

57
//-----------------------------------------------------------------------------
68
// Functions
@@ -16,6 +18,9 @@ CustomEncoder::CustomEncoder(HOOK_ENCODER_PROC pHookCallback, void* pHookParam,
1618
m_pMetadataFree = pMetadataFree;
1719

1820
memset(m_metadata.get(), 0, metadata_size);
21+
22+
m_buffer_i.Startup(CustomEncoder::Thunk_Write, this, ExtendedExecution_GetReaderBuffering());
23+
m_buffer_o.Startup(CustomEncoder::Thunk_Process, this, ExtendedExecution_GetEncoderBuffering());
1924
}
2025

2126
// OK
@@ -35,6 +40,21 @@ CustomEncoder(pHookCallback, pHookParam, pMetadataFree, metadata_size)
3540
// OK
3641
CustomEncoder::~CustomEncoder()
3742
{
43+
m_buffer_i.Cleanup();
44+
m_pSinkWriter.reset();
45+
m_buffer_o.Cleanup();
46+
}
47+
48+
// OK
49+
void CustomEncoder::WriteSample(IMFSample* pSample)
50+
{
51+
if (m_pSinkWriter) { m_pSinkWriter->WriteSample(pSample); } else { Thunk_Sink(pSample, this); }
52+
}
53+
54+
// OK
55+
void CustomEncoder::ReceiveSample(IMFSample* pSample)
56+
{
57+
m_buffer_o.Push(pSample);
3858
}
3959

4060
// OK
@@ -64,9 +84,21 @@ void CustomEncoder::ProcessSample(IMFSample* pSample)
6484
}
6585

6686
// OK
67-
void CustomEncoder::Thunk_Sink(IMFSample* pSample, void* param)
87+
void CustomEncoder::Thunk_Write(IMFSample* pSample, void* self)
88+
{
89+
static_cast<CustomEncoder*>(self)->WriteSample(pSample);
90+
}
91+
92+
// OK
93+
void CustomEncoder::Thunk_Sink(IMFSample* pSample, void* self)
94+
{
95+
static_cast<CustomEncoder*>(self)->ReceiveSample(pSample);
96+
}
97+
98+
// OK
99+
void CustomEncoder::Thunk_Process(IMFSample* pSample, void* self)
68100
{
69-
static_cast<CustomEncoder*>(param)->ProcessSample(pSample);
101+
static_cast<CustomEncoder*>(self)->ProcessSample(pSample);
70102
}
71103

72104
// OK
@@ -89,7 +121,7 @@ void CustomEncoder::WriteBuffer(IMFMediaBuffer* pBuffer, LONGLONG timestamp, LON
89121
pSample->SetSampleTime(timestamp);
90122
pSample->SetBlob(MF_USER_DATA_PAYLOAD, static_cast<UINT8*>(metadata), m_metadata_size);
91123

92-
m_pSinkWriter->WriteSample(pSample);
124+
m_buffer_i.Push(pSample);
93125

94126
pSample->Release();
95127
}

hl2ss/hl2ss/custom_encoder.h

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11

22
#pragma once
33

4+
#include "queue.h"
45
#include "custom_sink_writers.h"
6+
#include "custom_sample_buffer.h"
57

68
uint8_t const NV12_ZERO_CHROMA = 0x80;
79

@@ -17,14 +19,19 @@ class CustomEncoder
1719
HOOK_ENCODER_PROC m_pHookCallback;
1820
void* m_pHookParam;
1921
HOOK_METADATA_PROC m_pMetadataFree;
22+
SampleBuffer m_buffer_i;
23+
SampleBuffer m_buffer_o;
2024

21-
CustomEncoder(HOOK_ENCODER_PROC pHookCallback, void* pHookParam, HOOK_METADATA_PROC pMetadataFree, uint32_t metadata_size);
22-
25+
void WriteSample(IMFSample* pSample);
26+
void ReceiveSample(IMFSample* pSample);
2327
void ProcessSample(IMFSample* pSample);
24-
25-
static void Thunk_Sink(IMFSample* pSample, void* param);
28+
29+
static void Thunk_Write(IMFSample* pSample, void* self);
30+
static void Thunk_Sink(IMFSample* pSample, void* self);
31+
static void Thunk_Process(IMFSample* pSample, void* self);
2632

2733
protected:
34+
CustomEncoder(HOOK_ENCODER_PROC pHookCallback, void* pHookParam, HOOK_METADATA_PROC pMetadataFree, uint32_t metadata_size);
2835
CustomEncoder(HOOK_ENCODER_PROC pHookCallback, void* pHookParam, HOOK_METADATA_PROC pMetadataFree, uint32_t metadata_size, AudioSubtype input_subtype, AACFormat const& format);
2936
CustomEncoder(HOOK_ENCODER_PROC pHookCallback, void* pHookParam, HOOK_METADATA_PROC pMetadataFree, uint32_t metadata_size, VideoSubtype input_subtype, H26xFormat const& format, uint32_t stride, std::vector<uint64_t> const& encoder_options);
3037

hl2ss/hl2ss/custom_media_buffers.cpp

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,3 +219,108 @@ HRESULT BufferBuffer::CreateInstance(BufferBuffer** ppBuffer, Buffer const& ref)
219219
*ppBuffer = new BufferBuffer(ref);
220220
return S_OK;
221221
}
222+
223+
//*****************************************************************************
224+
// VectorBuffer
225+
//*****************************************************************************
226+
227+
//-----------------------------------------------------------------------------
228+
// IUnknown Methods
229+
//-----------------------------------------------------------------------------
230+
231+
// OK
232+
ULONG VectorBuffer::AddRef()
233+
{
234+
return InterlockedIncrement(&m_nRefCount);
235+
}
236+
237+
// OK
238+
ULONG VectorBuffer::Release()
239+
{
240+
ULONG uCount = InterlockedDecrement(&m_nRefCount);
241+
if (uCount == 0) { delete this; }
242+
return uCount;
243+
}
244+
245+
// OK
246+
HRESULT VectorBuffer::QueryInterface(REFIID iid, void** ppv)
247+
{
248+
if (!ppv) { return E_POINTER; }
249+
250+
*ppv = NULL;
251+
252+
if (iid == IID_IUnknown) { *ppv = static_cast<IUnknown*>(this); }
253+
else if (iid == IID_IMFMediaBuffer) { *ppv = static_cast<IMFMediaBuffer*>(this); }
254+
else { return E_NOINTERFACE; }
255+
256+
AddRef();
257+
return S_OK;
258+
}
259+
260+
//-----------------------------------------------------------------------------
261+
// IMFMediaBuffer Methods
262+
//-----------------------------------------------------------------------------
263+
264+
// OK
265+
HRESULT VectorBuffer::GetCurrentLength(DWORD* pcbCurrentLength)
266+
{
267+
*pcbCurrentLength = static_cast<DWORD>(m_v.size());
268+
return S_OK;
269+
}
270+
271+
// OK
272+
HRESULT VectorBuffer::GetMaxLength(DWORD* pcbMaxLength)
273+
{
274+
*pcbMaxLength = static_cast<DWORD>(m_v.size());
275+
return S_OK;
276+
}
277+
278+
// OK
279+
HRESULT VectorBuffer::Lock(BYTE** ppbBuffer, DWORD* pcbMaxLength, DWORD* pcbCurrentLength)
280+
{
281+
*ppbBuffer = m_v.data();
282+
if (pcbMaxLength) { *pcbMaxLength = static_cast<DWORD>(m_v.size()); }
283+
if (pcbCurrentLength) { *pcbCurrentLength = static_cast<DWORD>(m_v.size()); }
284+
return S_OK;
285+
}
286+
287+
// OK
288+
HRESULT VectorBuffer::SetCurrentLength(DWORD cbCurrentLength)
289+
{
290+
(void)cbCurrentLength;
291+
return S_OK;
292+
}
293+
294+
// OK
295+
HRESULT VectorBuffer::Unlock()
296+
{
297+
return S_OK;
298+
}
299+
300+
//-----------------------------------------------------------------------------
301+
// VectorBuffer Methods
302+
//-----------------------------------------------------------------------------
303+
304+
// OK
305+
VectorBuffer::VectorBuffer()
306+
{
307+
m_nRefCount = 1;
308+
}
309+
310+
// OK
311+
VectorBuffer::~VectorBuffer()
312+
{
313+
}
314+
315+
// OK
316+
HRESULT VectorBuffer::CreateInstance(VectorBuffer** ppBuffer)
317+
{
318+
*ppBuffer = new VectorBuffer();
319+
return S_OK;
320+
}
321+
322+
// OK
323+
std::vector<uint8_t>& VectorBuffer::Get()
324+
{
325+
return m_v;
326+
}

hl2ss/hl2ss/custom_media_buffers.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,30 @@ class BufferBuffer : public IMFMediaBuffer
6969
HRESULT SetCurrentLength(DWORD cbCurrentLength);
7070
HRESULT Unlock();
7171
};
72+
73+
class VectorBuffer : public IMFMediaBuffer
74+
{
75+
private:
76+
ULONG m_nRefCount;
77+
std::vector<uint8_t> m_v;
78+
79+
VectorBuffer();
80+
~VectorBuffer();
81+
82+
public:
83+
static HRESULT CreateInstance(VectorBuffer** ppBuffer);
84+
85+
std::vector<uint8_t>& Get();
86+
87+
// IUnknown Methods
88+
ULONG AddRef();
89+
ULONG Release();
90+
HRESULT QueryInterface(REFIID iid, void** ppv);
91+
92+
// IMFMediaBuffer Methods
93+
HRESULT GetCurrentLength(DWORD* pcbCurrentLength);
94+
HRESULT GetMaxLength(DWORD* pcbMaxLength);
95+
HRESULT Lock(BYTE** ppbBuffer, DWORD* pcbMaxLength, DWORD* pcbCurrentLength);
96+
HRESULT SetCurrentLength(DWORD cbCurrentLength);
97+
HRESULT Unlock();
98+
};

hl2ss/hl2ss/custom_sample_buffer.cpp

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
2+
#include "custom_sample_buffer.h"
3+
#include "lock.h"
4+
5+
//-----------------------------------------------------------------------------
6+
// Functions
7+
//-----------------------------------------------------------------------------
8+
9+
// OK
10+
void SampleBuffer::Startup(HOOK_BUFFER_PROC hook, void* param, bool enable)
11+
{
12+
m_hook = hook;
13+
m_param = param;
14+
m_enable = enable;
15+
if (!enable) { return; }
16+
InitializeCriticalSection(&m_lock);
17+
m_semaphore = CreateSemaphore(NULL, 0, LONG_MAX, NULL);
18+
m_thread = CreateThread(NULL, 0, Thunk_Loop, this, 0, NULL);
19+
}
20+
21+
// OK
22+
void SampleBuffer::Push(IMFSample* pSample)
23+
{
24+
if (!m_enable)
25+
{
26+
m_hook(pSample, m_param);
27+
}
28+
else
29+
{
30+
pSample->AddRef();
31+
{
32+
CriticalSection cs(&m_lock);
33+
m_buffer.push(pSample);
34+
}
35+
ReleaseSemaphore(m_semaphore, 1, NULL);
36+
}
37+
}
38+
39+
// OK
40+
void SampleBuffer::Loop()
41+
{
42+
IMFSample* pSample; // Release
43+
44+
while (true)
45+
{
46+
WaitForSingleObject(m_semaphore, INFINITE);
47+
{
48+
CriticalSection cs(&m_lock);
49+
if (m_buffer.empty()) { return; }
50+
pSample = pull(m_buffer);
51+
}
52+
m_hook(pSample, m_param);
53+
pSample->Release();
54+
}
55+
}
56+
57+
// OK
58+
DWORD WINAPI SampleBuffer::Thunk_Loop(void* self)
59+
{
60+
static_cast<SampleBuffer*>(self)->Loop();
61+
return 0;
62+
}
63+
64+
// OK
65+
void SampleBuffer::Cleanup()
66+
{
67+
if (!m_enable) { return; }
68+
ReleaseSemaphore(m_semaphore, 1, NULL);
69+
WaitForSingleObject(m_thread, INFINITE);
70+
CloseHandle(m_thread);
71+
CloseHandle(m_semaphore);
72+
DeleteCriticalSection(&m_lock);
73+
}

hl2ss/hl2ss/custom_sample_buffer.h

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
#pragma once
3+
4+
#include "queue.h"
5+
#include <mfidl.h>
6+
7+
typedef void(*HOOK_BUFFER_PROC)(IMFSample*, void*);
8+
9+
class SampleBuffer
10+
{
11+
private:
12+
HOOK_BUFFER_PROC m_hook;
13+
void* m_param;
14+
bool m_enable;
15+
std::queue<IMFSample*> m_buffer;
16+
CRITICAL_SECTION m_lock;
17+
HANDLE m_semaphore;
18+
HANDLE m_thread;
19+
20+
void Loop();
21+
22+
static DWORD WINAPI Thunk_Loop(void* self);
23+
24+
public:
25+
void Startup(HOOK_BUFFER_PROC hook, void* param, bool enable);
26+
void Push(IMFSample* pSample);
27+
void Cleanup();
28+
};

0 commit comments

Comments
 (0)