blob: 4fd1757e95d005a274a157b4a2dc62fbd186e7c0 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_MEDIA_CODEC_CODECS_VAAPI_MJPEG_DECODER_H_
#define SRC_MEDIA_CODEC_CODECS_VAAPI_MJPEG_DECODER_H_
#include <cstdint>
#include <memory>
#include <optional>
#include "media/gpu/accelerated_video_decoder.h"
#include "media/gpu/codec_picture.h"
#include "media/parsers/jpeg_parser.h"
namespace media {
class JPEGPicture : public CodecPicture {
public:
JPEGPicture() = default;
// Disallow copying
JPEGPicture(const JPEGPicture&) = delete;
JPEGPicture& operator=(const JPEGPicture&) = delete;
void set_frame_header(const media::JpegFrameHeader& frame_header) {
frame_header_ = frame_header;
}
const media::JpegFrameHeader& frame_header() const { return frame_header_; }
protected:
~JPEGPicture() override = default;
private:
media::JpegFrameHeader frame_header_;
};
// Takes a MJPEG stream and parses and decodes the images contained within that stream.
class MJPEGDecoder : public media::AcceleratedVideoDecoder {
public:
class MJPEGAccelerator {
public:
enum class Status {
// Operation completed successfully.
kOk,
// Operation failed.
kFail,
};
MJPEGAccelerator();
virtual ~MJPEGAccelerator();
// Disallow copying
MJPEGAccelerator(const MJPEGAccelerator&) = delete;
MJPEGAccelerator& operator=(const MJPEGAccelerator&) = delete;
virtual std::shared_ptr<JPEGPicture> CreateJPEGPicture() = 0;
virtual Status SubmitDecode(std::shared_ptr<media::JPEGPicture> picture,
const media::JpegParseResult& parse_result) = 0;
virtual bool OutputPicture(std::shared_ptr<JPEGPicture> picture) = 0;
};
explicit MJPEGDecoder(std::unique_ptr<MJPEGAccelerator> accelerator);
~MJPEGDecoder() override;
// Disallow copying
MJPEGDecoder(const MJPEGDecoder&) = delete;
MJPEGDecoder& operator=(const MJPEGDecoder&) = delete;
// AcceleratedVideoDecoder implementation.
void SetStream(int32_t id, const DecoderBuffer& decoder_buffer) override;
[[nodiscard]] bool Flush() override;
void Reset() override;
[[nodiscard]] DecodeResult Decode() override;
gfx::Size GetPicSize() const override;
gfx::Rect GetVisibleRect() const override;
VideoCodecProfile GetProfile() const override;
uint8_t GetBitDepth() const override;
size_t GetRequiredNumOfPictures() const override;
size_t GetNumReferenceFrames() const override;
bool IsCurrentFrameKeyframe() const override;
private:
static constexpr uint32_t kInvalidVaFormat = 0u;
static uint32_t VaFormatFromFrameHeader(const JpegFrameHeader& frame_header);
// Stream settings
int32_t stream_id_;
const uint8_t* stream_data_;
size_t stream_bytes_left_;
// Saved parse result when returning |kConfigChange| signaling a resolution change
std::optional<JpegParseResult> pending_parse_result_;
// Current coded resolution.
gfx::Size pic_size_;
// Visible rectangle on the most recent allocation.
gfx::Rect visible_rect_;
// Underlying hardware accelerator that will process JPEG decoding operations
const std::unique_ptr<MJPEGAccelerator> accelerator_;
};
} // namespace media
#endif /* SRC_MEDIA_CODEC_CODECS_VAAPI_MJPEG_DECODER_H_ */