28 #include <CoreFoundation/CoreFoundation.h>
34 #ifndef kCFCoreFoundationVersionNumber10_7
35 #define kCFCoreFoundationVersionNumber10_7 635.00
80 CVPixelBufferUnlockBaseAddress(context->
cv_buffer, 0);
89 if (!context || !buffer) {
95 pic->
data[0] = (
void *)1;
126 ret = ff_h264_decoder.
decode(avctx, data, got_frame, avpkt);
131 CVPixelBufferRef cv_buffer = (CVPixelBufferRef)pic->
data[3];
133 CVPixelBufferRetain(cv_buffer);
134 CVPixelBufferLockBaseAddress(cv_buffer, 0);
137 if (CVPixelBufferIsPlanar(cv_buffer)) {
138 int i,
count = CVPixelBufferGetPlaneCount(cv_buffer);
140 for (i = 0; i <
count; i++) {
141 pic->
data[i] = CVPixelBufferGetBaseAddressOfPlane(cv_buffer, i);
142 pic->
linesize[i] = CVPixelBufferGetBytesPerRowOfPlane(cv_buffer, i);
145 pic->
data[0] = CVPixelBufferGetBaseAddress(cv_buffer);
146 pic->
linesize[0] = CVPixelBufferGetBytesPerRow(cv_buffer);
162 ff_h264_decoder.
close(avctx);
178 if (!ff_h264_vda_decoder.
pix_fmts) {
212 if (status != kVDADecoderNoErr) {
214 "Failed to init VDA decoder: %d.\n", status);
220 ret = ff_h264_decoder.
init(avctx);
248 ff_h264_decoder.
flush(avctx);
packed YUV 4:2:2, 16bpp, Cb Y0 Cr Y1
const struct AVCodec * codec
static enum AVPixelFormat pix_fmt
This structure describes decoded (raw) audio or video data.
ptrdiff_t const GLvoid * data
static void flush(AVCodecContext *avctx)
void(* flush)(AVCodecContext *)
Flush buffers.
AVBufferRef * sps_list[MAX_SPS_COUNT]
AVBufferRef * buf[AV_NUM_DATA_POINTERS]
AVBuffer references backing the data for this frame.
static av_cold int init(AVCodecContext *avctx)
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
int(* get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags)
AVCodec ff_h264_vda_decoder
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int(* decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt)
int format
The frame format.
OSType cv_pix_fmt_type
The pixel format for output image buffers.
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
int use_ref_buffer
Use av_buffer to manage buffer.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
void * hwaccel_context
Hardware accelerator context.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
static enum AVPixelFormat get_format(struct AVCodecContext *avctx, const enum AVPixelFormat *fmt)
int width
The frame width.
static av_cold int vdadec_init(AVCodecContext *avctx)
static enum AVPixelFormat vda_pixfmts[]
int(* close)(AVCodecContext *)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
planar YUV 4:2:0, 12bpp, 1 plane for Y and 1 plane for the UV components, which are interleaved (firs...
const char * name
Name of the codec implementation.
AVBufferRef * av_buffer_create(uint8_t *data, int size, void(*free)(void *opaque, uint8_t *data), void *opaque, int flags)
Create an AVBuffer from an existing array.
This structure is used to provide the necessary configurations and data to the VDA FFmpeg HWAccel imp...
enum AVPixelFormat(* get_format)(struct AVCodecContext *s, const enum AVPixelFormat *fmt)
static av_cold int vdadec_close(AVCodecContext *avctx)
enum AVPixelFormat * pix_fmts
array of supported pixel formats, or NULL if unknown, array is terminated by -1
int width
picture width / height.
H.264 / AVC / MPEG-4 part10 codec.
enum AVPixelFormat pix_fmt
struct vda_context vda_ctx
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
CVPixelBufferRef cv_buffer
Libavcodec external API header.
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Public libavcodec VDA header.
int ff_vda_destroy_decoder(struct vda_context *vda_ctx)
Destroy the video decoder.
main external API structure.
uint8_t * data
The data buffer.
packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr
static enum AVPixelFormat vda_pixfmts_prior_10_7[]
static void set_context(AVCodecContext *avctx)
void * av_buffer_get_opaque(const AVBufferRef *buf)
enum AVPixelFormat(* get_format)(struct AVCodecContext *s, const enum AVPixelFormat *fmt)
callback to negotiate the pixelFormat
int(* get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags)
This callback is called at the beginning of each frame to get data buffer(s) for it.
int use_sync_decoding
Use the hardware decoder in synchronous mode.
static void vdadec_flush(AVCodecContext *avctx)
#define kCFCoreFoundationVersionNumber10_7
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
A reference to a data buffer.
hardware decoding through VDA
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
static void restore_context(AVCodecContext *avctx)
static void release_buffer(void *opaque, uint8_t *data)
int bit_depth_luma
bit_depth_luma_minus8 + 8
int ff_vda_create_decoder(struct vda_context *vda_ctx, uint8_t *extradata, int extradata_size)
Create the video decoder.
static int vdadec_decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
static int get_buffer2(AVCodecContext *avctx, AVFrame *pic, int flag)
static int decode(AVCodecContext *avctx, AVFrame *frame, int *got_frame, AVPacket *pkt)
int(* init)(AVCodecContext *)
int height
The frame height.
AVPixelFormat
Pixel format.
This structure stores compressed data.