You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
Merge commit 'ce083282f0a8b7d63c4047c30b7bac498f9806dd'
* commit 'ce083282f0a8b7d63c4047c30b7bac498f9806dd': vdpau: common support for managing the VdpDecoder in avcodec Conflicts: libavcodec/vdpau.c Merged-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
@@ -22,7 +22,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
|
#include "libavutil/avassert.h"
|
||||||
#include "avcodec.h"
|
#include "avcodec.h"
|
||||||
|
#include "internal.h"
|
||||||
#include "h264.h"
|
#include "h264.h"
|
||||||
#include "vc1.h"
|
#include "vc1.h"
|
||||||
|
|
||||||
@@ -69,6 +71,68 @@ AVVDPAUContext *av_alloc_vdpaucontext(void)
|
|||||||
|
|
||||||
MAKE_ACCESSORS(AVVDPAUContext, vdpau_hwaccel, AVVDPAU_Render2, render2)
|
MAKE_ACCESSORS(AVVDPAUContext, vdpau_hwaccel, AVVDPAU_Render2, render2)
|
||||||
|
|
||||||
|
int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
|
||||||
|
int level)
|
||||||
|
{
|
||||||
|
VDPAUHWContext *hwctx = avctx->hwaccel_context;
|
||||||
|
VDPAUContext *vdctx = avctx->internal->hwaccel_priv_data;
|
||||||
|
VdpDecoderCreate *create;
|
||||||
|
void *func;
|
||||||
|
VdpStatus status;
|
||||||
|
/* See vdpau/vdpau.h for alignment constraints. */
|
||||||
|
uint32_t width = (avctx->coded_width + 1) & ~1;
|
||||||
|
uint32_t height = (avctx->coded_height + 3) & ~3;
|
||||||
|
|
||||||
|
if (hwctx->context.decoder != VDP_INVALID_HANDLE) {
|
||||||
|
vdctx->decoder = hwctx->context.decoder;
|
||||||
|
vdctx->render = hwctx->context.render;
|
||||||
|
vdctx->device = VDP_INVALID_HANDLE;
|
||||||
|
return 0; /* Decoder created by user */
|
||||||
|
}
|
||||||
|
|
||||||
|
vdctx->device = hwctx->device;
|
||||||
|
vdctx->get_proc_address = hwctx->get_proc_address;
|
||||||
|
|
||||||
|
status = vdctx->get_proc_address(vdctx->device, VDP_FUNC_ID_DECODER_CREATE,
|
||||||
|
&func);
|
||||||
|
if (status != VDP_STATUS_OK)
|
||||||
|
return vdpau_error(status);
|
||||||
|
else
|
||||||
|
create = func;
|
||||||
|
|
||||||
|
status = vdctx->get_proc_address(vdctx->device, VDP_FUNC_ID_DECODER_RENDER,
|
||||||
|
&func);
|
||||||
|
if (status != VDP_STATUS_OK)
|
||||||
|
return vdpau_error(status);
|
||||||
|
else
|
||||||
|
vdctx->render = func;
|
||||||
|
|
||||||
|
status = create(vdctx->device, profile, width, height, avctx->refs,
|
||||||
|
&vdctx->decoder);
|
||||||
|
return vdpau_error(status);
|
||||||
|
}
|
||||||
|
|
||||||
|
int ff_vdpau_common_uninit(AVCodecContext *avctx)
|
||||||
|
{
|
||||||
|
VDPAUContext *vdctx = avctx->internal->hwaccel_priv_data;
|
||||||
|
VdpDecoderDestroy *destroy;
|
||||||
|
void *func;
|
||||||
|
VdpStatus status;
|
||||||
|
|
||||||
|
if (vdctx->device == VDP_INVALID_HANDLE)
|
||||||
|
return 0; /* Decoder created and destroyed by user */
|
||||||
|
|
||||||
|
status = vdctx->get_proc_address(vdctx->device,
|
||||||
|
VDP_FUNC_ID_DECODER_DESTROY, &func);
|
||||||
|
if (status != VDP_STATUS_OK)
|
||||||
|
return vdpau_error(status);
|
||||||
|
else
|
||||||
|
destroy = func;
|
||||||
|
|
||||||
|
status = destroy(vdctx->decoder);
|
||||||
|
return vdpau_error(status);
|
||||||
|
}
|
||||||
|
|
||||||
int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic_ctx,
|
int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic_ctx,
|
||||||
av_unused const uint8_t *buffer,
|
av_unused const uint8_t *buffer,
|
||||||
av_unused uint32_t size)
|
av_unused uint32_t size)
|
||||||
|
@@ -55,6 +55,34 @@ union AVVDPAUPictureInfo {
|
|||||||
#include "vdpau.h"
|
#include "vdpau.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
typedef struct VDPAUHWContext {
|
||||||
|
AVVDPAUContext context;
|
||||||
|
VdpDevice device;
|
||||||
|
VdpGetProcAddress *get_proc_address;
|
||||||
|
} VDPAUHWContext;
|
||||||
|
|
||||||
|
typedef struct VDPAUContext {
|
||||||
|
/**
|
||||||
|
* VDPAU device handle
|
||||||
|
*/
|
||||||
|
VdpDevice device;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VDPAU decoder handle
|
||||||
|
*/
|
||||||
|
VdpDecoder decoder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VDPAU device driver
|
||||||
|
*/
|
||||||
|
VdpGetProcAddress *get_proc_address;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* VDPAU decoder render callback
|
||||||
|
*/
|
||||||
|
VdpDecoderRender *render;
|
||||||
|
} VDPAUContext;
|
||||||
|
|
||||||
struct vdpau_picture_context {
|
struct vdpau_picture_context {
|
||||||
/**
|
/**
|
||||||
* VDPAU picture information.
|
* VDPAU picture information.
|
||||||
@@ -76,8 +104,13 @@ struct vdpau_picture_context {
|
|||||||
*/
|
*/
|
||||||
VdpBitstreamBuffer *bitstream_buffers;
|
VdpBitstreamBuffer *bitstream_buffers;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
|
||||||
|
int level);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int ff_vdpau_common_uninit(AVCodecContext *avctx);
|
||||||
|
|
||||||
int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic,
|
int ff_vdpau_common_start_frame(struct vdpau_picture_context *pic,
|
||||||
const uint8_t *buffer, uint32_t size);
|
const uint8_t *buffer, uint32_t size);
|
||||||
int ff_vdpau_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
|
int ff_vdpau_common_end_frame(AVCodecContext *avctx, AVFrame *frame,
|
||||||
|
Reference in New Issue
Block a user