26 #define VPX_DISABLE_CTRL_TYPECHECKS 1 
   27 #define VPX_CODEC_DISABLE_COMPAT    1 
   28 #include <vpx/vpx_encoder.h> 
   29 #include <vpx/vp8cx.h> 
   63 typedef struct VPxEncoderContext {
 
   65     struct vpx_codec_ctx encoder;
 
   66     struct vpx_image rawimg;
 
   67     struct vpx_codec_ctx encoder_alpha;
 
   68     struct vpx_image rawimg_alpha;
 
   70     struct vpx_fixed_buf twopass_stats;
 
   82 #define VP8F_ERROR_RESILIENT 0x00000001  
   83 #define VP8F_AUTO_ALT_REF    0x00000002 
 
  114     [VP8E_SET_CPUUSED]           = 
"VP8E_SET_CPUUSED",
 
  115     [VP8E_SET_ENABLEAUTOALTREF]  = 
"VP8E_SET_ENABLEAUTOALTREF",
 
  116     [VP8E_SET_NOISE_SENSITIVITY] = 
"VP8E_SET_NOISE_SENSITIVITY",
 
  117     [VP8E_SET_STATIC_THRESHOLD]  = 
"VP8E_SET_STATIC_THRESHOLD",
 
  118     [VP8E_SET_TOKEN_PARTITIONS]  = 
"VP8E_SET_TOKEN_PARTITIONS",
 
  119     [VP8E_SET_ARNR_MAXFRAMES]    = 
"VP8E_SET_ARNR_MAXFRAMES",
 
  120     [VP8E_SET_ARNR_STRENGTH]     = 
"VP8E_SET_ARNR_STRENGTH",
 
  121     [VP8E_SET_ARNR_TYPE]         = 
"VP8E_SET_ARNR_TYPE",
 
  122     [VP8E_SET_TUNING]            = 
"VP8E_SET_TUNING",
 
  123     [VP8E_SET_CQ_LEVEL]          = 
"VP8E_SET_CQ_LEVEL",
 
  124     [VP8E_SET_MAX_INTRA_BITRATE_PCT] = 
"VP8E_SET_MAX_INTRA_BITRATE_PCT",
 
  125 #if CONFIG_LIBVPX_VP9_ENCODER 
  126     [VP9E_SET_LOSSLESS]                = 
"VP9E_SET_LOSSLESS",
 
  127     [VP9E_SET_TILE_COLUMNS]            = 
"VP9E_SET_TILE_COLUMNS",
 
  128     [VP9E_SET_TILE_ROWS]               = 
"VP9E_SET_TILE_ROWS",
 
  129     [VP9E_SET_FRAME_PARALLEL_DECODING] = 
"VP9E_SET_FRAME_PARALLEL_DECODING",
 
  130     [VP9E_SET_AQ_MODE]                 = 
"VP9E_SET_AQ_MODE",
 
  131 #if VPX_ENCODER_ABI_VERSION > 8 
  132     [VP9E_SET_COLOR_SPACE]             = 
"VP9E_SET_COLOR_SPACE",
 
  134 #if VPX_ENCODER_ABI_VERSION >= 11 
  135     [VP9E_SET_COLOR_RANGE]             = 
"VP9E_SET_COLOR_RANGE",
 
  143     const char *error  = vpx_codec_error(&ctx->
encoder);
 
  144     const char *detail = vpx_codec_error_detail(&ctx->
encoder);
 
  152                                  const struct vpx_codec_enc_cfg *cfg)
 
  157     av_log(avctx, level, 
"vpx_codec_enc_cfg\n");
 
  158     av_log(avctx, level, 
"generic settings\n" 
  159            "  %*s%u\n  %*s%u\n  %*s%u\n  %*s%u\n  %*s%u\n" 
  160 #
if CONFIG_LIBVPX_VP9_ENCODER && defined(VPX_IMG_FMT_HIGHBITDEPTH)
 
  163            "  %*s{%u/%u}\n  %*s%u\n  %*s%d\n  %*s%u\n",
 
  164            width, 
"g_usage:",           cfg->g_usage,
 
  165            width, 
"g_threads:",         cfg->g_threads,
 
  166            width, 
"g_profile:",         cfg->g_profile,
 
  167            width, 
"g_w:",               cfg->g_w,
 
  168            width, 
"g_h:",               cfg->g_h,
 
  169 #
if CONFIG_LIBVPX_VP9_ENCODER && defined(VPX_IMG_FMT_HIGHBITDEPTH)
 
  170            width, 
"g_bit_depth:",       cfg->g_bit_depth,
 
  171            width, 
"g_input_bit_depth:", cfg->g_input_bit_depth,
 
  173            width, 
"g_timebase:",        cfg->g_timebase.num, cfg->g_timebase.den,
 
  174            width, 
"g_error_resilient:", cfg->g_error_resilient,
 
  175            width, 
"g_pass:",            cfg->g_pass,
 
  176            width, 
"g_lag_in_frames:",   cfg->g_lag_in_frames);
 
  177     av_log(avctx, level, 
"rate control settings\n" 
  178            "  %*s%u\n  %*s%u\n  %*s%u\n  %*s%u\n" 
  180            width, 
"rc_dropframe_thresh:",   cfg->rc_dropframe_thresh,
 
  181            width, 
"rc_resize_allowed:",     cfg->rc_resize_allowed,
 
  182            width, 
"rc_resize_up_thresh:",   cfg->rc_resize_up_thresh,
 
  183            width, 
"rc_resize_down_thresh:", cfg->rc_resize_down_thresh,
 
  184            width, 
"rc_end_usage:",          cfg->rc_end_usage,
 
  185            width, 
"rc_twopass_stats_in:",   cfg->rc_twopass_stats_in.buf, cfg->rc_twopass_stats_in.sz,
 
  186            width, 
"rc_target_bitrate:",     cfg->rc_target_bitrate);
 
  187     av_log(avctx, level, 
"quantizer settings\n" 
  189            width, 
"rc_min_quantizer:", cfg->rc_min_quantizer,
 
  190            width, 
"rc_max_quantizer:", cfg->rc_max_quantizer);
 
  191     av_log(avctx, level, 
"bitrate tolerance\n" 
  193            width, 
"rc_undershoot_pct:", cfg->rc_undershoot_pct,
 
  194            width, 
"rc_overshoot_pct:",  cfg->rc_overshoot_pct);
 
  195     av_log(avctx, level, 
"decoder buffer model\n" 
  196             "  %*s%u\n  %*s%u\n  %*s%u\n",
 
  197             width, 
"rc_buf_sz:",         cfg->rc_buf_sz,
 
  198             width, 
"rc_buf_initial_sz:", cfg->rc_buf_initial_sz,
 
  199             width, 
"rc_buf_optimal_sz:", cfg->rc_buf_optimal_sz);
 
  200     av_log(avctx, level, 
"2 pass rate control settings\n" 
  201            "  %*s%u\n  %*s%u\n  %*s%u\n",
 
  202            width, 
"rc_2pass_vbr_bias_pct:",       cfg->rc_2pass_vbr_bias_pct,
 
  203            width, 
"rc_2pass_vbr_minsection_pct:", cfg->rc_2pass_vbr_minsection_pct,
 
  204            width, 
"rc_2pass_vbr_maxsection_pct:", cfg->rc_2pass_vbr_maxsection_pct);
 
  205     av_log(avctx, level, 
"keyframing settings\n" 
  206            "  %*s%d\n  %*s%u\n  %*s%u\n",
 
  207            width, 
"kf_mode:",     cfg->kf_mode,
 
  208            width, 
"kf_min_dist:", cfg->kf_min_dist,
 
  209            width, 
"kf_max_dist:", cfg->kf_max_dist);
 
  210     av_log(avctx, level, 
"\n");
 
  243                                 enum vp8e_enc_control_id 
