diff options
Diffstat (limited to 'libavcodec/wrapped_avframe.c')
-rw-r--r-- | libavcodec/wrapped_avframe.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/libavcodec/wrapped_avframe.c b/libavcodec/wrapped_avframe.c index 1436032..5f88a66 100644 --- a/libavcodec/wrapped_avframe.c +++ b/libavcodec/wrapped_avframe.c @@ -75,6 +75,33 @@ 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->flags & AV_PKT_FLAG_TRUSTED)) { + // This decoder is not usable with untrusted input. + return AVERROR(EPERM); + } + + 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 +110,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, +}; |