tdesktop/Telegram/SourceFiles/media/streaming/media_streaming_common.h

195 lines
3.9 KiB
C
Raw Normal View History

/*
This file is part of Telegram Desktop,
the official desktop application for the Telegram messaging service.
For license and copyright information please follow this link:
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
*/
#pragma once
2021-08-31 11:26:17 +00:00
#include "data/data_audio_msg_id.h"
#include "ui/image/image_prepare.h"
2019-09-13 12:22:54 +00:00
#include "ui/rect_part.h"
namespace Media {
2019-06-26 15:04:38 +00:00
inline constexpr auto kTimeUnknown = std::numeric_limits<crl::time>::min();
inline constexpr auto kDurationMax = crl::time(std::numeric_limits<int>::max());
inline constexpr auto kDurationUnavailable = std::numeric_limits<crl::time>::max();
2019-02-21 16:01:55 +00:00
namespace Audio {
bool SupportsSpeedControl();
} // namespace Audio
2019-02-21 11:15:44 +00:00
namespace Streaming {
2019-02-21 16:01:55 +00:00
inline bool SupportsSpeedControl() {
return Media::Audio::SupportsSpeedControl();
}
class VideoTrack;
class AudioTrack;
enum class Mode {
Both,
Audio,
Video,
Inspection,
};
struct PlaybackOptions {
Mode mode = Mode::Both;
crl::time position = 0;
crl::time durationOverride = 0;
float64 speed = 1.; // Valid values between 0.5 and 2.
2019-02-28 21:03:25 +00:00
AudioMsgId audioId;
bool syncVideoByAudio = true;
2019-12-11 14:01:11 +00:00
bool waitForMarkAsShown = false;
bool hwAllowed = false;
bool seekable = true;
bool loop = false;
};
struct TrackState {
crl::time position = kTimeUnknown;
crl::time receivedTill = kTimeUnknown;
crl::time duration = kTimeUnknown;
};
struct VideoInformation {
TrackState state;
QSize size;
QImage cover;
int rotation = 0;
2022-01-21 15:00:13 +00:00
bool alpha = false;
};
struct AudioInformation {
TrackState state;
};
struct Information {
VideoInformation video;
AudioInformation audio;
2019-05-31 11:45:35 +00:00
int headerSize = 0;
};
template <typename Track>
struct PreloadedUpdate {
crl::time till = kTimeUnknown;
};
template <typename Track>
struct PlaybackUpdate {
crl::time position = kTimeUnknown;
};
using PreloadedVideo = PreloadedUpdate<VideoTrack>;
using UpdateVideo = PlaybackUpdate<VideoTrack>;
using PreloadedAudio = PreloadedUpdate<AudioTrack>;
using UpdateAudio = PlaybackUpdate<AudioTrack>;
struct WaitingForData {
2019-03-01 11:16:55 +00:00
bool waiting = false;
};
struct MutedByOther {
};
2019-02-22 11:58:26 +00:00
struct Finished {
};
struct Update {
std::variant<
Information,
PreloadedVideo,
UpdateVideo,
PreloadedAudio,
UpdateAudio,
WaitingForData,
2019-02-22 11:58:26 +00:00
MutedByOther,
Finished> data;
};
2019-03-05 13:56:27 +00:00
enum class Error {
OpenFailed,
LoadFailed,
InvalidData,
NotStreamable,
};
struct FrameRequest {
QSize resize;
QSize outer;
Images::CornersMaskRef rounding;
QImage mask;
2022-01-21 15:00:13 +00:00
QColor colored = QColor(0, 0, 0, 0);
bool blurredBackground = false;
2021-06-03 12:57:48 +00:00
bool requireARGB32 = true;
bool keepAlpha = false;
bool strict = true;
static FrameRequest NonStrict() {
auto result = FrameRequest();
result.strict = false;
return result;
}
[[nodiscard]] bool empty() const {
return blurredBackground ? outer.isEmpty() : resize.isEmpty();
}
[[nodiscard]] bool operator==(const FrameRequest &other) const {
return (resize == other.resize)
&& (outer == other.outer)
&& (rounding == other.rounding)
&& (mask.constBits() == other.mask.constBits())
2022-01-21 15:00:13 +00:00
&& (colored == other.colored)
&& (keepAlpha == other.keepAlpha)
&& (requireARGB32 == other.requireARGB32)
&& (blurredBackground == other.blurredBackground);
}
[[nodiscard]] bool operator!=(const FrameRequest &other) const {
return !(*this == other);
}
[[nodiscard]] bool goodFor(const FrameRequest &other) const {
return (blurredBackground == other.blurredBackground)
&& (requireARGB32 == other.requireARGB32)
&& (keepAlpha == other.keepAlpha)
2022-01-21 15:00:13 +00:00
&& (colored == other.colored)
&& ((strict && !other.strict) || (*this == other));
}
};
2021-06-03 12:57:48 +00:00
enum class FrameFormat {
None,
ARGB32,
YUV420,
NV12,
2021-06-03 12:57:48 +00:00
};
struct FrameChannel {
const void *data = nullptr;
int stride = 0;
};
struct FrameYUV {
2021-06-03 12:57:48 +00:00
QSize size;
QSize chromaSize;
FrameChannel y;
FrameChannel u;
FrameChannel v;
};
struct FrameWithInfo {
QImage image;
FrameYUV *yuv = nullptr;
2021-06-03 12:57:48 +00:00
FrameFormat format = FrameFormat::None;
int index = -1;
2022-01-21 15:00:13 +00:00
bool alpha = false;
2021-06-03 12:57:48 +00:00
};
} // namespace Streaming
} // namespace Media