+ q->frame_info = param->mfx.FrameInfo;
+
+ if (!avctx->hw_frames_ctx)
+ q->pool = av_buffer_pool_init(av_image_get_buffer_size(avctx->pix_fmt,
+ FFALIGN(avctx->width, 128), FFALIGN(avctx->height, 64), 1), av_buffer_allocz);
+ return 0;
+}
+
+static int qsv_decode_header(AVCodecContext *avctx, QSVContext *q, AVPacket *avpkt, enum AVPixelFormat pix_fmt, mfxVideoParam *param)
+{
+ int ret;
+
+ mfxBitstream bs = { 0 };
+
+ if (avpkt->size) {
+ bs.Data = avpkt->data;
+ bs.DataLength = avpkt->size;
+ bs.MaxLength = bs.DataLength;
+ bs.TimeStamp = avpkt->pts;
+ if (avctx->field_order == AV_FIELD_PROGRESSIVE)
+ bs.DataFlag |= MFX_BITSTREAM_COMPLETE_FRAME;
+ } else
+ return AVERROR_INVALIDDATA;
+
+
+ if(!q->session) {
+ ret = qsv_decode_preinit(avctx, q, pix_fmt, param);
+ if (ret < 0)
+ return ret;
+ }
+
+ ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
+ if (ret < 0)
+ return ret;
+
+ param->mfx.CodecId = ret;
+ ret = MFXVideoDECODE_DecodeHeader(q->session, &bs, param);
+ if (MFX_ERR_MORE_DATA == ret) {
+ return AVERROR(EAGAIN);
+ }
+ if (ret < 0)
+ return ff_qsv_print_error(avctx, ret,
+ "Error decoding stream header");