X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fqsvenc.c;h=3c821733791aeedb9b75691e7a11a098420493b6;hb=b1b0e532583e26f18ba27f3cc8775dbd62f3bc2b;hp=afb953eb11645fae622f0da52cf5db8c01438b13;hpb=ae7e66fb4b1a256fb79a016b9c585de84ac77339;p=ffmpeg diff --git a/libavcodec/qsvenc.c b/libavcodec/qsvenc.c index afb953eb116..3c821733791 100644 --- a/libavcodec/qsvenc.c +++ b/libavcodec/qsvenc.c @@ -651,6 +651,20 @@ FF_ENABLE_DEPRECATION_WARNINGS q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extco2; } +#endif +#if QSV_HAVE_MF + if (avctx->codec_id == AV_CODEC_ID_H264) { + mfxVersion ver; + ret = MFXQueryVersion(q->session,&ver); + if (ret >= MFX_ERR_NONE && QSV_RUNTIME_VERSION_ATLEAST(ver, 1, 25)) { + q->extmfp.Header.BufferId = MFX_EXTBUFF_MULTI_FRAME_PARAM; + q->extmfp.Header.BufferSz = sizeof(q->extmfp); + + q->extmfp.MFMode = q->mfmode; + av_log(avctx,AV_LOG_VERBOSE,"MFMode:%d\n", q->extmfp.MFMode); + q->extparam_internal[q->nb_extparam_internal++] = (mfxExtBuffer *)&q->extmfp; + } + } #endif } @@ -1114,6 +1128,10 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, { AVPacket new_pkt = { 0 }; mfxBitstream *bs; +#if QSV_VERSION_ATLEAST(1, 26) + mfxExtAVCEncodedFrameInfo *enc_info; + mfxExtBuffer **enc_buf; +#endif mfxFrameSurface1 *surf = NULL; mfxSyncPoint *sync = NULL; @@ -1147,6 +1165,24 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, bs->Data = new_pkt.data; bs->MaxLength = new_pkt.size; +#if QSV_VERSION_ATLEAST(1, 26) + if (avctx->codec_id == AV_CODEC_ID_H264) { + enc_info = av_mallocz(sizeof(*enc_info)); + if (!enc_info) + return AVERROR(ENOMEM); + + enc_info->Header.BufferId = MFX_EXTBUFF_ENCODED_FRAME_INFO; + enc_info->Header.BufferSz = sizeof (*enc_info); + bs->NumExtParam = 1; + enc_buf = av_mallocz(sizeof(mfxExtBuffer *)); + if (!enc_buf) + return AVERROR(ENOMEM); + enc_buf[0] = (mfxExtBuffer *)enc_info; + + bs->ExtParam = enc_buf; + } +#endif + if (q->set_encode_ctrl_cb) { q->set_encode_ctrl_cb(avctx, frame, &qsv_frame->enc_ctrl); } @@ -1154,6 +1190,12 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, sync = av_mallocz(sizeof(*sync)); if (!sync) { av_freep(&bs); + #if QSV_VERSION_ATLEAST(1, 26) + if (avctx->codec_id == AV_CODEC_ID_H264) { + av_freep(&enc_info); + av_freep(&enc_buf); + } + #endif av_packet_unref(&new_pkt); return AVERROR(ENOMEM); } @@ -1170,6 +1212,12 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, if (ret < 0) { av_packet_unref(&new_pkt); av_freep(&bs); +#if QSV_VERSION_ATLEAST(1, 26) + if (avctx->codec_id == AV_CODEC_ID_H264) { + av_freep(&enc_info); + av_freep(&enc_buf); + } +#endif av_freep(&sync); return (ret == MFX_ERR_MORE_DATA) ? 0 : ff_qsv_print_error(avctx, ret, "Error during encoding"); @@ -1186,6 +1234,12 @@ static int encode_frame(AVCodecContext *avctx, QSVEncContext *q, av_freep(&sync); av_packet_unref(&new_pkt); av_freep(&bs); +#if QSV_VERSION_ATLEAST(1, 26) + if (avctx->codec_id == AV_CODEC_ID_H264) { + av_freep(&enc_info); + av_freep(&enc_buf); + } +#endif } return 0; @@ -1205,6 +1259,11 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, AVPacket new_pkt; mfxBitstream *bs; mfxSyncPoint *sync; +#if QSV_VERSION_ATLEAST(1, 26) + mfxExtAVCEncodedFrameInfo *enc_info; + mfxExtBuffer **enc_buf; +#endif + enum AVPictureType pict_type; av_fifo_generic_read(q->async_fifo, &new_pkt, sizeof(new_pkt), NULL); av_fifo_generic_read(q->async_fifo, &sync, sizeof(sync), NULL); @@ -1222,17 +1281,29 @@ int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, bs->FrameType & MFX_FRAMETYPE_xIDR) new_pkt.flags |= AV_PKT_FLAG_KEY; -#if FF_API_CODED_FRAME -FF_DISABLE_DEPRECATION_WARNINGS if (bs->FrameType & MFX_FRAMETYPE_I || bs->FrameType & MFX_FRAMETYPE_xI) - avctx->coded_frame->pict_type = AV_PICTURE_TYPE_I; + pict_type = AV_PICTURE_TYPE_I; else if (bs->FrameType & MFX_FRAMETYPE_P || bs->FrameType & MFX_FRAMETYPE_xP) - avctx->coded_frame->pict_type = AV_PICTURE_TYPE_P; + pict_type = AV_PICTURE_TYPE_P; else if (bs->FrameType & MFX_FRAMETYPE_B || bs->FrameType & MFX_FRAMETYPE_xB) - avctx->coded_frame->pict_type = AV_PICTURE_TYPE_B; + pict_type = AV_PICTURE_TYPE_B; + +#if FF_API_CODED_FRAME +FF_DISABLE_DEPRECATION_WARNINGS + avctx->coded_frame->pict_type = pict_type; FF_ENABLE_DEPRECATION_WARNINGS #endif +#if QSV_VERSION_ATLEAST(1, 26) + if (avctx->codec_id == AV_CODEC_ID_H264) { + enc_buf = bs->ExtParam; + enc_info = (mfxExtAVCEncodedFrameInfo *)(*bs->ExtParam); + ff_side_data_set_encoder_stats(&new_pkt, + enc_info->QP * FF_QP2LAMBDA, NULL, 0, pict_type); + av_freep(&enc_info); + av_freep(&enc_buf); + } +#endif av_freep(&bs); av_freep(&sync);