On Mon, 19 Feb 2018 23:28:49 +0000 Mark Thompson <s...@jkqxz.net> wrote:
> From: Philip Langdale <phil...@overt.org> > > --- > Changelog | 2 +- > configure | 2 ++ > libavcodec/Makefile | 1 + > libavcodec/hwaccels.h | 1 + > libavcodec/mjpegdec.c | 6 ++++ > libavcodec/nvdec.c | 1 + > libavcodec/nvdec_mjpeg.c | 86 > ++++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 98 > insertions(+), 1 deletion(-) create mode 100644 > libavcodec/nvdec_mjpeg.c > > diff --git a/Changelog b/Changelog > index 32e39b8344..a46edb318c 100644 > --- a/Changelog > +++ b/Changelog > @@ -13,7 +13,7 @@ version <next>: > - PCE support for extended channel layouts in the AAC encoder > - native aptX and aptX HD encoder and decoder > - Raw aptX and aptX HD muxer and demuxer > -- NVIDIA NVDEC-accelerated H.264, HEVC, MPEG-1/2/4, VC1, VP8/9 > hwaccel decoding +- NVIDIA NVDEC-accelerated H.264, HEVC, MJPEG, > MPEG-1/2/4, VC1, VP8/9 hwaccel decoding > - Intel QSV-accelerated overlay filter > - mcompand audio filter > - acontrast audio filter > diff --git a/configure b/configure > index 4839d35747..eab9976bf7 100755 > --- a/configure > +++ b/configure > @@ -2714,6 +2714,8 @@ hevc_vdpau_hwaccel_deps="vdpau > VdpPictureInfoHEVC" hevc_vdpau_hwaccel_select="hevc_decoder" > hevc_videotoolbox_hwaccel_deps="videotoolbox" > hevc_videotoolbox_hwaccel_select="hevc_decoder" > +mjpeg_nvdec_hwaccel_deps="nvdec" > +mjpeg_nvdec_hwaccel_select="mjpeg_decoder" > mjpeg_vaapi_hwaccel_deps="vaapi" > mjpeg_vaapi_hwaccel_select="mjpeg_decoder" > mpeg_xvmc_hwaccel_deps="xvmc" > diff --git a/libavcodec/Makefile b/libavcodec/Makefile > index de52bc2094..c7a5692421 100644 > --- a/libavcodec/Makefile > +++ b/libavcodec/Makefile > @@ -854,6 +854,7 @@ OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += > nvdec_hevc.o OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += > qsvdec_h2645.o OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += > vaapi_hevc.o OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o > +OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o > OBJS-$(CONFIG_MJPEG_VAAPI_HWACCEL) += vaapi_mjpeg.o > OBJS-$(CONFIG_MPEG1_NVDEC_HWACCEL) += nvdec_mpeg12.o > OBJS-$(CONFIG_MPEG1_VDPAU_HWACCEL) += vdpau_mpeg12.o > diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h > index 420e2feeea..7d73da8676 100644 > --- a/libavcodec/hwaccels.h > +++ b/libavcodec/hwaccels.h > @@ -37,6 +37,7 @@ extern const AVHWAccel ff_hevc_nvdec_hwaccel; > extern const AVHWAccel ff_hevc_vaapi_hwaccel; > extern const AVHWAccel ff_hevc_vdpau_hwaccel; > extern const AVHWAccel ff_hevc_videotoolbox_hwaccel; > +extern const AVHWAccel ff_mjpeg_nvdec_hwaccel; > extern const AVHWAccel ff_mjpeg_vaapi_hwaccel; > extern const AVHWAccel ff_mpeg1_nvdec_hwaccel; > extern const AVHWAccel ff_mpeg1_vdpau_hwaccel; > diff --git a/libavcodec/mjpegdec.c b/libavcodec/mjpegdec.c > index 939f2849d0..beef174618 100644 > --- a/libavcodec/mjpegdec.c > +++ b/libavcodec/mjpegdec.c > @@ -650,6 +650,9 @@ unk_pixfmt: > s->avctx->pix_fmt = s->hwaccel_pix_fmt; > } else { > enum AVPixelFormat pix_fmts[] = { > +#if CONFIG_MJPEG_NVDEC_HWACCEL > + AV_PIX_FMT_CUDA, > +#endif > #if CONFIG_MJPEG_VAAPI_HWACCEL > AV_PIX_FMT_VAAPI, > #endif > @@ -2780,6 +2783,9 @@ AVCodec ff_mjpeg_decoder = { > .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM, > .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_MJPEG_NVDEC_HWACCEL > + HWACCEL_NVDEC(mjpeg), > +#endif > #if CONFIG_MJPEG_VAAPI_HWACCEL > HWACCEL_VAAPI(mjpeg), > #endif > diff --git a/libavcodec/nvdec.c b/libavcodec/nvdec.c > index e9e6ea0f8b..ab3cb88b27 100644 > --- a/libavcodec/nvdec.c > +++ b/libavcodec/nvdec.c > @@ -54,6 +54,7 @@ static int map_avcodec_id(enum AVCodecID id) > switch (id) { > case AV_CODEC_ID_H264: return cudaVideoCodec_H264; > case AV_CODEC_ID_HEVC: return cudaVideoCodec_HEVC; > + case AV_CODEC_ID_MJPEG: return cudaVideoCodec_JPEG; > case AV_CODEC_ID_MPEG1VIDEO: return cudaVideoCodec_MPEG1; > case AV_CODEC_ID_MPEG2VIDEO: return cudaVideoCodec_MPEG2; > case AV_CODEC_ID_MPEG4: return cudaVideoCodec_MPEG4; > diff --git a/libavcodec/nvdec_mjpeg.c b/libavcodec/nvdec_mjpeg.c > new file mode 100644 > index 0000000000..7e404246ce > --- /dev/null > +++ b/libavcodec/nvdec_mjpeg.c > @@ -0,0 +1,86 @@ > +/* > + * MJPEG HW decode acceleration through NVDEC > + * > + * Copyright (c) 2017 Philip Langdale > + * > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > 02110-1301 USA > + */ > + > +#include "avcodec.h" > +#include "internal.h" > +#include "mjpegdec.h" > +#include "nvdec.h" > +#include "decode.h" > + > +static int nvdec_mjpeg_start_frame(AVCodecContext *avctx, const > uint8_t *buffer, uint32_t size) +{ > + MJpegDecodeContext *s = avctx->priv_data; > + > + NVDECContext *ctx = avctx->internal->hwaccel_priv_data; > + CUVIDPICPARAMS *pp = &ctx->pic_params; > + FrameDecodeData *fdd; > + NVDECFrame *cf; > + AVFrame *cur_frame = s->picture; > + > + int ret; > + > + ret = ff_nvdec_start_frame(avctx, cur_frame); > + if (ret < 0) > + return ret; > + > + fdd = (FrameDecodeData*)cur_frame->private_ref->data; > + cf = (NVDECFrame*)fdd->hwaccel_priv; > + > + *pp = (CUVIDPICPARAMS) { > + .PicWidthInMbs = (cur_frame->width + 15) / 16, > + .FrameHeightInMbs = (cur_frame->height + 15) / 16, > + .CurrPicIdx = cf->idx, > + > + .intra_pic_flag = 1, > + .ref_pic_flag = 0, > + }; > + > + return ff_nvdec_simple_decode_slice(avctx, buffer, size); > +} > + > +static int nvdec_mjpeg_decode_slice(AVCodecContext *avctx, const > uint8_t *buffer, uint32_t size) +{ > + return 0; > +} > + > +static int nvdec_mjpeg_frame_params(AVCodecContext *avctx, > + AVBufferRef *hw_frames_ctx) > +{ > + // Only need storage for the current frame > + return ff_nvdec_frame_params(avctx, hw_frames_ctx, 1); > +} > + > +#if CONFIG_MJPEG_NVDEC_HWACCEL > +AVHWAccel ff_mjpeg_nvdec_hwaccel = { > + .name = "mjpeg_nvdec", > + .type = AVMEDIA_TYPE_VIDEO, > + .id = AV_CODEC_ID_MJPEG, > + .pix_fmt = AV_PIX_FMT_CUDA, > + .start_frame = nvdec_mjpeg_start_frame, > + .end_frame = ff_nvdec_simple_end_frame, > + .decode_slice = nvdec_mjpeg_decode_slice, > + .frame_params = nvdec_mjpeg_frame_params, > + .init = ff_nvdec_decode_init, > + .uninit = ff_nvdec_decode_uninit, > + .priv_data_size = sizeof(NVDECContext), > +}; > +#endif LGTM (unsurprisingly :-) --phil _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel