return ret;
if (frame->frame->format == AV_PIX_FMT_QSV) {
- frame->surface = (mfxFrameSurface1*)frame->frame->data[3];
+ frame->surface = *(mfxFrameSurface1*)frame->frame->data[3];
} else {
- frame->surface_internal.Info = q->frame_info;
+ frame->surface.Info = q->frame_info;
- frame->surface_internal.Data.PitchLow = frame->frame->linesize[0];
- frame->surface_internal.Data.Y = frame->frame->data[0];
- frame->surface_internal.Data.UV = frame->frame->data[1];
+ frame->surface.Data.PitchLow = frame->frame->linesize[0];
+ frame->surface.Data.Y = frame->frame->data[0];
+ frame->surface.Data.UV = frame->frame->data[1];
+ }
+
+ if (q->frames_ctx.mids) {
+ ret = ff_qsv_find_surface_idx(&q->frames_ctx, frame);
+ if (ret < 0)
+ return ret;
- frame->surface = &frame->surface_internal;
+ frame->surface.Data.MemId = &q->frames_ctx.mids[ret];
}
+ frame->used = 1;
+
return 0;
}
{
QSVFrame *cur = q->work_frames;
while (cur) {
- if (cur->surface && !cur->surface->Data.Locked && !cur->queued) {
- cur->surface = NULL;
+ if (cur->used && !cur->surface.Data.Locked && !cur->queued) {
+ cur->used = 0;
av_frame_unref(cur->frame);
}
cur = cur->next;
frame = q->work_frames;
last = &q->work_frames;
while (frame) {
- if (!frame->surface) {
+ if (!frame->used) {
ret = alloc_frame(avctx, q, frame);
if (ret < 0)
return ret;
- *surf = frame->surface;
+ *surf = &frame->surface;
return 0;
}
if (ret < 0)
return ret;
- *surf = frame->surface;
+ *surf = &frame->surface;
return 0;
}
{
QSVFrame *cur = q->work_frames;
while (cur) {
- if (surf == cur->surface)
+ if (surf == &cur->surface)
return cur;
cur = cur->next;
}
if (ret < 0)
return ret;
- outsurf = out_frame->surface;
+ outsurf = &out_frame->surface;
#if FF_API_PKT_PTS
FF_DISABLE_DEPRECATION_WARNINGS
frame->interlaced_frame =
!(outsurf->Info.PicStruct & MFX_PICSTRUCT_PROGRESSIVE);
+ /* update the surface properties */
+ if (avctx->pix_fmt == AV_PIX_FMT_QSV)
+ ((mfxFrameSurface1*)frame->data[3])->Info = outsurf->Info;
+
*got_frame = 1;
}
MFXClose(q->internal_session);
av_buffer_unref(&q->frames_ctx.hw_frames_ctx);
- av_freep(&q->frames_ctx.mids);
- q->frames_ctx.nb_mids = 0;
+ av_buffer_unref(&q->frames_ctx.mids_buf);
return 0;
}