| /* |
| * Copyright 2020 Google LLC |
| * |
| */ |
| |
| /* |
| * Copyright (c) 2020, Alliance for Open Media. All rights reserved |
| * |
| * This source code is subject to the terms of the BSD 2 Clause License and |
| * the Alliance for Open Media Patent License 1.0. If the BSD 2 Clause License |
| * was not distributed with this source code in the LICENSE file, you can |
| * obtain it at www.aomedia.org/license/software. If the Alliance for Open |
| * Media Patent License 1.0 was not distributed with this source code in the |
| * PATENTS file, you can obtain it at www.aomedia.org/license/patent. |
| */ |
| |
| #pragma once |
| |
| #include "decoder.h" |
| |
| #define CREATE_SHADERS_THREAD_CNT 4 // 0 - sync creation, async (1 - 6 threads num) |
| #define _CONFIG_PATH_ "/args/args_av1.txt" |
| |
| typedef enum { TaskNone = 0, taskStop = 1, taskNext = 2, taskStopNoWait = 3, taskStopFlush = 4 } decodeTask; |
| |
| #if (WINAPI_FAMILY == WINAPI_FAMILY_APP) |
| using namespace Windows::Storage; |
| #endif |
| |
| class Decoders; |
| |
| interface DisplayCallbacks { |
| virtual void AddSource(AV1Decoder * source) = 0; |
| virtual void RemoveSource(AV1Decoder * source) = 0; |
| virtual void AllJobDoneNotify() = 0; |
| }; |
| |
| class Decoders { |
| public: |
| Decoders(int is_xbox, d3d_resources dx_resources, DisplayCallbacks* display, const char* root_path = 0); |
| |
| static void GetAvailablePaths(std::string& read_path, std::string& write_path, std::string& root_path); |
| void Start() { |
| stop_decode_ = 0; |
| stop_ = 0; |
| work_thread_ = std::thread(RunDecoderLoop, this); |
| } |
| |
| void Stop(decodeTask stop_task) { |
| stop_decode_ = stop_task; |
| if (stop_task == taskStop) { |
| stop_ = 1; |
| WaitForFinish(); |
| } else if (stop_task == taskStopNoWait) { |
| stop_ = 1; |
| } else if (stop_task == taskStopFlush) { |
| stop_ = 1; |
| decoder_->FlushOutput(); |
| WaitForFinish(); |
| } |
| } |
| |
| void WaitForFinish() { work_thread_.join(); } |
| |
| protected: |
| static void RunDecoderLoop(Decoders* ptr) { ptr->DecodeLoop(); } |
| int DecodeLoop(); |
| int process_directory(CParameters& params); |
| |
| private: |
| int is_xbox_ = 0; |
| DisplayCallbacks* display_; |
| std::shared_ptr<AV1Decoder> decoder_; |
| std::thread work_thread_; |
| volatile int is_running_ = 0; |
| volatile int stop_ = 0; |
| uint32_t stop_decode_ = 0; |
| std::string read_path_; |
| std::string write_path_; |
| d3d_resources dx_resources_; |
| std::string root_path_; |
| }; |