Merge commit '4cfbeef31d4e6096c0596359d212f5d99a7ba4b5'
authorMichael Niedermayer <michaelni@gmx.at>
Sat, 27 Dec 2014 11:15:34 +0000 (12:15 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 27 Dec 2014 11:15:34 +0000 (12:15 +0100)
* commit '4cfbeef31d4e6096c0596359d212f5d99a7ba4b5':
  h264: factor hwaccel pixel formats list

Conflicts:
libavcodec/h264_slice.c

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

index 216e96394d24180ba7f1bfbf691043a1be058c28,c2826e69da5eef7314ea0b754b211338e7b39902..2f58f1132eb06194cecbc007b73ef92b7b4d14ac
@@@ -1034,14 -937,15 +998,16 @@@ static int clone_slice(H264Context *dst
      return 0;
  }
  
 -static enum AVPixelFormat get_pixel_format(H264Context *h)
 +static enum AVPixelFormat get_pixel_format(H264Context *h, int force_callback)
  {
-     enum AVPixelFormat pix_fmts[2];
+ #define HWACCEL_MAX (CONFIG_H264_DXVA2_HWACCEL + \
+                      CONFIG_H264_VAAPI_HWACCEL + \
+                      (CONFIG_H264_VDA_HWACCEL * 2) + \
+                      CONFIG_H264_VDPAU_HWACCEL)
+     enum AVPixelFormat pix_fmts[HWACCEL_MAX + 2], *fmt = pix_fmts;
      const enum AVPixelFormat *choices = pix_fmts;
 +    int i;
  
-     pix_fmts[1] = AV_PIX_FMT_NONE;
      switch (h->sps.bit_depth_luma) {
      case 9:
          if (CHROMA444(h)) {
      case 10:
          if (CHROMA444(h)) {
              if (h->avctx->colorspace == AVCOL_SPC_RGB) {
-                 pix_fmts[0] = AV_PIX_FMT_GBRP10;
+                 *fmt++ = AV_PIX_FMT_GBRP10;
              } else
-                 pix_fmts[0] = AV_PIX_FMT_YUV444P10;
+                 *fmt++ = AV_PIX_FMT_YUV444P10;
          } else if (CHROMA422(h))
-             pix_fmts[0] = AV_PIX_FMT_YUV422P10;
+             *fmt++ = AV_PIX_FMT_YUV422P10;
          else
-             pix_fmts[0] = AV_PIX_FMT_YUV420P10;
+             *fmt++ = AV_PIX_FMT_YUV420P10;
          break;
-                 pix_fmts[0] = AV_PIX_FMT_GBRP12;
 +    case 12:
 +        if (CHROMA444(h)) {
 +            if (h->avctx->colorspace == AVCOL_SPC_RGB) {
-                 pix_fmts[0] = AV_PIX_FMT_YUV444P12;
++                *fmt++ = AV_PIX_FMT_GBRP12;
 +            } else
-             pix_fmts[0] = AV_PIX_FMT_YUV422P12;
++                *fmt++ = AV_PIX_FMT_YUV444P12;
 +        } else if (CHROMA422(h))
-             pix_fmts[0] = AV_PIX_FMT_YUV420P12;
++            *fmt++ = AV_PIX_FMT_YUV422P12;
 +        else
-                 pix_fmts[0] = AV_PIX_FMT_GBRP14;
++            *fmt++ = AV_PIX_FMT_YUV420P12;
 +        break;
 +    case 14:
 +        if (CHROMA444(h)) {
 +            if (h->avctx->colorspace == AVCOL_SPC_RGB) {
-                 pix_fmts[0] = AV_PIX_FMT_YUV444P14;
++                *fmt++ = AV_PIX_FMT_GBRP14;
 +            } else
-             pix_fmts[0] = AV_PIX_FMT_YUV422P14;
++                *fmt++ = AV_PIX_FMT_YUV444P14;
 +        } else if (CHROMA422(h))
-             pix_fmts[0] = AV_PIX_FMT_YUV420P14;
++            *fmt++ = AV_PIX_FMT_YUV422P14;
 +        else
++            *fmt++ = AV_PIX_FMT_YUV420P14;
 +        break;
      case 8:
          if (CHROMA444(h)) {
 +            if (h->avctx->colorspace == AVCOL_SPC_YCGCO)
 +                av_log(h->avctx, AV_LOG_WARNING, "Detected unsupported YCgCo colorspace.\n");
              if (h->avctx->colorspace == AVCOL_SPC_RGB)
-                 pix_fmts[0] = AV_PIX_FMT_GBRP;
+                 *fmt++ = AV_PIX_FMT_GBRP;
              else if (h->avctx->color_range == AVCOL_RANGE_JPEG)
-                 pix_fmts[0] = AV_PIX_FMT_YUVJ444P;
+                 *fmt++ = AV_PIX_FMT_YUVJ444P;
              else
-                 pix_fmts[0] = AV_PIX_FMT_YUV444P;
+                 *fmt++ = AV_PIX_FMT_YUV444P;
          } else if (CHROMA422(h)) {
              if (h->avctx->color_range == AVCOL_RANGE_JPEG)
-                 pix_fmts[0] = AV_PIX_FMT_YUVJ422P;
+                 *fmt++ = AV_PIX_FMT_YUVJ422P;
              else
-                 pix_fmts[0] = AV_PIX_FMT_YUV422P;
+                 *fmt++ = AV_PIX_FMT_YUV422P;
          } else {
+ #if CONFIG_H264_DXVA2_HWACCEL
+             *fmt++ = AV_PIX_FMT_DXVA2_VLD;
+ #endif
+ #if CONFIG_H264_VAAPI_HWACCEL
+             *fmt++ = AV_PIX_FMT_VAAPI_VLD;
+ #endif
+ #if CONFIG_H264_VDA_HWACCEL
+             *fmt++ = AV_PIX_FMT_VDA_VLD;
+             *fmt++ = AV_PIX_FMT_VDA;
+ #endif
+ #if CONFIG_H264_VDPAU_HWACCEL
+             *fmt++ = AV_PIX_FMT_VDPAU;
+ #endif
              if (h->avctx->codec->pix_fmts)
                  choices = h->avctx->codec->pix_fmts;
              else if (h->avctx->color_range == AVCOL_RANGE_JPEG)
          return AVERROR_INVALIDDATA;
      }
  
 -    return ff_get_format(h->avctx, choices);
+     *fmt = AV_PIX_FMT_NONE;
 +    for (i=0; choices[i] != AV_PIX_FMT_NONE; i++)
 +        if (choices[i] == h->avctx->pix_fmt && !force_callback)
 +            return choices[i];
 +    return ff_thread_get_format(h->avctx, choices);
  }
  
  /* export coded and cropped frame dimensions to AVCodecContext */