10#include <libavcodec/mediacodec.h>
11#include <libavutil/hwcontext_mediacodec.h>
14#if !defined(Q_OS_ANDROID)
15# error "Configuration error"
35 AVMediaCodecContext *mediacodecContext = av_mediacodec_alloc_context();
36 av_mediacodec_default_init(avCodecContext, mediacodecContext, androidSurfaceTexture->surface());
38 if (!avCodecContext->hw_device_ctx || !avCodecContext->hw_device_ctx->data)
41 AVHWDeviceContext *deviceContext =
42 reinterpret_cast<AVHWDeviceContext *
>(avCodecContext->hw_device_ctx->data);
44 if (!deviceContext->hwctx)
47 AVMediaCodecDeviceContext *mediaDeviceContext =
48 reinterpret_cast<AVMediaCodecDeviceContext *
>(deviceContext->hwctx);
50 if (!mediaDeviceContext)
53 mediaDeviceContext->surface = androidSurfaceTexture->surface();
58 if (!androidSurfaceTexture->isValid())
61 if (!externalTexture) {
62 androidSurfaceTexture->detachFromGLContext();
63 externalTexture = std::unique_ptr<QRhiTexture>(
67 if (!externalTexture->create()) {
68 qWarning() <<
"Failed to create the external texture!";
72 quint64 textureHandle = externalTexture->nativeTexture().object;
73 androidSurfaceTexture->attachToGLContext(textureHandle);
77 AVMediaCodecBuffer *
buffer = (AVMediaCodecBuffer *)
frame->data[3];
80 qWarning() <<
"Received a frame without AVMediaCodecBuffer.";
81 }
else if (av_mediacodec_release_buffer(
buffer, 1) < 0) {
82 qWarning() <<
"Failed to render buffer to surface.";
86 androidSurfaceTexture->updateTexImage();
static void setupDecoderSurface(AVCodecContext *s)
TextureSet * getTextures(AVFrame *frame) override
qint64 textureHandle(int plane) override
MediaCodecTextureSet(qint64 textureHandle)
QRhiTexture * newTexture(QRhiTexture::Format format, const QSize &pixelSize, int sampleCount=1, QRhiTexture::Flags flags={})
#define Q_GLOBAL_STATIC(TYPE, NAME,...)
GLuint64 GLenum void * handle
unsigned long long quint64