summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorGwenole Beauchesne <gbeauchesne@splitted-desktop.com>2009-02-23 13:44:51 +0000
committerMichael Niedermayer <michaelni@gmx.at>2009-02-23 13:44:51 +0000
commit40e5d31b576fcd0674acf35ce2120242a72dd801 (patch)
tree3ed8ebd14acb62a2320239f6f6171feef8d1b00d /libavcodec
parentc269cf68a0d1579f41e082288072e3f182ef2b5f (diff)
More approved hunks for VAAPI & our new and cleaner hwaccel API.
patch by Gwenole Beauchesne gbeauchesne splitted-desktop com Originally committed as revision 17540 to svn://svn.ffmpeg.org/ffmpeg/trunk
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/avcodec.h100
-rw-r--r--libavcodec/error_resilience.c1
-rw-r--r--libavcodec/h263dec.c4
-rw-r--r--libavcodec/h264.c3
4 files changed, 108 insertions, 0 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index f38ad2bdb7..cfe38c5edb 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -2315,6 +2315,13 @@ typedef struct AVCodecContext {
* - decoding: unused.
*/
float rc_min_vbv_overflow_use;
+
+ /**
+ * Hardware accelerator in use
+ * - encoding: unused.
+ * - decoding: Set by libavcodec
+ */
+ struct AVHWAccel *hwaccel;
} AVCodecContext;
/**
@@ -2360,6 +2367,87 @@ typedef struct AVCodec {
} AVCodec;
/**
+ * AVHWAccel.
+ */
+typedef struct AVHWAccel {
+ /**
+ * Name of the hardware accelerated codec.
+ * The name is globally unique among encoders and among decoders (but an
+ * encoder and a decoder can share the same name).
+ */
+ const char *name;
+
+ /**
+ * Type of codec implemented by the hardware accelerator.
+ *
+ * See CODEC_TYPE_xxx
+ */
+ enum CodecType type;
+
+ /**
+ * Codec implemented by the hardware accelerator.
+ *
+ * See CODEC_ID_xxx
+ */
+ enum CodecID id;
+
+ /**
+ * Supported pixel format.
+ *
+ * Only hardware accelerated formats are supported here.
+ */
+ enum PixelFormat pix_fmt;
+
+ /**
+ * Hardware accelerated codec capabilities.
+ * see FF_HWACCEL_CODEC_CAP_*
+ */
+ int capabilities;
+
+ struct AVHWAccel *next;
+
+ /**
+ * Called at the beginning of each frame or field picture.
+ *
+ * Meaningful frame information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ *
+ * Note that \p buf can be NULL along with \p buf_size set to 0.
+ * Otherwise, this means the whole frame is available at this point.
+ *
+ * @param avctx the codec context
+ * @param buf the frame data buffer base
+ * @param buf_size the size of the frame in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*start_frame)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Callback for each slice.
+ *
+ * Meaningful slice information (codec specific) is guaranteed to
+ * be parsed at this point. This function is mandatory.
+ *
+ * @param avctx the codec context
+ * @param buf the slice data buffer base
+ * @param buf_size the size of the slice in bytes
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*decode_slice)(AVCodecContext *avctx, const uint8_t *buf, uint32_t buf_size);
+
+ /**
+ * Called at the end of each frame or field picture.
+ *
+ * The whole picture is parsed at this point and can now be sent
+ * to the hardware accelerator. This function is mandatory.
+ *
+ * @param avctx the codec context
+ * @return zero if successful, a negative value otherwise
+ */
+ int (*end_frame)(AVCodecContext *avctx);
+} AVHWAccel;
+
+/**
* four components are given, that's all.
* the last component is alpha
*/
@@ -3196,4 +3284,16 @@ int av_parse_video_frame_rate(AVRational *frame_rate, const char *str);
#define AVERROR_EOF AVERROR(EPIPE) /**< End of file. */
#define AVERROR_PATCHWELCOME -MKTAG('P','A','W','E') /**< Not yet implemented in FFmpeg. Patches welcome. */
+/**
+ * Registers the hardware accelerator \p hwaccel.
+ */
+void av_register_hwaccel(AVHWAccel *hwaccel);
+
+/**
+ * If hwaccel is NULL, returns the first registered hardware accelerator,
+ * if hwaccel is non-NULL, returns the next registered hardware accelerator
+ * after hwaccel, or NULL if hwaccel is the last one.
+ */
+AVHWAccel *av_hwaccel_next(AVHWAccel *hwaccel);
+
#endif /* AVCODEC_AVCODEC_H */
diff --git a/libavcodec/error_resilience.c b/libavcodec/error_resilience.c
index a196326e01..c21bc70d1e 100644
--- a/libavcodec/error_resilience.c
+++ b/libavcodec/error_resilience.c
@@ -680,6 +680,7 @@ void ff_er_frame_end(MpegEncContext *s){
Picture *pic= s->current_picture_ptr;
if(!s->error_recognition || s->error_count==0 || s->avctx->lowres ||
+ s->avctx->hwaccel ||
s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU ||
s->error_count==3*s->mb_width*(s->avctx->skip_top + s->avctx->skip_bottom)) return;
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 4cd2ce85aa..d2c8fd17f7 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -25,6 +25,7 @@
* H.263 decoder.
*/
+#include "internal.h"
#include "avcodec.h"
#include "dsputil.h"
#include "mpegvideo.h"
@@ -159,6 +160,9 @@ static int decode_slice(MpegEncContext *s){
ff_set_qscale(s, s->qscale);
+ if (s->avctx->hwaccel)
+ return 0;
+
if(s->partitioned_frame){
const int qscale= s->qscale;
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 5339ed017e..6ea09b086e 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -25,6 +25,7 @@
* @author Michael Niedermayer <michaelni@gmx.at>
*/
+#include "internal.h"
#include "dsputil.h"
#include "avcodec.h"
#include "mpegvideo.h"
@@ -7356,6 +7357,8 @@ static void execute_decode_slices(H264Context *h, int context_count){
H264Context *hx;
int i;
+ if (s->avctx->hwaccel)
+ return;
if(s->avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
return;
if(context_count == 1) {