3 * Copyright (c) 2015 Luca Barbato
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Simple wrapper to store an AVFrame and forward it as AVPacket.
30 #include "libavutil/internal.h"
31 #include "libavutil/frame.h"
32 #include "libavutil/buffer.h"
33 #include "libavutil/pixdesc.h"
35 static void wrapped_avframe_release_buffer(void *unused
, uint8_t *data
)
37 AVFrame
*frame
= (AVFrame
*)data
;
39 av_frame_free(&frame
);
42 static int wrapped_avframe_encode(AVCodecContext
*avctx
, AVPacket
*pkt
,
43 const AVFrame
*frame
, int *got_packet
)
45 AVFrame
*wrapped
= av_frame_clone(frame
);
48 return AVERROR(ENOMEM
);
50 pkt
->buf
= av_buffer_create((uint8_t *)wrapped
, sizeof(*wrapped
),
51 wrapped_avframe_release_buffer
, NULL
,
52 AV_BUFFER_FLAG_READONLY
);
54 av_frame_free(&wrapped
);
55 return AVERROR(ENOMEM
);
58 pkt
->data
= (uint8_t *)wrapped
;
59 pkt
->size
= sizeof(*wrapped
);
61 pkt
->flags
|= AV_PKT_FLAG_KEY
;
66 AVCodec ff_wrapped_avframe_encoder
= {
67 .name
= "wrapped_avframe",
68 .long_name
= NULL_IF_CONFIG_SMALL("AVFrame to AVPacket passthrough"),
69 .type
= AVMEDIA_TYPE_VIDEO
,
70 .id
= AV_CODEC_ID_WRAPPED_AVFRAME
,
71 .encode2
= wrapped_avframe_encode
,
72 .caps_internal
= FF_CODEC_CAP_INIT_THREADSAFE
,