}, arg, ret, count, 0);\r
}\r
\r
-int thread_init(AVCodecContext *s)\r
+void thread_init(AVCodecContext* s)\r
{\r
- if(!(s->thread_type & FF_THREAD_SLICE)) \r
- return 0; \r
-\r
static const size_t MAX_THREADS = 16; // See mpegvideo.h\r
static int dummy_opaque;\r
\r
s->thread_count = MAX_THREADS; // We are using a task-scheduler, so use as many "threads/tasks" as possible. \r
\r
CASPAR_LOG(info) << "Initialized ffmpeg tbb context.";\r
-\r
- return 0;\r
}\r
\r
void thread_free(AVCodecContext* s)\r
{\r
s->thread_opaque = nullptr;\r
+\r
CASPAR_LOG(info) << "Released ffmpeg tbb context.";\r
}\r
\r
int tbb_avcodec_open(AVCodecContext* avctx, AVCodec* codec)\r
{\r
- thread_init(avctx);\r
- // ff_thread_init will not be executed since thread_opaque != nullptr.\r
+ avctx->thread_count = 1;\r
+ if((codec->capabilities & CODEC_CAP_SLICE_THREADS) && (avctx->thread_type & FF_THREAD_SLICE))\r
+ thread_init(avctx);\r
+ // ff_thread_init will not be executed since thread_opaque != nullptr || thread_count == 1.\r
return avcodec_open(avctx, codec); \r
}\r
\r