diff options
author | Gwenole Beauchesne <gbeauchesne@splitted-desktop.com> | 2009-02-23 13:44:51 +0000 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2009-02-23 13:44:51 +0000 |
commit | 40e5d31b576fcd0674acf35ce2120242a72dd801 (patch) | |
tree | 3ed8ebd14acb62a2320239f6f6171feef8d1b00d /libavcodec | |
parent | c269cf68a0d1579f41e082288072e3f182ef2b5f (diff) | |
download | ffmpeg-40e5d31b576fcd0674acf35ce2120242a72dd801.tar.gz |
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.h | 100 | ||||
-rw-r--r-- | libavcodec/error_resilience.c | 1 | ||||
-rw-r--r-- | libavcodec/h263dec.c | 4 | ||||
-rw-r--r-- | libavcodec/h264.c | 3 |
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) { |