id, 
int val)
 
  253     res = vpx_codec_control(&ctx->
encoder, 
id, val);
 
  254     if (res != VPX_CODEC_OK) {
 
  255         snprintf(buf, 
sizeof(buf), 
"Failed to set %s codec control",
 
  260     return res == VPX_CODEC_OK ? 0 : 
AVERROR(EINVAL);
 
  267     vpx_codec_destroy(&ctx->
encoder);
 
  276 #if CONFIG_LIBVPX_VP9_ENCODER 
  278                        struct vpx_codec_enc_cfg *enccfg, vpx_codec_flags_t *
flags,
 
  279                        vpx_img_fmt_t *img_fmt)
 
  282 #ifdef VPX_IMG_FMT_HIGHBITDEPTH 
  283     enccfg->g_bit_depth = enccfg->g_input_bit_depth = 8;
 
  288         enccfg->g_profile = 0;
 
  289         *img_fmt = VPX_IMG_FMT_I420;
 
  292         enccfg->g_profile = 1;
 
  293         *img_fmt = VPX_IMG_FMT_I422;
 
  295 #if VPX_IMAGE_ABI_VERSION >= 3 
  297         enccfg->g_profile = 1;
 
  298         *img_fmt = VPX_IMG_FMT_I440;
 
  301         ctx->vpx_cs = VPX_CS_SRGB;
 
  304         enccfg->g_profile = 1;
 
  305         *img_fmt = VPX_IMG_FMT_I444;
 
  307 #ifdef VPX_IMG_FMT_HIGHBITDEPTH 
  310         if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) {
 
  311             enccfg->g_bit_depth = enccfg->g_input_bit_depth =
 
  313             enccfg->g_profile = 2;
 
  314             *img_fmt = VPX_IMG_FMT_I42016;
 
  315             *flags |= VPX_CODEC_USE_HIGHBITDEPTH;
 
  321         if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) {
 
  322             enccfg->g_bit_depth = enccfg->g_input_bit_depth =
 
  324             enccfg->g_profile = 3;
 
  325             *img_fmt = VPX_IMG_FMT_I42216;
 
  326             *flags |= VPX_CODEC_USE_HIGHBITDEPTH;
 
  330 #if VPX_IMAGE_ABI_VERSION >= 3 
  333         if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) {
 
  334             enccfg->g_bit_depth = enccfg->g_input_bit_depth =
 
  336             enccfg->g_profile = 3;
 
  337             *img_fmt = VPX_IMG_FMT_I44016;
 
  338             *flags |= VPX_CODEC_USE_HIGHBITDEPTH;
 
  344         ctx->vpx_cs = VPX_CS_SRGB;
 
  348         if (codec_caps & VPX_CODEC_CAP_HIGHBITDEPTH) {
 
  349             enccfg->g_bit_depth = enccfg->g_input_bit_depth =
 
  352             enccfg->g_profile = 3;
 
  353             *img_fmt = VPX_IMG_FMT_I44416;
 
  354             *flags |= VPX_CODEC_USE_HIGHBITDEPTH;
 
  366 #if VPX_ENCODER_ABI_VERSION > 8 
  369     enum vpx_color_space vpx_cs;
 
  394 #if VPX_ENCODER_ABI_VERSION >= 11 
  397     enum vpx_color_range vpx_cr;
 
  414                             const struct vpx_codec_iface *iface)
 
  417     struct vpx_codec_enc_cfg enccfg = { 0 };
 
  418     struct vpx_codec_enc_cfg enccfg_alpha;
 
  422     vpx_img_fmt_t img_fmt = VPX_IMG_FMT_I420;
 
  423 #if CONFIG_LIBVPX_VP9_ENCODER 
  424     vpx_codec_caps_t codec_caps = vpx_codec_get_caps(iface);
 
  433     if ((res = vpx_codec_enc_config_default(iface, &enccfg, 0)) != VPX_CODEC_OK) {
 
  435                vpx_codec_err_to_string(res));
 
  439 #if CONFIG_LIBVPX_VP9_ENCODER 
  441         if (
set_pix_fmt(avctx, codec_caps, &enccfg, &flags, &img_fmt))
 
  454     enccfg.g_w            = avctx->
width;
 
  455     enccfg.g_h            = avctx->
height;
 
  462         enccfg.g_pass = VPX_RC_FIRST_PASS;
 
  464         enccfg.g_pass = VPX_RC_LAST_PASS;
 
  466         enccfg.g_pass = VPX_RC_ONE_PASS;
 
  470         enccfg.rc_end_usage = VPX_CBR;
 
  471     } 
