+++ /dev/null
-From b52c216539bdbee830e0d306b372037d4e0cb35f Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= <Reimar.Doeffinger@gmx.de>
-Date: Sun, 8 Mar 2015 19:44:12 +0100
-Subject: [PATCH] pthread: Fix ff_thread_get_format issues when called outside
- frame decode
-
-Patch part of the XBMC patch set for ffmpeg, downloaded from
-https://github.com/xbmc/FFmpeg/.
-
-Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
----
- libavcodec/pthread_frame.c | 22 +++++++++++++++++++---
- 1 file changed, 19 insertions(+), 3 deletions(-)
-
-diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c
-index 5a4ab84..c29d0a9 100644
---- a/libavcodec/pthread_frame.c
-+++ b/libavcodec/pthread_frame.c
-@@ -53,6 +53,7 @@
- * Context used by codec threads and stored in their AVCodecInternal thread_ctx.
- */
- typedef struct PerThreadContext {
-+ int main_thread;
- struct FrameThreadContext *parent;
-
- pthread_t thread;
-@@ -83,7 +84,8 @@ typedef struct PerThreadContext {
- * Set when the codec calls get_format().
- * State is returned to STATE_SETTING_UP afterwards.
- */
-- STATE_SETUP_FINISHED ///< Set after the codec has called ff_thread_finish_setup().
-+ STATE_SETUP_FINISHED, ///< Set after the codec has called ff_thread_finish_setup().
-+ STATE_UPDATE_CONTEXT, ///< Main thread is updating its context
- } state;
-
- /**
-@@ -105,6 +107,7 @@ typedef struct PerThreadContext {
- * Context stored in the client AVCodecInternal thread_ctx.
- */
- typedef struct FrameThreadContext {
-+ int main_thread;
- PerThreadContext *threads; ///< The contexts for each thread.
- PerThreadContext *prev_thread; ///< The last thread submit_packet() was called on.
-
-@@ -143,6 +146,7 @@ static attribute_align_arg void *frame_worker_thread(void *arg)
- AVCodecContext *avctx = p->avctx;
- const AVCodec *codec = avctx->codec;
-
-+ av_assert0(!p->main_thread);
- pthread_mutex_lock(&p->mutex);
- while (1) {
- while (p->state == STATE_INPUT_READY && !fctx->die)
-@@ -330,6 +334,8 @@ static int submit_packet(PerThreadContext *p, AVPacket *avpkt)
-
- pthread_mutex_lock(&p->mutex);
-
-+ p->state = STATE_UPDATE_CONTEXT;
-+
- release_delayed_buffers(p);
-
- if (prev_thread) {
-@@ -408,6 +414,7 @@ int ff_thread_decode_frame(AVCodecContext *avctx,
- int finished = fctx->next_finished;
- PerThreadContext *p;
- int err;
-+ av_assert0(fctx->main_thread);
-
- /*
- * Submit a packet to the next decoding thread.
-@@ -515,6 +522,7 @@ void ff_thread_finish_setup(AVCodecContext *avctx) {
-
- if (!(avctx->active_thread_type&FF_THREAD_FRAME)) return;
-
-+ av_assert0(!p->main_thread);
- if(p->state == STATE_SETUP_FINISHED){
- av_log(avctx, AV_LOG_WARNING, "Multiple ff_thread_finish_setup() calls\n");
- }
-@@ -549,6 +557,7 @@ void ff_frame_thread_free(AVCodecContext *avctx, int thread_count)
- const AVCodec *codec = avctx->codec;
- int i;
-
-+ av_assert0(fctx->main_thread);
- park_frame_worker_threads(fctx, thread_count);
-
- if (fctx->prev_thread && fctx->prev_thread != fctx->threads)
-@@ -634,6 +643,7 @@ int ff_frame_thread_init(AVCodecContext *avctx)
- }
-
- avctx->internal->thread_ctx = fctx = av_mallocz(sizeof(FrameThreadContext));
-+ fctx->main_thread = 1;
-
- fctx->threads = av_mallocz_array(thread_count, sizeof(PerThreadContext));
- pthread_mutex_init(&fctx->buffer_mutex, NULL);
-@@ -718,6 +728,7 @@ void ff_thread_flush(AVCodecContext *avctx)
-
- if (!fctx) return;
-
-+ av_assert0(fctx->main_thread);
- park_frame_worker_threads(fctx, avctx->thread_count);
- if (fctx->prev_thread) {
- if (fctx->prev_thread != &fctx->threads[0])
-@@ -743,7 +754,10 @@ void ff_thread_flush(AVCodecContext *avctx)
- int ff_thread_can_start_frame(AVCodecContext *avctx)
- {
- PerThreadContext *p = avctx->internal->thread_ctx;
-- if ((avctx->active_thread_type&FF_THREAD_FRAME) && p->state != STATE_SETTING_UP &&
-+ if (!(avctx->active_thread_type&FF_THREAD_FRAME))
-+ return 1;
-+ av_assert0(!p->main_thread);
-+ if (p->state != STATE_SETTING_UP &&
- (avctx->codec->update_thread_context || !THREAD_SAFE_CALLBACKS(avctx))) {
- return 0;
- }
-@@ -762,6 +776,7 @@ static int thread_get_buffer_internal(AVCodecContext *avctx, ThreadFrame *f, int
- if (!(avctx->active_thread_type & FF_THREAD_FRAME))
- return ff_get_buffer(avctx, f->f, flags);
-
-+ av_assert0(!p->main_thread);
- if (p->state != STATE_SETTING_UP &&
- (avctx->codec->update_thread_context || !THREAD_SAFE_CALLBACKS(avctx))) {
- av_log(avctx, AV_LOG_ERROR, "get_buffer() cannot be called after ff_thread_finish_setup()\n");
-@@ -819,7 +834,8 @@ enum AVPixelFormat ff_thread_get_format(AVCodecContext *avctx, const enum AVPixe
- enum AVPixelFormat res;
- PerThreadContext *p = avctx->internal->thread_ctx;
- if (!(avctx->active_thread_type & FF_THREAD_FRAME) || avctx->thread_safe_callbacks ||
-- avctx->get_format == avcodec_default_get_format)
-+ avctx->get_format == avcodec_default_get_format ||
-+ p->main_thread || p->state == STATE_UPDATE_CONTEXT)
- return ff_get_format(avctx, fmt);
- if (p->state != STATE_SETTING_UP) {
- av_log(avctx, AV_LOG_ERROR, "get_format() cannot be called after ff_thread_finish_setup()\n");
+++ /dev/null
-From ef86b05da8ad38c9c83e6f075536635647e6b799 Mon Sep 17 00:00:00 2001
-From: Rainer Hochecker <fernetmenta@online.de>
-Date: Thu, 12 Mar 2015 12:49:48 +0100
-Subject: [PATCH] hevc: avoid unnecessary calls to get_format
-
-Patch part of the XBMC patch set for ffmpeg, downloaded from
-https://github.com/xbmc/FFmpeg/.
-
-Upstream status: committed to master
-http://git.videolan.org/?p=ffmpeg.git;a=commit;h=786032cad8ecabe577d9cff0356da6e9e9488a2d
-
-Signed-off-by: Bernd Kuhls <bernd.kuhls@t-online.de>
----
- libavcodec/hevc.c | 23 ++++++++++++++---------
- 1 file changed, 14 insertions(+), 9 deletions(-)
-
-diff --git a/libavcodec/hevc.c b/libavcodec/hevc.c
-index b7ad29a..77b0c0c 100644
---- a/libavcodec/hevc.c
-+++ b/libavcodec/hevc.c
-@@ -280,7 +280,7 @@ static int decode_lt_rps(HEVCContext *s, LongTermRPS *rps, GetBitContext *gb)
- return 0;
- }
-
--static int set_sps(HEVCContext *s, const HEVCSPS *sps)
-+static int set_sps(HEVCContext *s, const HEVCSPS *sps, enum AVPixelFormat pix_fmt)
- {
- #define HWACCEL_MAX (CONFIG_HEVC_DXVA2_HWACCEL)
- enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
-@@ -304,13 +304,18 @@ static int set_sps(HEVCContext *s, const HEVCSPS *sps)
- #endif
- }
-
-- *fmt++ = sps->pix_fmt;
-- *fmt = AV_PIX_FMT_NONE;
-+ if (pix_fmt == AV_PIX_FMT_NONE) {
-+ *fmt++ = sps->pix_fmt;
-+ *fmt = AV_PIX_FMT_NONE;
-
-- ret = ff_thread_get_format(s->avctx, pix_fmts);
-- if (ret < 0)
-- goto fail;
-- s->avctx->pix_fmt = ret;
-+ ret = ff_thread_get_format(s->avctx, pix_fmts);
-+ if (ret < 0)
-+ goto fail;
-+ s->avctx->pix_fmt = ret;
-+ }
-+ else {
-+ s->avctx->pix_fmt = pix_fmt;
-+ }
-
- ff_set_sar(s->avctx, sps->vui.sar);
-
-@@ -420,7 +425,7 @@ static int hls_slice_header(HEVCContext *s)
- sh->no_output_of_prior_pics_flag = 0;
- }
- ff_hevc_clear_refs(s);
-- ret = set_sps(s, s->sps);
-+ ret = set_sps(s, s->sps, AV_PIX_FMT_NONE);
- if (ret < 0)
- return ret;
-
-@@ -3335,7 +3340,7 @@ static int hevc_update_thread_context(AVCodecContext *dst,
- }
-
- if (s->sps != s0->sps)
-- if ((ret = set_sps(s, s0->sps)) < 0)
-+ if ((ret = set_sps(s, s0->sps, src->pix_fmt)) < 0)
- return ret;
-
- s->seq_decode = s0->seq_decode;