D3DLOCK_READONLY properly corresponds to the absence of the write flag,
not to the presence of the read flag, while D3DLOCK_DISCARD is
equivalent to the overwrite flag.
D3DLOCKED_RECT LockedRect;
HRESULT hr;
int i, err, nb_planes;
D3DLOCKED_RECT LockedRect;
HRESULT hr;
int i, err, nb_planes;
nb_planes = av_pix_fmt_count_planes(dst->format);
nb_planes = av_pix_fmt_count_planes(dst->format);
return AVERROR_UNKNOWN;
}
return AVERROR_UNKNOWN;
}
- hr = IDirect3DSurface9_LockRect(surface, &LockedRect, NULL,
- flags & AV_HWFRAME_MAP_READ ? D3DLOCK_READONLY : D3DLOCK_DISCARD);
+ if (!(flags & AV_HWFRAME_MAP_WRITE))
+ lock_flags |= D3DLOCK_READONLY;
+ if (flags & AV_HWFRAME_MAP_OVERWRITE)
+ lock_flags |= D3DLOCK_DISCARD;
+
+ hr = IDirect3DSurface9_LockRect(surface, &LockedRect, NULL, lock_flags);
if (FAILED(hr)) {
av_log(ctx, AV_LOG_ERROR, "Unable to lock DXVA2 surface\n");
return AVERROR_UNKNOWN;
if (FAILED(hr)) {
av_log(ctx, AV_LOG_ERROR, "Unable to lock DXVA2 surface\n");
return AVERROR_UNKNOWN;
map->format = dst->format;
ret = dxva2_map_frame(ctx, map, download ? src : dst,
map->format = dst->format;
ret = dxva2_map_frame(ctx, map, download ? src : dst,
- download ? AV_HWFRAME_MAP_READ : AV_HWFRAME_MAP_WRITE);
+ download ? AV_HWFRAME_MAP_READ :
+ AV_HWFRAME_MAP_WRITE | AV_HWFRAME_MAP_OVERWRITE);