[01/17] lavc: Split out ff_hwaccel_pixfmt_list_420[] over individual codecs

Message ID 1362578206-2806-1-git-send-email-martin@martin.st
State Committed
Headers show

Commit Message

Martin Storsjö March 6, 2013, 1:56 p.m.
From: "Ronald S. Bultje" <rsbultje@gmail.com>

Not all hwaccels implement all codecs, so using one single list for
multiple such codecs means some codecs will be represented in the list,
even though they don't actually handle that codec. Copying specific
lists in each codec fixes that.
---
 libavcodec/h263.h          |    2 ++
 libavcodec/h263dec.c       |   13 ++++++++++++-
 libavcodec/h264.c          |   19 ++++++++++++++++++-
 libavcodec/mpeg12.c        |   16 +++++++++++++++-
 libavcodec/mpeg4videodec.c |    2 +-
 libavcodec/mpegvideo.c     |   17 -----------------
 libavcodec/mpegvideo.h     |    1 -
 libavcodec/vc1dec.c        |   18 ++++++++++++++++--
 8 files changed, 64 insertions(+), 24 deletions(-)

Comments

Anton Khirnov March 6, 2013, 3:29 p.m. | #1
On Wed,  6 Mar 2013 15:56:30 +0200, Martin Storsjö <martin@martin.st> wrote:
> From: "Ronald S. Bultje" <rsbultje@gmail.com>
> 
> Not all hwaccels implement all codecs, so using one single list for
> multiple such codecs means some codecs will be represented in the list,
> even though they don't actually handle that codec. Copying specific
> lists in each codec fixes that.
> ---
>  libavcodec/h263.h          |    2 ++
>  libavcodec/h263dec.c       |   13 ++++++++++++-
>  libavcodec/h264.c          |   19 ++++++++++++++++++-
>  libavcodec/mpeg12.c        |   16 +++++++++++++++-
>  libavcodec/mpeg4videodec.c |    2 +-
>  libavcodec/mpegvideo.c     |   17 -----------------
>  libavcodec/mpegvideo.h     |    1 -
>  libavcodec/vc1dec.c        |   18 ++++++++++++++++--
>  8 files changed, 64 insertions(+), 24 deletions(-)
> 
> diff --git a/libavcodec/h263.h b/libavcodec/h263.h
> index e1e0dd7..dec660e 100644
> --- a/libavcodec/h263.h
> +++ b/libavcodec/h263.h
> @@ -64,6 +64,8 @@ extern uint8_t ff_mba_length[7];
>  
>  extern uint8_t ff_h263_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
>  
> +extern const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[];
> +
>  
>  int ff_h263_decode_motion(MpegEncContext * s, int pred, int f_code);
>  av_const int ff_h263_aspect_to_info(AVRational aspect);
> diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
> index 663fe90..9714632 100644
> --- a/libavcodec/h263dec.c
> +++ b/libavcodec/h263dec.c
> @@ -738,6 +738,17 @@ av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time);
>      return (ret && (avctx->err_recognition & AV_EF_EXPLODE))?ret:get_consumed_bytes(s, buf_size);
>  }
>  
> +const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[] = {
> +#if CONFIG_VAAPI
> +    AV_PIX_FMT_VAAPI_VLD,
> +#endif
> +#if CONFIG_VDPAU
> +    AV_PIX_FMT_VDPAU,
> +#endif
> +    AV_PIX_FMT_YUV420P,
> +    AV_PIX_FMT_NONE
> +};
> +
>  AVCodec ff_h263_decoder = {
>      .name           = "h263",
>      .type           = AVMEDIA_TYPE_VIDEO,
> @@ -750,5 +761,5 @@ AVCodec ff_h263_decoder = {
>                        CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
>      .flush          = ff_mpeg_flush,
>      .long_name      = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
> -    .pix_fmts       = ff_hwaccel_pixfmt_list_420,
> +    .pix_fmts       = ff_h263_hwaccel_pixfmt_list_420,
>  };
> diff --git a/libavcodec/h264.c b/libavcodec/h264.c
> index e7186c8..7ec5583 100644
> --- a/libavcodec/h264.c
> +++ b/libavcodec/h264.c
> @@ -61,6 +61,23 @@ static const uint8_t div6[QP_MAX_NUM + 1] = {
>      7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
>  };
>  
> +static const enum AVPixelFormat hwaccel_pixfmt_list_h264_420[] = {
> +#if CONFIG_H264_DXVA2_HWACCEL
> +    AV_PIX_FMT_DXVA2_VLD,
> +#endif
> +#if CONFIG_H264_VAAPI_HWACCEL
> +    AV_PIX_FMT_VAAPI_VLD,
> +#endif
> +#if CONFIG_H264_VDA_HWACCEL
> +    AV_PIX_FMT_VDA_VLD,
> +#endif
> +#if CONFIG_H264_VDPAU_HWACCEL
> +    AV_PIX_FMT_VDPAU,
> +#endif
> +    AV_PIX_FMT_YUV420P,
> +    AV_PIX_FMT_NONE
> +};
> +
>  static const enum AVPixelFormat hwaccel_pixfmt_list_h264_jpeg_420[] = {
>  #if CONFIG_H264_DXVA2_HWACCEL
>      AV_PIX_FMT_DXVA2_VLD,
> @@ -2817,7 +2834,7 @@ static enum PixelFormat get_pixel_format(H264Context *h)
>                                          h->avctx->codec->pix_fmts :
>                                          h->avctx->color_range == AVCOL_RANGE_JPEG ?
>                                          hwaccel_pixfmt_list_h264_jpeg_420 :
> -                                        ff_hwaccel_pixfmt_list_420);
> +                                        hwaccel_pixfmt_list_h264_420);
>          }
>          break;
>      default:
> diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
> index 4df51a2..8aa3122 100644
> --- a/libavcodec/mpeg12.c
> +++ b/libavcodec/mpeg12.c
> @@ -1176,6 +1176,20 @@ static const enum AVPixelFormat pixfmt_xvmc_mpg2_420[] = {
>      AV_PIX_FMT_XVMC_MPEG2_MC,
>      AV_PIX_FMT_NONE };
>  
> +static const enum AVPixelFormat mpeg12_hwaccel_pixfmt_list_420[] = {

Inconsistent naming -- hwaccel_pixfmt_list_<codec>_<subsampling> vs
<codec>_hwaccel_pixfmt_list_<subsampling>

I don't really care which scheme is used, as long as it's consistent between
codecs.

Otherwise looks ok.
Martin Storsjö March 6, 2013, 7:20 p.m. | #2
On Wed, 6 Mar 2013, Anton Khirnov wrote:

>
> On Wed,  6 Mar 2013 15:56:30 +0200, Martin Storsjö <martin@martin.st> wrote:
>> From: "Ronald S. Bultje" <rsbultje@gmail.com>
>>
>> Not all hwaccels implement all codecs, so using one single list for
>> multiple such codecs means some codecs will be represented in the list,
>> even though they don't actually handle that codec. Copying specific
>> lists in each codec fixes that.
>> ---
>>  libavcodec/h263.h          |    2 ++
>>  libavcodec/h263dec.c       |   13 ++++++++++++-
>>  libavcodec/h264.c          |   19 ++++++++++++++++++-
>>  libavcodec/mpeg12.c        |   16 +++++++++++++++-
>>  libavcodec/mpeg4videodec.c |    2 +-
>>  libavcodec/mpegvideo.c     |   17 -----------------
>>  libavcodec/mpegvideo.h     |    1 -
>>  libavcodec/vc1dec.c        |   18 ++++++++++++++++--
>>  8 files changed, 64 insertions(+), 24 deletions(-)
>>
>> diff --git a/libavcodec/h263.h b/libavcodec/h263.h
>> index e1e0dd7..dec660e 100644
>> --- a/libavcodec/h263.h
>> +++ b/libavcodec/h263.h
>> @@ -64,6 +64,8 @@ extern uint8_t ff_mba_length[7];
>>
>>  extern uint8_t ff_h263_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
>>
>> +extern const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[];
>> +
>>
>>  int ff_h263_decode_motion(MpegEncContext * s, int pred, int f_code);
>>  av_const int ff_h263_aspect_to_info(AVRational aspect);
>> diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
>> index 663fe90..9714632 100644
>> --- a/libavcodec/h263dec.c
>> +++ b/libavcodec/h263dec.c
>> @@ -738,6 +738,17 @@ av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time);
>>      return (ret && (avctx->err_recognition & AV_EF_EXPLODE))?ret:get_consumed_bytes(s, buf_size);
>>  }
>>
>> +const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[] = {
>> +#if CONFIG_VAAPI
>> +    AV_PIX_FMT_VAAPI_VLD,
>> +#endif
>> +#if CONFIG_VDPAU
>> +    AV_PIX_FMT_VDPAU,
>> +#endif
>> +    AV_PIX_FMT_YUV420P,
>> +    AV_PIX_FMT_NONE
>> +};
>> +
>>  AVCodec ff_h263_decoder = {
>>      .name           = "h263",
>>      .type           = AVMEDIA_TYPE_VIDEO,
>> @@ -750,5 +761,5 @@ AVCodec ff_h263_decoder = {
>>                        CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
>>      .flush          = ff_mpeg_flush,
>>      .long_name      = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
>> -    .pix_fmts       = ff_hwaccel_pixfmt_list_420,
>> +    .pix_fmts       = ff_h263_hwaccel_pixfmt_list_420,
>>  };
>> diff --git a/libavcodec/h264.c b/libavcodec/h264.c
>> index e7186c8..7ec5583 100644
>> --- a/libavcodec/h264.c
>> +++ b/libavcodec/h264.c
>> @@ -61,6 +61,23 @@ static const uint8_t div6[QP_MAX_NUM + 1] = {
>>      7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
>>  };
>>
>> +static const enum AVPixelFormat hwaccel_pixfmt_list_h264_420[] = {
>> +#if CONFIG_H264_DXVA2_HWACCEL
>> +    AV_PIX_FMT_DXVA2_VLD,
>> +#endif
>> +#if CONFIG_H264_VAAPI_HWACCEL
>> +    AV_PIX_FMT_VAAPI_VLD,
>> +#endif
>> +#if CONFIG_H264_VDA_HWACCEL
>> +    AV_PIX_FMT_VDA_VLD,
>> +#endif
>> +#if CONFIG_H264_VDPAU_HWACCEL
>> +    AV_PIX_FMT_VDPAU,
>> +#endif
>> +    AV_PIX_FMT_YUV420P,
>> +    AV_PIX_FMT_NONE
>> +};
>> +
>>  static const enum AVPixelFormat hwaccel_pixfmt_list_h264_jpeg_420[] = {
>>  #if CONFIG_H264_DXVA2_HWACCEL
>>      AV_PIX_FMT_DXVA2_VLD,
>> @@ -2817,7 +2834,7 @@ static enum PixelFormat get_pixel_format(H264Context *h)
>>                                          h->avctx->codec->pix_fmts :
>>                                          h->avctx->color_range == AVCOL_RANGE_JPEG ?
>>                                          hwaccel_pixfmt_list_h264_jpeg_420 :
>> -                                        ff_hwaccel_pixfmt_list_420);
>> +                                        hwaccel_pixfmt_list_h264_420);
>>          }
>>          break;
>>      default:
>> diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
>> index 4df51a2..8aa3122 100644
>> --- a/libavcodec/mpeg12.c
>> +++ b/libavcodec/mpeg12.c
>> @@ -1176,6 +1176,20 @@ static const enum AVPixelFormat pixfmt_xvmc_mpg2_420[] = {
>>      AV_PIX_FMT_XVMC_MPEG2_MC,
>>      AV_PIX_FMT_NONE };
>>
>> +static const enum AVPixelFormat mpeg12_hwaccel_pixfmt_list_420[] = {
>
> Inconsistent naming -- hwaccel_pixfmt_list_<codec>_<subsampling> vs
> <codec>_hwaccel_pixfmt_list_<subsampling>
>
> I don't really care which scheme is used, as long as it's consistent between
> codecs.
>
> Otherwise looks ok.

Pushed with the naming made consistent.

// Martin

Patch

diff --git a/libavcodec/h263.h b/libavcodec/h263.h
index e1e0dd7..dec660e 100644
--- a/libavcodec/h263.h
+++ b/libavcodec/h263.h
@@ -64,6 +64,8 @@  extern uint8_t ff_mba_length[7];
 
 extern uint8_t ff_h263_static_rl_table_store[2][2][2*MAX_RUN + MAX_LEVEL + 3];
 
+extern const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[];
+
 
 int ff_h263_decode_motion(MpegEncContext * s, int pred, int f_code);
 av_const int ff_h263_aspect_to_info(AVRational aspect);
diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 663fe90..9714632 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -738,6 +738,17 @@  av_log(avctx, AV_LOG_DEBUG, "%"PRId64"\n", rdtsc()-time);
     return (ret && (avctx->err_recognition & AV_EF_EXPLODE))?ret:get_consumed_bytes(s, buf_size);
 }
 
