flacdec: frame multi-threading support

Signed-off-by: Paul B Mahol <onemda@gmail.com>
pull/25/head
Paul B Mahol 12 years ago
parent d97044640c
commit 9300de0409
  1. 15
      libavcodec/flacdec.c

@ -44,6 +44,7 @@
#include "flac.h"
#include "flacdata.h"
#include "flacdsp.h"
#include "thread.h"
typedef struct FLACContext {
FLACSTREAMINFO
@ -489,6 +490,7 @@ static int flac_decode_frame(AVCodecContext *avctx, void *data,
int *got_frame_ptr, AVPacket *avpkt)
{
AVFrame *frame = data;
ThreadFrame tframe = { .f = data };
const uint8_t *buf = avpkt->data;
int buf_size = avpkt->size;
FLACContext *s = avctx->priv_data;
@ -547,7 +549,7 @@ static int flac_decode_frame(AVCodecContext *avctx, void *data,
/* get output buffer */
frame->nb_samples = s->blocksize;
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
if ((ret = ff_thread_get_buffer(avctx, &tframe, 0)) < 0)
return ret;
s->dsp.decorrelate[s->ch_mode](frame->data, s->decoded, s->channels,
@ -567,6 +569,14 @@ static int flac_decode_frame(AVCodecContext *avctx, void *data,
return bytes_read;
}
static int init_thread_copy(AVCodecContext *avctx)
{
FLACContext *s = avctx->priv_data;
s->decoded_buffer = NULL;
s->decoded_buffer_size = 0;
return allocate_buffers(s);
}
static av_cold int flac_decode_close(AVCodecContext *avctx)
{
FLACContext *s = avctx->priv_data;
@ -584,7 +594,8 @@ AVCodec ff_flac_decoder = {
.init = flac_decode_init,
.close = flac_decode_close,
.decode = flac_decode_frame,
.capabilities = CODEC_CAP_DR1,
.init_thread_copy = init_thread_copy,
.capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
.long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"),
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16,
AV_SAMPLE_FMT_S16P,

Loading…
Cancel
Save