Merge commit '1c80c9d7ef809180042257200c7b5f6b81d0b0e2'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 27 Sep 2014 00:42:30 +0000 (02:42 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 27 Sep 2014 00:42:30 +0000 (02:42 +0200)
* commit '1c80c9d7ef809180042257200c7b5f6b81d0b0e2':
  hwaccel: Call ->get_format again if hwaccel init fails

Conflicts:
libavcodec/utils.c

Merged-by: Michael Niedermayer <michaelni@gmx.at>
1  2 
libavcodec/avcodec.h
libavcodec/utils.c

Simple merge
@@@ -1156,46 -934,49 +1188,51 @@@ static int setup_hwaccel(AVCodecContex
  int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)
  {
      const AVPixFmtDescriptor *desc;
-     enum AVPixelFormat ret = avctx->get_format(avctx, fmt);
+     enum AVPixelFormat *choices;
+     enum AVPixelFormat ret;
+     unsigned n = 0;
+     while (fmt[n] != AV_PIX_FMT_NONE)
+         ++n;
  
-     desc = av_pix_fmt_desc_get(ret);
-     if (!desc)
+     choices = av_malloc_array(n + 1, sizeof(*choices));
+     if (!choices)
          return AV_PIX_FMT_NONE;
  
-     if (avctx->hwaccel && avctx->hwaccel->uninit)
-         avctx->hwaccel->uninit(avctx);
-     av_freep(&avctx->internal->hwaccel_priv_data);
-     avctx->hwaccel = NULL;
-     if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL &&
-         !(avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)) {
-         AVHWAccel *hwaccel;
-         int err;
-         hwaccel = find_hwaccel(avctx->codec_id, ret);
-         if (!hwaccel) {
-             av_log(avctx, AV_LOG_ERROR,
-                    "Could not find an AVHWAccel for the pixel format: %s",
-                    desc->name);
-             return AV_PIX_FMT_NONE;
-         }
+     memcpy(choices, fmt, (n + 1) * sizeof(*choices));
  
-         if (hwaccel->priv_data_size) {
-             avctx->internal->hwaccel_priv_data = av_mallocz(hwaccel->priv_data_size);
-             if (!avctx->internal->hwaccel_priv_data)
-                 return AV_PIX_FMT_NONE;
-         }
+     for (;;) {
+         ret = avctx->get_format(avctx, choices);
  
-         if (hwaccel->init) {
-             err = hwaccel->init(avctx);
-             if (err < 0) {
-                 av_freep(&avctx->internal->hwaccel_priv_data);
-                 return AV_PIX_FMT_NONE;
-             }
+         desc = av_pix_fmt_desc_get(ret);
+         if (!desc) {
+             ret = AV_PIX_FMT_NONE;
+             break;
          }
-         avctx->hwaccel = hwaccel;
+         if (avctx->hwaccel && avctx->hwaccel->uninit)
+             avctx->hwaccel->uninit(avctx);
+         av_freep(&avctx->internal->hwaccel_priv_data);
+         avctx->hwaccel = NULL;
+         if (!(desc->flags & AV_PIX_FMT_FLAG_HWACCEL))
+             break;
++        if (avctx->codec->capabilities&CODEC_CAP_HWACCEL_VDPAU)
++            break;
+         if (!setup_hwaccel(avctx, ret, desc->name))
+             break;
+         /* Remove failed hwaccel from choices */
+         for (n = 0; choices[n] != ret; n++)
+             av_assert0(choices[n] != AV_PIX_FMT_NONE);
+         do
+             choices[n] = choices[n + 1];
+         while (choices[n] != AV_PIX_FMT_NONE);
      }
  
+     av_freep(&choices);
      return ret;
  }