File: pixelformat.h

package info (click to toggle)
olive-editor 20200620-2
  • links: PTS, VCS
  • area: main
  • in suites: bullseye
  • size: 40,228 kB
  • sloc: cpp: 51,932; sh: 56; makefile: 7; xml: 7
file content (149 lines) | stat: -rw-r--r-- 3,945 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/***

  Olive - Non-Linear Video Editor
  Copyright (C) 2019 Olive Team

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.

***/

#ifndef BITDEPTHS_H
#define BITDEPTHS_H

#include <memory>
#include <OpenImageIO/imageio.h>
#include <QOpenGLExtraFunctions>
#include <QString>

#include "render/rendermodes.h"

OLIVE_NAMESPACE_ENTER

class Frame;
using FramePtr = std::shared_ptr<Frame>;

class PixelFormat : public QObject
{
  Q_OBJECT
public:
  /**
   * @brief Olive's internal supported pixel formats.
   */
  enum Format {
    PIX_FMT_INVALID = -1,

    PIX_FMT_RGBA8,
    PIX_FMT_RGBA16U,
    PIX_FMT_RGBA16F,
    PIX_FMT_RGBA32F,

    PIX_FMT_RGB8,
    PIX_FMT_RGB16U,
    PIX_FMT_RGB16F,
    PIX_FMT_RGB32F,

    PIX_FMT_COUNT
  };

  static void CreateInstance();
  static void DestroyInstance();
  static PixelFormat* instance();

  /**
   * @brief Returns the configured pixel format for a given mode
   */
  Format GetConfiguredFormatForMode(RenderMode::Mode mode);
  void SetConfiguredFormatForMode(RenderMode::Mode mode, PixelFormat::Format format);

  static Format OIIOFormatToOliveFormat(OIIO::TypeDesc desc, bool has_alpha);

  static Format GetFormatWithAlphaChannel(Format f);
  static Format GetFormatWithoutAlphaChannel(Format f);

  /**
   * @brief Returns the minimum buffer size (in bytes) necessary for a given format, width, and height.
   *
   * @param format
   *
   * The format of the data the buffer should contain. Must be a member of the olive::PixelFormat enum.
   *
   * @param width
   *
   * The width (in pixels) of the buffer.
   *
   * @param height
   *
   * The height (in pixels) of the buffer.
   */
  static int GetBufferSize(const Format &format, const int& width, const int& height);

  /**
   * @brief Returns the number of bytes per pixel for a certain format
   *
   * Different formats use different sizes of data for pixels. Use this function to determine how many bytes a pixel
   * requires for a certain format. The number of bytes will always be a multiple of 4 since all formats use RGBA and
   * are at least 1 bpc.
   */
  static int BytesPerPixel(const Format &format);

  /**
   * @brief Returns the number of bytes per channel for a certain format
   */
  static int BytesPerChannel(const Format& format);

  /**
   * @brief Return the number of channels in this format
   */
  static int ChannelCount(const Format& format);

  /**
   * @brief Convert a frame to a pixel format
   *
   * If the frame's pixel format == the destination format, this just returns `frame`.
   */
  static FramePtr ConvertPixelFormat(FramePtr frame, const Format &dest_format);

  /**
   * @brief Simple convenience function returning whether a pixel format has an alpha channel or not
   */
  static bool FormatHasAlphaChannel(const Format& format);

  /**
   * @brief Simple convenience function returning whether a pixel format is float-based or integer-based
   */
  static bool FormatIsFloat(const Format& format);

  /**
   * @brief Get corresponding OpenImageIO TypeDesc for a given pixel format
   */
  static OIIO::TypeDesc::BASETYPE GetOIIOTypeDesc(const Format& format);

  /**
   * @brief Get format name
   */
  static QString GetName(const Format& format);

signals:
  void FormatChanged();

private:
  PixelFormat() = default;

  static PixelFormat* instance_;

};

OLIVE_NAMESPACE_EXIT

#endif // BITDEPTHS_H