blob: 358b5b18228d379fe5e592d2328cb2d2bad4eea8 [file] [log] [blame]
// Copyright 2017 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_VAAPI_VAAPI_PICTURE_FACTORY_H_
#define MEDIA_GPU_VAAPI_VAAPI_PICTURE_FACTORY_H_
#include <stdint.h>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "media/gpu/vaapi/vaapi_picture.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gl/gl_implementation.h"
namespace media {
class PictureBuffer;
class VaapiWrapper;
using CreatePictureCB = base::RepeatingCallback<std::unique_ptr<VaapiPicture>(
scoped_refptr<VaapiWrapper>,
const MakeGLContextCurrentCallback&,
const BindGLImageCallback&,
const PictureBuffer&,
const gfx::Size&,
uint32_t,
uint32_t)>;
// Factory of platform dependent VaapiPictures.
class MEDIA_GPU_EXPORT VaapiPictureFactory {
public:
enum VaapiImplementation {
kVaapiImplementationNone = 0,
kVaapiImplementationDrm,
kVaapiImplementationX11,
kVaapiImplementationAngle,
};
VaapiPictureFactory();
VaapiPictureFactory(const VaapiPictureFactory&) = delete;
VaapiPictureFactory& operator=(const VaapiPictureFactory&) = delete;
virtual ~VaapiPictureFactory();
// Creates a VaapiPicture of picture_buffer.size() associated with
// picture_buffer.id().
virtual std::unique_ptr<VaapiPicture> Create(
scoped_refptr<VaapiWrapper> vaapi_wrapper,
const MakeGLContextCurrentCallback& make_context_current_cb,
const BindGLImageCallback& bind_image_cb,
const PictureBuffer& picture_buffer,
const gfx::Size& visible_size);
// Return the type of the VaapiPicture implementation for the given GL
// implementation.
VaapiImplementation GetVaapiImplementation(gl::GLImplementation gl_impl);
// Determines whether the DownloadFromSurface() method of the VaapiPictures
// created by this factory requires a processing pipeline VaapiWrapper.
bool NeedsProcessingPipelineForDownloading() const;
// Gets the texture target used to bind EGLImages (either GL_TEXTURE_2D on X11
// or GL_TEXTURE_EXTERNAL_OES on DRM).
uint32_t GetGLTextureTarget();
// Buffer format to use for output buffers backing PictureBuffers. This is
// the format decoded frames in VASurfaces are converted into.
gfx::BufferFormat GetBufferFormat();
std::unique_ptr<VaapiPicture> CreateVaapiPictureNative(
scoped_refptr<VaapiWrapper> vaapi_wrapper,
const MakeGLContextCurrentCallback& make_context_current_cb,
const BindGLImageCallback& bind_image_cb,
const PictureBuffer& picture_buffer,
const gfx::Size& visible_size,
uint32_t client_texture_id,
uint32_t service_texture_id);
std::map<gl::GLImplementation, VaapiPictureFactory::VaapiImplementation>
vaapi_impl_pairs_;
private:
void DeterminePictureCreationAndDownloadingMechanism();
CreatePictureCB create_picture_cb_;
bool needs_vpp_for_downloading_ = false;
};
} // namespace media
#endif // MEDIA_GPU_VAAPI_VAAPI_PICTURE_FACTORY_H_