Skip to content

Commit

Permalink
Refactoring to move common QSV-related code part into libavcodec/qsvd…
Browse files Browse the repository at this point in the history
…ec.c

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
  • Loading branch information
iuskov-nablet authored and michaelni committed Jul 16, 2015
1 parent 17ee24a commit 6e12799
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 40 deletions.
42 changes: 17 additions & 25 deletions libavcodec/qsvdec.c
Expand Up @@ -34,6 +34,7 @@

#include "avcodec.h"
#include "internal.h"
#include "qsv.h"
#include "qsv_internal.h"
#include "qsvdec.h"

Expand All @@ -48,37 +49,28 @@ int ff_qsv_map_pixfmt(enum AVPixelFormat format)
}
}

static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession session)
{
if (!session) {
if (!q->internal_qs.session) {
int ret = ff_qsv_init_internal_session(avctx, &q->internal_qs, NULL);
if (ret < 0)
return ret;
}

q->session = q->internal_qs.session;
} else {
q->session = session;
}

/* make sure the decoder is uninitialized */
MFXVideoDECODE_Close(q->session);

return 0;
}

int ff_qsv_decode_init(AVCodecContext *avctx, QSVContext *q, mfxSession session)
int ff_qsv_decode_init(AVCodecContext *avctx, QSVContext *q)
{
mfxVideoParam param = { { 0 } };
int ret;

ret = qsv_init_session(avctx, q, session);
if (ret < 0) {
av_log(avctx, AV_LOG_ERROR, "Error initializing an MFX session\n");
return ret;
q->iopattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY;

if (avctx->hwaccel_context) {
AVQSVContext *qsv = avctx->hwaccel_context;

q->session = qsv->session;
q->iopattern = qsv->iopattern;
q->ext_buffers = qsv->ext_buffers;
q->nb_ext_buffers = qsv->nb_ext_buffers;
}
if (!q->session) {
ret = ff_qsv_init_internal_session(avctx, &q->internal_qs, NULL);
if (ret < 0)
return ret;

q->session = q->internal_qs.session;
}

ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
if (ret < 0)
Expand Down
2 changes: 1 addition & 1 deletion libavcodec/qsvdec.h
Expand Up @@ -57,7 +57,7 @@ typedef struct QSVContext {

int ff_qsv_map_pixfmt(enum AVPixelFormat format);

int ff_qsv_decode_init(AVCodecContext *s, QSVContext *q, mfxSession session);
int ff_qsv_decode_init(AVCodecContext *s, QSVContext *q);

int ff_qsv_decode(AVCodecContext *s, QSVContext *q,
AVFrame *frame, int *got_frame,
Expand Down
15 changes: 1 addition & 14 deletions libavcodec/qsvdec_h264.c
Expand Up @@ -33,9 +33,7 @@

#include "avcodec.h"
#include "internal.h"
#include "qsv_internal.h"
#include "qsvdec.h"
#include "qsv.h"

typedef struct QSVH264Context {
AVClass *class;
Expand Down Expand Up @@ -130,8 +128,6 @@ static av_cold int qsv_decode_init(AVCodecContext *avctx)
}
s->parser->flags |= PARSER_FLAG_COMPLETE_FRAMES;

s->qsv.iopattern = MFX_IOPATTERN_OUT_SYSTEM_MEMORY;

return 0;
fail:
qsv_decode_close(avctx);
Expand All @@ -157,7 +153,6 @@ static int qsv_process_data(AVCodecContext *avctx, AVFrame *frame,
if (s->parser->format != s->orig_pix_fmt ||
s->parser->coded_width != avctx->coded_width ||
s->parser->coded_height != avctx->coded_height) {
mfxSession session = NULL;

enum AVPixelFormat pix_fmts[3] = { AV_PIX_FMT_QSV,
AV_PIX_FMT_NONE,
Expand Down Expand Up @@ -187,15 +182,7 @@ static int qsv_process_data(AVCodecContext *avctx, AVFrame *frame,

avctx->pix_fmt = ret;

if (avctx->hwaccel_context) {
AVQSVContext *user_ctx = avctx->hwaccel_context;
session = user_ctx->session;
s->qsv.iopattern = user_ctx->iopattern;
s->qsv.ext_buffers = user_ctx->ext_buffers;
s->qsv.nb_ext_buffers = user_ctx->nb_ext_buffers;
}

ret = ff_qsv_decode_init(avctx, &s->qsv, session);
ret = ff_qsv_decode_init(avctx, &s->qsv);
if (ret < 0)
goto reinit_fail;
}
Expand Down

0 comments on commit 6e12799

Please sign in to comment.