static int qsv_frames_init(AVHWFramesContext *ctx) { QSVFramesContext *s = ctx->internal->priv; AVQSVFramesContext *frames_hwctx = ctx->hwctx; int opaque = !!(frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME); uint32_t fourcc; int i, ret; fourcc = qsv_fourcc_from_pix_fmt(ctx->sw_format); if (!fourcc) { av_log(ctx, AV_LOG_ERROR, "Unsupported pixel format\n"); return AVERROR(ENOSYS); } if (!ctx->pool) { ret = qsv_init_pool(ctx, fourcc); if (ret < 0) { av_log(ctx, AV_LOG_ERROR, "Error creating an internal frame pool\n"); return ret; } } if (opaque) { s->surface_ptrs = av_mallocz_array(frames_hwctx->nb_surfaces, sizeof(*s->surface_ptrs)); if (!s->surface_ptrs) return AVERROR(ENOMEM); for (i = 0; i < frames_hwctx->nb_surfaces; i++) s->surface_ptrs[i] = frames_hwctx->surfaces + i; s->opaque_alloc.In.Surfaces = s->surface_ptrs; s->opaque_alloc.In.NumSurface = frames_hwctx->nb_surfaces; s->opaque_alloc.In.Type = frames_hwctx->frame_type; s->opaque_alloc.Out = s->opaque_alloc.In; s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION; s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc); s->ext_buffers[0] = (mfxExtBuffer*)&s->opaque_alloc; } else { s->mem_ids = av_mallocz_array(frames_hwctx->nb_surfaces, sizeof(*s->mem_ids)); if (!s->mem_ids) return AVERROR(ENOMEM); for (i = 0; i < frames_hwctx->nb_surfaces; i++) s->mem_ids[i] = frames_hwctx->surfaces[i].Data.MemId; } s->session_download = NULL; s->session_upload = NULL; s->session_download_init = 0; s->session_upload_init = 0; #if HAVE_PTHREADS pthread_mutex_init(&s->session_lock, NULL); pthread_cond_init(&s->session_cond, NULL); #endif return 0; }
static int qsv_frames_init(AVHWFramesContext *ctx) { QSVFramesContext *s = ctx->internal->priv; AVQSVFramesContext *frames_hwctx = ctx->hwctx; int opaque = !!(frames_hwctx->frame_type & MFX_MEMTYPE_OPAQUE_FRAME); uint32_t fourcc = 0; int i, ret; for (i = 0; i < FF_ARRAY_ELEMS(supported_pixel_formats); i++) { if (supported_pixel_formats[i].pix_fmt == ctx->sw_format) { fourcc = supported_pixel_formats[i].fourcc; break; } } if (!fourcc) { av_log(ctx, AV_LOG_ERROR, "Unsupported pixel format\n"); return AVERROR(ENOSYS); } if (!ctx->pool) { ret = qsv_init_pool(ctx, fourcc); if (ret < 0) { av_log(ctx, AV_LOG_ERROR, "Error creating an internal frame pool\n"); return ret; } } if (opaque) { s->surface_ptrs = av_mallocz_array(frames_hwctx->nb_surfaces, sizeof(*s->surface_ptrs)); if (!s->surface_ptrs) return AVERROR(ENOMEM); for (i = 0; i < frames_hwctx->nb_surfaces; i++) s->surface_ptrs[i] = frames_hwctx->surfaces + i; s->opaque_alloc.In.Surfaces = s->surface_ptrs; s->opaque_alloc.In.NumSurface = frames_hwctx->nb_surfaces; s->opaque_alloc.In.Type = frames_hwctx->frame_type; s->opaque_alloc.Out = s->opaque_alloc.In; s->opaque_alloc.Header.BufferId = MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION; s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc); s->ext_buffers[0] = (mfxExtBuffer*)&s->opaque_alloc; } else { s->mem_ids = av_mallocz_array(frames_hwctx->nb_surfaces, sizeof(*s->mem_ids)); if (!s->mem_ids) return AVERROR(ENOMEM); for (i = 0; i < frames_hwctx->nb_surfaces; i++) s->mem_ids[i] = frames_hwctx->surfaces[i].Data.MemId; } ret = qsv_init_internal_session(ctx, &s->session_download, 0); if (ret < 0) return ret; ret = qsv_init_internal_session(ctx, &s->session_upload, 1); if (ret < 0) return ret; return 0; }