+const enum AVPixelFormat ff_h263_hwaccel_pixfmt_list_420[] = {
+#if CONFIG_VAAPI
+    AV_PIX_FMT_VAAPI_VLD,
+#endif
+#if CONFIG_VDPAU
+    AV_PIX_FMT_VDPAU,
+#endif
+    AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_NONE
+};
+
 AVCodec ff_h263_decoder = {
     .name           = "h263",
     .type           = AVMEDIA_TYPE_VIDEO,
@@ -750,5 +761,5 @@  AVCodec ff_h263_decoder = {
                       CODEC_CAP_TRUNCATED | CODEC_CAP_DELAY,
     .flush          = ff_mpeg_flush,
     .long_name      = NULL_IF_CONFIG_SMALL("H.263 / H.263-1996, H.263+ / H.263-1998 / H.263 version 2"),
-    .pix_fmts       = ff_hwaccel_pixfmt_list_420,
+    .pix_fmts       = ff_h263_hwaccel_pixfmt_list_420,
 };
diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index e7186c8..7ec5583 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -61,6 +61,23 @@  static const uint8_t div6[QP_MAX_NUM + 1] = {
     7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10,
 };
 
+static const enum AVPixelFormat hwaccel_pixfmt_list_h264_420[] = {
+#if CONFIG_H264_DXVA2_HWACCEL
+    AV_PIX_FMT_DXVA2_VLD,
+#endif
+#if CONFIG_H264_VAAPI_HWACCEL
+    AV_PIX_FMT_VAAPI_VLD,
+#endif
+#if CONFIG_H264_VDA_HWACCEL
+    AV_PIX_FMT_VDA_VLD,
+#endif
+#if CONFIG_H264_VDPAU_HWACCEL
+    AV_PIX_FMT_VDPAU,
+#endif
+    AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_NONE
+};
+
 static const enum AVPixelFormat hwaccel_pixfmt_list_h264_jpeg_420[] = {
 #if CONFIG_H264_DXVA2_HWACCEL
     AV_PIX_FMT_DXVA2_VLD,
@@ -2817,7 +2834,7 @@  static enum PixelFormat get_pixel_format(H264Context *h)
                                         h->avctx->codec->pix_fmts :
                                         h->avctx->color_range == AVCOL_RANGE_JPEG ?
                                         hwaccel_pixfmt_list_h264_jpeg_420 :
-                                        ff_hwaccel_pixfmt_list_420);
+                                        hwaccel_pixfmt_list_h264_420);
         }
         break;
     default:
