On Wed, 21 Oct 2015 17:10:48 +0200 Julian Scheel <jul...@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 <jul...@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. _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel