blob: 5019fe8129229dea6aba04533244956602702254 [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 MEDIA_GPU_MAC_VP9_SUPER_FRAME_BITSTREAM_FILTER_H_
#define MEDIA_GPU_MAC_VP9_SUPER_FRAME_BITSTREAM_FILTER_H_
#include <vector>
#include <CoreMedia/CoreMedia.h>
#include "base/mac/scoped_cftyperef.h"
#include "media/base/decoder_buffer.h"
#include "media/gpu/media_gpu_export.h"
namespace media {
class Vp9RawBitsReader;
// Combines alt-ref VP9 buffers into super frames and passes through non-alt-ref
// buffers without modification.
class MEDIA_GPU_EXPORT VP9SuperFrameBitstreamFilter {
public:
VP9SuperFrameBitstreamFilter();
~VP9SuperFrameBitstreamFilter();
// Adds a buffer for processing. Clients must call take_buffer() after this
// to see if a buffer is ready for processing.
bool EnqueueBuffer(scoped_refptr<DecoderBuffer> buffer);
// Releases any pending data.
void Flush();
// Releases any prepared buffer. Returns null if no buffers are available.
base::ScopedCFTypeRef<CMBlockBufferRef> take_buffer() {
return std::move(data_);
}
bool has_buffers_for_testing() const {
return data_ || !partial_buffers_.empty();
}
private:
bool ShouldShowFrame(Vp9RawBitsReader* reader);
bool PreparePassthroughBuffer(scoped_refptr<DecoderBuffer> buffer);
bool AllocateCombinedBlock(size_t total_size);
bool MergeBuffer(const DecoderBuffer& buffer, size_t offset);
bool BuildSuperFrame();
// Prepared CMBlockBuffer -- either by assembling |partial_buffers_| or when
// a super frame is unnecessary, just by passing through DecoderBuffer.
base::ScopedCFTypeRef<CMBlockBufferRef> data_;
// Partial buffers which need to be assembled into a super frame.
std::vector<scoped_refptr<DecoderBuffer>> partial_buffers_;
};
} // namespace media
#endif // MEDIA_GPU_MAC_VP9_SUPER_FRAME_BITSTREAM_FILTER_H_