else if (ctx->
crf >= 0) {
 
  472         enccfg.rc_end_usage = VPX_CQ;
 
  473 #if CONFIG_LIBVPX_VP9_ENCODER 
  475             enccfg.rc_end_usage = VPX_Q;
 
  482 #if CONFIG_LIBVPX_VP9_ENCODER 
  483     } 
else if (enccfg.rc_end_usage == VPX_Q) {
 
  486         if (enccfg.rc_end_usage == VPX_CQ) {
 
  487             enccfg.rc_target_bitrate = 1000000;
 
  489             avctx->
bit_rate = enccfg.rc_target_bitrate * 1000;
 
  491                    "Neither bitrate nor constrained quality specified, using default bitrate of %dkbit/sec\n",
 
  492                    enccfg.rc_target_bitrate);
 
  497         enccfg.rc_min_quantizer =
 
  498         enccfg.rc_max_quantizer = 0;
 
  500         if (avctx->
qmin >= 0)
 
  501             enccfg.rc_min_quantizer = avctx->
qmin;
 
  502         if (avctx->
qmax >= 0)
 
  503             enccfg.rc_max_quantizer = avctx->
qmax;
 
  506     if (enccfg.rc_end_usage == VPX_CQ
 
  507 #
if CONFIG_LIBVPX_VP9_ENCODER
 
  508         || enccfg.rc_end_usage == VPX_Q
 
  511         if (ctx->
crf < enccfg.rc_min_quantizer || ctx->
crf > enccfg.rc_max_quantizer) {
 
  513                    "CQ level %d must be between minimum and maximum quantizer value (%d-%d)\n",
 
  514                    ctx->
crf, enccfg.rc_min_quantizer, enccfg.rc_max_quantizer);
 
  519 #if FF_API_PRIVATE_OPT 
  530         enccfg.rc_2pass_vbr_minsection_pct =
 
  533         enccfg.rc_2pass_vbr_maxsection_pct =
 
  540         enccfg.rc_buf_initial_sz =
 
  542     enccfg.rc_buf_optimal_sz     = enccfg.rc_buf_sz * 5 / 6;
 
  547                "deprecated, use the undershoot-pct private option instead.\n");
 
  561         enccfg.kf_max_dist = avctx->
gop_size;
 
  563     if (enccfg.g_pass == VPX_RC_FIRST_PASS)
 
  564         enccfg.g_lag_in_frames = 0;
 
  565     else if (enccfg.g_pass == VPX_RC_LAST_PASS) {
 
  566         int decode_size, ret;
 
  584         if (decode_size < 0) {
 
  597         enccfg.g_profile = avctx->
profile;
 
  603     res = vpx_codec_enc_init(&ctx->
encoder, iface, &enccfg, flags);
 
  604     if (res != VPX_CODEC_OK) {
 
  610         enccfg_alpha = enccfg;
 
  611         res = vpx_codec_enc_init(&ctx->
encoder_alpha, iface, &enccfg_alpha, flags);
 
  612         if (res != VPX_CODEC_OK) {
 
  636         av_log(avctx, 
AV_LOG_ERROR, 
"Transparency encoding with auto_alt_ref does not work\n");
 
  641 #if FF_API_PRIVATE_OPT 
  654                "use the static-thresh private option instead.\n");
 
  665 #if CONFIG_LIBVPX_VP9_ENCODER 
  677 #if VPX_ENCODER_ABI_VERSION > 8 
  678         set_colorspace(avctx);
 
  680 #if VPX_ENCODER_ABI_VERSION >= 11 
  681         set_color_range(avctx);
 
  691 #if CONFIG_LIBVPX_VP9_ENCODER && defined(VPX_IMG_FMT_HIGHBITDEPTH) 
  693         ctx->
rawimg.bit_depth = enccfg.g_bit_depth;
 
  704     if (enccfg.rc_end_usage == VPX_CBR ||
 
  705         enccfg.g_pass != VPX_RC_ONE_PASS) {
 
  716                              const struct vpx_codec_cx_pkt *
src,
 
  717                              const struct vpx_codec_cx_pkt *src_alpha,
 
  720     dst->
pts      = src->data.frame.pts;
 
  721     dst->
duration = src->data.frame.duration;
 
  722     dst->
flags    = src->data.frame.flags;
 
  723     dst->
sz       = src->data.frame.sz;
 
  724     dst->
buf      = src->data.frame.buf;
 
  727     if (!(dst->
flags & VPX_FRAME_IS_INVISIBLE)) {
 
  735             memcpy(dst->
sse, ctx->
sse, 
sizeof(dst->
sse));
 
  742         dst->
buf_alpha = src_alpha->data.frame.buf;
 
  743         dst->
sz_alpha = src_alpha->data.frame.sz;
 
  766 #if FF_API_CODED_FRAME 
  773         if (!!(cx_frame->
flags & VPX_FRAME_IS_KEY)) {
 
  775 #if FF_API_CODED_FRAME 
  783 #if FF_API_CODED_FRAME 
  791                                        cx_frame->
have_sse ? 3 : 0, pict_type);
 
  796 #if FF_API_CODED_FRAME 
  804             for (i = 0; i < 3; ++i) {
 
  805                 avctx->
error[i] += cx_frame->
sse[i + 1];
 
  838     const struct vpx_codec_cx_pkt *
pkt;
 
  839     const struct vpx_codec_cx_pkt *pkt_alpha = 
NULL;
 
  840     const void *iter = 
NULL;
 
  841     const void *iter_alpha = 
NULL;
 
  856     while ((pkt = vpx_codec_get_cx_data(&ctx->
encoder, &iter)) &&
 
  860         case VPX_CODEC_CX_FRAME_PKT:
 
  867                 cx_pktcpy(&cx_frame, pkt, pkt_alpha, ctx);
 
  877                            "Frame queue element alloc failed\n");
 
  880                 cx_pktcpy(cx_frame, pkt, pkt_alpha, ctx);
 
  883                 if (!cx_frame->
buf) {
 
  890                 memcpy(cx_frame->
buf, pkt->data.frame.buf, pkt->data.frame.sz);
 
  900                     memcpy(cx_frame->
buf_alpha, pkt_alpha->data.frame.buf, pkt_alpha->data.frame.sz);
 
  905         case VPX_CODEC_STATS_PKT: {
 
  910                                    pkt->data.twopass_stats.sz)) < 0) {
 
  915             memcpy((
uint8_t*)stats->buf + stats->sz,
 
  916                    pkt->data.twopass_stats.buf, pkt->data.twopass_stats.sz);
 
  917             stats->sz += pkt->data.twopass_stats.sz;
 
  920         case VPX_CODEC_PSNR_PKT:
 
  922             ctx->
sse[0] = pkt->data.psnr.sse[0];
 
  923             ctx->
sse[1] = pkt->data.psnr.sse[1];
 
  924             ctx->
sse[2] = pkt->data.psnr.sse[2];
 
  925             ctx->
sse[3] = pkt->data.psnr.sse[3];
 
  928         case VPX_CODEC_CUSTOM_PKT:
 
  941     struct vpx_image *rawimg = 
NULL;
 
  942     struct vpx_image *rawimg_alpha = 
NULL;
 
  943     int64_t timestamp = 0;
 
  945     vpx_enc_frame_flags_t flags = 0;
 
  949         rawimg->planes[VPX_PLANE_Y] = frame->
data[0];
 
  950         rawimg->planes[VPX_PLANE_U] = frame->
data[1];
 
  951         rawimg->planes[VPX_PLANE_V] = frame->
data[2];
 
  952         rawimg->stride[VPX_PLANE_Y] = frame->
linesize[0];
 
  953         rawimg->stride[VPX_PLANE_U] = frame->
linesize[1];
 
  954         rawimg->stride[VPX_PLANE_V] = frame->
linesize[2];
 
  958             rawimg_alpha->planes[VPX_PLANE_Y] = frame->
data[3];
 
  961             if (!u_plane || !v_plane) {
 
  967             rawimg_alpha->planes[VPX_PLANE_U] = u_plane;
 
  969             rawimg_alpha->planes[VPX_PLANE_V] = v_plane;
 
  970             rawimg_alpha->stride[VPX_PLANE_Y] = frame->
linesize[0];
 
  971             rawimg_alpha->stride[VPX_PLANE_U] = frame->
linesize[1];
 
  972             rawimg_alpha->stride[VPX_PLANE_V] = frame->
linesize[2];
 
  974         timestamp                   = frame->
pts;
 
  976             flags |= VPX_EFLAG_FORCE_KF;
 
  979     res = vpx_codec_encode(&ctx->
encoder, rawimg, timestamp,
 
  981     if (res != VPX_CODEC_OK) {
 
  987         res = vpx_codec_encode(&ctx->
encoder_alpha, rawimg_alpha, timestamp,
 
  989         if (res != VPX_CODEC_OK) {
 
 1011         av_freep(&rawimg_alpha->planes[VPX_PLANE_U]);
 
 1012         av_freep(&rawimg_alpha->planes[VPX_PLANE_V]);
 
 1015     *got_packet = !!coded_size;
 
 1019 #define OFFSET(x) offsetof(VPxContext, x) 
 1020 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 
 1022 #ifndef VPX_ERROR_RESILIENT_DEFAULT 
 1023 #define VPX_ERROR_RESILIENT_DEFAULT 1 
 1024 #define VPX_ERROR_RESILIENT_PARTITIONS 2 
 1027 #define COMMON_OPTIONS \ 
 1028     { "auto-alt-ref",    "Enable use of alternate reference " \ 
 1029                          "frames (2-pass only)",                   OFFSET(auto_alt_ref),    AV_OPT_TYPE_INT, {.i64 = -1},      -1,      2,       VE}, \ 
 1030     { "lag-in-frames",   "Number of frames to look ahead for " \ 
 1031                          "alternate reference frame selection",    OFFSET(lag_in_frames),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE}, \ 
 1032     { "arnr-maxframes",  "altref noise reduction max frame count", OFFSET(arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE}, \ 
 1033     { "arnr-strength",   "altref noise reduction filter strength", OFFSET(arnr_strength),   AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE}, \ 
 1034     { "arnr-type",       "altref noise reduction filter type",     OFFSET(arnr_type),       AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE, "arnr_type"}, \ 
 1035     { "backward",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, "arnr_type" }, \ 
 1036     { "forward",         NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, "arnr_type" }, \ 
 1037     { "centered",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, "arnr_type" }, \ 
 1038     { "tune",            "Tune the encoding to a specific scenario", OFFSET(tune),          AV_OPT_TYPE_INT, {.i64 = -1},      -1,      INT_MAX, VE, "tune"}, \ 
 1039     { "psnr",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VP8_TUNE_PSNR}, 0, 0, VE, "tune"}, \ 
 1040     { "ssim",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VP8_TUNE_SSIM}, 0, 0, VE, "tune"}, \ 
 1041     { "deadline",        "Time to spend encoding, in microseconds.", OFFSET(deadline),      AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, "quality"}, \ 
 1042     { "best",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_BEST_QUALITY}, 0, 0, VE, "quality"}, \ 
 1043     { "good",            NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_GOOD_QUALITY}, 0, 0, VE, "quality"}, \ 
 1044     { "realtime",        NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_REALTIME},     0, 0, VE, "quality"}, \ 
 1045     { "error-resilient", "Error resilience configuration", OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, VE, "er"}, \ 
 1046     { "max-intra-rate",  "Maximum I-frame bitrate (pct) 0=unlimited",  OFFSET(max_intra_rate),  AV_OPT_TYPE_INT,  {.i64 = -1}, -1,      INT_MAX, VE}, \ 
 1047     { "default",         "Improve resiliency against losses of whole frames", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_DEFAULT}, 0, 0, VE, "er"}, \ 
 1048     { "partitions",      "The frame partitions are independently decodable " \ 
 1049                          "by the bool decoder, meaning that partitions can be decoded even " \ 
 1050                          "though earlier partitions have been lost. Note that intra predicition" \ 
 1051                          " is still done over the partition boundary.",       0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_PARTITIONS}, 0, 0, VE, "er"}, \ 
 1052     { "crf",              "Select the quality for constant quality mode", offsetof(VPxContext, crf), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 63, VE }, \ 
 1053     { "static-thresh",    "A change threshold on blocks below which they will be skipped by the encoder", OFFSET(static_thresh), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, \ 
 1054     { "drop-threshold",   "Frame drop threshold", offsetof(VPxContext, drop_threshold), AV_OPT_TYPE_INT, {.i64 = 0 }, INT_MIN, INT_MAX, VE }, \ 
 1055     { "noise-sensitivity", "Noise sensitivity", OFFSET(noise_sensitivity), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 4, VE}, \ 
 1056     { "undershoot-pct",  "Datarate undershoot (min) target (%)", OFFSET(rc_undershoot_pct), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 100, VE }, \ 
 1057     { "overshoot-pct",   "Datarate overshoot (max) target (%)", OFFSET(rc_overshoot_pct), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1000, VE }, \ 
 1059 #define LEGACY_OPTIONS \ 
 1060     {"speed", "", offsetof(VPxContext, cpu_used), AV_OPT_TYPE_INT, {.i64 = 1}, -16, 16, VE}, \ 
 1061     {"quality", "", offsetof(VPxContext, deadline), AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, "quality"}, \ 
 1062     {"vp8flags", "", offsetof(VPxContext, flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, UINT_MAX, VE, "flags"}, \ 
 1063     {"error_resilient", "enable error resilience", 0, AV_OPT_TYPE_CONST, {.i64 = VP8F_ERROR_RESILIENT}, INT_MIN, INT_MAX, VE, "flags"}, \ 
 1064     {"altref", "enable use of alternate reference frames (VP8/2-pass only)", 0, AV_OPT_TYPE_CONST, {.i64 = VP8F_AUTO_ALT_REF}, INT_MIN, INT_MAX, VE, "flags"}, \ 
 1065     {"arnr_max_frames", "altref noise reduction max frame count", offsetof(VPxContext, arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 15, VE}, \ 
 1066     {"arnr_strength", "altref noise reduction filter strength", offsetof(VPxContext, arnr_strength), AV_OPT_TYPE_INT, {.i64 = 3}, 0, 6, VE}, \ 
 1067     {"arnr_type", "altref noise reduction filter type", offsetof(VPxContext, arnr_type), AV_OPT_TYPE_INT, {.i64 = 3}, 1, 3, VE}, \ 
 1068     {"rc_lookahead", "Number of frames to look ahead for alternate reference frame selection", offsetof(VPxContext, lag_in_frames), AV_OPT_TYPE_INT, {.i64 = 25}, 0, 25, VE}, \ 
 1070 #if CONFIG_LIBVPX_VP8_ENCODER 
 1071 static const AVOption vp8_options[] = {
 
 1079 #if CONFIG_LIBVPX_VP9_ENCODER 
 1080 static const AVOption vp9_options[] = {
 
 1084     { 
"tile-columns",    
"Number of tile columns to use, log2",         
OFFSET(tile_columns),    
AV_OPT_TYPE_INT, {.i64 = -1}, -1, 6, 
VE},
 
 1085     { 
"tile-rows",       
"Number of tile rows to use, log2",            
OFFSET(tile_rows),       
AV_OPT_TYPE_INT, {.i64 = -1}, -1, 2, 
VE},
 
 1086     { 
"frame-parallel",  
"Enable frame parallel decodability features", 
OFFSET(frame_parallel),  
AV_OPT_TYPE_BOOL,{.i64 = -1}, -1, 1, 
VE},
 
 1087     { 
"aq-mode",         
"adaptive quantization mode",                  
OFFSET(aq_mode),         
AV_OPT_TYPE_INT, {.i64 = -1}, -1, 3, 
VE, 
"aq_mode"},
 
 1089     { 
"variance",        
"Variance based Aq",   0, 
AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, 
VE, 
"aq_mode" },
 
 1090     { 
"complexity",      
"Complexity based Aq", 0, 
AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, 
VE, 
"aq_mode" },
 
 1097 #undef COMMON_OPTIONS 
 1098 #undef LEGACY_OPTIONS 
 1104     { 
"keyint_min",       
"-1" },
 
 1108 #if CONFIG_LIBVPX_VP8_ENCODER 
 1111     return vpx_init(avctx, vpx_codec_vp8_cx());
 
 1114 static const AVClass class_vp8 = {
 
 1117     .option     = vp8_options,
 
 1121 AVCodec ff_libvpx_vp8_encoder = {
 
 1132     .priv_class     = &class_vp8,
 
 1137 #if CONFIG_LIBVPX_VP9_ENCODER 
 1140     return vpx_init(avctx, vpx_codec_vp9_cx());
 
 1143 static const AVClass class_vp9 = {
 
 1146     .option     = vp9_options,
 
 1150 AVCodec ff_libvpx_vp9_encoder = {
 
 1151     .
name           = 
"libvpx-vp9",
 
 1161     .priv_class     = &class_vp9,
 
also ITU-R BT1361 / IEC 61966-2-4 xvYCC709 / SMPTE RP177 Annex B 
const char const char void * val
#define AVERROR_INVALIDDATA
Invalid data found when processing input. 
#define AV_PIX_FMT_YUV440P10
This structure describes decoded (raw) audio or video data. 
static av_cold int vpx_free(AVCodecContext *avctx)
int ff_side_data_set_encoder_stats(AVPacket *pkt, int quality, int64_t *error, int error_count, int pict_type)
uint64_t error[AV_NUM_DATA_POINTERS]
error 
planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) 
#define AV_LOG_WARNING
Something somehow does not look correct. 
int64_t bit_rate
the average bitrate 
#define LIBAVUTIL_VERSION_INT
static av_cold int init(AVCodecContext *avctx)
struct FrameListData * coded_frame_list
int max_bitrate
Maximum bitrate of the stream, in bits per second. 
also ITU-R BT601-6 625 / ITU-R BT1358 625 / ITU-R BT1700 625 PAL & SECAM / IEC 61966-2-4 xvYCC601 ...
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts. 
enum AVColorRange color_range
MPEG vs JPEG YUV range. 
#define AV_PIX_FMT_GBRP10
also ITU-R BT601-6 525 / ITU-R BT1358 525 / ITU-R BT1700 NTSC 
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx. 
size_t sz
length of compressed data 
static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride)
#define AV_PIX_FMT_YUV420P12
char * stats_in
pass2 encoding statistics input buffer Concatenated stuff from stats_out of pass1 should be placed he...
static void cx_pktcpy(struct FrameListData *dst, const struct vpx_codec_cx_pkt *src, const struct vpx_codec_cx_pkt *src_alpha, VPxContext *ctx)
#define AV_CODEC_CAP_AUTO_THREADS
Codec supports avctx->thread_count == 0 (auto). 
struct vpx_fixed_buf twopass_stats
order of coefficients is actually GBR, also IEC 61966-2-1 (sRGB) 
int min_bitrate
Minimum bitrate of the stream, in bits per second. 
functionally identical to above 
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
#define VP8F_AUTO_ALT_REF
Enable automatic alternate reference frame generation. 
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define av_assert0(cond)
assert() equivalent, that is always enabled. 
planar YUV 4:2:0, 20bpp, (1 Cr & Cb sample per 2x2 Y & A samples) 
attribute_deprecated float rc_buffer_aggressivity
static av_cold int codecctl_int(AVCodecContext *avctx, enum vp8e_enc_control_id id, int val)
int64_t pts
time stamp to show frame (in timebase units) 
static void coded_frame_add(void *list, struct FrameListData *cx_frame)
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user). 
#define AV_LOG_VERBOSE
Detailed information. 
int buffer_size
The size of the buffer to which the ratecontrol is applied, in bits. 
#define AV_PIX_FMT_YUV422P12
char * stats_out
pass1 encoding statistics output buffer 
attribute_deprecated uint64_t error[AV_NUM_DATA_POINTERS]
attribute_deprecated int frame_skip_threshold
#define AV_PKT_FLAG_KEY
The packet contains a keyframe. 
static int vpx_encode(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *frame, int *got_packet)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered. 
static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame, AVPacket *pkt)
Store coded frame information in format suitable for return from encode2(). 
int qmax
maximum quantizer 
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers. 
int flags
AV_CODEC_FLAG_*. 
Round to nearest and halfway cases away from zero. 
simple assert() macros that are a bit more flexible than ISO C assert(). 
const char * name
Name of the codec implementation. 
#define AV_PIX_FMT_YUV444P10
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate. 
int flags
A combination of AV_PKT_FLAG values. 
planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) 
int rc_buffer_size
decoder bitstream buffer size 
int64_t rc_min_rate
minimum bitrate 
common internal API header 
static av_cold void dump_enc_cfg(AVCodecContext *avctx, const struct vpx_codec_enc_cfg *cfg)
enum AVPictureType pict_type
Picture type of the frame. 
struct vpx_image rawimg_alpha
#define AV_BASE64_SIZE(x)
Calculate the output size needed to base64-encode x bytes to a null-terminated string. 
int width
picture width / height. 
#define FF_PROFILE_UNKNOWN
ITU-R BT2020 non-constant luminance system. 
attribute_deprecated int noise_reduction
#define AV_CODEC_FLAG_PSNR
error[?] variables will be set during encoding. 
#define AV_CODEC_FLAG_PASS1
Use internal 2pass ratecontrol in first pass mode. 
int ticks_per_frame
For some codecs, the time base is closer to the field rate than the frame rate. 
static av_cold void log_encoder_error(AVCodecContext *avctx, const char *desc)
attribute_deprecated int mb_threshold
int64_t av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd)
Rescale a 64-bit integer with specified rounding. 
int thread_count
thread count is used to decide how many independent tasks should be passed to execute() ...
struct FrameListData * next
the normal 2^n-1 "JPEG" YUV ranges 
#define VP8F_ERROR_RESILIENT
Enable measures appropriate for streaming over lossy links. 
static av_cold int vpx_init(AVCodecContext *avctx, const struct vpx_codec_iface *iface)
This structure describes the bitrate properties of an encoded bitstream. 
static const AVCodecDefault defaults[]
#define AV_LOG_INFO
Standard information. 
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer. 
Libavcodec external API header. 
av_cold void ff_vp9_init_static(AVCodec *codec)
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line. 
static av_cold int vp9_init(AVFormatContext *ctx, int st_index, PayloadContext *data)
static int set_pix_fmt(AVCodecContext *avctx, struct vpx_image *img, int has_alpha_channel)
main external API structure. 
static int queue_frames(AVCodecContext *avctx, AVPacket *pkt_out)
Queue multiple output frames from the encoder, returning the front-most. 
void av_packet_unref(AVPacket *pkt)
Wipe the packet. 
int qmin
minimum quantizer 
Data found in BlockAdditional element of matroska container. 
#define AV_PIX_FMT_YUV420P10
Describe the class of an AVClass context structure. 
static const AVProfile profiles[]
enum AVColorSpace colorspace
YUV colorspace type. 
uint32_t flags
flags for this frame 
#define AV_PIX_FMT_YUV440P12
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int64_t size, int64_t min_size)
Check AVPacket size and/or allocate data. 
static av_cold void free_coded_frame(struct FrameListData *cx_frame)
float qcompress
amount of qscale change between easy & hard scenes (0.0-1.0) 
static enum AVPixelFormat pix_fmts[]
void * buf
compressed data buffer 
#define AV_PIX_FMT_GBRP12
int have_sse
true if we have pending sse[] 
#define AV_PIX_FMT_YUV422P10
#define AV_PIX_FMT_YUV444P12
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes. 
the normal 219*2^(n-8) "MPEG" YUV ranges 
int flags
VP8 specific flags, see VP8F_* below. 
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only 
static const char *const ctlidstr[]
String mappings for enum vp8e_enc_control_id. 
struct vpx_codec_ctx encoder_alpha
static av_cold int vp8_init(AVFormatContext *s, int st_index, PayloadContext *vp8)
planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) 
#define FF_DISABLE_DEPRECATION_WARNINGS
common internal api header. 
common internal and external API header 
struct vpx_codec_ctx encoder
attribute_deprecated AVFrame * coded_frame
the picture in the bitstream 
AVCPBProperties * ff_add_cpb_side_data(AVCodecContext *avctx)
Add a CPB properties side data to an encoding context. 
static av_cold void free_frame_list(struct FrameListData *list)
#define AV_CODEC_FLAG_PASS2
Use internal 2pass ratecontrol in second pass mode. 
int slices
Number of slices. 
#define FF_ENABLE_DEPRECATION_WARNINGS
Portion of struct vpx_codec_cx_pkt from vpx_encoder.h. 
int avg_bitrate
Average bitrate of the stream, in bits per second. 
int key_frame
1 -> keyframe, 0-> not 
unsigned long duration
duration to show frame (in timebase units) 
int av_base64_decode(uint8_t *out, const char *in_str, int out_size)
Decode a base64-encoded string. 
static void stats(const struct CachedBuf *in, int n_in, unsigned *_max, unsigned *_sum)
int64_t dts
Decompression timestamp in AVStream->time_base units; the time at which the packet is decompressed...
int have_sse
true if we have pending sse[] 
planar YUV 4:4:0 (1 Cr & Cb sample per 1x2 Y samples) 
uint8_t * av_packet_new_side_data(AVPacket *pkt, enum AVPacketSideDataType type, int size)
Allocate new information of a packet. 
const AVProfile ff_vp9_profiles[]
AVPixelFormat
Pixel format. 
This structure stores compressed data. 
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
int64_t rc_max_rate
maximum bitrate 
int keyint_min
minimum GOP size