|
|
@@ -351,7 +351,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; |
|
|
@@ -760,31 +770,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) |