diff --git a/libavcodec/mpeg12.c b/libavcodec/mpeg12.c
index 4df51a2..8aa3122 100644
--- a/libavcodec/mpeg12.c
+++ b/libavcodec/mpeg12.c
@@ -1176,6 +1176,20 @@  static const enum AVPixelFormat pixfmt_xvmc_mpg2_420[] = {
     AV_PIX_FMT_XVMC_MPEG2_MC,
     AV_PIX_FMT_NONE };
 
+static const enum AVPixelFormat mpeg12_hwaccel_pixfmt_list_420[] = {
+#if CONFIG_MPEG2_DXVA2_HWACCEL
+    AV_PIX_FMT_DXVA2_VLD,
+#endif
+#if CONFIG_MPEG2_VAAPI_HWACCEL
+    AV_PIX_FMT_VAAPI_VLD,
+#endif
+#if CONFIG_MPEG1_VDPAU_HWACCEL | CONFIG_MPEG2_VDPAU_HWACCEL
+    AV_PIX_FMT_VDPAU,
+#endif
+    AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_NONE
+};
+
 static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
 {
     Mpeg1Context *s1 = avctx->priv_data;
@@ -1190,7 +1204,7 @@  static enum AVPixelFormat mpeg_get_pixelformat(AVCodecContext *avctx)
             return AV_PIX_FMT_VDPAU_MPEG2;
     } else {
         if (s->chroma_format <  2)
-            return avctx->get_format(avctx, ff_hwaccel_pixfmt_list_420);
+            return avctx->get_format(avctx, mpeg12_hwaccel_pixfmt_list_420);
         else if (s->chroma_format == 2)
             return AV_PIX_FMT_YUV422P;
         else
diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
index ebc74a7..3f88993 100644
--- a/libavcodec/mpeg4videodec.c
+++ b/libavcodec/mpeg4videodec.c
@@ -2270,7 +2270,7 @@  AVCodec ff_mpeg4_decoder = {
                              CODEC_CAP_FRAME_THREADS,
     .flush                 = ff_mpeg_flush,
     .long_name             = NULL_IF_CONFIG_SMALL("MPEG-4 part 2"),
-    .pix_fmts              = ff_hwaccel_pixfmt_list_420,
+    .pix_fmts              = ff_h263_hwaccel_pixfmt_list_420,
     .profiles              = NULL_IF_CONFIG_SMALL(mpeg4_video_profiles),
     .update_thread_context = ONLY_IF_THREADS_ENABLED(ff_mpeg_update_thread_context),
 };
diff --git a/libavcodec/mpegvideo.c b/libavcodec/mpegvideo.c
index 08d4cbb..96cb6a7 100644
--- a/libavcodec/mpegvideo.c
+++ b/libavcodec/mpegvideo.c
@@ -130,23 +130,6 @@  const enum AVPixelFormat ff_pixfmt_list_420[] = {
     AV_PIX_FMT_NONE
 };
 
-const enum AVPixelFormat ff_hwaccel_pixfmt_list_420[] = {
-#if CONFIG_DXVA2
-    AV_PIX_FMT_DXVA2_VLD,
-#endif
-#if CONFIG_VAAPI
-    AV_PIX_FMT_VAAPI_VLD,
-#endif
-#if CONFIG_VDA
-    AV_PIX_FMT_VDA_VLD,
-#endif
-#if CONFIG_VDPAU
-    AV_PIX_FMT_VDPAU,
-#endif
-    AV_PIX_FMT_YUV420P,
-    AV_PIX_FMT_NONE
-};
-
 static void mpeg_er_decode_mb(void *opaque, int ref, int mv_dir, int mv_type,
                               int (*mv)[2][4][2],
                               int mb_x, int mb_y, int mb_intra, int mb_skipped)
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index cd11ecd..7e031db 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -802,7 +802,6 @@  void ff_MPV_motion(MpegEncContext *s,
 int ff_alloc_picture(MpegEncContext *s, Picture *pic, int shared);
 
 extern const enum AVPixelFormat ff_pixfmt_list_420[];
-extern const enum AVPixelFormat ff_hwaccel_pixfmt_list_420[];
 
 /**
  * permute block according to permuatation.
diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c
index 403bac8..6a76b1d 100644
--- a/libavcodec/vc1dec.c
+++ b/libavcodec/vc1dec.c
@@ -5687,6 +5687,20 @@  static const AVProfile profiles[] = {
     { FF_PROFILE_UNKNOWN },
 };
 
+static const enum AVPixelFormat vc1_hwaccel_pixfmt_list_420[] = {
+#if CONFIG_DXVA2
+    AV_PIX_FMT_DXVA2_VLD,
+#endif
+#if CONFIG_VAAPI
+    AV_PIX_FMT_VAAPI_VLD,
+#endif
+#if CONFIG_VDPAU
+    AV_PIX_FMT_VDPAU,
+#endif
+    AV_PIX_FMT_YUV420P,
+    AV_PIX_FMT_NONE
+};
+
 AVCodec ff_vc1_decoder = {
     .name           = "vc1",
     .type           = AVMEDIA_TYPE_VIDEO,
@@ -5698,7 +5712,7 @@  AVCodec ff_vc1_decoder = {
     .flush          = ff_mpeg_flush,
     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
     .long_name      = NULL_IF_CONFIG_SMALL("SMPTE VC-1"),
-    .pix_fmts       = ff_hwaccel_pixfmt_list_420,
+    .pix_fmts       = vc1_hwaccel_pixfmt_list_420,
     .profiles       = NULL_IF_CONFIG_SMALL(profiles)
 };
 
@@ -5714,7 +5728,7 @@  AVCodec ff_wmv3_decoder = {
     .flush          = ff_mpeg_flush,
     .capabilities   = CODEC_CAP_DR1 | CODEC_CAP_DELAY,
     .long_name      = NULL_IF_CONFIG_SMALL("Windows Media Video 9"),
-    .pix_fmts       = ff_hwaccel_pixfmt_list_420,
+    .pix_fmts       = vc1_hwaccel_pixfmt_list_420,
     .profiles       = NULL_IF_CONFIG_SMALL(profiles)
 };
 #endif