| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. | 2 * Copyright (c) 2010 The WebM project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 | 11 |
| 12 #include "./vpx_config.h" | 12 #include "./vpx_config.h" |
| 13 #include "vp8_rtcd.h" | 13 #include "vp8_rtcd.h" |
| 14 #include "vpx/vpx_codec.h" | 14 #include "vpx/vpx_codec.h" |
| 15 #include "vpx/internal/vpx_codec_internal.h" | 15 #include "vpx/internal/vpx_codec_internal.h" |
| 16 #include "vpx_version.h" | 16 #include "vpx_version.h" |
| 17 #include "vpx_mem/vpx_mem.h" |
| 17 #include "vp8/encoder/onyx_int.h" | 18 #include "vp8/encoder/onyx_int.h" |
| 18 #include "vpx/vp8cx.h" | 19 #include "vpx/vp8cx.h" |
| 19 #include "vp8/encoder/firstpass.h" | 20 #include "vp8/encoder/firstpass.h" |
| 20 #include "vp8/common/onyx.h" | 21 #include "vp8/common/onyx.h" |
| 21 #include <stdlib.h> | 22 #include <stdlib.h> |
| 22 #include <string.h> | 23 #include <string.h> |
| 23 | 24 |
| 24 struct vp8_extracfg | 25 struct vp8_extracfg |
| 25 { | 26 { |
| 26 struct vpx_codec_pkt_list *pkt_list; | 27 struct vpx_codec_pkt_list *pkt_list; |
| 27 int cpu_used; /** available cpu p
ercentage in 1/16*/ | 28 int cpu_used; /** available cpu p
ercentage in 1/16*/ |
| 28 unsigned int enable_auto_alt_ref; /** if encoder de
cides to uses alternate reference frame */ | 29 unsigned int enable_auto_alt_ref; /** if encoder de
cides to uses alternate reference frame */ |
| 29 unsigned int noise_sensitivity; | 30 unsigned int noise_sensitivity; |
| 30 unsigned int Sharpness; | 31 unsigned int Sharpness; |
| 31 unsigned int static_thresh; | 32 unsigned int static_thresh; |
| 32 unsigned int token_partitions; | 33 unsigned int token_partitions; |
| 33 unsigned int arnr_max_frames; /* alt_ref Noise Reduction M
ax Frame Count */ | 34 unsigned int arnr_max_frames; /* alt_ref Noise Reduction M
ax Frame Count */ |
| 34 unsigned int arnr_strength; /* alt_ref Noise Reduction Str
ength */ | 35 unsigned int arnr_strength; /* alt_ref Noise Reduction Str
ength */ |
| 35 unsigned int arnr_type; /* alt_ref filter type */ | 36 unsigned int arnr_type; /* alt_ref filter type */ |
| 36 vp8e_tuning tuning; | 37 vp8e_tuning tuning; |
| 37 unsigned int cq_level; /* constrained quality level *
/ | 38 unsigned int cq_level; /* constrained quality level *
/ |
| 38 unsigned int rc_max_intra_bitrate_pct; | 39 unsigned int rc_max_intra_bitrate_pct; |
| 39 | 40 |
| 40 }; | 41 }; |
| 41 | 42 |
| 42 struct extraconfig_map | 43 static struct vp8_extracfg default_extracfg = { |
| 43 { | 44 NULL, |
| 44 int usage; | |
| 45 struct vp8_extracfg cfg; | |
| 46 }; | |
| 47 | |
| 48 static const struct extraconfig_map extracfg_map[] = | |
| 49 { | |
| 50 { | |
| 51 0, | |
| 52 { | |
| 53 NULL, | |
| 54 #if !(CONFIG_REALTIME_ONLY) | 45 #if !(CONFIG_REALTIME_ONLY) |
| 55 0, /* cpu_used */ | 46 0, /* cpu_used */ |
| 56 #else | 47 #else |
| 57 4, /* cpu_used */ | 48 4, /* cpu_used */ |
| 58 #endif | 49 #endif |
| 59 0, /* enable_auto_alt_ref */ | 50 0, /* enable_auto_alt_ref */ |
| 60 0, /* noise_sensitivity */ | 51 0, /* noise_sensitivity */ |
| 61 0, /* Sharpness */ | 52 0, /* Sharpness */ |
| 62 0, /* static_thresh */ | 53 0, /* static_thresh */ |
| 63 #if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) | 54 #if (CONFIG_REALTIME_ONLY & CONFIG_ONTHEFLY_BITPACKING) |
| 64 VP8_EIGHT_TOKENPARTITION, | 55 VP8_EIGHT_TOKENPARTITION, |
| 65 #else | 56 #else |
| 66 VP8_ONE_TOKENPARTITION, /* token_partitions */ | 57 VP8_ONE_TOKENPARTITION, /* token_partitions */ |
| 67 #endif | 58 #endif |
| 68 0, /* arnr_max_frames */ | 59 0, /* arnr_max_frames */ |
| 69 3, /* arnr_strength */ | 60 3, /* arnr_strength */ |
| 70 3, /* arnr_type*/ | 61 3, /* arnr_type*/ |
| 71 0, /* tuning*/ | 62 0, /* tuning*/ |
| 72 10, /* cq_level */ | 63 10, /* cq_level */ |
| 73 0, /* rc_max_intra_bitrate_pct */ | 64 0, /* rc_max_intra_bitrate_pct */ |
| 74 } | |
| 75 } | |
| 76 }; | 65 }; |
| 77 | 66 |
| 78 struct vpx_codec_alg_priv | 67 struct vpx_codec_alg_priv |
| 79 { | 68 { |
| 80 vpx_codec_priv_t base; | 69 vpx_codec_priv_t base; |
| 81 vpx_codec_enc_cfg_t cfg; | 70 vpx_codec_enc_cfg_t cfg; |
| 82 struct vp8_extracfg vp8_cfg; | 71 struct vp8_extracfg vp8_cfg; |
| 83 VP8_CONFIG oxcf; | 72 VP8_CONFIG oxcf; |
| 84 struct VP8_COMP *cpi; | 73 struct VP8_COMP *cpi; |
| 85 unsigned char *cx_data; | 74 unsigned char *cx_data; |
| (...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 624 res = VPX_CODEC_OK; | 613 res = VPX_CODEC_OK; |
| 625 } | 614 } |
| 626 #endif | 615 #endif |
| 627 return res; | 616 return res; |
| 628 } | 617 } |
| 629 | 618 |
| 630 static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx, | 619 static vpx_codec_err_t vp8e_init(vpx_codec_ctx_t *ctx, |
| 631 vpx_codec_priv_enc_mr_cfg_t *mr_cfg) | 620 vpx_codec_priv_enc_mr_cfg_t *mr_cfg) |
| 632 { | 621 { |
| 633 vpx_codec_err_t res = VPX_CODEC_OK; | 622 vpx_codec_err_t res = VPX_CODEC_OK; |
| 634 struct vpx_codec_alg_priv *priv; | |
| 635 vpx_codec_enc_cfg_t *cfg; | |
| 636 unsigned int i; | |
| 637 | 623 |
| 638 struct VP8_COMP *optr; | |
| 639 | 624 |
| 640 vp8_rtcd(); | 625 vp8_rtcd(); |
| 641 | 626 |
| 642 if (!ctx->priv) | 627 if (!ctx->priv) |
| 643 { | 628 { |
| 644 priv = calloc(1, sizeof(struct vpx_codec_alg_priv)); | 629 struct vpx_codec_alg_priv *priv = |
| 630 (struct vpx_codec_alg_priv *)vpx_calloc(1, sizeof(*priv)); |
| 645 | 631 |
| 646 if (!priv) | 632 if (!priv) |
| 647 { | 633 { |
| 648 return VPX_CODEC_MEM_ERROR; | 634 return VPX_CODEC_MEM_ERROR; |
| 649 } | 635 } |
| 650 | 636 |
| 651 ctx->priv = &priv->base; | 637 ctx->priv = (vpx_codec_priv_t *)priv; |
| 652 ctx->priv->sz = sizeof(*ctx->priv); | |
| 653 ctx->priv->alg_priv = priv; | |
| 654 ctx->priv->init_flags = ctx->init_flags; | 638 ctx->priv->init_flags = ctx->init_flags; |
| 655 | 639 |
| 656 if (ctx->config.enc) | 640 if (ctx->config.enc) |
| 657 { | 641 { |
| 658 /* Update the reference to the config structure to an | 642 /* Update the reference to the config structure to an |
| 659 * internal copy. | 643 * internal copy. |
| 660 */ | 644 */ |
| 661 ctx->priv->alg_priv->cfg = *ctx->config.enc; | 645 priv->cfg = *ctx->config.enc; |
| 662 ctx->config.enc = &ctx->priv->alg_priv->cfg; | 646 ctx->config.enc = &priv->cfg; |
| 663 } | 647 } |
| 664 | 648 |
| 665 cfg = &ctx->priv->alg_priv->cfg; | 649 priv->vp8_cfg = default_extracfg; |
| 666 | |
| 667 /* Select the extra vp8 configuration table based on the current | |
| 668 * usage value. If the current usage value isn't found, use the | |
| 669 * values for usage case 0. | |
| 670 */ | |
| 671 for (i = 0; | |
| 672 extracfg_map[i].usage && extracfg_map[i].usage != cfg->g_usage; | |
| 673 i++); | |
| 674 | |
| 675 priv->vp8_cfg = extracfg_map[i].cfg; | |
| 676 priv->vp8_cfg.pkt_list = &priv->pkt_list.head; | 650 priv->vp8_cfg.pkt_list = &priv->pkt_list.head; |
| 677 | 651 |
| 678 priv->cx_data_sz = priv->cfg.g_w * priv->cfg.g_h * 3 / 2 * 2; | 652 priv->cx_data_sz = priv->cfg.g_w * priv->cfg.g_h * 3 / 2 * 2; |
| 679 | 653 |
| 680 if (priv->cx_data_sz < 32768) priv->cx_data_sz = 32768; | 654 if (priv->cx_data_sz < 32768) priv->cx_data_sz = 32768; |
| 681 | 655 |
| 682 priv->cx_data = malloc(priv->cx_data_sz); | 656 priv->cx_data = malloc(priv->cx_data_sz); |
| 683 | 657 |
| 684 if (!priv->cx_data) | 658 if (!priv->cx_data) |
| 685 { | 659 { |
| 686 return VPX_CODEC_MEM_ERROR; | 660 return VPX_CODEC_MEM_ERROR; |
| 687 } | 661 } |
| 688 | 662 |
| 689 if(mr_cfg) | 663 if(mr_cfg) |
| 690 ctx->priv->enc.total_encoders = mr_cfg->mr_total_resolutions; | 664 ctx->priv->enc.total_encoders = mr_cfg->mr_total_resolutions; |
| 691 else | 665 else |
| 692 ctx->priv->enc.total_encoders = 1; | 666 ctx->priv->enc.total_encoders = 1; |
| 693 | 667 |
| 694 res = validate_config(priv, &priv->cfg, &priv->vp8_cfg, 0); | 668 res = validate_config(priv, &priv->cfg, &priv->vp8_cfg, 0); |
| 695 | 669 |
| 696 if (!res) | 670 if (!res) |
| 697 { | 671 { |
| 698 set_vp8e_config(&ctx->priv->alg_priv->oxcf, | 672 set_vp8e_config(&priv->oxcf, priv->cfg, priv->vp8_cfg, mr_cfg); |
| 699 ctx->priv->alg_priv->cfg, | 673 priv->cpi = vp8_create_compressor(&priv->oxcf); |
| 700 ctx->priv->alg_priv->vp8_cfg, | 674 if (!priv->cpi) |
| 701 mr_cfg); | |
| 702 | |
| 703 optr = vp8_create_compressor(&ctx->priv->alg_priv->oxcf); | |
| 704 | |
| 705 if (!optr) | |
| 706 res = VPX_CODEC_MEM_ERROR; | 675 res = VPX_CODEC_MEM_ERROR; |
| 707 else | |
| 708 ctx->priv->alg_priv->cpi = optr; | |
| 709 } | 676 } |
| 710 } | 677 } |
| 711 | 678 |
| 712 return res; | 679 return res; |
| 713 } | 680 } |
| 714 | 681 |
| 715 static vpx_codec_err_t vp8e_destroy(vpx_codec_alg_priv_t *ctx) | 682 static vpx_codec_err_t vp8e_destroy(vpx_codec_alg_priv_t *ctx) |
| 716 { | 683 { |
| 717 #if CONFIG_MULTI_RES_ENCODING | 684 #if CONFIG_MULTI_RES_ENCODING |
| 718 /* Free multi-encoder shared memory */ | 685 /* Free multi-encoder shared memory */ |
| 719 if (ctx->oxcf.mr_total_resolutions > 0 && (ctx->oxcf.mr_encoder_id == ctx->o
xcf.mr_total_resolutions-1)) | 686 if (ctx->oxcf.mr_total_resolutions > 0 && (ctx->oxcf.mr_encoder_id == ctx->o
xcf.mr_total_resolutions-1)) |
| 720 { | 687 { |
| 721 LOWER_RES_FRAME_INFO *shared_mem_loc = (LOWER_RES_FRAME_INFO *)ctx->oxcf
.mr_low_res_mode_info; | 688 LOWER_RES_FRAME_INFO *shared_mem_loc = (LOWER_RES_FRAME_INFO *)ctx->oxcf
.mr_low_res_mode_info; |
| 722 free(shared_mem_loc->mb_info); | 689 free(shared_mem_loc->mb_info); |
| 723 free(ctx->oxcf.mr_low_res_mode_info); | 690 free(ctx->oxcf.mr_low_res_mode_info); |
| 724 } | 691 } |
| 725 #endif | 692 #endif |
| 726 | 693 |
| 727 free(ctx->cx_data); | 694 free(ctx->cx_data); |
| 728 vp8_remove_compressor(&ctx->cpi); | 695 vp8_remove_compressor(&ctx->cpi); |
| 729 free(ctx); | 696 vpx_free(ctx); |
| 730 return VPX_CODEC_OK; | 697 return VPX_CODEC_OK; |
| 731 } | 698 } |
| 732 | 699 |
| 733 static vpx_codec_err_t image2yuvconfig(const vpx_image_t *img, | 700 static vpx_codec_err_t image2yuvconfig(const vpx_image_t *img, |
| 734 YV12_BUFFER_CONFIG *yv12) | 701 YV12_BUFFER_CONFIG *yv12) |
| 735 { | 702 { |
| 736 const int y_w = img->d_w; | 703 const int y_w = img->d_w; |
| 737 const int y_h = img->d_h; | 704 const int y_h = img->d_h; |
| 738 const int uv_w = (img->d_w + 1) / 2; | 705 const int uv_w = (img->d_w + 1) / 2; |
| 739 const int uv_h = (img->d_h + 1) / 2; | 706 const int uv_h = (img->d_h + 1) / 2; |
| (...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1271 { | 1238 { |
| 1272 { | 1239 { |
| 1273 0, | 1240 0, |
| 1274 { | 1241 { |
| 1275 0, /* g_usage */ | 1242 0, /* g_usage */ |
| 1276 0, /* g_threads */ | 1243 0, /* g_threads */ |
| 1277 0, /* g_profile */ | 1244 0, /* g_profile */ |
| 1278 | 1245 |
| 1279 320, /* g_width */ | 1246 320, /* g_width */ |
| 1280 240, /* g_height */ | 1247 240, /* g_height */ |
| 1248 VPX_BITS_8, /* g_bit_depth */ |
| 1249 8, /* g_input_bit_depth */ |
| 1250 |
| 1281 {1, 30}, /* g_timebase */ | 1251 {1, 30}, /* g_timebase */ |
| 1282 | 1252 |
| 1283 0, /* g_error_resilient */ | 1253 0, /* g_error_resilient */ |
| 1284 | 1254 |
| 1285 VPX_RC_ONE_PASS, /* g_pass */ | 1255 VPX_RC_ONE_PASS, /* g_pass */ |
| 1286 | 1256 |
| 1287 0, /* g_lag_in_frames */ | 1257 0, /* g_lag_in_frames */ |
| 1288 | 1258 |
| 1289 0, /* rc_dropframe_thresh */ | 1259 0, /* rc_dropframe_thresh */ |
| 1290 0, /* rc_resize_allowed */ | 1260 0, /* rc_resize_allowed */ |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1339 { | 1309 { |
| 1340 "WebM Project VP8 Encoder" VERSION_STRING, | 1310 "WebM Project VP8 Encoder" VERSION_STRING, |
| 1341 VPX_CODEC_INTERNAL_ABI_VERSION, | 1311 VPX_CODEC_INTERNAL_ABI_VERSION, |
| 1342 VPX_CODEC_CAP_ENCODER | VPX_CODEC_CAP_PSNR | | 1312 VPX_CODEC_CAP_ENCODER | VPX_CODEC_CAP_PSNR | |
| 1343 VPX_CODEC_CAP_OUTPUT_PARTITION, | 1313 VPX_CODEC_CAP_OUTPUT_PARTITION, |
| 1344 /* vpx_codec_caps_t caps; */ | 1314 /* vpx_codec_caps_t caps; */ |
| 1345 vp8e_init, /* vpx_codec_init_fn_t init; */ | 1315 vp8e_init, /* vpx_codec_init_fn_t init; */ |
| 1346 vp8e_destroy, /* vpx_codec_destroy_fn_t destroy; */ | 1316 vp8e_destroy, /* vpx_codec_destroy_fn_t destroy; */ |
| 1347 vp8e_ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */ | 1317 vp8e_ctf_maps, /* vpx_codec_ctrl_fn_map_t *ctrl_maps; */ |
| 1348 { | 1318 { |
| 1349 NOT_IMPLEMENTED, /* vpx_codec_peek_si_fn_t peek_si; */ | 1319 NULL, /* vpx_codec_peek_si_fn_t peek_si; */ |
| 1350 NOT_IMPLEMENTED, /* vpx_codec_get_si_fn_t get_si; */ | 1320 NULL, /* vpx_codec_get_si_fn_t get_si; */ |
| 1351 NOT_IMPLEMENTED, /* vpx_codec_decode_fn_t decode; */ | 1321 NULL, /* vpx_codec_decode_fn_t decode; */ |
| 1352 NOT_IMPLEMENTED, /* vpx_codec_frame_get_fn_t frame_get; */ | 1322 NULL, /* vpx_codec_frame_get_fn_t frame_get; */ |
| 1353 }, | 1323 }, |
| 1354 { | 1324 { |
| 1355 1, /* 1 cfg map */ | 1325 1, /* 1 cfg map */ |
| 1356 vp8e_usage_cfg_map, /* vpx_codec_enc_cfg_map_t peek_si; */ | 1326 vp8e_usage_cfg_map, /* vpx_codec_enc_cfg_map_t peek_si; */ |
| 1357 vp8e_encode, /* vpx_codec_encode_fn_t encode; */ | 1327 vp8e_encode, /* vpx_codec_encode_fn_t encode; */ |
| 1358 vp8e_get_cxdata, /* vpx_codec_get_cx_data_fn_t frame_get; */ | 1328 vp8e_get_cxdata, /* vpx_codec_get_cx_data_fn_t frame_get; */ |
| 1359 vp8e_set_config, | 1329 vp8e_set_config, |
| 1360 NOT_IMPLEMENTED, | 1330 NULL, |
| 1361 vp8e_get_preview, | 1331 vp8e_get_preview, |
| 1362 vp8e_mr_alloc_mem, | 1332 vp8e_mr_alloc_mem, |
| 1363 } /* encoder functions */ | 1333 } /* encoder functions */ |
| 1364 }; | 1334 }; |
| OLD | NEW |