Browse code

avcodec: Implement mpeg1 nvdec hwaccel

Once I remembered that there's a separate decoder type for mpeg1,
even though params struct is shared with mpeg2, everything worked.

Philip Langdale authored on 2017/11/17 00:38:10
Showing 8 changed files
... ...
@@ -13,7 +13,7 @@ version <next>:
13 13
 - PCE support for extended channel layouts in the AAC encoder
14 14
 - native aptX encoder and decoder
15 15
 - Raw aptX muxer and demuxer
16
-- NVIDIA NVDEC-accelerated H.264, HEVC, MPEG-2, VC1 and VP9 hwaccel decoding
16
+- NVIDIA NVDEC-accelerated H.264, HEVC, MPEG-1/2, VC1 and VP9 hwaccel decoding
17 17
 - Intel QSV-accelerated overlay filter
18 18
 - mcompand audio filter
19 19
 - acontrast audio filter
... ...
@@ -2704,6 +2704,8 @@ mjpeg_cuvid_hwaccel_select="mjpeg_cuvid_decoder"
2704 2704
 mpeg_xvmc_hwaccel_deps="xvmc"
2705 2705
 mpeg_xvmc_hwaccel_select="mpeg2video_decoder"
2706 2706
 mpeg1_cuvid_hwaccel_select="mpeg1_cuvid_decoder"
2707
+mpeg1_nvdec_hwaccel_deps="nvdec"
2708
+mpeg1_nvdec_hwaccel_select="mpeg1video_decoder"
2707 2709
 mpeg1_vdpau_hwaccel_deps="vdpau"
2708 2710
 mpeg1_vdpau_hwaccel_select="mpeg1video_decoder"
2709 2711
 mpeg1_videotoolbox_hwaccel_deps="videotoolbox"
... ...
@@ -849,6 +849,7 @@ OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL)         += nvdec_hevc.o
849 849
 OBJS-$(CONFIG_HEVC_QSV_HWACCEL)           += qsvdec_h2645.o
850 850
 OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL)         += vaapi_hevc.o
851 851
 OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL)         += vdpau_hevc.o
852
+OBJS-$(CONFIG_MPEG1_NVDEC_HWACCEL)        += nvdec_mpeg12.o
852 853
 OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL)        += vdpau_mpeg12.o
853 854
 OBJS-$(CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o
854 855
 OBJS-$(CONFIG_MPEG1_XVMC_HWACCEL)         += mpegvideo_xvmc.o
... ...
@@ -87,6 +87,7 @@ static void register_all(void)
87 87
     REGISTER_HWACCEL(HEVC_VIDEOTOOLBOX, hevc_videotoolbox);
88 88
     REGISTER_HWACCEL(MJPEG_CUVID,       mjpeg_cuvid);
89 89
     REGISTER_HWACCEL(MPEG1_CUVID,       mpeg1_cuvid);
90
+    REGISTER_HWACCEL(MPEG1_NVDEC,       mpeg1_nvdec);
90 91
     REGISTER_HWACCEL(MPEG1_XVMC,        mpeg1_xvmc);
91 92
     REGISTER_HWACCEL(MPEG1_VDPAU,       mpeg1_vdpau);
92 93
     REGISTER_HWACCEL(MPEG1_VIDEOTOOLBOX, mpeg1_videotoolbox);
... ...
@@ -1130,6 +1130,9 @@ static void quant_matrix_rebuild(uint16_t *matrix, const uint8_t *old_perm,
1130 1130
 }
1131 1131
 
1132 1132
 static const enum AVPixelFormat mpeg1_hwaccel_pixfmt_list_420[] = {
1133
+#if CONFIG_MPEG1_NVDEC_HWACCEL
1134
+    AV_PIX_FMT_CUDA,
1135
+#endif
1133 1136
 #if CONFIG_MPEG1_XVMC_HWACCEL
1134 1137
     AV_PIX_FMT_XVMC,
1135 1138
 #endif
... ...
@@ -54,6 +54,7 @@ static int map_avcodec_id(enum AVCodecID id)
54 54
     switch (id) {
55 55
     case AV_CODEC_ID_H264:       return cudaVideoCodec_H264;
56 56
     case AV_CODEC_ID_HEVC:       return cudaVideoCodec_HEVC;
57
+    case AV_CODEC_ID_MPEG1VIDEO: return cudaVideoCodec_MPEG1;
57 58
     case AV_CODEC_ID_MPEG2VIDEO: return cudaVideoCodec_MPEG2;
58 59
     case AV_CODEC_ID_VC1:        return cudaVideoCodec_VC1;
59 60
     case AV_CODEC_ID_VP9:        return cudaVideoCodec_VP9;
... ...
@@ -1,5 +1,5 @@
1 1
 /*
2
- * MPEG-2 HW decode acceleration through NVDEC
2
+ * MPEG-1/2 HW decode acceleration through NVDEC
3 3
  *
4 4
  * Copyright (c) 2017 Philip Langdale
5 5
  *
... ...
@@ -105,3 +105,19 @@ AVHWAccel ff_mpeg2_nvdec_hwaccel = {
105 105
     .priv_data_size       = sizeof(NVDECContext),
106 106
 };
107 107
 #endif
108
+
109
+#if CONFIG_MPEG1_NVDEC_HWACCEL
110
+AVHWAccel ff_mpeg1_nvdec_hwaccel = {
111
+    .name                 = "mpeg1_nvdec",
112
+    .type                 = AVMEDIA_TYPE_VIDEO,
113
+    .id                   = AV_CODEC_ID_MPEG1VIDEO,
114
+    .pix_fmt              = AV_PIX_FMT_CUDA,
115
+    .start_frame          = nvdec_mpeg12_start_frame,
116
+    .end_frame            = ff_nvdec_simple_end_frame,
117
+    .decode_slice         = ff_nvdec_simple_decode_slice,
118
+    .frame_params         = nvdec_mpeg12_frame_params,
119
+    .init                 = ff_nvdec_decode_init,
120
+    .uninit               = ff_nvdec_decode_uninit,
121
+    .priv_data_size       = sizeof(NVDECContext),
122
+};
123
+#endif
... ...
@@ -29,7 +29,7 @@
29 29
 
30 30
 #define LIBAVCODEC_VERSION_MAJOR  58
31 31
 #define LIBAVCODEC_VERSION_MINOR   3
32
-#define LIBAVCODEC_VERSION_MICRO 103
32
+#define LIBAVCODEC_VERSION_MICRO 104
33 33
 
34 34
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
35 35
                                                LIBAVCODEC_VERSION_MINOR, \