blob: 72f981996e8cd5a883dfd70a694f54c4f81ce16e [file] [edit]
// Copyright 2024 The Chromium Authors
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef H264_DECODER_DELEGATE_H_
#define H264_DECODER_DELEGATE_H_
#include <va/va.h>
#include "base/lru_cache.h"
#include "context_delegate.h"
#include "wels/codec_api.h"
namespace libvafake {
// Class used for H264 software decoding.
class H264DecoderDelegate : public ContextDelegate {
public:
explicit H264DecoderDelegate(int picture_width_hint,
int picture_height_hint,
VAProfile profile);
H264DecoderDelegate(const H264DecoderDelegate&) = delete;
H264DecoderDelegate& operator=(const H264DecoderDelegate&) = delete;
~H264DecoderDelegate() override;
// ContextDelegate implementation.
void SetRenderTarget(const FakeSurface& surface) override;
void EnqueueWork(const std::vector<const FakeBuffer*>& buffers) override;
void Run() override;
private:
void OnFrameReady(unsigned char* pData[3], SBufferInfo* pDstInfo);
ISVCDecoder* svc_decoder_ = nullptr;
const VAProfile profile_;
std::vector<const FakeBuffer*> slice_data_buffers_;
std::vector<const FakeBuffer*> slice_param_buffers_;
const FakeSurface* render_target_{nullptr};
const FakeBuffer* pic_param_buffer_{nullptr};
const FakeBuffer* matrix_buffer_{nullptr};
uint32_t current_ts_ = 0;
base::LRUCache<uint32_t, const FakeSurface*> ts_to_render_target_;
};
} // namespace libvafake
#endif // H264_DECODER_DELEGATE_H_