vda.h 3.97 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
/*
 * VDA HW acceleration
 *
 * copyright (c) 2011 Sebastien Zwickert
 *
 * This file is part of FFmpeg.
 *
 * FFmpeg is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * FFmpeg is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with FFmpeg; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#ifndef AVCODEC_VDA_H
#define AVCODEC_VDA_H

#include <stdint.h>

// emmintrin.h is unable to compile with -std=c99 -Werror=missing-prototypes
// http://openradar.appspot.com/8026390
#undef __GNUC_STDC_INLINE__

Sebastien Zwickert's avatar
Sebastien Zwickert committed
32
#define Picture QuickdrawPicture
33
#include <VideoDecodeAcceleration/VDADecoder.h>
Sebastien Zwickert's avatar
Sebastien Zwickert committed
34
#undef Picture
35 36 37 38

/**
 *  This structure is used to store a decoded frame information and data.
 */
Clément Bœsch's avatar
Clément Bœsch committed
39
typedef struct {
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
    /**
    * The PTS of the frame.
    *
    * - encoding: unused
    * - decoding: Set/Unset by libavcodec.
    */
    int64_t             pts;

    /**
    * The CoreVideo buffer that contains the decoded data.
    *
    * - encoding: unused
    * - decoding: Set/Unset by libavcodec.
    */
    CVPixelBufferRef    cv_buffer;

    /**
    * A pointer to the next frame.
    *
    * - encoding: unused
    * - decoding: Set/Unset by libavcodec.
    */
    struct vda_frame    *next_frame;

} vda_frame;

/**
 * This structure is used to provide the necessary configurations and data
 * to the VDA FFmpeg HWAccel implementation.
 *
 * The application must make it available as AVCodecContext.hwaccel_context.
 */
struct vda_context {
    /**
    * VDA decoder object.
    *
    * - encoding: unused
    * - decoding: Set/Unset by libavcodec.
    */
    VDADecoder          decoder;

    /**
    * VDA frames queue ordered by presentation timestamp.
    *
    * - encoding: unused
    * - decoding: Set/Unset by libavcodec.
    */
    vda_frame           *queue;

    /**
    * Mutex for locking queue operations.
    *
    * - encoding: unused
    * - decoding: Set/Unset by libavcodec.
    */
    void                *queue_mutex;

    /**
    * The frame width.
    *
    * - encoding: unused
    * - decoding: Set/Unset by user.
    */
    int                 width;

    /**
    * The frame height.
    *
    * - encoding: unused
    * - decoding: Set/Unset by user.
    */
    int                 height;

    /**
    * The frame format.
    *
    * - encoding: unused
    * - decoding: Set/Unset by user.
    */
    int                 format;
120 121 122 123 124 125 126 127

    /**
    * The pixel format for output image buffers.
    *
    * - encoding: unused
    * - decoding: Set/Unset by user.
    */
    OSType              cv_pix_fmt_type;
128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151

    /**
    * The current bitstream buffer.
    *
    * - encoding: unused
    * - decoding: Set/Unset by libavcodec.
    */
    uint8_t             *bitstream;

    /**
    * The current size of the bitstream.
    *
    * - encoding: unused
    * - decoding: Set/Unset by libavcodec.
    */
    int                 bitstream_size;

    /**
    * The reference size used for fast reallocation.
    *
    * - encoding: unused
    * - decoding: Set/Unset by libavcodec.
    */
    int                 ref_size;
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
};

/** Creates the video decoder. */
int ff_vda_create_decoder(struct vda_context *vda_ctx,
                          uint8_t *extradata,
                          int extradata_size);

/** Destroys the video decoder. */
int ff_vda_destroy_decoder(struct vda_context *vda_ctx);

/** Returns the top frame of the queue. */
vda_frame *ff_vda_queue_pop(struct vda_context *vda_ctx);

/** Releases the given frame. */
void ff_vda_release_vda_frame(vda_frame *frame);

#endif /* AVCODEC_VDA_H */