#include "avcodec.h"
#include "internal.h"
+#if defined(_MSC_VER)
+#define X265_API_IMPORTS 1
+#endif
+
typedef struct libx265Context {
const AVClass *class;
libx265Context *ctx = avctx->priv_data;
x265_nal *nal;
uint8_t *buf;
+ int sar_num, sar_den;
int nnal;
int ret;
int i;
+ if (avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL &&
+ !av_pix_fmt_desc_get(avctx->pix_fmt)->log2_chroma_w &&
+ !av_pix_fmt_desc_get(avctx->pix_fmt)->log2_chroma_h) {
+ av_log(avctx, AV_LOG_ERROR,
+ "4:4:4 support is not fully defined for HEVC yet. "
+ "Set -strict experimental to encode anyway.\n");
+ return AVERROR(ENOSYS);
+ }
+
avctx->coded_frame = av_frame_alloc();
if (!avctx->coded_frame) {
av_log(avctx, AV_LOG_ERROR, "Could not allocate frame.\n");
ctx->params->sourceWidth = avctx->width;
ctx->params->sourceHeight = avctx->height;
+ av_reduce(&sar_num, &sar_den,
+ avctx->sample_aspect_ratio.num,
+ avctx->sample_aspect_ratio.den, 4096);
+ ctx->params->bEnableVuiParametersPresentFlag = 1;
+ ctx->params->bEnableAspectRatioIdc = 1;
+ ctx->params->aspectRatioIdc = 255;
+ ctx->params->sarWidth = sar_num;
+ ctx->params->sarHeight = sar_den;
+
if (x265_max_bit_depth == 8)
ctx->params->internalBitDepth = 8;
else if (x265_max_bit_depth == 12)
ctx->params->internalBitDepth = 10;
+ switch (avctx->pix_fmt) {
+ case AV_PIX_FMT_YUV420P:
+ case AV_PIX_FMT_YUV420P10:
+ ctx->params->internalCsp = X265_CSP_I420;
+ break;
+ case AV_PIX_FMT_YUV444P:
+ case AV_PIX_FMT_YUV444P10:
+ ctx->params->internalCsp = X265_CSP_I444;
+ break;
+ }
+
if (avctx->bit_rate > 0) {
ctx->params->rc.bitrate = avctx->bit_rate / 1000;
ctx->params->rc.rateControlMode = X265_RC_ABR;
ret = x265_encoder_encode(ctx->encoder, &nal, &nnal,
pic ? &x265pic : NULL, &x265pic_out);
if (ret < 0)
- return AVERROR_UNKNOWN;
+ return AVERROR_EXTERNAL;
if (!nnal)
return 0;
static const enum AVPixelFormat x265_csp_eight[] = {
AV_PIX_FMT_YUV420P,
+ AV_PIX_FMT_YUV444P,
AV_PIX_FMT_NONE
};
static const enum AVPixelFormat x265_csp_twelve[] = {
AV_PIX_FMT_YUV420P,
+ AV_PIX_FMT_YUV444P,
AV_PIX_FMT_YUV420P10,
+ AV_PIX_FMT_YUV444P10,
AV_PIX_FMT_NONE
};