lavc: add generic-decode-layer private data
Move AVCodecInternal.nb_draining_errors to it, should should not be visible outside of decode.c.
This commit is contained in:
parent
21de4db402
commit
f2fb882b3f
@ -150,7 +150,9 @@ int attribute_align_arg avcodec_open2(AVCodecContext *avctx, const AVCodec *code
|
||||
if (avctx->extradata_size < 0 || avctx->extradata_size >= FF_MAX_EXTRADATA_SIZE)
|
||||
return AVERROR(EINVAL);
|
||||
|
||||
avci = av_mallocz(sizeof(*avci));
|
||||
avci = av_codec_is_decoder(codec) ?
|
||||
ff_decode_internal_alloc() :
|
||||
av_mallocz(sizeof(AVCodecInternal));
|
||||
if (!avci) {
|
||||
ret = AVERROR(ENOMEM);
|
||||
goto end;
|
||||
|
@ -53,4 +53,6 @@ int ff_decode_preinit(struct AVCodecContext *avctx);
|
||||
void ff_decode_flush_buffers(struct AVCodecContext *avctx);
|
||||
void ff_encode_flush_buffers(struct AVCodecContext *avctx);
|
||||
|
||||
struct AVCodecInternal *ff_decode_internal_alloc(void);
|
||||
|
||||
#endif // AVCODEC_AVCODEC_INTERNAL_H
|
||||
|
@ -50,6 +50,18 @@
|
||||
#include "internal.h"
|
||||
#include "thread.h"
|
||||
|
||||
typedef struct DecodeContext {
|
||||
AVCodecInternal avci;
|
||||
|
||||
/* to prevent infinite loop on errors when draining */
|
||||
int nb_draining_errors;
|
||||
} DecodeContext;
|
||||
|
||||
static DecodeContext *decode_ctx(AVCodecInternal *avci)
|
||||
{
|
||||
return (DecodeContext *)avci;
|
||||
}
|
||||
|
||||
static int apply_param_change(AVCodecContext *avctx, const AVPacket *avpkt)
|
||||
{
|
||||
int ret;
|
||||
@ -439,7 +451,7 @@ FF_ENABLE_DEPRECATION_WARNINGS
|
||||
int nb_errors_max = 20 + (HAVE_THREADS && avctx->active_thread_type & FF_THREAD_FRAME ?
|
||||
avctx->thread_count : 1);
|
||||
|
||||
if (avci->nb_draining_errors++ >= nb_errors_max) {
|
||||
if (decode_ctx(avci)->nb_draining_errors++ >= nb_errors_max) {
|
||||
av_log(avctx, AV_LOG_ERROR, "Too many errors when draining, this is a bug. "
|
||||
"Stop draining and force EOF.\n");
|
||||
avci->draining_done = 1;
|
||||
@ -1753,5 +1765,10 @@ void ff_decode_flush_buffers(AVCodecContext *avctx)
|
||||
|
||||
av_bsf_flush(avci->bsf);
|
||||
|
||||
avci->nb_draining_errors = 0;
|
||||
decode_ctx(avci)->nb_draining_errors = 0;
|
||||
}
|
||||
|
||||
AVCodecInternal *ff_decode_internal_alloc(void)
|
||||
{
|
||||
return av_mallocz(sizeof(DecodeContext));
|
||||
}
|
||||
|
@ -148,9 +148,6 @@ typedef struct AVCodecInternal {
|
||||
AVFrame *buffer_frame;
|
||||
int draining_done;
|
||||
|
||||
/* to prevent infinite loop on errors when draining */
|
||||
int nb_draining_errors;
|
||||
|
||||
/* used when avctx flag AV_CODEC_FLAG_DROPCHANGED is set */
|
||||
int changed_frames_dropped;
|
||||
int initial_format;
|
||||
|
@ -28,6 +28,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include "avcodec.h"
|
||||
#include "avcodec_internal.h"
|
||||
#include "codec_internal.h"
|
||||
#include "decode.h"
|
||||
#include "hwconfig.h"
|
||||
@ -815,7 +816,7 @@ static av_cold int init_thread(PerThreadContext *p, int *threads_to_free,
|
||||
p->parent = fctx;
|
||||
p->avctx = copy;
|
||||
|
||||
copy->internal = av_mallocz(sizeof(*copy->internal));
|
||||
copy->internal = ff_decode_internal_alloc();
|
||||
if (!copy->internal)
|
||||
return AVERROR(ENOMEM);
|
||||
copy->internal->thread_ctx = p;
|
||||
|
Loading…
x
Reference in New Issue
Block a user