Ticket #927: DNxHD_MT.patch

File DNxHD_MT.patch, 2.3 KB (added by STaRGaZeR, 14 years ago)
  • libavcodec/dnxhddec.c

    From 0f4bf97027499b483dfdd5b27e40be6f7f1d3c0c Mon Sep 17 00:00:00 2001
    From: Javier Cabezas <jcabgz@gmail.com>
    Date: Thu, 19 Jan 2012 02:06:29 +0100
    Subject: [PATCH] DNxHD: frame multithreading
    
    
    Signed-off-by: Javier Cabezas <jcabgz@gmail.com>
    ---
     libavcodec/dnxhddec.c |   14 +++++++++-----
     1 files changed, 9 insertions(+), 5 deletions(-)
    
    diff --git a/libavcodec/dnxhddec.c b/libavcodec/dnxhddec.c
    index 2548614..0f1ce9e 100644
    a b  
    3030#include "get_bits.h"
    3131#include "dnxhddata.h"
    3232#include "dsputil.h"
     33#include "thread.h"
    3334
    3435typedef struct DNXHDContext {
    3536    AVCodecContext *avctx;
    static int dnxhd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,  
    365366    DNXHDContext *ctx = avctx->priv_data;
    366367    AVFrame *picture = data;
    367368    int first_field = 1;
     369    int ret;
    368370
    369371    av_dlog(avctx, "frame size %d\n", buf_size);
    370372
    static int dnxhd_decode_frame(AVCodecContext *avctx, void *data, int *data_size,  
    385387
    386388    if (first_field) {
    387389        if (ctx->picture.data[0])
    388             avctx->release_buffer(avctx, &ctx->picture);
    389         if (avctx->get_buffer(avctx, &ctx->picture) < 0) {
     390            ff_thread_release_buffer(avctx, &ctx->picture);
     391        if ((ret = ff_thread_get_buffer(avctx, &ctx->picture)) < 0) {
    390392            av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
    391             return -1;
     393            return ret;
    392394        }
    393395    }
    394396
     397    ff_thread_finish_setup(avctx);
     398
    395399    dnxhd_decode_macroblocks(ctx, buf + 0x280, buf_size - 0x280);
    396400
    397401    if (first_field && ctx->picture.interlaced_frame) {
    static av_cold int dnxhd_decode_close(AVCodecContext *avctx)  
    411415    DNXHDContext *ctx = avctx->priv_data;
    412416
    413417    if (ctx->picture.data[0])
    414         avctx->release_buffer(avctx, &ctx->picture);
     418        ff_thread_release_buffer(avctx, &ctx->picture);
    415419    free_vlc(&ctx->ac_vlc);
    416420    free_vlc(&ctx->dc_vlc);
    417421    free_vlc(&ctx->run_vlc);
    AVCodec ff_dnxhd_decoder = {  
    426430    .init           = dnxhd_decode_init,
    427431    .close          = dnxhd_decode_close,
    428432    .decode         = dnxhd_decode_frame,
    429     .capabilities   = CODEC_CAP_DR1,
     433    .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
    430434    .long_name = NULL_IF_CONFIG_SMALL("VC3/DNxHD"),
    431435};