Skip to content

Commit 235f24e

Browse files
committed
Add Duck IVF parsing support to the elementary stream.
Signed-off-by: Vassili Nikolaev (NVIDIA) <[email protected]>
1 parent 44fa4da commit 235f24e

File tree

1 file changed

+75
-5
lines changed

1 file changed

+75
-5
lines changed

vk_video_decoder/libs/VkDecoderUtils/ElementaryStream.cpp

Lines changed: 75 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
#include <fstream>
1919
#include "mio/mio.hpp"
2020
#include "VkDecoderUtils/VideoStreamDemuxer.h"
21+
#define DKIF_FRAME_CONTAINER_HEADER_SIZE 12
22+
#define DKIF_HEADER_MAGIC *((const uint32_t*)"DKIF")
23+
#define DKIF_FILE_HEADER_SIZE 32
2124

2225
class ElementaryStream : public VideoStreamDemuxer {
2326

@@ -32,11 +35,35 @@ class ElementaryStream : public VideoStreamDemuxer {
3235
, m_height(defaultHeight)
3336
, m_bitDepth(defaultBitDepth)
3437
, m_videoCodecType(forceParserType)
38+
#ifndef USE_SIMPLE_MALLOC
3539
, m_inputVideoStreamMmap()
40+
#endif
3641
, m_pBitstreamData(nullptr)
3742
, m_bitstreamDataSize(0)
3843
, m_bytesRead(0) {
3944

45+
#ifdef USE_SIMPLE_MALLOC
46+
FILE* handle = fopen(pFilePath, "rb");
47+
if (handle == nullptr) {
48+
printf("Failed to open video file %s\n", pFilePath);
49+
return;
50+
}
51+
52+
fseek(handle, 0, SEEK_END);
53+
size_t size = ftell(handle);
54+
uint8_t* data = (uint8_t*)malloc(size);
55+
56+
if (data == nullptr) {
57+
printf("Failed to allocate memory for video file: %i\n", (uint32_t)size);
58+
return;
59+
}
60+
61+
m_bitstreamDataSize = size;
62+
fseek(handle, 0, SEEK_SET);
63+
fread(data, 1, size, handle);
64+
m_pBitstreamData = data;
65+
fclose(handle);
66+
#else
4067
std::error_code error;
4168
m_inputVideoStreamMmap.map(pFilePath, 0, mio::map_entire_file, error);
4269
if (error) {
@@ -46,6 +73,14 @@ class ElementaryStream : public VideoStreamDemuxer {
4673
m_bitstreamDataSize = m_inputVideoStreamMmap.mapped_length();
4774

4875
m_pBitstreamData = m_inputVideoStreamMmap.data();
76+
#endif
77+
if (m_videoCodecType == VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR) {
78+
// Assume Duck IVF. DKIF.
79+
assert(*(const uint32_t*)m_pBitstreamData == DKIF_HEADER_MAGIC);
80+
const uint32_t firstFrameOffset = (DKIF_FILE_HEADER_SIZE + DKIF_FRAME_CONTAINER_HEADER_SIZE);
81+
m_pBitstreamData += firstFrameOffset;
82+
m_bitstreamDataSize -= firstFrameOffset;
83+
}
4984
}
5085

5186
ElementaryStream(const uint8_t *pInput, const size_t,
@@ -54,11 +89,19 @@ class ElementaryStream : public VideoStreamDemuxer {
5489
, m_height(144)
5590
, m_bitDepth(8)
5691
, m_videoCodecType(codecType)
92+
#ifndef USE_SIMPLE_MALLOC
5793
, m_inputVideoStreamMmap()
94+
#endif
5895
, m_pBitstreamData(pInput)
5996
, m_bitstreamDataSize(0)
60-
, m_bytesRead(0) {
61-
97+
, m_bytesRead(0)
98+
{
99+
if (m_videoCodecType == VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR) {
100+
// Assume Duck IVF. DKIF.
101+
assert(*(const uint32_t*)pInput == DKIF_HEADER_MAGIC);
102+
const uint32_t firstFrameOffset = (DKIF_FILE_HEADER_SIZE + DKIF_FRAME_CONTAINER_HEADER_SIZE);
103+
m_pBitstreamData += firstFrameOffset;
104+
}
62105
}
63106

64107
int32_t Initialize() { return 0; }
@@ -83,7 +126,12 @@ class ElementaryStream : public VideoStreamDemuxer {
83126
}
84127

85128
virtual ~ElementaryStream() {
129+
#ifdef USE_SIMPLE_MALLOC
130+
const uint32_t firstFrameOffset = (DKIF_FILE_HEADER_SIZE + DKIF_FRAME_CONTAINER_HEADER_SIZE);
131+
free(m_pBitstreamData - firstFrameOffset);
132+
#else
86133
m_inputVideoStreamMmap.unmap();
134+
#endif
87135
}
88136

89137
virtual bool IsStreamDemuxerEnabled() const { return false; }
@@ -135,7 +183,17 @@ class ElementaryStream : public VideoStreamDemuxer {
135183
}
136184
virtual uint32_t GetProfileIdc() const
137185
{
138-
return STD_VIDEO_H264_PROFILE_IDC_MAIN;
186+
switch (m_videoCodecType) {
187+
case VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR:
188+
return STD_VIDEO_H264_PROFILE_IDC_MAIN;
189+
case VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR:
190+
return STD_VIDEO_H265_PROFILE_IDC_MAIN;
191+
case VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR:
192+
return STD_VIDEO_AV1_PROFILE_MAIN;
193+
default:
194+
assert(0);
195+
}
196+
return (uint32_t)(-1);
139197
}
140198

141199
virtual int32_t GetWidth() const { return m_width; }
@@ -150,8 +208,18 @@ class ElementaryStream : public VideoStreamDemuxer {
150208
assert(m_pBitstreamData != nullptr);
151209

152210
// Compute and return the pointer to data at new offset.
153-
*ppVideo = (m_pBitstreamData + offset);
154-
return m_bitstreamDataSize - offset;
211+
if (m_videoCodecType == VK_VIDEO_CODEC_OPERATION_DECODE_AV1_BIT_KHR) {
212+
*ppVideo = (m_pBitstreamData + offset);
213+
uint32_t dataSize = *(const uint32_t*)(*ppVideo - DKIF_FRAME_CONTAINER_HEADER_SIZE);
214+
if ((m_bitstreamDataSize - (offset + dataSize)) == 0) {
215+
return dataSize;
216+
}
217+
218+
return dataSize + DKIF_FRAME_CONTAINER_HEADER_SIZE;
219+
} else {
220+
*ppVideo = (m_pBitstreamData + offset);
221+
return m_bitstreamDataSize - offset;
222+
}
155223
}
156224

157225
virtual void DumpStreamParameters() const {
@@ -160,7 +228,9 @@ class ElementaryStream : public VideoStreamDemuxer {
160228
private:
161229
int32_t m_width, m_height, m_bitDepth;
162230
VkVideoCodecOperationFlagBitsKHR m_videoCodecType;
231+
#ifndef USE_SIMPLE_MALLOC
163232
mio::basic_mmap<mio::access_mode::read, uint8_t> m_inputVideoStreamMmap;
233+
#endif
164234
const uint8_t* m_pBitstreamData;
165235
VkDeviceSize m_bitstreamDataSize;
166236
VkDeviceSize m_bytesRead;

0 commit comments

Comments
 (0)