diff options
author | Julian Scheel <julian@jusst.de> | 2015-10-21 17:10:48 +0200 |
---|---|---|
committer | wm4 <nfxjfg@googlemail.com> | 2015-10-22 10:46:03 +0200 |
commit | 7ebe12fc55591053cbd194ca6638e5c32beaee45 (patch) | |
tree | a7fc34a5b3b93e1d355d23631d3a0e5935cb3501 /libavcodec/mmaldec.c | |
parent | 73353af6e559f2d9758915f490a28cef8d854af2 (diff) | |
download | ffmpeg-7ebe12fc55591053cbd194ca6638e5c32beaee45.tar.gz |
mmaldec: Add mpeg2 decoding support
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@jusst.de>
Signed-off-by: wm4 <nfxjfg@googlemail.com>
Diffstat (limited to 'libavcodec/mmaldec.c')
-rw-r--r-- | libavcodec/mmaldec.c | 71 |
1 files changed, 47 insertions, 24 deletions
diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c index 13cc191ff1..91fb084e10 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) |