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
2225class 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 {
160228private:
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