kodi
VideoBufferDRMPRIME.h
1 /*
2  * Copyright (C) 2017-2018 Team Kodi
3  * This file is part of Kodi - https://kodi.tv
4  *
5  * SPDX-License-Identifier: GPL-2.0-or-later
6  * See LICENSES/README.md for more information.
7  */
8 
9 #pragma once
10 
11 #include "cores/VideoPlayer/Buffers/VideoBuffer.h"
12 #include "cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodec.h"
13 #include "utils/DisplayInfo.h"
14 
15 extern "C"
16 {
17 #include <libavutil/frame.h>
18 #include <libavutil/hwcontext_drm.h>
19 #include <libavutil/mastering_display_metadata.h>
20 }
21 
22 namespace DRMPRIME
23 {
24 
25 // HDR enums is copied from linux include/linux/hdmi.h (strangely not part of uapi)
26 enum hdmi_metadata_type
27 {
28  HDMI_STATIC_METADATA_TYPE1 = 0,
29 };
30 enum hdmi_eotf
31 {
32  HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
33  HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
34  HDMI_EOTF_SMPTE_ST2084,
35  HDMI_EOTF_BT_2100_HLG,
36 };
37 
38 KODI::UTILS::Colorimetry GetColorimetry(const VideoPicture& picture);
39 std::string GetColorEncoding(const VideoPicture& picture);
40 std::string GetColorRange(const VideoPicture& picture);
41 KODI::UTILS::Eotf GetEOTF(const VideoPicture& picture);
42 const AVMasteringDisplayMetadata* GetMasteringDisplayMetadata(const VideoPicture& picture);
43 const AVContentLightMetadata* GetContentLightMetadata(const VideoPicture& picture);
44 
45 } // namespace DRMPRIME
46 
48 {
49 public:
50  CVideoBufferDRMPRIME() = delete;
51  ~CVideoBufferDRMPRIME() override = default;
52 
53  virtual void SetPictureParams(const VideoPicture& picture) { m_picture.SetParams(picture); }
54  virtual const VideoPicture& GetPicture() const { return m_picture; }
55  virtual uint32_t GetWidth() const { return GetPicture().iWidth; }
56  virtual uint32_t GetHeight() const { return GetPicture().iHeight; }
57 
58  virtual AVDRMFrameDescriptor* GetDescriptor() const = 0;
59  virtual bool IsValid() const { return true; }
60  virtual bool AcquireDescriptor() { return true; }
61  virtual void ReleaseDescriptor() {}
62 
63  uint32_t m_fb_id = 0;
64  uint32_t m_handles[AV_DRM_MAX_PLANES] = {};
65 
66 protected:
67  explicit CVideoBufferDRMPRIME(int id);
68 
69  VideoPicture m_picture;
70 };
71 
73 {
74 public:
76  ~CVideoBufferDRMPRIMEFFmpeg() override;
77  void SetRef(AVFrame* frame);
78  void Unref();
79 
80  AVDRMFrameDescriptor* GetDescriptor() const override
81  {
82  return reinterpret_cast<AVDRMFrameDescriptor*>(m_pFrame->data[0]);
83  }
84  bool IsValid() const override;
85 
86 protected:
87  AVFrame* m_pFrame = nullptr;
88 };
89 
91 {
92 public:
94  void Return(int id) override;
95  CVideoBuffer* Get() override;
96 
97 protected:
98  CCriticalSection m_critSection;
99  std::vector<CVideoBufferDRMPRIMEFFmpeg*> m_all;
100  std::deque<int> m_used;
101  std::deque<int> m_free;
102 };
Definition: VideoBuffer.h:85
Definition: VideoBuffer.h:51
Definition: VideoBufferDRMPRIME.h:90
Definition: VideoBufferDRMPRIME.h:72
Definition: DVDVideoCodec.h:36
Definition: VideoBufferDRMPRIME.h:47
Definition: VideoBufferDRMPRIME.cpp:20