[FFmpeg-devel] [PATCH 3/4] lavc: Add wrapped_avframe decoder
Muhammad Faiz
mfcc64 at gmail.com
Sun Sep 3 20:25:14 EEST 2017
On Sun, Sep 3, 2017 at 5:21 AM, Mark Thompson <sw at jkqxz.net> wrote:
> Intended for use with hardware frames for which rawvideo is not
> sufficient.
> ---
> Kindof nasty. Any thoughts on better ways of achieving the same result (hardware frames out of lavd) very welcome!
>
>
> libavcodec/Makefile | 1 +
> libavcodec/allcodecs.c | 2 +-
> libavcodec/wrapped_avframe.c | 31 +++++++++++++++++++++++++++++++
> 3 files changed, 33 insertions(+), 1 deletion(-)
>
> diff --git a/libavcodec/Makefile b/libavcodec/Makefile
> index 999632cf9e..943e5db511 100644
> --- a/libavcodec/Makefile
> +++ b/libavcodec/Makefile
> @@ -653,6 +653,7 @@ OBJS-$(CONFIG_WMV2_DECODER) += wmv2dec.o wmv2.o wmv2data.o \
> OBJS-$(CONFIG_WMV2_ENCODER) += wmv2enc.o wmv2.o wmv2data.o \
> msmpeg4.o msmpeg4enc.o msmpeg4data.o
> OBJS-$(CONFIG_WNV1_DECODER) += wnv1.o
> +OBJS-$(CONFIG_WRAPPED_AVFRAME_DECODER) += wrapped_avframe.o
> OBJS-$(CONFIG_WRAPPED_AVFRAME_ENCODER) += wrapped_avframe.o
> OBJS-$(CONFIG_WS_SND1_DECODER) += ws-snd1.o
> OBJS-$(CONFIG_XAN_DPCM_DECODER) += dpcm.o
> diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
> index ce0bc7ecf3..625720578f 100644
> --- a/libavcodec/allcodecs.c
> +++ b/libavcodec/allcodecs.c
> @@ -377,7 +377,7 @@ static void register_all(void)
> REGISTER_DECODER(VQA, vqa);
> REGISTER_DECODER(BITPACKED, bitpacked);
> REGISTER_DECODER(WEBP, webp);
> - REGISTER_ENCODER(WRAPPED_AVFRAME, wrapped_avframe);
> + REGISTER_ENCDEC (WRAPPED_AVFRAME, wrapped_avframe);
> REGISTER_ENCDEC (WMV1, wmv1);
> REGISTER_ENCDEC (WMV2, wmv2);
> REGISTER_DECODER(WMV3, wmv3);
> diff --git a/libavcodec/wrapped_avframe.c b/libavcodec/wrapped_avframe.c
> index 14360320ff..e66f0cfa4c 100644
> --- a/libavcodec/wrapped_avframe.c
> +++ b/libavcodec/wrapped_avframe.c
> @@ -75,6 +75,28 @@ static int wrapped_avframe_encode(AVCodecContext *avctx, AVPacket *pkt,
> return 0;
> }
>
> +static int wrapped_avframe_decode(AVCodecContext *avctx, void *data,
> + int *got_frame, AVPacket *pkt)
> +{
> + AVFrame *in, *out;
> + int err;
> +
> + if (pkt->size < sizeof(AVFrame))
> + return AVERROR(EINVAL);
> +
> + in = (AVFrame*)pkt->data;
> + out = data;
> +
> + err = ff_decode_frame_props(avctx, out);
> + if (err < 0)
> + return err;
> +
> + av_frame_move_ref(out, in);
> +
> + *got_frame = 1;
> + return 0;
> +}
> +
> AVCodec ff_wrapped_avframe_encoder = {
> .name = "wrapped_avframe",
> .long_name = NULL_IF_CONFIG_SMALL("AVFrame to AVPacket passthrough"),
> @@ -83,3 +105,12 @@ AVCodec ff_wrapped_avframe_encoder = {
> .encode2 = wrapped_avframe_encode,
> .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
> };
> +
> +AVCodec ff_wrapped_avframe_decoder = {
> + .name = "wrapped_avframe",
> + .long_name = NULL_IF_CONFIG_SMALL("AVPacket to AVFrame passthrough"),
> + .type = AVMEDIA_TYPE_VIDEO,
> + .id = AV_CODEC_ID_WRAPPED_AVFRAME,
> + .decode = wrapped_avframe_decode,
> + .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
> +};
> --
> 2.11.0
Security issues:
https://ffmpeg.org/pipermail/ffmpeg-devel/2015-November/182985.html
More information about the ffmpeg-devel
mailing list