Commit d9704464 authored by Paul B Mahol's avatar Paul B Mahol

takdec: frame multi-threading support

Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent d5f7f1fe
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "libavutil/internal.h" #include "libavutil/internal.h"
#include "libavutil/samplefmt.h" #include "libavutil/samplefmt.h"
#include "tak.h" #include "tak.h"
#include "thread.h"
#include "avcodec.h" #include "avcodec.h"
#include "dsputil.h" #include "dsputil.h"
#include "internal.h" #include "internal.h"
...@@ -673,6 +674,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, ...@@ -673,6 +674,7 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data,
{ {
TAKDecContext *s = avctx->priv_data; TAKDecContext *s = avctx->priv_data;
AVFrame *frame = data; AVFrame *frame = data;
ThreadFrame tframe = { .f = data };
GetBitContext *gb = &s->gb; GetBitContext *gb = &s->gb;
int chan, i, ret, hsize; int chan, i, ret, hsize;
...@@ -736,8 +738,9 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, ...@@ -736,8 +738,9 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data,
: s->ti.frame_samples; : s->ti.frame_samples;
frame->nb_samples = s->nb_samples; frame->nb_samples = s->nb_samples;
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0)
return ret; return ret;
ff_thread_finish_setup(avctx);
if (avctx->bits_per_raw_sample <= 16) { if (avctx->bits_per_raw_sample <= 16) {
int buf_size = av_samples_get_buffer_size(NULL, avctx->channels, int buf_size = av_samples_get_buffer_size(NULL, avctx->channels,
...@@ -899,6 +902,18 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data, ...@@ -899,6 +902,18 @@ static int tak_decode_frame(AVCodecContext *avctx, void *data,
return pkt->size; return pkt->size;
} }
static int update_thread_context(AVCodecContext *dst,
const AVCodecContext *src)
{
TAKDecContext *tsrc = src->priv_data;
TAKDecContext *tdst = dst->priv_data;
if (dst == src)
return 0;
memcpy(&tdst->ti, &tsrc->ti, sizeof(TAKStreamInfo));
return 0;
}
static av_cold int tak_decode_close(AVCodecContext *avctx) static av_cold int tak_decode_close(AVCodecContext *avctx)
{ {
TAKDecContext *s = avctx->priv_data; TAKDecContext *s = avctx->priv_data;
...@@ -916,7 +931,8 @@ AVCodec ff_tak_decoder = { ...@@ -916,7 +931,8 @@ AVCodec ff_tak_decoder = {
.init = tak_decode_init, .init = tak_decode_init,
.close = tak_decode_close, .close = tak_decode_close,
.decode = tak_decode_frame, .decode = tak_decode_frame,
.capabilities = CODEC_CAP_DR1, .update_thread_context = update_thread_context,
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
.long_name = NULL_IF_CONFIG_SMALL("TAK (Tom's lossless Audio Kompressor)"), .long_name = NULL_IF_CONFIG_SMALL("TAK (Tom's lossless Audio Kompressor)"),
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_U8P,
AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S16P,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment