#ifndef MEDIA_BASE_DECODER_STATUS_H_
#define MEDIA_BASE_DECODER_STATUS_H_
#include <ostream>
#include "base/time/time.h"
#include "media/base/decoder_buffer.h"
#include "media/base/media_export.h"
#include "media/base/status.h"
namespace media {
struct DecoderStatusTraits {
enum class Codes : StatusCodeType {
kOk = 0,
kFailed = 1,
kAborted = 2,
kInvalidArgument = 3,
kInterrupted = 4,
kDisconnected = 5,
kOutOfMemory = 6,
kNotInitialized = 100,
kMissingCDM = 101,
kFailedToGetVideoFrame = 102,
kPlatformDecodeFailure = 103,
kMalformedBitstream = 104,
kFailedToGetDecoderBuffer = 107,
kDecoderStreamInErrorState = 108,
kDecoderStreamDemuxerError = 110,
kKeyFrameRequired = 111,
kMissingTimestamp = 112,
kUnsupportedProfile = 200,
kUnsupportedCodec = 201,
kUnsupportedConfig = 202,
kUnsupportedEncryptionMode = 203,
kCantChangeCodec = 204,
kFailedToCreateDecoder = 205,
kTooManyDecoders = 206,
kMediaFoundationNotAvailable = 207,
kElidedEndOfStreamForConfigChange = 300
};
static constexpr StatusGroupType Group() { return "DecoderStatus"; }
};
using DecoderStatus = TypedStatus<DecoderStatusTraits>;
MEDIA_EXPORT std::ostream& operator<<(std::ostream& os,
const DecoderStatus& status);
class MEDIA_EXPORT ScopedDecodeTrace {
public:
ScopedDecodeTrace(const char* trace_name, const DecoderBuffer& buffer);
ScopedDecodeTrace(const char* trace_name,
bool is_key_frame,
base::TimeDelta timestamp);
explicit ScopedDecodeTrace(const char* trace_name);
ScopedDecodeTrace(const ScopedDecodeTrace&) = delete;
ScopedDecodeTrace& operator=(const ScopedDecodeTrace&) = delete;
~ScopedDecodeTrace();
void EndTrace(const DecoderStatus& status);
private:
const char* trace_name_;
bool closed_ = false;
};
}
#endif