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.

146 lines
6.0KB

  1. /*
  2. * Intel MediaSDK QSV encoder utility functions
  3. *
  4. * copyright (c) 2013 Yukinori Yamazoe
  5. *
  6. * This file is part of Libav.
  7. *
  8. * Libav is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU Lesser General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2.1 of the License, or (at your option) any later version.
  12. *
  13. * Libav is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * Lesser General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU Lesser General Public
  19. * License along with Libav; if not, write to the Free Software
  20. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  21. */
  22. #ifndef AVCODEC_QSVENC_H
  23. #define AVCODEC_QSVENC_H
  24. #include <stdint.h>
  25. #include <sys/types.h>
  26. #include <mfx/mfxvideo.h>
  27. #include "libavutil/avutil.h"
  28. #include "libavutil/fifo.h"
  29. #include "avcodec.h"
  30. #include "qsv_internal.h"
  31. #define QSV_HAVE_CO2 QSV_VERSION_ATLEAST(1, 6)
  32. #define QSV_HAVE_CO3 QSV_VERSION_ATLEAST(1, 11)
  33. #define QSV_HAVE_TRELLIS QSV_VERSION_ATLEAST(1, 8)
  34. #define QSV_HAVE_MAX_SLICE_SIZE QSV_VERSION_ATLEAST(1, 9)
  35. #define QSV_HAVE_BREF_TYPE QSV_VERSION_ATLEAST(1, 8)
  36. #define QSV_HAVE_LA QSV_VERSION_ATLEAST(1, 7)
  37. #define QSV_HAVE_LA_HRD QSV_VERSION_ATLEAST(1, 11)
  38. #define QSV_HAVE_ICQ QSV_VERSION_ATLEAST(1, 8)
  39. #define QSV_HAVE_VCM QSV_VERSION_ATLEAST(1, 8)
  40. #define QSV_HAVE_QVBR QSV_VERSION_ATLEAST(1, 11)
  41. #define QSV_COMMON_OPTS \
  42. { "async_depth", "Maximum processing parallelism", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 0, INT_MAX, VE }, \
  43. { "avbr_accuracy", "Accuracy of the AVBR ratecontrol", OFFSET(qsv.avbr_accuracy), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, \
  44. { "avbr_convergence", "Convergence of the AVBR ratecontrol", OFFSET(qsv.avbr_convergence), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE }, \
  45. { "preset", NULL, OFFSET(qsv.preset), AV_OPT_TYPE_INT, { .i64 = MFX_TARGETUSAGE_BALANCED }, 0, 7, VE, "preset" }, \
  46. { "fast", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_BEST_SPEED }, INT_MIN, INT_MAX, VE, "preset" }, \
  47. { "medium", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_BALANCED }, INT_MIN, INT_MAX, VE, "preset" }, \
  48. { "slow", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_BEST_QUALITY }, INT_MIN, INT_MAX, VE, "preset" }, \
  49. { "la_depth", "Number of frames to analyze before encoding.", OFFSET(qsv.la_depth), AV_OPT_TYPE_INT, { .i64 = 9 }, 9, 100, VE, "la_depth" }, \
  50. { "unset", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = 9 }, INT_MIN, INT_MAX, VE, "la_depth" }, \
  51. { "vcm", "Use the video conferencing mode ratecontrol", OFFSET(qsv.vcm), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, \
  52. { "rdo", "Enable rate distortion optimization", OFFSET(qsv.rdo), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
  53. { "max_frame_size", "Maximum encoded frame size in bytes", OFFSET(qsv.max_frame_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, UINT16_MAX, VE }, \
  54. { "max_slice_size", "Maximum encoded slice size in bytes", OFFSET(qsv.max_slice_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, UINT16_MAX, VE }, \
  55. { "bitrate_limit", "Toggle bitrate limitations", OFFSET(qsv.bitrate_limit), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
  56. { "mbbrc", "MB level bitrate control", OFFSET(qsv.mbbrc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
  57. { "extbrc", "Extended bitrate control", OFFSET(qsv.extbrc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
  58. { "adaptive_i", "Adaptive I-frame placement", OFFSET(qsv.adaptive_i), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
  59. { "adaptive_b", "Adaptive B-frame placement", OFFSET(qsv.adaptive_b), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
  60. { "b_strategy", "Strategy to choose between I/P/B-frames", OFFSET(qsv.b_strategy), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE }, \
  61. { "cavlc", "Enable CAVLC", OFFSET(qsv.cavlc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, VE }, \
  62. typedef struct QSVEncContext {
  63. AVCodecContext *avctx;
  64. QSVFrame *work_frames;
  65. mfxSession session;
  66. mfxSession internal_session;
  67. int packet_size;
  68. int width_align;
  69. int height_align;
  70. mfxVideoParam param;
  71. mfxFrameAllocRequest req;
  72. mfxExtCodingOption extco;
  73. #if QSV_HAVE_CO2
  74. mfxExtCodingOption2 extco2;
  75. #endif
  76. mfxExtOpaqueSurfaceAlloc opaque_alloc;
  77. mfxFrameSurface1 **opaque_surfaces;
  78. AVBufferRef *opaque_alloc_buf;
  79. mfxExtBuffer *extparam_internal[2 + QSV_HAVE_CO2];
  80. int nb_extparam_internal;
  81. mfxExtBuffer **extparam;
  82. AVFifoBuffer *async_fifo;
  83. QSVFramesContext frames_ctx;
  84. // options set by the caller
  85. int async_depth;
  86. int idr_interval;
  87. int profile;
  88. int preset;
  89. int avbr_accuracy;
  90. int avbr_convergence;
  91. int la_depth;
  92. int vcm;
  93. int rdo;
  94. int max_frame_size;
  95. int max_slice_size;
  96. int single_sei_nal_unit;
  97. int max_dec_frame_buffering;
  98. int trellis;
  99. int bitrate_limit;
  100. int mbbrc;
  101. int extbrc;
  102. int adaptive_i;
  103. int adaptive_b;
  104. int b_strategy;
  105. int cavlc;
  106. int int_ref_type;
  107. int int_ref_cycle_size;
  108. int int_ref_qp_delta;
  109. int recovery_point_sei;
  110. char *load_plugins;
  111. } QSVEncContext;
  112. int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q);
  113. int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q,
  114. AVPacket *pkt, const AVFrame *frame, int *got_packet);
  115. int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q);
  116. #endif /* AVCODEC_QSVENC_H */