diff mbox

[FFmpeg-devel,1/2] lavc/decode: re-allocate surface in ff_decode_get_hw_frames_ctx

Message ID 1577436492-25163-1-git-send-email-linjie.fu@intel.com
State New
Headers show

Commit Message

Fu, Linjie Dec. 27, 2019, 8:48 a.m. UTC
Allow hw_frames_ctx to be recreated instead of just return if it exists.

Move hw_frames_ctx check outside ff_decode_get_hw_frames_ctx, and check
in relevant code.

Signed-off-by: Linjie Fu <linjie.fu@intel.com>
---
 libavcodec/decode.c | 2 +-
 libavcodec/dxva2.c  | 8 +++++---
 libavcodec/vdpau.c  | 9 +++++----
 3 files changed, 11 insertions(+), 8 deletions(-)

Comments

Hendrik Leppkes Dec. 27, 2019, 10:24 a.m. UTC | #1
On Fri, Dec 27, 2019 at 9:59 AM Linjie Fu <linjie.fu@intel.com> wrote:
>
> Allow hw_frames_ctx to be recreated instead of just return if it exists.
>
> Move hw_frames_ctx check outside ff_decode_get_hw_frames_ctx, and check
> in relevant code.
>
> Signed-off-by: Linjie Fu <linjie.fu@intel.com>
> ---
>  libavcodec/decode.c | 2 +-
>  libavcodec/dxva2.c  | 8 +++++---
>  libavcodec/vdpau.c  | 9 +++++----
>  3 files changed, 11 insertions(+), 8 deletions(-)
>
> diff --git a/libavcodec/decode.c b/libavcodec/decode.c
> index cd275ba..ad046d9 100644
> --- a/libavcodec/decode.c
> +++ b/libavcodec/decode.c
> @@ -1229,7 +1229,7 @@ int ff_decode_get_hw_frames_ctx(AVCodecContext *avctx,
>          return AVERROR(ENOSYS);
>
>      if (avctx->hw_frames_ctx)
> -        return 0;
> +        av_buffer_unref(&avctx->hw_frames_ctx);
>      if (!avctx->hw_device_ctx) {
>          av_log(avctx, AV_LOG_ERROR, "A hardware frames or device context is "
>                  "required for hardware accelerated decoding.\n");


As mentioned in the other mail, this is not safe. An externally
provided hw_frames_ctx could be allocated with special requirements,
and shared with a renderer. If a user provides an external
hw_frames_ctx, then avcodec cannot just re-allocate it, instead we
would have to ask the user to do so.

- Hendrik
diff mbox

Patch

diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index cd275ba..ad046d9 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1229,7 +1229,7 @@  int ff_decode_get_hw_frames_ctx(AVCodecContext *avctx,
         return AVERROR(ENOSYS);
 
     if (avctx->hw_frames_ctx)
-        return 0;
+        av_buffer_unref(&avctx->hw_frames_ctx);
     if (!avctx->hw_device_ctx) {
         av_log(avctx, AV_LOG_ERROR, "A hardware frames or device context is "
                 "required for hardware accelerated decoding.\n");
diff --git a/libavcodec/dxva2.c b/libavcodec/dxva2.c
index 3241611..0404064 100644
--- a/libavcodec/dxva2.c
+++ b/libavcodec/dxva2.c
@@ -661,9 +661,11 @@  int ff_dxva2_decode_init(AVCodecContext *avctx)
     // (avctx->pix_fmt is not updated yet at this point)
     sctx->pix_fmt = avctx->hwaccel->pix_fmt;
 
-    ret = ff_decode_get_hw_frames_ctx(avctx, dev_type);
-    if (ret < 0)
-        return ret;
+    if (!avctx->hw_frames_ctx) {
+        ret = ff_decode_get_hw_frames_ctx(avctx, dev_type);
+        if (ret < 0)
+            return ret;
+    }
 
     frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
     sctx->device_ctx = frames_ctx->device_ctx;
diff --git a/libavcodec/vdpau.c b/libavcodec/vdpau.c
index 167f06d..b7a4e9c 100644
--- a/libavcodec/vdpau.c
+++ b/libavcodec/vdpau.c
@@ -178,10 +178,11 @@  int ff_vdpau_common_init(AVCodecContext *avctx, VdpDecoderProfile profile,
         AVHWFramesContext *frames_ctx;
         AVVDPAUDeviceContext *dev_ctx;
 
-        ret = ff_decode_get_hw_frames_ctx(avctx, AV_HWDEVICE_TYPE_VDPAU);
-        if (ret < 0)
-            return ret;
-
+        if (!avctx->hw_frames_ctx) {
+            ret = ff_decode_get_hw_frames_ctx(avctx, AV_HWDEVICE_TYPE_VDPAU);
+            if (ret < 0)
+                return ret;
+        }
         frames_ctx = (AVHWFramesContext*)avctx->hw_frames_ctx->data;
         dev_ctx = frames_ctx->device_ctx->hwctx;