From 2cf9ee989c4b53f945fe4aa9f6fc17001c3a60e7 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 5 Nov 2015 17:24:35 +0100 Subject: rpi: add support for codecs other than h264 FFmpeg now supports h264 and mpeg2. At least vc-1 will probably follow. --- video/decode/lavc.h | 2 +- video/decode/rpi.c | 23 ++++++++++++++++++----- video/decode/vd_lavc.c | 2 +- 3 files changed, 20 insertions(+), 7 deletions(-) (limited to 'video/decode') diff --git a/video/decode/lavc.h b/video/decode/lavc.h index b655b8480b..fa475c3fc5 100644 --- a/video/decode/lavc.h +++ b/video/decode/lavc.h @@ -56,7 +56,7 @@ struct vd_lavc_hwdec { void (*lock)(struct lavc_ctx *ctx); void (*unlock)(struct lavc_ctx *ctx); // Optional; if a special hardware decoder is needed (instead of "hwaccel"). - const char *(*get_codec)(struct lavc_ctx *ctx); + const char *(*get_codec)(struct lavc_ctx *ctx, const char *codec); }; enum { diff --git a/video/decode/rpi.c b/video/decode/rpi.c index 819369de0d..12816cdc86 100644 --- a/video/decode/rpi.c +++ b/video/decode/rpi.c @@ -18,6 +18,21 @@ #include "lavc.h" #include "common/common.h" +static const char *const codecs[][2] = { + {"h264", "h264_mmal"}, + {"mpeg2video", "mpeg2_mmal"}, + {0} +}; + +static const char *map_codec(const char *c) +{ + for (int n = 0; codecs[n][0]; n++) { + if (c && strcmp(codecs[n][0], c) == 0) + return codecs[n][1]; + } + return NULL; +} + static int init_decoder(struct lavc_ctx *ctx, int w, int h) { return 0; @@ -35,14 +50,12 @@ static int init(struct lavc_ctx *ctx) static int probe(struct vd_lavc_hwdec *hwdec, struct mp_hwdec_info *info, const char *decoder) { - if (strcmp(decoder, "h264") != 0) - return HWDEC_ERR_NO_CODEC; - return 0; + return map_codec(decoder) ? 0 : HWDEC_ERR_NO_CODEC; } -static const char *get_codec(struct lavc_ctx *ctx) +static const char *get_codec(struct lavc_ctx *ctx, const char *codec) { - return "h264_mmal"; + return map_codec(codec); } const struct vd_lavc_hwdec mp_vd_lavc_rpi = { diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index c80ec26deb..732f29d4f0 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -327,7 +327,7 @@ static int init(struct dec_video *vd, const char *decoder) if (hwdec) { ctx->software_fallback_decoder = talloc_strdup(ctx, decoder); if (hwdec->get_codec) - decoder = hwdec->get_codec(ctx); + decoder = hwdec->get_codec(ctx, decoder); MP_VERBOSE(vd, "Trying hardware decoding.\n"); } else { MP_VERBOSE(vd, "Using software decoding.\n"); -- cgit v1.2.3