[FFmpeg-devel] [PATCHv2] mmaldec: Add mpeg2 decoding support

wm4 nfxjfg at googlemail.com
Thu Oct 22 10:46:53 CEST 2015


On Wed, 21 Oct 2015 17:10:48 +0200
Julian Scheel <julian at jusst.de> wrote:

> Register mmaldec as mpeg2 decoder. Supporting mpeg2 in mmaldec is just a
> matter of setting the correct MMAL_ENCODING on the input port. To ease the
> addition of further supported mmal codecs a macro is introduced to generate
> the decoder and decoder class structs.
> 
> Signed-off-by: Julian Scheel <julian at jusst.de>
> ---
> Changes in v2:
> - Replace error log message in init decoder with debug log message (thanks
>   Hendrik for spotting it)
> ---
>  configure              |  3 +++
>  libavcodec/Makefile    |  1 +
>  libavcodec/allcodecs.c |  2 ++
>  libavcodec/mmaldec.c   | 71 +++++++++++++++++++++++++++++++++-----------------
>  4 files changed, 53 insertions(+), 24 deletions(-)
> 
> diff --git a/configure b/configure
> index 1bbaf7f..a38b290 100755
> --- a/configure
> +++ b/configure
> @@ -2481,6 +2481,9 @@ mpeg2_d3d11va_hwaccel_deps="d3d11va"
>  mpeg2_d3d11va_hwaccel_select="mpeg2video_decoder"
>  mpeg2_dxva2_hwaccel_deps="dxva2"
>  mpeg2_dxva2_hwaccel_select="mpeg2video_decoder"
> +mpeg2_mmal_decoder_deps="mmal"
> +mpeg2_mmal_hwaccel_deps="mmal"
> +mpeg2_mmal_decoder_select="mpeg2video_decoder"
>  mpeg2_qsv_hwaccel_deps="libmfx"
>  mpeg2_qsv_hwaccel_select="qsvdec_mpeg2"
>  mpeg2_vaapi_hwaccel_deps="vaapi"
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index af93f8a..f85fc18 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -370,6 +370,7 @@ OBJS-$(CONFIG_MPEG1VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
>  OBJS-$(CONFIG_MPEG1VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
>  OBJS-$(CONFIG_MPEG2VIDEO_DECODER)      += mpeg12dec.o mpeg12.o mpeg12data.o
>  OBJS-$(CONFIG_MPEG2VIDEO_ENCODER)      += mpeg12enc.o mpeg12.o
> +OBJS-$(CONFIG_MPEG2_MMAL_DECODER)      += mmaldec.o
>  OBJS-$(CONFIG_MPEG2_QSV_DECODER)       += qsvdec_mpeg2.o
>  OBJS-$(CONFIG_MPEG2_QSV_ENCODER)       += qsvenc_mpeg2.o
>  OBJS-$(CONFIG_MPEG4_DECODER)           += xvididct.o
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index d62bec7..7279620 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -97,6 +97,7 @@ void avcodec_register_all(void)
>      REGISTER_HWACCEL(MPEG2_XVMC,        mpeg2_xvmc);
>      REGISTER_HWACCEL(MPEG2_D3D11VA,     mpeg2_d3d11va);
>      REGISTER_HWACCEL(MPEG2_DXVA2,       mpeg2_dxva2);
> +    REGISTER_HWACCEL(MPEG2_MMAL,        mpeg2_mmal);
>      REGISTER_HWACCEL(MPEG2_QSV,         mpeg2_qsv);
>      REGISTER_HWACCEL(MPEG2_VAAPI,       mpeg2_vaapi);
>      REGISTER_HWACCEL(MPEG2_VDPAU,       mpeg2_vdpau);
> @@ -238,6 +239,7 @@ void avcodec_register_all(void)
>      REGISTER_DECODER(MPEG_VDPAU,        mpeg_vdpau);
>      REGISTER_DECODER(MPEG1_VDPAU,       mpeg1_vdpau);
>  #endif
> +    REGISTER_DECODER(MPEG2_MMAL,        mpeg2_mmal);
>      REGISTER_DECODER(MPEG2_CRYSTALHD,   mpeg2_crystalhd);
>      REGISTER_DECODER(MPEG2_QSV,         mpeg2_qsv);
>      REGISTER_DECODER(MSA1,              msa1);
> diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c
> index 13cc191..91fb084 100644
> --- a/libavcodec/mmaldec.c
> +++ b/libavcodec/mmaldec.c
> @@ -350,7 +350,17 @@ static av_cold int ffmmal_init_decoder(AVCodecContext *avctx)
>  
>      format_in = decoder->input[0]->format;
>      format_in->type = MMAL_ES_TYPE_VIDEO;
> -    format_in->encoding = MMAL_ENCODING_H264;
> +    switch (avctx->codec_id) {
> +        case AV_CODEC_ID_MPEG2VIDEO:
> +            format_in->encoding = MMAL_ENCODING_MP2V;
> +            av_log(avctx, AV_LOG_DEBUG, "Use MMAL MP2V encoding\n");
> +            break;
> +        case AV_CODEC_ID_H264:
> +        default:
> +            format_in->encoding = MMAL_ENCODING_H264;
> +            av_log(avctx, AV_LOG_DEBUG, "Use MMAL H264 encoding\n");
> +            break;
> +    }
>      format_in->es->video.width = FFALIGN(avctx->width, 32);
>      format_in->es->video.height = FFALIGN(avctx->height, 16);
>      format_in->es->video.crop.width = avctx->width;
> @@ -766,31 +776,44 @@ AVHWAccel ff_h264_mmal_hwaccel = {
>      .pix_fmt    = AV_PIX_FMT_MMAL,
>  };
>  
> +AVHWAccel ff_mpeg2_mmal_hwaccel = {
> +    .name       = "mpeg2_mmal",
> +    .type       = AVMEDIA_TYPE_VIDEO,
> +    .id         = AV_CODEC_ID_MPEG2VIDEO,
> +    .pix_fmt    = AV_PIX_FMT_MMAL,
> +};
> +
>  static const AVOption options[]={
>      {"extra_buffers", "extra buffers", offsetof(MMALDecodeContext, extra_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0},
>      {NULL}
>  };
>  
> -static const AVClass ffmmaldec_class = {
> -    .class_name = "mmaldec",
> -    .option     = options,
> -    .version    = LIBAVUTIL_VERSION_INT,
> -};
> -
> -AVCodec ff_h264_mmal_decoder = {
> -    .name           = "h264_mmal",
> -    .long_name      = NULL_IF_CONFIG_SMALL("h264 (mmal)"),
> -    .type           = AVMEDIA_TYPE_VIDEO,
> -    .id             = AV_CODEC_ID_H264,
> -    .priv_data_size = sizeof(MMALDecodeContext),
> -    .init           = ffmmal_init_decoder,
> -    .close          = ffmmal_close_decoder,
> -    .decode         = ffmmal_decode,
> -    .flush          = ffmmal_flush,
> -    .priv_class     = &ffmmaldec_class,
> -    .capabilities   = AV_CODEC_CAP_DELAY,
> -    .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
> -    .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_MMAL,
> -                                                     AV_PIX_FMT_YUV420P,
> -                                                     AV_PIX_FMT_NONE},
> -};
> +#define FFMMAL_DEC_CLASS(NAME) \
> +    static const AVClass ffmmal_##NAME##_dec_class = { \
> +        .class_name = "mmal_" #NAME "_dec", \
> +        .option     = options, \
> +        .version    = LIBAVUTIL_VERSION_INT, \
> +    };
> +
> +#define FFMMAL_DEC(NAME, ID) \
> +    FFMMAL_DEC_CLASS(NAME) \
> +    AVCodec ff_##NAME##_mmal_decoder = { \
> +        .name           = #NAME "_mmal", \
> +        .long_name      = NULL_IF_CONFIG_SMALL(#NAME " (mmal)"), \
> +        .type           = AVMEDIA_TYPE_VIDEO, \
> +        .id             = ID, \
> +        .priv_data_size = sizeof(MMALDecodeContext), \
> +        .init           = ffmmal_init_decoder, \
> +        .close          = ffmmal_close_decoder, \
> +        .decode         = ffmmal_decode, \
> +        .flush          = ffmmal_flush, \
> +        .priv_class     = &ffmmal_##NAME##_dec_class, \
> +        .capabilities   = AV_CODEC_CAP_DELAY, \
> +        .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS, \
> +        .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_MMAL, \
> +                                                         AV_PIX_FMT_YUV420P, \
> +                                                         AV_PIX_FMT_NONE}, \
> +    };
> +
> +FFMMAL_DEC(h264, AV_CODEC_ID_H264)
> +FFMMAL_DEC(mpeg2, AV_CODEC_ID_MPEG2VIDEO)

Pushed, thanks.


More information about the ffmpeg-devel mailing list