forked from FFmpeg/FFmpeg
mdec: enable frame-level multithreading.
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
This commit is contained in:
parent
32ac63ee10
commit
a64c58a240
1 changed files with 17 additions and 3 deletions
|
@ -31,6 +31,7 @@
|
|||
#include "dsputil.h"
|
||||
#include "mpegvideo.h"
|
||||
#include "mpeg12.h"
|
||||
#include "thread.h"
|
||||
|
||||
typedef struct MDECContext{
|
||||
AVCodecContext *avctx;
|
||||
|
@ -163,10 +164,10 @@ static int decode_frame(AVCodecContext *avctx,
|
|||
int i;
|
||||
|
||||
if(p->data[0])
|
||||
avctx->release_buffer(avctx, p);
|
||||
ff_thread_release_buffer(avctx, p);
|
||||
|
||||
p->reference= 0;
|
||||
if(avctx->get_buffer(avctx, p) < 0){
|
||||
if(ff_thread_get_buffer(avctx, p) < 0){
|
||||
av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
|
||||
return -1;
|
||||
}
|
||||
|
@ -239,6 +240,18 @@ static av_cold int decode_init(AVCodecContext *avctx){
|
|||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int decode_init_thread_copy(AVCodecContext *avctx){
|
||||
MDECContext * const a = avctx->priv_data;
|
||||
AVFrame *p = (AVFrame*)&a->picture;
|
||||
|
||||
avctx->coded_frame = p;
|
||||
a->avctx= avctx;
|
||||
|
||||
p->qscale_table = av_mallocz( a->mb_width);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static av_cold int decode_end(AVCodecContext *avctx){
|
||||
MDECContext * const a = avctx->priv_data;
|
||||
|
||||
|
@ -260,7 +273,8 @@ AVCodec ff_mdec_decoder = {
|
|||
NULL,
|
||||
decode_end,
|
||||
decode_frame,
|
||||
CODEC_CAP_DR1,
|
||||
CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS,
|
||||
.long_name= NULL_IF_CONFIG_SMALL("Sony PlayStation MDEC (Motion DECoder)"),
|
||||
.init_thread_copy= ONLY_IF_THREADS_ENABLED(decode_init_thread_copy)
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue