>From c882bbf42b0f13f98fb706139b7d3fbc53665319 Mon Sep 17 00:00:00 2001
From: Gopu Govindaswamy <g...@multicorewareinc.com>
Date: Tue, 5 May 2015 12:24:44 +0530
Subject: [PATCH] avcodec/libx265: use x265 Multi-library Interface to query
 the API

If Application might want to make a runtime selection between
a number of libx265 libraries (perhaps 8bpp and 16bpp), then we want
to use the multi-library interface,

The Application must link to one build of libx265 (statically or
dynamically) and this linked version of libx265 will support one
bit-depth (8 or 10 bits).

If the application must now request the API for the bitDepth you would
prefer the encoder to use (8 or 10). If the requested bitdepth is zero,
or if it matches the bitdepth of the system default libx265 (the
currently linked library), then this library will be used for encode.
If you request a different bit-depth, the linked libx265 will attempt
to dynamically bind a shared library with a name appropriate for the
requested bit-depth

This changes enables the ffmpeg  to query an API for
the bitdepth of the input pixels, to make a runtime selection between
a number of libx265 libraries (perhaps 8bpp and 16bpp)
---
 libavcodec/libx265.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/libavcodec/libx265.c b/libavcodec/libx265.c
index 8924657..a6923b1 100644
--- a/libavcodec/libx265.c
+++ b/libavcodec/libx265.c
@@ -39,6 +39,7 @@ typedef struct libx265Context {

     x265_encoder *encoder;
     x265_param   *params;
+    const x265_api     *api;

     float crf;
     char *preset;
@@ -67,10 +68,10 @@ static av_cold int libx265_encode_close(AVCodecContext
*avctx)

     av_frame_free(&avctx->coded_frame);

-    x265_param_free(ctx->params);
+    ctx->api->param_free(ctx->params);

     if (ctx->encoder)
-        x265_encoder_close(ctx->encoder);
+        ctx->api->encoder_close(ctx->encoder);

     return 0;
 }
@@ -79,6 +80,16 @@ static av_cold int libx265_encode_init(AVCodecContext
*avctx)
 {
     libx265Context *ctx = avctx->priv_data;

+    ctx->api = NULL;
+    ctx->api =
x265_api_get(av_pix_fmt_desc_get(avctx->pix_fmt)->comp[0].depth_minus1 + 1);
+    if (!ctx->api)
+        ctx->api = x265_api_get(0);
+
+    if (!ctx->api) {
+        av_log(avctx, AV_LOG_ERROR, "Could not get x265 API. \n");
+        return AVERROR(ENOSYS);
+    }
+
     if (avctx->strict_std_compliance > FF_COMPLIANCE_EXPERIMENTAL &&
         !av_pix_fmt_desc_get(avctx->pix_fmt)->log2_chroma_w) {
         av_log(avctx, AV_LOG_ERROR,
@@ -93,13 +104,13 @@ static av_cold int libx265_encode_init(AVCodecContext
*avctx)
         return AVERROR(ENOMEM);
     }

-    ctx->params = x265_param_alloc();
+    ctx->params = ctx->api->param_alloc();
     if (!ctx->params) {
         av_log(avctx, AV_LOG_ERROR, "Could not allocate x265 param
structure.\n");
         return AVERROR(ENOMEM);
     }

-    if (x265_param_default_preset(ctx->params, ctx->preset, ctx->tune) <
0) {
+    if (ctx->api->param_default_preset(ctx->params, ctx->preset,
ctx->tune) < 0) {
         int i;

         av_log(avctx, AV_LOG_ERROR, "Error setting preset/tune %s/%s.\n",
ctx->preset, ctx->tune);
@@ -148,7 +159,7 @@ static av_cold int libx265_encode_init(AVCodecContext
*avctx)
                   avctx->sample_aspect_ratio.num,
                   avctx->sample_aspect_ratio.den, 65535);
         snprintf(sar, sizeof(sar), "%d:%d", sar_num, sar_den);
-        if (x265_param_parse(ctx->params, "sar", sar) ==
X265_PARAM_BAD_VALUE) {
+        if (ctx->api->param_parse(ctx->params, "sar", sar) ==
X265_PARAM_BAD_VALUE) {
             av_log(avctx, AV_LOG_ERROR, "Invalid SAR: %d:%d.\n", sar_num,
sar_den);
             return AVERROR_INVALIDDATA;
         }
@@ -173,7 +184,7 @@ static av_cold int libx265_encode_init(AVCodecContext
*avctx)
         char crf[6];

         snprintf(crf, sizeof(crf), "%2.2f", ctx->crf);
-        if (x265_param_parse(ctx->params, "crf", crf) ==
X265_PARAM_BAD_VALUE) {
+        if (ctx->api->param_parse(ctx->params, "crf", crf) ==
X265_PARAM_BAD_VALUE) {
             av_log(avctx, AV_LOG_ERROR, "Invalid crf: %2.2f.\n", ctx->crf);
             return AVERROR(EINVAL);
         }
@@ -191,7 +202,7 @@ static av_cold int libx265_encode_init(AVCodecContext
*avctx)

         if (!av_dict_parse_string(&dict, ctx->x265_opts, "=", ":", 0)) {
             while ((en = av_dict_get(dict, "", en,
AV_DICT_IGNORE_SUFFIX))) {
-                int parse_ret = x265_param_parse(ctx->params, en->key,
en->value);
+                int parse_ret = ctx->api->param_parse(ctx->params,
en->key, en->value);

                 switch (parse_ret) {
                 case X265_PARAM_BAD_NAME:
@@ -210,7 +221,7 @@ static av_cold int libx265_encode_init(AVCodecContext
*avctx)
         }
     }

-    ctx->encoder = x265_encoder_open(ctx->params);
+    ctx->encoder = ctx->api->encoder_open(ctx->params);
     if (!ctx->encoder) {
         av_log(avctx, AV_LOG_ERROR, "Cannot open libx265 encoder.\n");
         libx265_encode_close(avctx);
@@ -221,7 +232,7 @@ static av_cold int libx265_encode_init(AVCodecContext
*avctx)
         x265_nal *nal;
         int nnal;

-        avctx->extradata_size = x265_encoder_headers(ctx->encoder, &nal,
&nnal);
+        avctx->extradata_size = ctx->api->encoder_headers(ctx->encoder,
&nal, &nnal);
         if (avctx->extradata_size <= 0) {
             av_log(avctx, AV_LOG_ERROR, "Cannot encode headers.\n");
             libx265_encode_close(avctx);
@@ -255,7 +266,7 @@ static int libx265_encode_frame(AVCodecContext *avctx,
AVPacket *pkt,
     int ret;
     int i;

-    x265_picture_init(ctx->params, &x265pic);
+    ctx->api->picture_init(ctx->params, &x265pic);

     if (pic) {
         for (i = 0; i < 3; i++) {
@@ -272,7 +283,7 @@ static int libx265_encode_frame(AVCodecContext *avctx,
AVPacket *pkt,
                             X265_TYPE_AUTO;
     }

-    ret = x265_encoder_encode(ctx->encoder, &nal, &nnal,
+    ret = ctx->api->encoder_encode(ctx->encoder, &nal, &nnal,
                               pic ? &x265pic : NULL, &x265pic_out);
     if (ret < 0)
         return AVERROR_EXTERNAL;
-- 
1.9.5.msysgit.1
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to