Hi,

nonworking patch atttached.
From 5d5f16ec7a6f471401ce753ed88c63c47a8c3eba Mon Sep 17 00:00:00 2001
From: Paul B Mahol <one...@gmail.com>
Date: Mon, 25 Jan 2016 13:36:01 +0100
Subject: [PATCH] avcodec: multithread frame encoding

Signed-off-by: Paul B Mahol <one...@gmail.com>
---
 libavcodec/flacenc.c              |  2 +-
 libavcodec/frame_thread_encoder.c | 14 +++++++++++---
 libavcodec/frame_thread_encoder.h |  2 +-
 libavcodec/utils.c                | 10 +++++++---
 4 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/libavcodec/flacenc.c b/libavcodec/flacenc.c
index c769833..773e34a 100644
--- a/libavcodec/flacenc.c
+++ b/libavcodec/flacenc.c
@@ -1483,7 +1483,7 @@ AVCodec ff_flac_encoder = {
     .init           = flac_encode_init,
     .encode2        = flac_encode_frame,
     .close          = flac_encode_close,
-    .capabilities   = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_LOSSLESS,
+    .capabilities   = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_LOSSLESS | AV_CODEC_CAP_FRAME_THREADS,
     .sample_fmts    = (const enum AVSampleFormat[]){ AV_SAMPLE_FMT_S16,
                                                      AV_SAMPLE_FMT_S32,
                                                      AV_SAMPLE_FMT_NONE },
diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c
index f4d35f9..d54e3de 100644
--- a/libavcodec/frame_thread_encoder.c
+++ b/libavcodec/frame_thread_encoder.c
@@ -83,7 +83,14 @@ static void * attribute_align_arg worker(void *v){
         pthread_mutex_unlock(&c->task_fifo_mutex);
         frame = task.indata;
 
-        ret = avcodec_encode_video2(avctx, pkt, frame, &got_packet);
+        switch (avctx->codec_type) {
+        case AVMEDIA_TYPE_AUDIO:
+            ret = avcodec_encode_audio2(avctx, pkt, frame, &got_packet);
+            break;
+        case AVMEDIA_TYPE_VIDEO:
+            ret = avcodec_encode_video2(avctx, pkt, frame, &got_packet);
+            break;
+        }
         pthread_mutex_lock(&c->buffer_mutex);
         av_frame_unref(frame);
         pthread_mutex_unlock(&c->buffer_mutex);
@@ -115,7 +122,8 @@ int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options){
 
 
     if(   !(avctx->thread_type & FF_THREAD_FRAME)
-       || !(avctx->codec->capabilities & AV_CODEC_CAP_INTRA_ONLY))
+       || (avctx->codec_type == AVMEDIA_TYPE_VIDEO &&
+            !(avctx->codec->capabilities & AV_CODEC_CAP_INTRA_ONLY)))
         return 0;
 
     if(   !avctx->thread_count
@@ -239,7 +247,7 @@ void ff_frame_thread_encoder_free(AVCodecContext *avctx){
     av_freep(&avctx->internal->frame_thread_encoder);
 }
 
-int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr){
+int ff_thread_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr){
     ThreadContext *c = avctx->internal->frame_thread_encoder;
     Task task;
     int ret;
diff --git a/libavcodec/frame_thread_encoder.h b/libavcodec/frame_thread_encoder.h
index 1da0ce1..fdaaea5 100644
--- a/libavcodec/frame_thread_encoder.h
+++ b/libavcodec/frame_thread_encoder.h
@@ -22,5 +22,5 @@
 
 int ff_frame_thread_encoder_init(AVCodecContext *avctx, AVDictionary *options);
 void ff_frame_thread_encoder_free(AVCodecContext *avctx);
-int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr);
+int ff_thread_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet_ptr);
 
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index fb6c5f4..b00bf1e 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -1704,6 +1704,10 @@ int attribute_align_arg avcodec_encode_audio2(AVCodecContext *avctx,
 
     *got_packet_ptr = 0;
 
+    if (CONFIG_FRAME_THREAD_ENCODER &&
+        avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))
+        return ff_thread_encode_frame(avctx, avpkt, frame, got_packet_ptr);
+
     if (!(avctx->codec->capabilities & AV_CODEC_CAP_DELAY) && !frame) {
         av_packet_unref(avpkt);
         av_init_packet(avpkt);
@@ -1843,9 +1847,9 @@ int attribute_align_arg avcodec_encode_video2(AVCodecContext *avctx,
 
     *got_packet_ptr = 0;
 
-    if(CONFIG_FRAME_THREAD_ENCODER &&
-       avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))
-        return ff_thread_video_encode_frame(avctx, avpkt, frame, got_packet_ptr);
+    if (CONFIG_FRAME_THREAD_ENCODER &&
+        avctx->internal->frame_thread_encoder && (avctx->active_thread_type&FF_THREAD_FRAME))
+        return ff_thread_encode_frame(avctx, avpkt, frame, got_packet_ptr);
 
     if ((avctx->flags&AV_CODEC_FLAG_PASS1) && avctx->stats_out)
         avctx->stats_out[0] = '\0';
-- 
1.9.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to