X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=libavcodec%2Fthread.h;h=864e67eb98b45c8db7c1a46879a9c8ce3f6b06e3;hb=6fee1b90ce3bf4fbdfde7016e0890057c9000487;hp=7f018fc441b68b20602fc6985255ec556932f2b0;hpb=58c42af722cebecd86e340dc3ed9ec44b1fe4a55;p=ffmpeg diff --git a/libavcodec/thread.h b/libavcodec/thread.h index 7f018fc441b..864e67eb98b 100644 --- a/libavcodec/thread.h +++ b/libavcodec/thread.h @@ -27,9 +27,19 @@ #ifndef AVCODEC_THREAD_H #define AVCODEC_THREAD_H +#include "libavutil/buffer.h" + #include "config.h" #include "avcodec.h" +typedef struct ThreadFrame { + AVFrame *f; + AVCodecContext *owner; + // progress->data is an array of 2 ints holding progress for top/bottom + // fields + AVBufferRef *progress; +} ThreadFrame; + /** * Wait for decoding threads to finish and reset internal state. * Called by avcodec_flush_buffers(). @@ -43,7 +53,7 @@ void ff_thread_flush(AVCodecContext *avctx); * Returns the next available frame in picture. *got_picture_ptr * will be 0 if none is available. * The return value on success is the size of the consumed packet for - * compatiblity with avcodec_decode_video2(). This means the decoder + * compatibility with avcodec_decode_video2(). This means the decoder * has to consume the full packet. * * Parameters are the same as avcodec_decode_video2(). @@ -71,7 +81,7 @@ void ff_thread_finish_setup(AVCodecContext *avctx); * @param field The field being decoded, for field-picture codecs. * 0 for top field or frame pictures, 1 for bottom field. */ -void ff_thread_report_progress(AVFrame *f, int progress, int field); +void ff_thread_report_progress(ThreadFrame *f, int progress, int field); /** * Wait for earlier decoding threads to finish reference pictures. @@ -85,17 +95,17 @@ void ff_thread_report_progress(AVFrame *f, int progress, int field); * @param field The field being referenced, for field-picture codecs. * 0 for top field or frame pictures, 1 for bottom field. */ -void ff_thread_await_progress(AVFrame *f, int progress, int field); +void ff_thread_await_progress(ThreadFrame *f, int progress, int field); /** * Wrapper around get_buffer() for frame-multithreaded codecs. - * Call this function instead of avctx->get_buffer(f). + * Call this function instead of ff_get_buffer(f). * Cannot be called after the codec has called ff_thread_finish_setup(). * * @param avctx The current context. * @param f The frame to write into. */ -int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f); +int ff_thread_get_buffer(AVCodecContext *avctx, ThreadFrame *f, int flags); /** * Wrapper around release_buffer() frame-for multithreaded codecs. @@ -108,7 +118,9 @@ int ff_thread_get_buffer(AVCodecContext *avctx, AVFrame *f); * @param avctx The current context. * @param f The picture being released. */ -void ff_thread_release_buffer(AVCodecContext *avctx, AVFrame *f); +void ff_thread_release_buffer(AVCodecContext *avctx, ThreadFrame *f); + +int ff_thread_ref_frame(ThreadFrame *dst, ThreadFrame *src); int ff_thread_init(AVCodecContext *s); void ff_thread_free(AVCodecContext *s);