You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

633 lines
25KB

  1. /*
  2. * Copyright (c) 2010, Google, Inc.
  3. *
  4. * This file is part of Libav.
  5. *
  6. * Libav is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * Libav is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with Libav; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. /**
  21. * @file
  22. * VP8 encoder support via libvpx
  23. */
  24. #define VPX_DISABLE_CTRL_TYPECHECKS 1
  25. #define VPX_CODEC_DISABLE_COMPAT 1
  26. #include <vpx/vpx_encoder.h>
  27. #include <vpx/vp8cx.h>
  28. #include "avcodec.h"
  29. #include "internal.h"
  30. #include "libavutil/base64.h"
  31. #include "libavutil/common.h"
  32. #include "libavutil/mathematics.h"
  33. #include "libavutil/opt.h"
  34. /**
  35. * Portion of struct vpx_codec_cx_pkt from vpx_encoder.h.
  36. * One encoded frame returned from the library.
  37. */
  38. struct FrameListData {
  39. void *buf; /**< compressed data buffer */
  40. size_t sz; /**< length of compressed data */
  41. int64_t pts; /**< time stamp to show frame
  42. (in timebase units) */
  43. unsigned long duration; /**< duration to show frame
  44. (in timebase units) */
  45. uint32_t flags; /**< flags for this frame */
  46. struct FrameListData *next;
  47. };
  48. typedef struct VP8EncoderContext {
  49. AVClass *class;
  50. struct vpx_codec_ctx encoder;
  51. struct vpx_image rawimg;
  52. struct vpx_fixed_buf twopass_stats;
  53. unsigned long deadline; //i.e., RT/GOOD/BEST
  54. struct FrameListData *coded_frame_list;
  55. int cpu_used;
  56. int auto_alt_ref;
  57. int arnr_max_frames;
  58. int arnr_strength;
  59. int arnr_type;
  60. int lag_in_frames;
  61. int error_resilient;
  62. int crf;
  63. } VP8Context;
  64. /** String mappings for enum vp8e_enc_control_id */
  65. static const char *const ctlidstr[] = {
  66. [VP8E_UPD_ENTROPY] = "VP8E_UPD_ENTROPY",
  67. [VP8E_UPD_REFERENCE] = "VP8E_UPD_REFERENCE",
  68. [VP8E_USE_REFERENCE] = "VP8E_USE_REFERENCE",
  69. [VP8E_SET_ROI_MAP] = "VP8E_SET_ROI_MAP",
  70. [VP8E_SET_ACTIVEMAP] = "VP8E_SET_ACTIVEMAP",
  71. [VP8E_SET_SCALEMODE] = "VP8E_SET_SCALEMODE",
  72. [VP8E_SET_CPUUSED] = "VP8E_SET_CPUUSED",
  73. [VP8E_SET_ENABLEAUTOALTREF] = "VP8E_SET_ENABLEAUTOALTREF",
  74. [VP8E_SET_NOISE_SENSITIVITY] = "VP8E_SET_NOISE_SENSITIVITY",
  75. [VP8E_SET_SHARPNESS] = "VP8E_SET_SHARPNESS",
  76. [VP8E_SET_STATIC_THRESHOLD] = "VP8E_SET_STATIC_THRESHOLD",
  77. [VP8E_SET_TOKEN_PARTITIONS] = "VP8E_SET_TOKEN_PARTITIONS",
  78. [VP8E_GET_LAST_QUANTIZER] = "VP8E_GET_LAST_QUANTIZER",
  79. [VP8E_SET_ARNR_MAXFRAMES] = "VP8E_SET_ARNR_MAXFRAMES",
  80. [VP8E_SET_ARNR_STRENGTH] = "VP8E_SET_ARNR_STRENGTH",
  81. [VP8E_SET_ARNR_TYPE] = "VP8E_SET_ARNR_TYPE",
  82. [VP8E_SET_CQ_LEVEL] = "VP8E_SET_CQ_LEVEL",
  83. };
  84. static av_cold void log_encoder_error(AVCodecContext *avctx, const char *desc)
  85. {
  86. VP8Context *ctx = avctx->priv_data;
  87. const char *error = vpx_codec_error(&ctx->encoder);
  88. const char *detail = vpx_codec_error_detail(&ctx->encoder);
  89. av_log(avctx, AV_LOG_ERROR, "%s: %s\n", desc, error);
  90. if (detail)
  91. av_log(avctx, AV_LOG_ERROR, " Additional information: %s\n", detail);
  92. }
  93. static av_cold void dump_enc_cfg(AVCodecContext *avctx,
  94. const struct vpx_codec_enc_cfg *cfg)
  95. {
  96. int width = -30;
  97. int level = AV_LOG_DEBUG;
  98. av_log(avctx, level, "vpx_codec_enc_cfg\n");
  99. av_log(avctx, level, "generic settings\n"
  100. " %*s%u\n %*s%u\n %*s%u\n %*s%u\n %*s%u\n"
  101. " %*s{%u/%u}\n %*s%u\n %*s%d\n %*s%u\n",
  102. width, "g_usage:", cfg->g_usage,
  103. width, "g_threads:", cfg->g_threads,
  104. width, "g_profile:", cfg->g_profile,
  105. width, "g_w:", cfg->g_w,
  106. width, "g_h:", cfg->g_h,
  107. width, "g_timebase:", cfg->g_timebase.num, cfg->g_timebase.den,
  108. width, "g_error_resilient:", cfg->g_error_resilient,
  109. width, "g_pass:", cfg->g_pass,
  110. width, "g_lag_in_frames:", cfg->g_lag_in_frames);
  111. av_log(avctx, level, "rate control settings\n"
  112. " %*s%u\n %*s%u\n %*s%u\n %*s%u\n"
  113. " %*s%d\n %*s%p(%zu)\n %*s%u\n",
  114. width, "rc_dropframe_thresh:", cfg->rc_dropframe_thresh,
  115. width, "rc_resize_allowed:", cfg->rc_resize_allowed,
  116. width, "rc_resize_up_thresh:", cfg->rc_resize_up_thresh,
  117. width, "rc_resize_down_thresh:", cfg->rc_resize_down_thresh,
  118. width, "rc_end_usage:", cfg->rc_end_usage,
  119. width, "rc_twopass_stats_in:", cfg->rc_twopass_stats_in.buf, cfg->rc_twopass_stats_in.sz,
  120. width, "rc_target_bitrate:", cfg->rc_target_bitrate);
  121. av_log(avctx, level, "quantizer settings\n"
  122. " %*s%u\n %*s%u\n",
  123. width, "rc_min_quantizer:", cfg->rc_min_quantizer,
  124. width, "rc_max_quantizer:", cfg->rc_max_quantizer);
  125. av_log(avctx, level, "bitrate tolerance\n"
  126. " %*s%u\n %*s%u\n",
  127. width, "rc_undershoot_pct:", cfg->rc_undershoot_pct,
  128. width, "rc_overshoot_pct:", cfg->rc_overshoot_pct);
  129. av_log(avctx, level, "decoder buffer model\n"
  130. " %*s%u\n %*s%u\n %*s%u\n",
  131. width, "rc_buf_sz:", cfg->rc_buf_sz,
  132. width, "rc_buf_initial_sz:", cfg->rc_buf_initial_sz,
  133. width, "rc_buf_optimal_sz:", cfg->rc_buf_optimal_sz);
  134. av_log(avctx, level, "2 pass rate control settings\n"
  135. " %*s%u\n %*s%u\n %*s%u\n",
  136. width, "rc_2pass_vbr_bias_pct:", cfg->rc_2pass_vbr_bias_pct,
  137. width, "rc_2pass_vbr_minsection_pct:", cfg->rc_2pass_vbr_minsection_pct,
  138. width, "rc_2pass_vbr_maxsection_pct:", cfg->rc_2pass_vbr_maxsection_pct);
  139. av_log(avctx, level, "keyframing settings\n"
  140. " %*s%d\n %*s%u\n %*s%u\n",
  141. width, "kf_mode:", cfg->kf_mode,
  142. width, "kf_min_dist:", cfg->kf_min_dist,
  143. width, "kf_max_dist:", cfg->kf_max_dist);
  144. av_log(avctx, level, "\n");
  145. }
  146. static void coded_frame_add(void *list, struct FrameListData *cx_frame)
  147. {
  148. struct FrameListData **p = list;
  149. while (*p != NULL)
  150. p = &(*p)->next;
  151. *p = cx_frame;
  152. cx_frame->next = NULL;
  153. }
  154. static av_cold void free_coded_frame(struct FrameListData *cx_frame)
  155. {
  156. av_freep(&cx_frame->buf);
  157. av_freep(&cx_frame);
  158. }
  159. static av_cold void free_frame_list(struct FrameListData *list)
  160. {
  161. struct FrameListData *p = list;
  162. while (p) {
  163. list = list->next;
  164. free_coded_frame(p);
  165. p = list;
  166. }
  167. }
  168. static av_cold int codecctl_int(AVCodecContext *avctx,
  169. enum vp8e_enc_control_id id, int val)
  170. {
  171. VP8Context *ctx = avctx->priv_data;
  172. char buf[80];
  173. int width = -30;
  174. int res;
  175. snprintf(buf, sizeof(buf), "%s:", ctlidstr[id]);
  176. av_log(avctx, AV_LOG_DEBUG, " %*s%d\n", width, buf, val);
  177. res = vpx_codec_control(&ctx->encoder, id, val);
  178. if (res != VPX_CODEC_OK) {
  179. snprintf(buf, sizeof(buf), "Failed to set %s codec control",
  180. ctlidstr[id]);
  181. log_encoder_error(avctx, buf);
  182. }
  183. return res == VPX_CODEC_OK ? 0 : AVERROR(EINVAL);
  184. }
  185. static av_cold int vp8_free(AVCodecContext *avctx)
  186. {
  187. VP8Context *ctx = avctx->priv_data;
  188. vpx_codec_destroy(&ctx->encoder);
  189. av_freep(&ctx->twopass_stats.buf);
  190. av_freep(&avctx->coded_frame);
  191. av_freep(&avctx->stats_out);
  192. free_frame_list(ctx->coded_frame_list);
  193. return 0;
  194. }
  195. static av_cold int vpx_init(AVCodecContext *avctx,
  196. const struct vpx_codec_iface *iface)
  197. {
  198. VP8Context *ctx = avctx->priv_data;
  199. struct vpx_codec_enc_cfg enccfg;
  200. int res;
  201. av_log(avctx, AV_LOG_INFO, "%s\n", vpx_codec_version_str());
  202. av_log(avctx, AV_LOG_VERBOSE, "%s\n", vpx_codec_build_config());
  203. if ((res = vpx_codec_enc_config_default(iface, &enccfg, 0)) != VPX_CODEC_OK) {
  204. av_log(avctx, AV_LOG_ERROR, "Failed to get config: %s\n",
  205. vpx_codec_err_to_string(res));
  206. return AVERROR(EINVAL);
  207. }
  208. dump_enc_cfg(avctx, &enccfg);
  209. enccfg.g_w = avctx->width;
  210. enccfg.g_h = avctx->height;
  211. enccfg.g_timebase.num = avctx->time_base.num;
  212. enccfg.g_timebase.den = avctx->time_base.den;
  213. enccfg.g_threads = avctx->thread_count;
  214. if (ctx->lag_in_frames >= 0)
  215. enccfg.g_lag_in_frames = ctx->lag_in_frames;
  216. if (avctx->flags & CODEC_FLAG_PASS1)
  217. enccfg.g_pass = VPX_RC_FIRST_PASS;
  218. else if (avctx->flags & CODEC_FLAG_PASS2)
  219. enccfg.g_pass = VPX_RC_LAST_PASS;
  220. else
  221. enccfg.g_pass = VPX_RC_ONE_PASS;
  222. if (!avctx->bit_rate)
  223. avctx->bit_rate = enccfg.rc_target_bitrate * 1000;
  224. else
  225. enccfg.rc_target_bitrate = av_rescale_rnd(avctx->bit_rate, 1, 1000,
  226. AV_ROUND_NEAR_INF);
  227. if (ctx->crf)
  228. enccfg.rc_end_usage = VPX_CQ;
  229. else if (avctx->rc_min_rate == avctx->rc_max_rate &&
  230. avctx->rc_min_rate == avctx->bit_rate)
  231. enccfg.rc_end_usage = VPX_CBR;
  232. if (avctx->qmin > 0)
  233. enccfg.rc_min_quantizer = avctx->qmin;
  234. if (avctx->qmax > 0)
  235. enccfg.rc_max_quantizer = avctx->qmax;
  236. enccfg.rc_dropframe_thresh = avctx->frame_skip_threshold;
  237. //0-100 (0 => CBR, 100 => VBR)
  238. enccfg.rc_2pass_vbr_bias_pct = round(avctx->qcompress * 100);
  239. enccfg.rc_2pass_vbr_minsection_pct =
  240. avctx->rc_min_rate * 100LL / avctx->bit_rate;
  241. if (avctx->rc_max_rate)
  242. enccfg.rc_2pass_vbr_maxsection_pct =
  243. avctx->rc_max_rate * 100LL / avctx->bit_rate;
  244. if (avctx->rc_buffer_size)
  245. enccfg.rc_buf_sz =
  246. avctx->rc_buffer_size * 1000LL / avctx->bit_rate;
  247. if (avctx->rc_initial_buffer_occupancy)
  248. enccfg.rc_buf_initial_sz =
  249. avctx->rc_initial_buffer_occupancy * 1000LL / avctx->bit_rate;
  250. enccfg.rc_buf_optimal_sz = enccfg.rc_buf_sz * 5 / 6;
  251. //_enc_init() will balk if kf_min_dist differs from max w/VPX_KF_AUTO
  252. if (avctx->keyint_min >= 0 && avctx->keyint_min == avctx->gop_size)
  253. enccfg.kf_min_dist = avctx->keyint_min;
  254. if (avctx->gop_size >= 0)
  255. enccfg.kf_max_dist = avctx->gop_size;
  256. if (enccfg.g_pass == VPX_RC_FIRST_PASS)
  257. enccfg.g_lag_in_frames = 0;
  258. else if (enccfg.g_pass == VPX_RC_LAST_PASS) {
  259. int decode_size;
  260. if (!avctx->stats_in) {
  261. av_log(avctx, AV_LOG_ERROR, "No stats file for second pass\n");
  262. return AVERROR_INVALIDDATA;
  263. }
  264. ctx->twopass_stats.sz = strlen(avctx->stats_in) * 3 / 4;
  265. ctx->twopass_stats.buf = av_malloc(ctx->twopass_stats.sz);
  266. if (!ctx->twopass_stats.buf) {
  267. av_log(avctx, AV_LOG_ERROR,
  268. "Stat buffer alloc (%zu bytes) failed\n",
  269. ctx->twopass_stats.sz);
  270. return AVERROR(ENOMEM);
  271. }
  272. decode_size = av_base64_decode(ctx->twopass_stats.buf, avctx->stats_in,
  273. ctx->twopass_stats.sz);
  274. if (decode_size < 0) {
  275. av_log(avctx, AV_LOG_ERROR, "Stat buffer decode failed\n");
  276. return AVERROR_INVALIDDATA;
  277. }
  278. ctx->twopass_stats.sz = decode_size;
  279. enccfg.rc_twopass_stats_in = ctx->twopass_stats;
  280. }
  281. /* 0-3: For non-zero values the encoder increasingly optimizes for reduced
  282. complexity playback on low powered devices at the expense of encode
  283. quality. */
  284. if (avctx->profile != FF_PROFILE_UNKNOWN)
  285. enccfg.g_profile = avctx->profile;
  286. enccfg.g_error_resilient = ctx->error_resilient;
  287. dump_enc_cfg(avctx, &enccfg);
  288. /* Construct Encoder Context */
  289. res = vpx_codec_enc_init(&ctx->encoder, iface, &enccfg, 0);
  290. if (res != VPX_CODEC_OK) {
  291. log_encoder_error(avctx, "Failed to initialize encoder");
  292. return AVERROR(EINVAL);
  293. }
  294. //codec control failures are currently treated only as warnings
  295. av_log(avctx, AV_LOG_DEBUG, "vpx_codec_control\n");
  296. if (ctx->cpu_used != INT_MIN)
  297. codecctl_int(avctx, VP8E_SET_CPUUSED, ctx->cpu_used);
  298. if (ctx->auto_alt_ref >= 0)
  299. codecctl_int(avctx, VP8E_SET_ENABLEAUTOALTREF, ctx->auto_alt_ref);
  300. if (ctx->arnr_max_frames >= 0)
  301. codecctl_int(avctx, VP8E_SET_ARNR_MAXFRAMES, ctx->arnr_max_frames);
  302. if (ctx->arnr_strength >= 0)
  303. codecctl_int(avctx, VP8E_SET_ARNR_STRENGTH, ctx->arnr_strength);
  304. if (ctx->arnr_type >= 0)
  305. codecctl_int(avctx, VP8E_SET_ARNR_TYPE, ctx->arnr_type);
  306. codecctl_int(avctx, VP8E_SET_NOISE_SENSITIVITY, avctx->noise_reduction);
  307. codecctl_int(avctx, VP8E_SET_TOKEN_PARTITIONS, av_log2(avctx->slices));
  308. codecctl_int(avctx, VP8E_SET_STATIC_THRESHOLD, avctx->mb_threshold);
  309. codecctl_int(avctx, VP8E_SET_CQ_LEVEL, ctx->crf);
  310. //provide dummy value to initialize wrapper, values will be updated each _encode()
  311. vpx_img_wrap(&ctx->rawimg, VPX_IMG_FMT_I420, avctx->width, avctx->height, 1,
  312. (unsigned char*)1);
  313. avctx->coded_frame = avcodec_alloc_frame();
  314. if (!avctx->coded_frame) {
  315. av_log(avctx, AV_LOG_ERROR, "Error allocating coded frame\n");
  316. vp8_free(avctx);
  317. return AVERROR(ENOMEM);
  318. }
  319. return 0;
  320. }
  321. static inline void cx_pktcpy(struct FrameListData *dst,
  322. const struct vpx_codec_cx_pkt *src)
  323. {
  324. dst->pts = src->data.frame.pts;
  325. dst->duration = src->data.frame.duration;
  326. dst->flags = src->data.frame.flags;
  327. dst->sz = src->data.frame.sz;
  328. dst->buf = src->data.frame.buf;
  329. }
  330. /**
  331. * Store coded frame information in format suitable for return from encode2().
  332. *
  333. * Write information from @a cx_frame to @a pkt
  334. * @return packet data size on success
  335. * @return a negative AVERROR on error
  336. */
  337. static int storeframe(AVCodecContext *avctx, struct FrameListData *cx_frame,
  338. AVPacket *pkt, AVFrame *coded_frame)
  339. {
  340. int ret = ff_alloc_packet(pkt, cx_frame->sz);
  341. if (ret >= 0) {
  342. memcpy(pkt->data, cx_frame->buf, pkt->size);
  343. pkt->pts = pkt->dts = cx_frame->pts;
  344. coded_frame->pts = cx_frame->pts;
  345. coded_frame->key_frame = !!(cx_frame->flags & VPX_FRAME_IS_KEY);
  346. if (coded_frame->key_frame) {
  347. coded_frame->pict_type = AV_PICTURE_TYPE_I;
  348. pkt->flags |= AV_PKT_FLAG_KEY;
  349. } else
  350. coded_frame->pict_type = AV_PICTURE_TYPE_P;
  351. } else {
  352. av_log(avctx, AV_LOG_ERROR,
  353. "Error getting output packet of size %zu.\n", cx_frame->sz);
  354. return ret;
  355. }
  356. return pkt->size;
  357. }
  358. /**
  359. * Queue multiple output frames from the encoder, returning the front-most.
  360. * In cases where vpx_codec_get_cx_data() returns more than 1 frame append
  361. * the frame queue. Return the head frame if available.
  362. * @return Stored frame size
  363. * @return AVERROR(EINVAL) on output size error
  364. * @return AVERROR(ENOMEM) on coded frame queue data allocation error
  365. */
  366. static int queue_frames(AVCodecContext *avctx, AVPacket *pkt_out,
  367. AVFrame *coded_frame)
  368. {
  369. VP8Context *ctx = avctx->priv_data;
  370. const struct vpx_codec_cx_pkt *pkt;
  371. const void *iter = NULL;
  372. int size = 0;
  373. if (ctx->coded_frame_list) {
  374. struct FrameListData *cx_frame = ctx->coded_frame_list;
  375. /* return the leading frame if we've already begun queueing */
  376. size = storeframe(avctx, cx_frame, pkt_out, coded_frame);
  377. if (size < 0)
  378. return size;
  379. ctx->coded_frame_list = cx_frame->next;
  380. free_coded_frame(cx_frame);
  381. }
  382. /* consume all available output from the encoder before returning. buffers
  383. are only good through the next vpx_codec call */
  384. while ((pkt = vpx_codec_get_cx_data(&ctx->encoder, &iter))) {
  385. switch (pkt->kind) {
  386. case VPX_CODEC_CX_FRAME_PKT:
  387. if (!size) {
  388. struct FrameListData cx_frame;
  389. /* avoid storing the frame when the list is empty and we haven't yet
  390. provided a frame for output */
  391. assert(!ctx->coded_frame_list);
  392. cx_pktcpy(&cx_frame, pkt);
  393. size = storeframe(avctx, &cx_frame, pkt_out, coded_frame);
  394. if (size < 0)
  395. return size;
  396. } else {
  397. struct FrameListData *cx_frame =
  398. av_malloc(sizeof(struct FrameListData));
  399. if (!cx_frame) {
  400. av_log(avctx, AV_LOG_ERROR,
  401. "Frame queue element alloc failed\n");
  402. return AVERROR(ENOMEM);
  403. }
  404. cx_pktcpy(cx_frame, pkt);
  405. cx_frame->buf = av_malloc(cx_frame->sz);
  406. if (!cx_frame->buf) {
  407. av_log(avctx, AV_LOG_ERROR,
  408. "Data buffer alloc (%zu bytes) failed\n",
  409. cx_frame->sz);
  410. return AVERROR(ENOMEM);
  411. }
  412. memcpy(cx_frame->buf, pkt->data.frame.buf, pkt->data.frame.sz);
  413. coded_frame_add(&ctx->coded_frame_list, cx_frame);
  414. }
  415. break;
  416. case VPX_CODEC_STATS_PKT: {
  417. struct vpx_fixed_buf *stats = &ctx->twopass_stats;
  418. stats->buf = av_realloc(stats->buf,
  419. stats->sz + pkt->data.twopass_stats.sz);
  420. if (!stats->buf) {
  421. av_log(avctx, AV_LOG_ERROR, "Stat buffer realloc failed\n");
  422. return AVERROR(ENOMEM);
  423. }
  424. memcpy((uint8_t*)stats->buf + stats->sz,
  425. pkt->data.twopass_stats.buf, pkt->data.twopass_stats.sz);
  426. stats->sz += pkt->data.twopass_stats.sz;
  427. break;
  428. }
  429. case VPX_CODEC_PSNR_PKT: //FIXME add support for CODEC_FLAG_PSNR
  430. case VPX_CODEC_CUSTOM_PKT:
  431. //ignore unsupported/unrecognized packet types
  432. break;
  433. }
  434. }
  435. return size;
  436. }
  437. static int vp8_encode(AVCodecContext *avctx, AVPacket *pkt,
  438. const AVFrame *frame, int *got_packet)
  439. {
  440. VP8Context *ctx = avctx->priv_data;
  441. struct vpx_image *rawimg = NULL;
  442. int64_t timestamp = 0;
  443. int res, coded_size;
  444. vpx_enc_frame_flags_t flags = 0;
  445. if (frame) {
  446. rawimg = &ctx->rawimg;
  447. rawimg->planes[VPX_PLANE_Y] = frame->data[0];
  448. rawimg->planes[VPX_PLANE_U] = frame->data[1];
  449. rawimg->planes[VPX_PLANE_V] = frame->data[2];
  450. rawimg->stride[VPX_PLANE_Y] = frame->linesize[0];
  451. rawimg->stride[VPX_PLANE_U] = frame->linesize[1];
  452. rawimg->stride[VPX_PLANE_V] = frame->linesize[2];
  453. timestamp = frame->pts;
  454. if (frame->pict_type == AV_PICTURE_TYPE_I)
  455. flags |= VPX_EFLAG_FORCE_KF;
  456. }
  457. res = vpx_codec_encode(&ctx->encoder, rawimg, timestamp,
  458. avctx->ticks_per_frame, flags, ctx->deadline);
  459. if (res != VPX_CODEC_OK) {
  460. log_encoder_error(avctx, "Error encoding frame");
  461. return AVERROR_INVALIDDATA;
  462. }
  463. coded_size = queue_frames(avctx, pkt, avctx->coded_frame);
  464. if (!frame && avctx->flags & CODEC_FLAG_PASS1) {
  465. unsigned int b64_size = AV_BASE64_SIZE(ctx->twopass_stats.sz);
  466. avctx->stats_out = av_malloc(b64_size);
  467. if (!avctx->stats_out) {
  468. av_log(avctx, AV_LOG_ERROR, "Stat buffer alloc (%d bytes) failed\n",
  469. b64_size);
  470. return AVERROR(ENOMEM);
  471. }
  472. av_base64_encode(avctx->stats_out, b64_size, ctx->twopass_stats.buf,
  473. ctx->twopass_stats.sz);
  474. }
  475. *got_packet = !!coded_size;
  476. return 0;
  477. }
  478. #define OFFSET(x) offsetof(VP8Context, x)
  479. #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
  480. static const AVOption options[] = {
  481. { "cpu-used", "Quality/Speed ratio modifier", OFFSET(cpu_used), AV_OPT_TYPE_INT, {.i64 = INT_MIN}, INT_MIN, INT_MAX, VE},
  482. { "auto-alt-ref", "Enable use of alternate reference "
  483. "frames (2-pass only)", OFFSET(auto_alt_ref), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 1, VE},
  484. { "lag-in-frames", "Number of frames to look ahead for "
  485. "alternate reference frame selection", OFFSET(lag_in_frames), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},
  486. { "arnr-maxframes", "altref noise reduction max frame count", OFFSET(arnr_max_frames), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},
  487. { "arnr-strength", "altref noise reduction filter strength", OFFSET(arnr_strength), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE},
  488. { "arnr-type", "altref noise reduction filter type", OFFSET(arnr_type), AV_OPT_TYPE_INT, {.i64 = -1}, -1, INT_MAX, VE, "arnr_type"},
  489. { "backward", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 1}, 0, 0, VE, "arnr_type" },
  490. { "forward", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 2}, 0, 0, VE, "arnr_type" },
  491. { "centered", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = 3}, 0, 0, VE, "arnr_type" },
  492. { "deadline", "Time to spend encoding, in microseconds.", OFFSET(deadline), AV_OPT_TYPE_INT, {.i64 = VPX_DL_GOOD_QUALITY}, INT_MIN, INT_MAX, VE, "quality"},
  493. { "best", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_BEST_QUALITY}, 0, 0, VE, "quality"},
  494. { "good", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_GOOD_QUALITY}, 0, 0, VE, "quality"},
  495. { "realtime", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VPX_DL_REALTIME}, 0, 0, VE, "quality"},
  496. { "error-resilient", "Error resilience configuration", OFFSET(error_resilient), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, VE, "er"},
  497. #ifdef VPX_ERROR_RESILIENT_DEFAULT
  498. { "default", "Improve resiliency against losses of whole frames", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_DEFAULT}, 0, 0, VE, "er"},
  499. { "partitions", "The frame partitions are independently decodable "
  500. "by the bool decoder, meaning that partitions can be decoded even "
  501. "though earlier partitions have been lost. Note that intra predicition"
  502. " is still done over the partition boundary.", 0, AV_OPT_TYPE_CONST, {.i64 = VPX_ERROR_RESILIENT_PARTITIONS}, 0, 0, VE, "er"},
  503. #endif
  504. { "crf", "Select the quality for constant quality mode", offsetof(VP8Context, crf), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 63, VE },
  505. { NULL }
  506. };
  507. static const AVCodecDefault defaults[] = {
  508. { "qmin", "-1" },
  509. { "qmax", "-1" },
  510. { "g", "-1" },
  511. { "keyint_min", "-1" },
  512. { NULL },
  513. };
  514. #if CONFIG_LIBVPX_VP8_ENCODER
  515. static av_cold int vp8_init(AVCodecContext *avctx)
  516. {
  517. return vpx_init(avctx, &vpx_codec_vp8_cx_algo);
  518. }
  519. static const AVClass class_vp8 = {
  520. .class_name = "libvpx encoder",
  521. .item_name = av_default_item_name,
  522. .option = options,
  523. .version = LIBAVUTIL_VERSION_INT,
  524. };
  525. AVCodec ff_libvpx_vp8_encoder = {
  526. .name = "libvpx",
  527. .long_name = NULL_IF_CONFIG_SMALL("libvpx VP8"),
  528. .type = AVMEDIA_TYPE_VIDEO,
  529. .id = AV_CODEC_ID_VP8,
  530. .priv_data_size = sizeof(VP8Context),
  531. .init = vp8_init,
  532. .encode2 = vp8_encode,
  533. .close = vp8_free,
  534. .capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS,
  535. .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
  536. .priv_class = &class_vp8,
  537. .defaults = defaults,
  538. };
  539. #endif /* CONFIG_LIBVPX_VP8_ENCODER */
  540. #if CONFIG_LIBVPX_VP9_ENCODER
  541. static av_cold int vp9_init(AVCodecContext *avctx)
  542. {
  543. return vpx_init(avctx, &vpx_codec_vp9_cx_algo);
  544. }
  545. static const AVClass class_vp9 = {
  546. .class_name = "libvpx encoder",
  547. .item_name = av_default_item_name,
  548. .option = options,
  549. .version = LIBAVUTIL_VERSION_INT,
  550. };
  551. AVCodec ff_libvpx_vp9_encoder = {
  552. .name = "libvpx-vp9",
  553. .long_name = NULL_IF_CONFIG_SMALL("libvpx VP9"),
  554. .type = AVMEDIA_TYPE_VIDEO,
  555. .id = AV_CODEC_ID_VP9,
  556. .priv_data_size = sizeof(VP8Context),
  557. .init = vp9_init,
  558. .encode2 = vp8_encode,
  559. .close = vp8_free,
  560. .capabilities = CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS | CODEC_CAP_EXPERIMENTAL,
  561. .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE },
  562. .priv_class = &class_vp9,
  563. .defaults = defaults,
  564. };
  565. #endif /* CONFIG_LIBVPX_VP9_ENCODER */