FFmpeg  4.0
libwebpenc.c
Go to the documentation of this file.
1 /*
2  * WebP encoding support via libwebp
3  * Copyright (c) 2013 Justin Ruggles <justin.ruggles@gmail.com>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg 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.
11  *
12  * FFmpeg 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.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * WebP encoder using libwebp (WebPEncode API)
25  */
26 
27 #include "libwebpenc_common.h"
28 
30 
32 {
33  return ff_libwebp_encode_init_common(avctx);
34 }
35 
37  const AVFrame *frame, int *got_packet)
38 {
39  LibWebPContext *s = avctx->priv_data;
40  WebPPicture *pic = NULL;
41  AVFrame *alt_frame = NULL;
42  WebPMemoryWriter mw = { 0 };
43 
44  int ret = ff_libwebp_get_frame(avctx, s, frame, &alt_frame, &pic);
45  if (ret < 0)
46  goto end;
47 
48  WebPMemoryWriterInit(&mw);
49  pic->custom_ptr = &mw;
50  pic->writer = WebPMemoryWrite;
51 
52  ret = WebPEncode(&s->config, pic);
53  if (!ret) {
54  av_log(avctx, AV_LOG_ERROR, "WebPEncode() failed with error: %d\n",
55  pic->error_code);
56  ret = ff_libwebp_error_to_averror(pic->error_code);
57  goto end;
58  }
59 
60  ret = ff_alloc_packet2(avctx, pkt, mw.size, mw.size);
61  if (ret < 0)
62  goto end;
63  memcpy(pkt->data, mw.mem, mw.size);
64 
65  pkt->flags |= AV_PKT_FLAG_KEY;
66  *got_packet = 1;
67 
68 end:
69 #if (WEBP_ENCODER_ABI_VERSION > 0x0203)
70  WebPMemoryWriterClear(&mw);
71 #else
72  free(mw.mem); /* must use free() according to libwebp documentation */
73 #endif
74  WebPPictureFree(pic);
75  av_freep(&pic);
76  av_frame_free(&alt_frame);
77 
78  return ret;
79 }
80 
82 {
84  av_frame_free(&s->ref);
85 
86  return 0;
87 }
88 
89 static const AVClass class = {
90  .class_name = "libwebp",
91  .item_name = av_default_item_name,
92  .option = options,
94 };
95 
97  .name = "libwebp",
98  .long_name = NULL_IF_CONFIG_SMALL("libwebp WebP image"),
99  .type = AVMEDIA_TYPE_VIDEO,
100  .id = AV_CODEC_ID_WEBP,
101  .priv_data_size = sizeof(LibWebPContext),
103  .encode2 = libwebp_encode_frame,
104  .close = libwebp_encode_close,
105  .pix_fmts = (const enum AVPixelFormat[]) {
109  },
110  .priv_class = &class,
111  .defaults = libwebp_defaults,
112  .wrapper_name = "libwebp",
113 };
#define NULL
Definition: coverity.c:32
const char * s
Definition: avisynth_c.h:768
This structure describes decoded (raw) audio or video data.
Definition: frame.h:218
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static int libwebp_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition: libwebpenc.c:36
int size
Definition: avcodec.h:1431
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:191
static int libwebp_encode_close(AVCodecContext *avctx)
Definition: libwebpenc.c:81
static AVPacket pkt
AVCodec.
Definition: avcodec.h:3408
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:72
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data.
Definition: encode.c:32
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples)
Definition: pixfmt.h:97
#define av_cold
Definition: attributes.h:82
static av_cold int end(AVCodecContext *avctx)
Definition: avrndec.c:90
static AVFrame * frame
uint8_t * data
Definition: avcodec.h:1430
#define av_log(a,...)
#define AV_PKT_FLAG_KEY
The packet contains a keyframe.
Definition: avcodec.h:1462
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
WebP encoder using libwebp: common structs and methods.
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
Definition: frame.c:202
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:186
const char * name
Name of the codec implementation.
Definition: avcodec.h:3415
int ff_libwebp_get_frame(AVCodecContext *avctx, LibWebPContextCommon *s, const AVFrame *frame, AVFrame **alt_frame_ptr, WebPPicture **pic_ptr)
av_cold int ff_libwebp_encode_init_common(AVCodecContext *avctx)
int flags
A combination of AV_PKT_FLAG values.
Definition: avcodec.h:1436
LibWebPContextCommon LibWebPContext
Definition: libwebpenc.c:29
static const AVCodecDefault libwebp_defaults[]
static av_cold int libwebp_encode_init(AVCodecContext *avctx)
Definition: libwebpenc.c:31
int ff_libwebp_error_to_averror(int err)
main external API structure.
Definition: avcodec.h:1518
#define AV_PIX_FMT_RGB32
Definition: pixfmt.h:342
Describe the class of an AVClass context structure.
Definition: log.h:67
static enum AVPixelFormat pix_fmts[]
Definition: libkvazaar.c:266
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
Definition: pixfmt.h:62
const OptionDef options[]
Definition: ffmpeg_opt.c:3292
void * priv_data
Definition: avcodec.h:1545
#define av_freep(p)
AVPixelFormat
Pixel format.
Definition: pixfmt.h:60
This structure stores compressed data.
Definition: avcodec.h:1407
AVCodec ff_libwebp_encoder
Definition: libwebpenc.c:96