blob: 5495a758c5103323ebceb5435ca9c008ddc774c0 [file] [log] [blame]
// Copyright 2018 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 GARNET_BIN_MEDIA_CODECS_SW_FFMPEG_CODEC_ADAPTER_FFMPEG_DECODER_H_
#define GARNET_BIN_MEDIA_CODECS_SW_FFMPEG_CODEC_ADAPTER_FFMPEG_DECODER_H_
#include <codec_adapter_sw.h>
#include "avcodec_context.h"
#include "buffer_pool.h"
class CodecAdapterFfmpegDecoder
: public CodecAdapterSW<AvCodecContext::AVFramePtr> {
public:
CodecAdapterFfmpegDecoder(std::mutex& lock,
CodecAdapterEvents* codec_adapter_events);
~CodecAdapterFfmpegDecoder();
fuchsia::sysmem::BufferCollectionConstraints
CoreCodecGetBufferCollectionConstraints(
CodecPort port,
const fuchsia::media::StreamBufferConstraints& stream_buffer_constraints,
const fuchsia::media::StreamBufferPartialSettings& partial_settings) override;
void CoreCodecSetBufferCollectionInfo(
CodecPort port,
const fuchsia::sysmem::BufferCollectionInfo_2& buffer_collection_info) override;
protected:
// Processes input in a loop. Should only execute on input_processing_thread_.
// Loops for the lifetime of a stream.
void ProcessInputLoop() override;
std::pair<fuchsia::media::FormatDetails, size_t> OutputFormatDetails()
override;
void CleanUpAfterStream() override;
private:
static void FfmpegFreeBufferCallback(void* ctx, uint8_t* base);
// Allocates buffer for a frame for ffmpeg.
int GetBuffer(const AvCodecContext::FrameBufferRequest& decoded_output_info,
AVCodecContext* avcodec_context, AVFrame* frame, int flags);
// Decodes frames until the decoder is empty.
void DecodeFrames();
std::optional<AvCodecContext::FrameBufferRequest> decoded_output_info_
FXL_GUARDED_BY(lock_);
std::unique_ptr<AvCodecContext> avcodec_context_;
};
#endif // GARNET_BIN_MEDIA_CODECS_SW_FFMPEG_CODEC_ADAPTER_FFMPEG_DECODER_H_