blob: b57f6c14d0763d6a93d5fe8a3a79d3c40aef9447 [file] [log] [blame]
// Copyright 2020 The Chromium 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 ANDROID_V4L2_CODEC2_COMPONENTS_V4L2_DECODE_INTERFACE_H
#define ANDROID_V4L2_CODEC2_COMPONENTS_V4L2_DECODE_INTERFACE_H
#include <memory>
#include <string>
#include <C2Config.h>
#include <util/C2InterfaceHelper.h>
#include <size.h>
#include <v4l2_codec2/common/VideoTypes.h>
namespace android {
class V4L2DecodeInterface : public C2InterfaceHelper {
public:
V4L2DecodeInterface(const std::string& name, const std::shared_ptr<C2ReflectorHelper>& helper);
V4L2DecodeInterface(const V4L2DecodeInterface&) = delete;
V4L2DecodeInterface& operator=(const V4L2DecodeInterface&) = delete;
~V4L2DecodeInterface() = default;
// interfaces for the client component.
c2_status_t status() const { return mInitStatus; }
C2BlockPool::local_id_t getBlockPoolId() const { return mOutputBlockPoolIds->m.values[0]; }
std::optional<VideoCodec> getVideoCodec() const { return mVideoCodec; }
media::Size getMaxSize() const { return mMaxSize; }
media::Size getMinSize() const { return mMinSize; }
size_t getInputBufferSize() const;
c2_status_t queryColorAspects(
std::shared_ptr<C2StreamColorAspectsInfo::output>* targetColorAspects);
private:
// Configurable parameter setters.
static C2R ProfileLevelSetter(bool mayBlock, C2P<C2StreamProfileLevelInfo::input>& info);
static C2R SizeSetter(bool mayBlock, C2P<C2StreamPictureSizeInfo::output>& videoSize);
static C2R MaxInputBufferSizeCalculator(bool mayBlock,
C2P<C2StreamMaxBufferSizeInfo::input>& me,
const C2P<C2StreamPictureSizeInfo::output>& size);
template <typename T>
static C2R DefaultColorAspectsSetter(bool mayBlock, C2P<T>& def);
static C2R MergedColorAspectsSetter(bool mayBlock,
C2P<C2StreamColorAspectsInfo::output>& merged,
const C2P<C2StreamColorAspectsTuning::output>& def,
const C2P<C2StreamColorAspectsInfo::input>& coded);
// The input format kind; should be C2FormatCompressed.
std::shared_ptr<C2StreamBufferTypeSetting::input> mInputFormat;
// The memory usage flag of input buffer; should be BufferUsage::VIDEO_DECODER.
std::shared_ptr<C2StreamUsageTuning::input> mInputMemoryUsage;
// The output format kind; should be C2FormatVideo.
std::shared_ptr<C2StreamBufferTypeSetting::output> mOutputFormat;
// The MIME type of input port.
std::shared_ptr<C2PortMediaTypeSetting::input> mInputMediaType;
// The MIME type of output port; should be MEDIA_MIMETYPE_VIDEO_RAW.
std::shared_ptr<C2PortMediaTypeSetting::output> mOutputMediaType;
// The number of additional output frames that might need to be generated before an output
// buffer can be released by the component; only used for H264 because H264 may reorder the
// output frames.
std::shared_ptr<C2PortDelayTuning::output> mOutputDelay;
// The input codec profile and level. For now configuring this parameter is useless since
// the component always uses fixed codec profile to initialize accelerator. It is only used
// for the client to query supported profile and level values.
// TODO: use configured profile/level to initialize accelerator.
std::shared_ptr<C2StreamProfileLevelInfo::input> mProfileLevel;
// Decoded video size for output.
std::shared_ptr<C2StreamPictureSizeInfo::output> mSize;
// Maximum size of one input buffer.
std::shared_ptr<C2StreamMaxBufferSizeInfo::input> mMaxInputSize;
// The suggested usage of input buffer allocator ID.
std::shared_ptr<C2PortAllocatorsTuning::input> mInputAllocatorIds;
// The suggested usage of output buffer allocator ID.
std::shared_ptr<C2PortAllocatorsTuning::output> mOutputAllocatorIds;
// The suggested usage of output buffer allocator ID with surface.
std::shared_ptr<C2PortSurfaceAllocatorTuning::output> mOutputSurfaceAllocatorId;
// Component uses this ID to fetch corresponding output block pool from platform.
std::shared_ptr<C2PortBlockPoolsTuning::output> mOutputBlockPoolIds;
// The color aspects parsed from input bitstream. This parameter should be configured by
// component while decoding.
std::shared_ptr<C2StreamColorAspectsInfo::input> mCodedColorAspects;
// The default color aspects specified by requested output format. This parameter should be
// configured by client.
std::shared_ptr<C2StreamColorAspectsTuning::output> mDefaultColorAspects;
// The combined color aspects by |mCodedColorAspects| and |mDefaultColorAspects|, and the
// former has higher priority. This parameter is used for component to provide color aspects
// as C2Info in decoded output buffers.
std::shared_ptr<C2StreamColorAspectsInfo::output> mColorAspects;
c2_status_t mInitStatus;
std::optional<VideoCodec> mVideoCodec;
media::Size mMinSize;
media::Size mMaxSize;
};
} // namespace android
#endif // ANDROID_V4L2_CODEC2_COMPONENTS_V4L2_DECODE_INTERFACE_H