diff options
author | John Stebbins <[email protected]> | 2015-10-12 13:16:26 -0700 |
---|---|---|
committer | John Stebbins <[email protected]> | 2015-11-12 09:54:38 -0800 |
commit | 02585c6faf9163a1b1bab9ce537afb7044dc35f6 (patch) | |
tree | 46c406de90acc6862a583c1f5fa4bec4e2ef629f | |
parent | ffd84aff1940fcd2e71a345a063bf6b1f117730a (diff) |
x265: use multi-lib API
This does not yet support other bit depths. But it's the first step to
doing so.
-rw-r--r-- | libhb/encx265.c | 75 |
1 files changed, 45 insertions, 30 deletions
diff --git a/libhb/encx265.c b/libhb/encx265.c index eb449173b..2da54ed71 100644 --- a/libhb/encx265.c +++ b/libhb/encx265.c @@ -39,15 +39,15 @@ static const char * const hb_x265_encopt_synonyms[][2] = struct hb_work_private_s { - hb_job_t *job; - x265_encoder *x265; - x265_param *param; + hb_job_t *job; + x265_encoder *x265; + x265_param *param; - int64_t last_stop; - uint32_t frames_in; + int64_t last_stop; + uint32_t frames_in; - hb_list_t *delayed_chapters; - int64_t next_chapter_pts; + hb_list_t *delayed_chapters; + int64_t next_chapter_pts; struct { @@ -55,7 +55,11 @@ struct hb_work_private_s } frame_info[FRAME_INFO_SIZE]; - char csvfn[1024]; + char csvfn[1024]; + + // Multiple bit-depth + int depth; + const x265_api *api; }; // used in delayed_chapters list @@ -65,9 +69,10 @@ struct chapter_s int64_t start; }; -static int param_parse(x265_param *param, const char *key, const char *value) +static int param_parse(hb_work_private_t *pv, x265_param *param, + const char *key, const char *value) { - int ret = x265_param_parse(param, key, value); + int ret = pv->api->param_parse(param, key, value); // let x265 sanity check the options for us switch (ret) { @@ -100,10 +105,19 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job) x265_nal *nal; uint32_t nnal; - x265_param *param = pv->param = x265_param_alloc(); + // TODO: add support for other bit depths + pv->depth = 8; + pv->api = x265_api_get(pv->depth); + if (pv->api == NULL) + { + hb_error("encx265: x265_api_get failed, bit depth %d.", pv->depth); + goto fail; + } + + x265_param *param = pv->param = pv->api->param_alloc(); - if (x265_param_default_preset(param, - job->encoder_preset, job->encoder_tune) < 0) + if (pv->api->param_default_preset(param, job->encoder_preset, + job->encoder_tune) < 0) { hb_error("encx265: x265_param_default_preset failed. Preset (%s) Tune (%s)", job->encoder_preset, job->encoder_tune); goto fail; @@ -178,9 +192,9 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job) snprintf(colormatrix, sizeof(colormatrix), "%d", job->title->color_matrix); break; } - if (param_parse(param, "colorprim", colorprim) || - param_parse(param, "transfer", transfer) || - param_parse(param, "colormatrix", colormatrix)) + if (param_parse(pv, param, "colorprim", colorprim) || + param_parse(pv, param, "transfer", transfer) || + param_parse(pv, param, "colormatrix", colormatrix)) { goto fail; } @@ -200,7 +214,7 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job) // here's where the strings are passed to libx265 for parsing // unknown options or bad values are non-fatal, see encx264.c - param_parse(param, key, str); + param_parse(pv, param, key, str); free(str); } hb_dict_free(&x265_opts); @@ -228,7 +242,7 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job) */ char sar[22]; snprintf(sar, sizeof(sar), "%d:%d", job->par.num, job->par.den); - if (param_parse(param, "sar", sar)) + if (param_parse(pv, param, "sar", sar)) { goto fail; } @@ -249,13 +263,13 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job) char pass[2]; snprintf(pass, sizeof(pass), "%d", job->pass_id); hb_get_tempory_filename(job->h, stats_file, "x265.log"); - if (param_parse(param, "stats", stats_file) || - param_parse(param, "pass", pass)) + if (param_parse(pv, param, "stats", stats_file) || + param_parse(pv, param, "pass", pass)) { goto fail; } if (job->pass_id == HB_PASS_ENCODE_1ST && job->fastfirstpass == 0 && - param_parse(param, "slow-firstpass", "1")) + param_parse(pv, param, "slow-firstpass", "1")) { goto fail; } @@ -280,7 +294,7 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job) /* Apply profile and level settings last. */ if (job->encoder_profile != NULL && strcasecmp(job->encoder_profile, hb_h265_profile_names[0]) != 0 && - x265_param_apply_profile(param, job->encoder_profile) < 0) + pv->api->param_apply_profile(param, job->encoder_profile) < 0) { goto fail; } @@ -290,9 +304,9 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job) param->bBPyramid > 0); /* Reset global variables before opening a new encoder */ - x265_cleanup(); + pv->api->cleanup(); - pv->x265 = x265_encoder_open(param); + pv->x265 = pv->api->encoder_open(param); if (pv->x265 == NULL) { hb_error("encx265: x265_encoder_open failed."); @@ -305,7 +319,7 @@ int encx265Init(hb_work_object_t *w, hb_job_t *job) * Write the header as is, and let the muxer reformat * the extradata and output bitstream properly for us. */ - ret = x265_encoder_headers(pv->x265, &nal, &nnal); + ret = pv->api->encoder_headers(pv->x265, &nal, &nnal); if (ret < 0) { hb_error("encx265: x265_encoder_headers failed (%d)", ret); @@ -342,8 +356,8 @@ void encx265Close(hb_work_object_t *w) hb_list_close(&pv->delayed_chapters); } - x265_param_free(pv->param); - x265_encoder_close(pv->x265); + pv->api->param_free(pv->param); + pv->api->encoder_close(pv->x265); free(pv); w->private_data = NULL; } @@ -466,7 +480,7 @@ static hb_buffer_t* x265_encode(hb_work_object_t *w, hb_buffer_t *in) x265_nal *nal; uint32_t nnal; - x265_picture_init(pv->param, &pic_in); + pv->api->picture_init(pv->param, &pic_in); pic_in.stride[0] = in->plane[0].stride; pic_in.stride[1] = in->plane[1].stride; @@ -522,7 +536,7 @@ static hb_buffer_t* x265_encode(hb_work_object_t *w, hb_buffer_t *in) pv->last_stop = in->s.stop; save_frame_info(pv, in); - if (x265_encoder_encode(pv->x265, &nal, &nnal, &pic_in, &pic_out) > 0) + if (pv->api->encoder_encode(pv->x265, &nal, &nnal, &pic_in, &pic_out) > 0) { return nal_encode(w, &pic_out, nal, nnal); } @@ -544,7 +558,8 @@ int encx265Work(hb_work_object_t *w, hb_buffer_t **buf_in, hb_buffer_t **buf_out hb_buffer_list_clear(&list); // flush delayed frames - while (x265_encoder_encode(pv->x265, &nal, &nnal, NULL, &pic_out) > 0) + while ( + pv->api->encoder_encode(pv->x265, &nal, &nnal, NULL, &pic_out) > 0) { hb_buffer_t *buf = nal_encode(w, &pic_out, nal, nnal); hb_buffer_list_append(&list, buf); |