1e5c31af7Sopenharmony_ci#ifndef _EXTESEXTRACTOR_HPP
2e5c31af7Sopenharmony_ci#define _EXTESEXTRACTOR_HPP
3e5c31af7Sopenharmony_ci/*
4e5c31af7Sopenharmony_ci* Copyright (C) 2023 Igalia, S.L.
5e5c31af7Sopenharmony_ci*
6e5c31af7Sopenharmony_ci* Licensed under the Apache License, Version 2.0 (the "License");
7e5c31af7Sopenharmony_ci* you may not use this file except in compliance with the License.
8e5c31af7Sopenharmony_ci* You may obtain a copy of the License at
9e5c31af7Sopenharmony_ci*
10e5c31af7Sopenharmony_ci*    http://www.apache.org/licenses/LICENSE-2.0
11e5c31af7Sopenharmony_ci*
12e5c31af7Sopenharmony_ci* Unless required by applicable law or agreed to in writing, software
13e5c31af7Sopenharmony_ci* distributed under the License is distributed on an "AS IS" BASIS,
14e5c31af7Sopenharmony_ci* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15e5c31af7Sopenharmony_ci* See the License for the specific language governing permissions and
16e5c31af7Sopenharmony_ci* limitations under the License.
17e5c31af7Sopenharmony_ci*/
18e5c31af7Sopenharmony_ci
19e5c31af7Sopenharmony_ci#include "esextractor.h"
20e5c31af7Sopenharmony_ci#include "tcuTestLog.hpp"
21e5c31af7Sopenharmony_ci
22e5c31af7Sopenharmony_ciclass ESEDemuxer {
23e5c31af7Sopenharmony_ci    ESExtractor *extractor{};
24e5c31af7Sopenharmony_ci    ESEPacket* pkt{};
25e5c31af7Sopenharmony_ci    ESEVideoCodec eVideoCodec{ESE_VIDEO_CODEC_UNKNOWN};
26e5c31af7Sopenharmony_ci
27e5c31af7Sopenharmony_ci    tcu::TestLog& log;
28e5c31af7Sopenharmony_ci
29e5c31af7Sopenharmony_cipublic:
30e5c31af7Sopenharmony_ci    ESEDemuxer(const std::string& filePath, tcu::TestLog& log_)
31e5c31af7Sopenharmony_ci		: extractor(es_extractor_new(filePath.c_str(), "Alignment:NAL"))
32e5c31af7Sopenharmony_ci		, log(log_)
33e5c31af7Sopenharmony_ci	{
34e5c31af7Sopenharmony_ci        eVideoCodec = es_extractor_video_codec(extractor);
35e5c31af7Sopenharmony_ci        log << tcu::TestLog::Message << "ESEDemuxer found video codec: " << eVideoCodec << tcu::TestLog::EndMessage;
36e5c31af7Sopenharmony_ci    }
37e5c31af7Sopenharmony_ci
38e5c31af7Sopenharmony_ci    ~ESEDemuxer()
39e5c31af7Sopenharmony_ci	{
40e5c31af7Sopenharmony_ci        if (pkt) {
41e5c31af7Sopenharmony_ci            es_extractor_clear_packet(pkt);
42e5c31af7Sopenharmony_ci        }
43e5c31af7Sopenharmony_ci        es_extractor_teardown(extractor);
44e5c31af7Sopenharmony_ci    }
45e5c31af7Sopenharmony_ci
46e5c31af7Sopenharmony_ci    ESEVideoCodec GetVideoCodec() {
47e5c31af7Sopenharmony_ci        if (!extractor) {
48e5c31af7Sopenharmony_ci            return ESE_VIDEO_CODEC_UNKNOWN;
49e5c31af7Sopenharmony_ci        }
50e5c31af7Sopenharmony_ci        return eVideoCodec;
51e5c31af7Sopenharmony_ci    }
52e5c31af7Sopenharmony_ci
53e5c31af7Sopenharmony_ci    bool Demux(deUint8 **ppVideo, deInt64 *pnVideoBytes) {
54e5c31af7Sopenharmony_ci        if (!extractor) {
55e5c31af7Sopenharmony_ci            return false;
56e5c31af7Sopenharmony_ci        }
57e5c31af7Sopenharmony_ci
58e5c31af7Sopenharmony_ci        *pnVideoBytes = 0;
59e5c31af7Sopenharmony_ci
60e5c31af7Sopenharmony_ci        if (pkt) {
61e5c31af7Sopenharmony_ci            es_extractor_clear_packet(pkt);
62e5c31af7Sopenharmony_ci            pkt = nullptr;
63e5c31af7Sopenharmony_ci        }
64e5c31af7Sopenharmony_ci
65e5c31af7Sopenharmony_ci        int e = 0;
66e5c31af7Sopenharmony_ci        e = es_extractor_read_packet(extractor, &pkt);
67e5c31af7Sopenharmony_ci
68e5c31af7Sopenharmony_ci        if (e > ESE_RESULT_LAST_PACKET) {
69e5c31af7Sopenharmony_ci            return false;
70e5c31af7Sopenharmony_ci        }
71e5c31af7Sopenharmony_ci
72e5c31af7Sopenharmony_ci        *ppVideo = pkt->data;
73e5c31af7Sopenharmony_ci        *pnVideoBytes = static_cast<int>(pkt->data_size);
74e5c31af7Sopenharmony_ci
75e5c31af7Sopenharmony_ci        return true;
76e5c31af7Sopenharmony_ci    }
77e5c31af7Sopenharmony_ci};
78e5c31af7Sopenharmony_ci
79e5c31af7Sopenharmony_ciinline vk::VkVideoCodecOperationFlagBitsKHR EXExtractor2NvCodecId(ESEVideoCodec id) {
80e5c31af7Sopenharmony_ci    switch (id) {
81e5c31af7Sopenharmony_ci        case ESE_VIDEO_CODEC_H264       : return vk::VK_VIDEO_CODEC_OPERATION_DECODE_H264_BIT_KHR;
82e5c31af7Sopenharmony_ci        case ESE_VIDEO_CODEC_H265       : return vk::VK_VIDEO_CODEC_OPERATION_DECODE_H265_BIT_KHR;
83e5c31af7Sopenharmony_ci        default                     : /* assert(false); */ return vk::VkVideoCodecOperationFlagBitsKHR(0);
84e5c31af7Sopenharmony_ci    }
85e5c31af7Sopenharmony_ci}
86e5c31af7Sopenharmony_ci#endif // _EXTESEXTRACTOR_HPP
87