Lines Matching defs:avctx
119 static int qsv_get_continuous_buffer(AVCodecContext *avctx, AVFrame *frame,
124 ff_decode_frame_props(avctx, frame);
126 frame->width = avctx->width;
127 frame->height = avctx->height;
129 switch (avctx->pix_fmt) {
131 frame->linesize[0] = FFALIGN(avctx->width, 128);
135 frame->linesize[0] = 2 * FFALIGN(avctx->width, 128);
138 frame->linesize[0] = 4 * FFALIGN(avctx->width, 128);
141 av_log(avctx, AV_LOG_ERROR, "Unsupported pixel format.\n");
150 if (avctx->pix_fmt == AV_PIX_FMT_NV12 ||
151 avctx->pix_fmt == AV_PIX_FMT_P010) {
154 frame->linesize[0] * FFALIGN(avctx->height, 64);
164 static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession session,
171 av_log(avctx, AV_LOG_WARNING, "GPU-accelerated memory copy "
188 ret = ff_qsv_init_session_frames(avctx, &q->internal_qs.session,
204 ret = ff_qsv_init_session_device(avctx, &q->internal_qs.session,
212 ret = ff_qsv_init_internal_session(avctx, &q->internal_qs,
222 av_log(avctx, AV_LOG_ERROR, "Error querying the session version. \n");
239 static int qsv_decode_preinit(AVCodecContext *avctx, QSVContext *q, enum AVPixelFormat pix_fmt, mfxVideoParam *param)
249 ret = ff_get_format(avctx, pix_fmts);
251 q->orig_pix_fmt = avctx->pix_fmt = AV_PIX_FMT_NONE;
261 if (avctx->pix_fmt == AV_PIX_FMT_QSV && avctx->hwaccel_context) {
262 AVQSVContext *user_ctx = avctx->hwaccel_context;
269 if (avctx->hw_device_ctx && !avctx->hw_frames_ctx && ret == AV_PIX_FMT_QSV) {
273 avctx->hw_frames_ctx = av_hwframe_ctx_alloc(avctx->hw_device_ctx);
275 if (!avctx->hw_frames_ctx) {
276 av_log(avctx, AV_LOG_ERROR, "av_hwframe_ctx_alloc failed\n");
280 hwframes_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
282 hwframes_ctx->width = FFALIGN(avctx->coded_width, 32);
283 hwframes_ctx->height = FFALIGN(avctx->coded_height, 32);
285 hwframes_ctx->sw_format = avctx->sw_pix_fmt;
286 hwframes_ctx->initial_pool_size = q->suggest_pool_size + 16 + avctx->extra_hw_frames;
289 ret = av_hwframe_ctx_init(avctx->hw_frames_ctx);
293 av_buffer_unref(&avctx->hw_frames_ctx);
298 if (avctx->hw_frames_ctx) {
299 AVHWFramesContext *frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
314 ff_qsv_print_iopattern(avctx, q->iopattern, "Decoder");
316 ret = qsv_init_session(avctx, q, session, avctx->hw_frames_ctx, avctx->hw_device_ctx);
318 av_log(avctx, AV_LOG_ERROR, "Error initializing an MFX session\n");
330 static int qsv_decode_init_context(AVCodecContext *avctx, QSVContext *q, mfxVideoParam *param)
334 avctx->width = param->mfx.FrameInfo.CropW;
335 avctx->height = param->mfx.FrameInfo.CropH;
336 avctx->coded_width = param->mfx.FrameInfo.Width;
337 avctx->coded_height = param->mfx.FrameInfo.Height;
338 avctx->level = param->mfx.CodecLevel;
339 avctx->profile = param->mfx.CodecProfile;
340 avctx->field_order = ff_qsv_map_picstruct(param->mfx.FrameInfo.PicStruct);
341 avctx->pix_fmt = ff_qsv_map_fourcc(param->mfx.FrameInfo.FourCC);
345 return ff_qsv_print_error(avctx, ret,
350 if (!avctx->hw_frames_ctx)
351 q->pool = av_buffer_pool_init(av_image_get_buffer_size(avctx->pix_fmt,
352 FFALIGN(avctx->width, 128), FFALIGN(avctx->height, 64), 1), av_buffer_allocz);
356 static int qsv_decode_header(AVCodecContext *avctx, QSVContext *q,
369 bs.TimeStamp = PTS_TO_MFX_PTS(avpkt->pts, avctx->pkt_timebase);
370 if (avctx->field_order == AV_FIELD_PROGRESSIVE)
377 ret = qsv_decode_preinit(avctx, q, pix_fmt, param);
382 ret = ff_qsv_codec_id_to_mfx(avctx->codec_id);
398 return ff_qsv_print_error(avctx, ret,
401 avctx->color_range = video_signal_info.VideoFullRange ? AVCOL_RANGE_JPEG : AVCOL_RANGE_MPEG;
404 avctx->color_primaries = video_signal_info.ColourPrimaries;
405 avctx->color_trc = video_signal_info.TransferCharacteristics;
406 avctx->colorspace = video_signal_info.MatrixCoefficients;
413 if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 34) && avctx->codec_id == AV_CODEC_ID_AV1)
414 param->mfx.FilmGrain = (avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) ? 0 : param->mfx.FilmGrain;
420 static int alloc_frame(AVCodecContext *avctx, QSVContext *q, QSVFrame *frame)
425 ret = qsv_get_continuous_buffer(avctx, frame->frame, q->pool);
427 ret = ff_get_buffer(avctx, frame->frame, AV_GET_BUFFER_FLAG_REF);
437 av_log(avctx, AV_LOG_ERROR, "map frame to surface failed.\n");
457 ff_qsv_frame_add_ext_param(avctx, frame, (mfxExtBuffer *)&frame->dec_info);
459 if (QSV_RUNTIME_VERSION_ATLEAST(q->ver, 1, 34) && avctx->codec_id == AV_CODEC_ID_AV1) {
463 ff_qsv_frame_add_ext_param(avctx, frame, (mfxExtBuffer *)&frame->av1_film_grain_param);
484 static int get_surface(AVCodecContext *avctx, QSVContext *q, mfxFrameSurface1 **surf)
495 ret = alloc_frame(avctx, q, frame);
516 ret = alloc_frame(avctx, q, frame);
537 static int qsv_export_film_grain(AVCodecContext *avctx, mfxExtAV1FilmGrainParam *ext_param, AVFrame *frame)
603 static int qsv_decode(AVCodecContext *avctx, QSVContext *q,
617 bs.TimeStamp = PTS_TO_MFX_PTS(avpkt->pts, avctx->pkt_timebase);
618 if (avctx->field_order == AV_FIELD_PROGRESSIVE)
629 ret = get_surface(avctx, q, &insurf);
644 av_log(avctx, AV_LOG_DEBUG, "Video parameter change\n");
654 return ff_qsv_print_error(avctx, ret,
664 ff_qsv_print_warning(avctx, ret, "A decode call did not consume any data");
674 av_log(avctx, AV_LOG_ERROR,
696 if (avctx->pix_fmt != AV_PIX_FMT_QSV) {
712 frame->pts = MFX_PTS_TO_PTS(outsurf->Data.TimeStamp, avctx->pkt_timebase);
714 if ((avctx->export_side_data & AV_CODEC_EXPORT_DATA_FILM_GRAIN) &&
716 avctx->codec_id == AV_CODEC_ID_AV1) {
717 ret = qsv_export_film_grain(avctx, &aframe.frame->av1_film_grain_param, frame);
734 if (avctx->codec_id == AV_CODEC_ID_H264)
738 if (avctx->pix_fmt == AV_PIX_FMT_QSV)
775 static int qsv_process_data(AVCodecContext *avctx, QSVContext *q,
783 return qsv_decode(avctx, q, frame, got_frame, pkt);
792 if (!avctx->coded_width)
793 avctx->coded_width = 1280;
794 if (!avctx->coded_height)
795 avctx->coded_height = 720;
800 ret = qsv_decode(avctx, q, frame, got_frame, &zero_pkt);
810 ret = qsv_decode_header(avctx, q, pkt, pix_fmt, ¶m);
813 av_log(avctx, AV_LOG_INFO, "More data is required to decode header\n");
815 av_log(avctx, AV_LOG_ERROR, "Error decoding header\n");
820 q->orig_pix_fmt = avctx->pix_fmt = pix_fmt = ff_qsv_map_fourcc(param.mfx.FrameInfo.FourCC);
822 avctx->coded_width = param.mfx.FrameInfo.Width;
823 avctx->coded_height = param.mfx.FrameInfo.Height;
827 return ff_qsv_print_error(avctx, ret, "Error querying IO surface");
831 ret = qsv_decode_preinit(avctx, q, pix_fmt, ¶m);
838 ret = qsv_decode_init_context(avctx, q, ¶m);
844 return qsv_decode(avctx, q, frame, got_frame, pkt);
847 q->orig_pix_fmt = avctx->pix_fmt = AV_PIX_FMT_NONE;
877 static av_cold int qsv_decode_close(AVCodecContext *avctx)
879 QSVDecContext *s = avctx->priv_data;
890 static av_cold int qsv_decode_init(AVCodecContext *avctx)
892 QSVDecContext *s = avctx->priv_data;
896 if (avctx->codec_id == AV_CODEC_ID_VP8) {
898 } else if (avctx->codec_id == AV_CODEC_ID_VP9) {
901 else if (avctx->codec_id == AV_CODEC_ID_HEVC && s->load_plugin != LOAD_PLUGIN_NONE) {
906 av_log(avctx, AV_LOG_WARNING,
931 if (!avctx->pkt_timebase.num)
932 av_log(avctx, AV_LOG_WARNING, "Invalid pkt_timebase, passing timestamps as-is.\n");
936 qsv_decode_close(avctx);
940 static int qsv_decode_frame(AVCodecContext *avctx, AVFrame *frame,
943 QSVDecContext *s = avctx->priv_data;
962 return avpkt->size ? avpkt->size : qsv_process_data(avctx, &s->qsv, frame, got_frame, avpkt);
970 ret = qsv_process_data(avctx, &s->qsv, frame, got_frame, &s->buffer_pkt);
987 static void qsv_decode_flush(AVCodecContext *avctx)
989 QSVDecContext *s = avctx->priv_data;