You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
takdec: frame multi-threading support
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
@@ -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,
|
|||||||
{
|
{
|
||||||
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,
|
|||||||
: 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,
|
|||||||
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 = {
|
|||||||
.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,
|
||||||
|
Reference in New Issue
Block a user