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 |
(...skipping 22 matching lines...) Expand all Loading... |
33 unsigned int arnr_strength; | 33 unsigned int arnr_strength; |
34 unsigned int arnr_type; | 34 unsigned int arnr_type; |
35 vp8e_tuning tuning; | 35 vp8e_tuning tuning; |
36 unsigned int cq_level; // constrained quality level | 36 unsigned int cq_level; // constrained quality level |
37 unsigned int rc_max_intra_bitrate_pct; | 37 unsigned int rc_max_intra_bitrate_pct; |
38 unsigned int lossless; | 38 unsigned int lossless; |
39 unsigned int frame_parallel_decoding_mode; | 39 unsigned int frame_parallel_decoding_mode; |
40 AQ_MODE aq_mode; | 40 AQ_MODE aq_mode; |
41 unsigned int frame_periodic_boost; | 41 unsigned int frame_periodic_boost; |
42 BIT_DEPTH bit_depth; | 42 BIT_DEPTH bit_depth; |
| 43 vp9e_tune_content content; |
43 }; | 44 }; |
44 | 45 |
45 struct extraconfig_map { | 46 struct extraconfig_map { |
46 unsigned int usage; | 47 unsigned int usage; |
47 struct vp9_extracfg cfg; | 48 struct vp9_extracfg cfg; |
48 }; | 49 }; |
49 | 50 |
50 static const struct extraconfig_map extracfg_map[] = { | 51 static const struct extraconfig_map extracfg_map[] = { |
51 { | 52 { |
52 0, | 53 0, |
(...skipping 10 matching lines...) Expand all Loading... |
63 5, // arnr_strength | 64 5, // arnr_strength |
64 3, // arnr_type | 65 3, // arnr_type |
65 VP8_TUNE_PSNR, // tuning | 66 VP8_TUNE_PSNR, // tuning |
66 10, // cq_level | 67 10, // cq_level |
67 0, // rc_max_intra_bitrate_pct | 68 0, // rc_max_intra_bitrate_pct |
68 0, // lossless | 69 0, // lossless |
69 0, // frame_parallel_decoding_mode | 70 0, // frame_parallel_decoding_mode |
70 NO_AQ, // aq_mode | 71 NO_AQ, // aq_mode |
71 0, // frame_periodic_delta_q | 72 0, // frame_periodic_delta_q |
72 BITS_8, // Bit depth | 73 BITS_8, // Bit depth |
| 74 VP9E_CONTENT_DEFAULT // content |
73 } | 75 } |
74 } | 76 } |
75 }; | 77 }; |
76 | 78 |
77 struct vpx_codec_alg_priv { | 79 struct vpx_codec_alg_priv { |
78 vpx_codec_priv_t base; | 80 vpx_codec_priv_t base; |
79 vpx_codec_enc_cfg_t cfg; | 81 vpx_codec_enc_cfg_t cfg; |
80 struct vp9_extracfg extra_cfg; | 82 struct vp9_extracfg extra_cfg; |
81 VP9EncoderConfig oxcf; | 83 VP9EncoderConfig oxcf; |
82 VP9_COMP *cpi; | 84 VP9_COMP *cpi; |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 RANGE_CHECK_BOOL(extra_cfg, enable_auto_alt_ref); | 214 RANGE_CHECK_BOOL(extra_cfg, enable_auto_alt_ref); |
213 RANGE_CHECK(extra_cfg, cpu_used, -16, 16); | 215 RANGE_CHECK(extra_cfg, cpu_used, -16, 16); |
214 RANGE_CHECK_HI(extra_cfg, noise_sensitivity, 6); | 216 RANGE_CHECK_HI(extra_cfg, noise_sensitivity, 6); |
215 RANGE_CHECK(extra_cfg, tile_columns, 0, 6); | 217 RANGE_CHECK(extra_cfg, tile_columns, 0, 6); |
216 RANGE_CHECK(extra_cfg, tile_rows, 0, 2); | 218 RANGE_CHECK(extra_cfg, tile_rows, 0, 2); |
217 RANGE_CHECK_HI(extra_cfg, sharpness, 7); | 219 RANGE_CHECK_HI(extra_cfg, sharpness, 7); |
218 RANGE_CHECK(extra_cfg, arnr_max_frames, 0, 15); | 220 RANGE_CHECK(extra_cfg, arnr_max_frames, 0, 15); |
219 RANGE_CHECK_HI(extra_cfg, arnr_strength, 6); | 221 RANGE_CHECK_HI(extra_cfg, arnr_strength, 6); |
220 RANGE_CHECK(extra_cfg, arnr_type, 1, 3); | 222 RANGE_CHECK(extra_cfg, arnr_type, 1, 3); |
221 RANGE_CHECK(extra_cfg, cq_level, 0, 63); | 223 RANGE_CHECK(extra_cfg, cq_level, 0, 63); |
| 224 RANGE_CHECK(extra_cfg, content, |
| 225 VP9E_CONTENT_DEFAULT, VP9E_CONTENT_INVALID - 1); |
222 | 226 |
223 // TODO(yaowu): remove this when ssim tuning is implemented for vp9 | 227 // TODO(yaowu): remove this when ssim tuning is implemented for vp9 |
224 if (extra_cfg->tuning == VP8_TUNE_SSIM) | 228 if (extra_cfg->tuning == VP8_TUNE_SSIM) |
225 ERROR("Option --tune=ssim is not currently supported in VP9."); | 229 ERROR("Option --tune=ssim is not currently supported in VP9."); |
226 | 230 |
227 if (cfg->g_pass == VPX_RC_LAST_PASS) { | 231 if (cfg->g_pass == VPX_RC_LAST_PASS) { |
228 const size_t packet_sz = sizeof(FIRSTPASS_STATS); | 232 const size_t packet_sz = sizeof(FIRSTPASS_STATS); |
229 const int n_packets = (int)(cfg->rc_twopass_stats_in.sz / packet_sz); | 233 const int n_packets = (int)(cfg->rc_twopass_stats_in.sz / packet_sz); |
230 const FIRSTPASS_STATS *stats; | 234 const FIRSTPASS_STATS *stats; |
231 | 235 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
290 const vpx_image_t *img) { | 294 const vpx_image_t *img) { |
291 switch (img->fmt) { | 295 switch (img->fmt) { |
292 case VPX_IMG_FMT_YV12: | 296 case VPX_IMG_FMT_YV12: |
293 case VPX_IMG_FMT_I420: | 297 case VPX_IMG_FMT_I420: |
294 case VPX_IMG_FMT_I422: | 298 case VPX_IMG_FMT_I422: |
295 case VPX_IMG_FMT_I444: | 299 case VPX_IMG_FMT_I444: |
296 break; | 300 break; |
297 default: | 301 default: |
298 ERROR("Invalid image format. Only YV12, I420, I422, I444 images are " | 302 ERROR("Invalid image format. Only YV12, I420, I422, I444 images are " |
299 "supported."); | 303 "supported."); |
| 304 break; |
300 } | 305 } |
301 | 306 |
302 if (img->d_w != ctx->cfg.g_w || img->d_h != ctx->cfg.g_h) | 307 if (img->d_w != ctx->cfg.g_w || img->d_h != ctx->cfg.g_h) |
303 ERROR("Image size must match encoder init configuration size"); | 308 ERROR("Image size must match encoder init configuration size"); |
304 | 309 |
305 return VPX_CODEC_OK; | 310 return VPX_CODEC_OK; |
306 } | 311 } |
307 | 312 |
| 313 static int get_image_bps(const vpx_image_t *img) { |
| 314 switch (img->fmt) { |
| 315 case VPX_IMG_FMT_YV12: |
| 316 case VPX_IMG_FMT_I420: return 12; |
| 317 case VPX_IMG_FMT_I422: return 16; |
| 318 case VPX_IMG_FMT_I444: return 24; |
| 319 default: assert(0 && "Invalid image format"); break; |
| 320 } |
| 321 return 0; |
| 322 } |
308 | 323 |
309 static vpx_codec_err_t set_encoder_config( | 324 static vpx_codec_err_t set_encoder_config( |
310 VP9EncoderConfig *oxcf, | 325 VP9EncoderConfig *oxcf, |
311 const vpx_codec_enc_cfg_t *cfg, | 326 const vpx_codec_enc_cfg_t *cfg, |
312 const struct vp9_extracfg *extra_cfg) { | 327 const struct vp9_extracfg *extra_cfg) { |
313 oxcf->profile = cfg->g_profile; | 328 oxcf->profile = cfg->g_profile; |
314 oxcf->width = cfg->g_w; | 329 oxcf->width = cfg->g_w; |
315 oxcf->height = cfg->g_h; | 330 oxcf->height = cfg->g_h; |
316 oxcf->bit_depth = extra_cfg->bit_depth; | 331 oxcf->bit_depth = extra_cfg->bit_depth; |
317 // guess a frame rate if out of whack, use 30 | 332 // guess a frame rate if out of whack, use 30 |
318 oxcf->framerate = (double)cfg->g_timebase.den / cfg->g_timebase.num; | 333 oxcf->init_framerate = (double)cfg->g_timebase.den / cfg->g_timebase.num; |
319 if (oxcf->framerate > 180) | 334 if (oxcf->init_framerate > 180) |
320 oxcf->framerate = 30; | 335 oxcf->init_framerate = 30; |
321 | 336 |
322 switch (cfg->g_pass) { | 337 switch (cfg->g_pass) { |
323 case VPX_RC_ONE_PASS: | 338 case VPX_RC_ONE_PASS: |
324 oxcf->mode = ONE_PASS_GOOD; | 339 oxcf->mode = ONE_PASS_GOOD; |
| 340 oxcf->pass = 0; |
325 break; | 341 break; |
326 case VPX_RC_FIRST_PASS: | 342 case VPX_RC_FIRST_PASS: |
327 oxcf->mode = TWO_PASS_FIRST; | 343 oxcf->mode = TWO_PASS_FIRST; |
| 344 oxcf->pass = 1; |
328 break; | 345 break; |
329 case VPX_RC_LAST_PASS: | 346 case VPX_RC_LAST_PASS: |
330 oxcf->mode = TWO_PASS_SECOND_BEST; | 347 oxcf->mode = TWO_PASS_SECOND_BEST; |
| 348 oxcf->pass = 2; |
331 break; | 349 break; |
332 } | 350 } |
333 | 351 |
334 oxcf->lag_in_frames = cfg->g_pass == VPX_RC_FIRST_PASS ? 0 | 352 oxcf->lag_in_frames = cfg->g_pass == VPX_RC_FIRST_PASS ? 0 |
335 : cfg->g_lag_in_frames; | 353 : cfg->g_lag_in_frames; |
336 oxcf->rc_mode = cfg->rc_end_usage; | 354 oxcf->rc_mode = cfg->rc_end_usage; |
337 | 355 |
338 // Convert target bandwidth from Kbit/s to Bit/s | 356 // Convert target bandwidth from Kbit/s to Bit/s |
339 oxcf->target_bandwidth = 1000 * cfg->rc_target_bitrate; | 357 oxcf->target_bandwidth = 1000 * cfg->rc_target_bitrate; |
340 oxcf->rc_max_intra_bitrate_pct = extra_cfg->rc_max_intra_bitrate_pct; | 358 oxcf->rc_max_intra_bitrate_pct = extra_cfg->rc_max_intra_bitrate_pct; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 | 397 |
380 #if CONFIG_FP_MB_STATS | 398 #if CONFIG_FP_MB_STATS |
381 oxcf->firstpass_mb_stats_in = cfg->rc_firstpass_mb_stats_in; | 399 oxcf->firstpass_mb_stats_in = cfg->rc_firstpass_mb_stats_in; |
382 #endif | 400 #endif |
383 | 401 |
384 oxcf->arnr_max_frames = extra_cfg->arnr_max_frames; | 402 oxcf->arnr_max_frames = extra_cfg->arnr_max_frames; |
385 oxcf->arnr_strength = extra_cfg->arnr_strength; | 403 oxcf->arnr_strength = extra_cfg->arnr_strength; |
386 oxcf->arnr_type = extra_cfg->arnr_type; | 404 oxcf->arnr_type = extra_cfg->arnr_type; |
387 | 405 |
388 oxcf->tuning = extra_cfg->tuning; | 406 oxcf->tuning = extra_cfg->tuning; |
| 407 oxcf->content = extra_cfg->content; |
389 | 408 |
390 oxcf->tile_columns = extra_cfg->tile_columns; | 409 oxcf->tile_columns = extra_cfg->tile_columns; |
391 oxcf->tile_rows = extra_cfg->tile_rows; | 410 oxcf->tile_rows = extra_cfg->tile_rows; |
392 | 411 |
393 oxcf->error_resilient_mode = cfg->g_error_resilient; | 412 oxcf->error_resilient_mode = cfg->g_error_resilient; |
394 oxcf->frame_parallel_decoding_mode = extra_cfg->frame_parallel_decoding_mode; | 413 oxcf->frame_parallel_decoding_mode = extra_cfg->frame_parallel_decoding_mode; |
395 | 414 |
396 oxcf->aq_mode = extra_cfg->aq_mode; | 415 oxcf->aq_mode = extra_cfg->aq_mode; |
397 | 416 |
398 oxcf->frame_periodic_boost = extra_cfg->frame_periodic_boost; | 417 oxcf->frame_periodic_boost = extra_cfg->frame_periodic_boost; |
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 // Select the extra vp6 configuration table based on the current | 684 // Select the extra vp6 configuration table based on the current |
666 // usage value. If the current usage value isn't found, use the | 685 // usage value. If the current usage value isn't found, use the |
667 // values for usage case 0. | 686 // values for usage case 0. |
668 for (i = 0; | 687 for (i = 0; |
669 extracfg_map[i].usage && extracfg_map[i].usage != cfg->g_usage; | 688 extracfg_map[i].usage && extracfg_map[i].usage != cfg->g_usage; |
670 ++i) {} | 689 ++i) {} |
671 | 690 |
672 priv->extra_cfg = extracfg_map[i].cfg; | 691 priv->extra_cfg = extracfg_map[i].cfg; |
673 priv->extra_cfg.pkt_list = &priv->pkt_list.head; | 692 priv->extra_cfg.pkt_list = &priv->pkt_list.head; |
674 | 693 |
675 // Maximum buffer size approximated based on having multiple ARF. | |
676 priv->cx_data_sz = priv->cfg.g_w * priv->cfg.g_h * 3 / 2 * 8; | |
677 | |
678 if (priv->cx_data_sz < 4096) | |
679 priv->cx_data_sz = 4096; | |
680 | |
681 priv->cx_data = (unsigned char *)malloc(priv->cx_data_sz); | |
682 if (priv->cx_data == NULL) | |
683 return VPX_CODEC_MEM_ERROR; | |
684 | |
685 vp9_initialize_enc(); | 694 vp9_initialize_enc(); |
686 | 695 |
687 res = validate_config(priv, &priv->cfg, &priv->extra_cfg); | 696 res = validate_config(priv, &priv->cfg, &priv->extra_cfg); |
688 | 697 |
689 if (res == VPX_CODEC_OK) { | 698 if (res == VPX_CODEC_OK) { |
690 VP9_COMP *cpi; | 699 VP9_COMP *cpi; |
691 set_encoder_config(&ctx->priv->alg_priv->oxcf, | 700 set_encoder_config(&ctx->priv->alg_priv->oxcf, |
692 &ctx->priv->alg_priv->cfg, | 701 &ctx->priv->alg_priv->cfg, |
693 &ctx->priv->alg_priv->extra_cfg); | 702 &ctx->priv->alg_priv->extra_cfg); |
694 cpi = vp9_create_compressor(&ctx->priv->alg_priv->oxcf); | 703 cpi = vp9_create_compressor(&ctx->priv->alg_priv->oxcf); |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 } | 800 } |
792 *x++ = marker; | 801 *x++ = marker; |
793 ctx->pending_cx_data_sz += index_sz; | 802 ctx->pending_cx_data_sz += index_sz; |
794 #ifdef TEST_SUPPLEMENTAL_SUPERFRAME_DATA | 803 #ifdef TEST_SUPPLEMENTAL_SUPERFRAME_DATA |
795 index_sz += index_sz_test; | 804 index_sz += index_sz_test; |
796 #endif | 805 #endif |
797 } | 806 } |
798 return index_sz; | 807 return index_sz; |
799 } | 808 } |
800 | 809 |
| 810 // vp9 uses 10,000,000 ticks/second as time stamp |
| 811 #define TICKS_PER_SEC 10000000LL |
| 812 |
| 813 static int64_t timebase_units_to_ticks(const vpx_rational_t *timebase, |
| 814 int64_t n) { |
| 815 return n * TICKS_PER_SEC * timebase->num / timebase->den; |
| 816 } |
| 817 |
| 818 static int64_t ticks_to_timebase_units(const vpx_rational_t *timebase, |
| 819 int64_t n) { |
| 820 const int64_t round = TICKS_PER_SEC * timebase->num / 2 - 1; |
| 821 return (n * timebase->den + round) / timebase->num / TICKS_PER_SEC; |
| 822 } |
| 823 |
801 static vpx_codec_err_t encoder_encode(vpx_codec_alg_priv_t *ctx, | 824 static vpx_codec_err_t encoder_encode(vpx_codec_alg_priv_t *ctx, |
802 const vpx_image_t *img, | 825 const vpx_image_t *img, |
803 vpx_codec_pts_t pts, | 826 vpx_codec_pts_t pts, |
804 unsigned long duration, | 827 unsigned long duration, |
805 vpx_enc_frame_flags_t flags, | 828 vpx_enc_frame_flags_t flags, |
806 unsigned long deadline) { | 829 unsigned long deadline) { |
807 vpx_codec_err_t res = VPX_CODEC_OK; | 830 vpx_codec_err_t res = VPX_CODEC_OK; |
| 831 const vpx_rational_t *const timebase = &ctx->cfg.g_timebase; |
808 | 832 |
809 if (img) | 833 if (img != NULL) { |
810 res = validate_img(ctx, img); | 834 res = validate_img(ctx, img); |
| 835 // TODO(jzern) the checks related to cpi's validity should be treated as a |
| 836 // failure condition, encoder setup is done fully in init() currently. |
| 837 if (res == VPX_CODEC_OK && ctx->cpi != NULL && ctx->cx_data == NULL) { |
| 838 // There's no codec control for multiple alt-refs so check the encoder |
| 839 // instance for its status to determine the compressed data size. |
| 840 ctx->cx_data_sz = ctx->cfg.g_w * ctx->cfg.g_h * |
| 841 get_image_bps(img) / 8 * |
| 842 (ctx->cpi->multi_arf_allowed ? 8 : 2); |
| 843 if (ctx->cx_data_sz < 4096) ctx->cx_data_sz = 4096; |
| 844 |
| 845 ctx->cx_data = (unsigned char *)malloc(ctx->cx_data_sz); |
| 846 if (ctx->cx_data == NULL) { |
| 847 return VPX_CODEC_MEM_ERROR; |
| 848 } |
| 849 } |
| 850 } |
811 | 851 |
812 pick_quickcompress_mode(ctx, duration, deadline); | 852 pick_quickcompress_mode(ctx, duration, deadline); |
813 vpx_codec_pkt_list_init(&ctx->pkt_list); | 853 vpx_codec_pkt_list_init(&ctx->pkt_list); |
814 | 854 |
815 // Handle Flags | 855 // Handle Flags |
816 if (((flags & VP8_EFLAG_NO_UPD_GF) && (flags & VP8_EFLAG_FORCE_GF)) || | 856 if (((flags & VP8_EFLAG_NO_UPD_GF) && (flags & VP8_EFLAG_FORCE_GF)) || |
817 ((flags & VP8_EFLAG_NO_UPD_ARF) && (flags & VP8_EFLAG_FORCE_ARF))) { | 857 ((flags & VP8_EFLAG_NO_UPD_ARF) && (flags & VP8_EFLAG_FORCE_ARF))) { |
818 ctx->base.err_detail = "Conflicting flags."; | 858 ctx->base.err_detail = "Conflicting flags."; |
819 return VPX_CODEC_INVALID_PARAM; | 859 return VPX_CODEC_INVALID_PARAM; |
820 } | 860 } |
821 | 861 |
822 vp9_apply_encoding_flags(ctx->cpi, flags); | 862 vp9_apply_encoding_flags(ctx->cpi, flags); |
823 | 863 |
824 // Handle fixed keyframe intervals | 864 // Handle fixed keyframe intervals |
825 if (ctx->cfg.kf_mode == VPX_KF_AUTO && | 865 if (ctx->cfg.kf_mode == VPX_KF_AUTO && |
826 ctx->cfg.kf_min_dist == ctx->cfg.kf_max_dist) { | 866 ctx->cfg.kf_min_dist == ctx->cfg.kf_max_dist) { |
827 if (++ctx->fixed_kf_cntr > ctx->cfg.kf_min_dist) { | 867 if (++ctx->fixed_kf_cntr > ctx->cfg.kf_min_dist) { |
828 flags |= VPX_EFLAG_FORCE_KF; | 868 flags |= VPX_EFLAG_FORCE_KF; |
829 ctx->fixed_kf_cntr = 1; | 869 ctx->fixed_kf_cntr = 1; |
830 } | 870 } |
831 } | 871 } |
832 | 872 |
833 // Initialize the encoder instance on the first frame. | 873 // Initialize the encoder instance on the first frame. |
834 if (res == VPX_CODEC_OK && ctx->cpi != NULL) { | 874 if (res == VPX_CODEC_OK && ctx->cpi != NULL) { |
835 unsigned int lib_flags = 0; | 875 unsigned int lib_flags = 0; |
836 YV12_BUFFER_CONFIG sd; | 876 YV12_BUFFER_CONFIG sd; |
837 int64_t dst_time_stamp, dst_end_time_stamp; | 877 int64_t dst_time_stamp = timebase_units_to_ticks(timebase, pts); |
| 878 int64_t dst_end_time_stamp = |
| 879 timebase_units_to_ticks(timebase, pts + duration); |
838 size_t size, cx_data_sz; | 880 size_t size, cx_data_sz; |
839 unsigned char *cx_data; | 881 unsigned char *cx_data; |
840 | 882 |
841 // Set up internal flags | 883 // Set up internal flags |
842 if (ctx->base.init_flags & VPX_CODEC_USE_PSNR) | 884 if (ctx->base.init_flags & VPX_CODEC_USE_PSNR) |
843 ((VP9_COMP *)ctx->cpi)->b_calculate_psnr = 1; | 885 ((VP9_COMP *)ctx->cpi)->b_calculate_psnr = 1; |
844 | 886 |
845 /* vp9 use 10,000,000 ticks/second as time stamp */ | |
846 dst_time_stamp = (pts * 10000000 * ctx->cfg.g_timebase.num) | |
847 / ctx->cfg.g_timebase.den; | |
848 dst_end_time_stamp = (pts + duration) * 10000000 * ctx->cfg.g_timebase.num / | |
849 ctx->cfg.g_timebase.den; | |
850 | |
851 if (img != NULL) { | 887 if (img != NULL) { |
852 res = image2yuvconfig(img, &sd); | 888 res = image2yuvconfig(img, &sd); |
853 | 889 |
854 // Store the original flags in to the frame buffer. Will extract the | 890 // Store the original flags in to the frame buffer. Will extract the |
855 // key frame flag when we actually encode this frame. | 891 // key frame flag when we actually encode this frame. |
856 if (vp9_receive_raw_frame(ctx->cpi, flags, | 892 if (vp9_receive_raw_frame(ctx->cpi, flags, |
857 &sd, dst_time_stamp, dst_end_time_stamp)) { | 893 &sd, dst_time_stamp, dst_end_time_stamp)) { |
858 VP9_COMP *cpi = (VP9_COMP *)ctx->cpi; | 894 VP9_COMP *cpi = (VP9_COMP *)ctx->cpi; |
859 res = update_error_state(ctx, &cpi->common.error); | 895 res = update_error_state(ctx, &cpi->common.error); |
860 } | 896 } |
(...skipping 16 matching lines...) Expand all Loading... |
877 ctx->base.err_detail = "Compressed data buffer too small"; | 913 ctx->base.err_detail = "Compressed data buffer too small"; |
878 return VPX_CODEC_ERROR; | 914 return VPX_CODEC_ERROR; |
879 } | 915 } |
880 } | 916 } |
881 | 917 |
882 while (cx_data_sz >= ctx->cx_data_sz / 2 && | 918 while (cx_data_sz >= ctx->cx_data_sz / 2 && |
883 -1 != vp9_get_compressed_data(ctx->cpi, &lib_flags, &size, | 919 -1 != vp9_get_compressed_data(ctx->cpi, &lib_flags, &size, |
884 cx_data, &dst_time_stamp, | 920 cx_data, &dst_time_stamp, |
885 &dst_end_time_stamp, !img)) { | 921 &dst_end_time_stamp, !img)) { |
886 if (size) { | 922 if (size) { |
887 vpx_codec_pts_t round, delta; | 923 VP9_COMP *const cpi = (VP9_COMP *)ctx->cpi; |
888 vpx_codec_cx_pkt_t pkt; | 924 vpx_codec_cx_pkt_t pkt; |
889 VP9_COMP *const cpi = (VP9_COMP *)ctx->cpi; | |
890 | 925 |
891 #if CONFIG_SPATIAL_SVC | 926 #if CONFIG_SPATIAL_SVC |
892 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) | 927 if (is_spatial_svc(cpi)) |
893 cpi->svc.layer_context[cpi->svc.spatial_layer_id].layer_size += size; | 928 cpi->svc.layer_context[cpi->svc.spatial_layer_id].layer_size += size; |
894 #endif | 929 #endif |
895 | 930 |
896 // Pack invisible frames with the next visible frame | 931 // Pack invisible frames with the next visible frame |
897 if (cpi->common.show_frame == 0 | 932 if (cpi->common.show_frame == 0 |
898 #if CONFIG_SPATIAL_SVC | 933 #if CONFIG_SPATIAL_SVC |
899 || (cpi->use_svc && cpi->svc.number_temporal_layers == 1 && | 934 || (is_spatial_svc(cpi) && |
900 cpi->svc.spatial_layer_id < cpi->svc.number_spatial_layers - 1) | 935 cpi->svc.spatial_layer_id < cpi->svc.number_spatial_layers - 1) |
901 #endif | 936 #endif |
902 ) { | 937 ) { |
903 if (ctx->pending_cx_data == 0) | 938 if (ctx->pending_cx_data == 0) |
904 ctx->pending_cx_data = cx_data; | 939 ctx->pending_cx_data = cx_data; |
905 ctx->pending_cx_data_sz += size; | 940 ctx->pending_cx_data_sz += size; |
906 ctx->pending_frame_sizes[ctx->pending_frame_count++] = size; | 941 ctx->pending_frame_sizes[ctx->pending_frame_count++] = size; |
907 ctx->pending_frame_magnitude |= size; | 942 ctx->pending_frame_magnitude |= size; |
908 cx_data += size; | 943 cx_data += size; |
909 cx_data_sz -= size; | 944 cx_data_sz -= size; |
910 continue; | 945 continue; |
911 } | 946 } |
912 | 947 |
913 // Add the frame packet to the list of returned packets. | 948 // Add the frame packet to the list of returned packets. |
914 round = (vpx_codec_pts_t)10000000 * ctx->cfg.g_timebase.num / 2 - 1; | |
915 delta = (dst_end_time_stamp - dst_time_stamp); | |
916 pkt.kind = VPX_CODEC_CX_FRAME_PKT; | 949 pkt.kind = VPX_CODEC_CX_FRAME_PKT; |
917 pkt.data.frame.pts = | 950 pkt.data.frame.pts = ticks_to_timebase_units(timebase, dst_time_stamp); |
918 (dst_time_stamp * ctx->cfg.g_timebase.den + round) | 951 pkt.data.frame.duration = |
919 / ctx->cfg.g_timebase.num / 10000000; | 952 (unsigned long)ticks_to_timebase_units(timebase, |
920 pkt.data.frame.duration = (unsigned long) | 953 dst_end_time_stamp - dst_time_stamp); |
921 ((delta * ctx->cfg.g_timebase.den + round) | |
922 / ctx->cfg.g_timebase.num / 10000000); | |
923 pkt.data.frame.flags = lib_flags << 16; | 954 pkt.data.frame.flags = lib_flags << 16; |
924 | 955 |
925 if (lib_flags & FRAMEFLAGS_KEY | 956 if (lib_flags & FRAMEFLAGS_KEY |
926 #if CONFIG_SPATIAL_SVC | 957 #if CONFIG_SPATIAL_SVC |
927 || (cpi->use_svc && cpi->svc.number_temporal_layers == 1 && | 958 || (is_spatial_svc(cpi) && |
928 cpi->svc.layer_context[0].is_key_frame) | 959 cpi->svc.layer_context[0].is_key_frame) |
929 #endif | 960 #endif |
930 ) | 961 ) |
931 pkt.data.frame.flags |= VPX_FRAME_IS_KEY; | 962 pkt.data.frame.flags |= VPX_FRAME_IS_KEY; |
932 | 963 |
933 if (cpi->common.show_frame == 0) { | 964 if (cpi->common.show_frame == 0) { |
934 pkt.data.frame.flags |= VPX_FRAME_IS_INVISIBLE; | 965 pkt.data.frame.flags |= VPX_FRAME_IS_INVISIBLE; |
935 | 966 |
936 // This timestamp should be as close as possible to the | 967 // This timestamp should be as close as possible to the |
937 // prior PTS so that if a decoder uses pts to schedule when | 968 // prior PTS so that if a decoder uses pts to schedule when |
938 // to do this, we start right after last frame was decoded. | 969 // to do this, we start right after last frame was decoded. |
939 // Invisible frames have no duration. | 970 // Invisible frames have no duration. |
940 pkt.data.frame.pts = ((cpi->last_time_stamp_seen | 971 pkt.data.frame.pts = |
941 * ctx->cfg.g_timebase.den + round) | 972 ticks_to_timebase_units(timebase, cpi->last_time_stamp_seen) + 1; |
942 / ctx->cfg.g_timebase.num / 10000000) + 1; | |
943 pkt.data.frame.duration = 0; | 973 pkt.data.frame.duration = 0; |
944 } | 974 } |
945 | 975 |
946 if (cpi->droppable) | 976 if (cpi->droppable) |
947 pkt.data.frame.flags |= VPX_FRAME_IS_DROPPABLE; | 977 pkt.data.frame.flags |= VPX_FRAME_IS_DROPPABLE; |
948 | 978 |
949 if (ctx->pending_cx_data) { | 979 if (ctx->pending_cx_data) { |
950 ctx->pending_frame_sizes[ctx->pending_frame_count++] = size; | 980 ctx->pending_frame_sizes[ctx->pending_frame_count++] = size; |
951 ctx->pending_frame_magnitude |= size; | 981 ctx->pending_frame_magnitude |= size; |
952 ctx->pending_cx_data_sz += size; | 982 ctx->pending_cx_data_sz += size; |
953 size += write_superframe_index(ctx); | 983 size += write_superframe_index(ctx); |
954 pkt.data.frame.buf = ctx->pending_cx_data; | 984 pkt.data.frame.buf = ctx->pending_cx_data; |
955 pkt.data.frame.sz = ctx->pending_cx_data_sz; | 985 pkt.data.frame.sz = ctx->pending_cx_data_sz; |
956 ctx->pending_cx_data = NULL; | 986 ctx->pending_cx_data = NULL; |
957 ctx->pending_cx_data_sz = 0; | 987 ctx->pending_cx_data_sz = 0; |
958 ctx->pending_frame_count = 0; | 988 ctx->pending_frame_count = 0; |
959 ctx->pending_frame_magnitude = 0; | 989 ctx->pending_frame_magnitude = 0; |
960 } else { | 990 } else { |
961 pkt.data.frame.buf = cx_data; | 991 pkt.data.frame.buf = cx_data; |
962 pkt.data.frame.sz = size; | 992 pkt.data.frame.sz = size; |
963 } | 993 } |
964 pkt.data.frame.partition_id = -1; | 994 pkt.data.frame.partition_id = -1; |
965 vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt); | 995 vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt); |
966 cx_data += size; | 996 cx_data += size; |
967 cx_data_sz -= size; | 997 cx_data_sz -= size; |
968 #if CONFIG_SPATIAL_SVC | 998 #if CONFIG_SPATIAL_SVC |
969 if (cpi->use_svc && cpi->svc.number_temporal_layers == 1) { | 999 if (is_spatial_svc(cpi)) { |
970 vpx_codec_cx_pkt_t pkt = {0}; | 1000 vpx_codec_cx_pkt_t pkt = {0}; |
971 int i; | 1001 int i; |
972 pkt.kind = VPX_CODEC_SPATIAL_SVC_LAYER_SIZES; | 1002 pkt.kind = VPX_CODEC_SPATIAL_SVC_LAYER_SIZES; |
973 for (i = 0; i < cpi->svc.number_spatial_layers; ++i) { | 1003 for (i = 0; i < cpi->svc.number_spatial_layers; ++i) { |
974 pkt.data.layer_sizes[i] = cpi->svc.layer_context[i].layer_size; | 1004 pkt.data.layer_sizes[i] = cpi->svc.layer_context[i].layer_size; |
975 cpi->svc.layer_context[i].layer_size = 0; | 1005 cpi->svc.layer_context[i].layer_size = 0; |
976 } | 1006 } |
977 vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt); | 1007 vpx_codec_pkt_list_add(&ctx->pkt_list.head, &pkt); |
978 } | 1008 } |
979 #endif | 1009 #endif |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1019 } else { | 1049 } else { |
1020 return VPX_CODEC_INVALID_PARAM; | 1050 return VPX_CODEC_INVALID_PARAM; |
1021 } | 1051 } |
1022 } | 1052 } |
1023 | 1053 |
1024 static vpx_codec_err_t ctrl_get_reference(vpx_codec_alg_priv_t *ctx, | 1054 static vpx_codec_err_t ctrl_get_reference(vpx_codec_alg_priv_t *ctx, |
1025 va_list args) { | 1055 va_list args) { |
1026 vp9_ref_frame_t *const frame = va_arg(args, vp9_ref_frame_t *); | 1056 vp9_ref_frame_t *const frame = va_arg(args, vp9_ref_frame_t *); |
1027 | 1057 |
1028 if (frame != NULL) { | 1058 if (frame != NULL) { |
1029 YV12_BUFFER_CONFIG *fb; | 1059 YV12_BUFFER_CONFIG *fb = get_ref_frame(&ctx->cpi->common, frame->idx); |
| 1060 if (fb == NULL) return VPX_CODEC_ERROR; |
1030 | 1061 |
1031 vp9_get_reference_enc(ctx->cpi, frame->idx, &fb); | |
1032 yuvconfig2image(&frame->img, fb, NULL); | 1062 yuvconfig2image(&frame->img, fb, NULL); |
1033 return VPX_CODEC_OK; | 1063 return VPX_CODEC_OK; |
1034 } else { | 1064 } else { |
1035 return VPX_CODEC_INVALID_PARAM; | 1065 return VPX_CODEC_INVALID_PARAM; |
1036 } | 1066 } |
1037 } | 1067 } |
1038 | 1068 |
1039 static vpx_codec_err_t ctrl_set_previewpp(vpx_codec_alg_priv_t *ctx, | 1069 static vpx_codec_err_t ctrl_set_previewpp(vpx_codec_alg_priv_t *ctx, |
1040 va_list args) { | 1070 va_list args) { |
1041 #if CONFIG_VP9_POSTPROC | 1071 #if CONFIG_VP9_POSTPROC |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1189 cpi->svc.layer_context[i].svc_params_received.spatial_layer = -1; | 1219 cpi->svc.layer_context[i].svc_params_received.spatial_layer = -1; |
1190 } | 1220 } |
1191 } | 1221 } |
1192 | 1222 |
1193 cpi->svc.layer_context[params->spatial_layer].svc_params_received = | 1223 cpi->svc.layer_context[params->spatial_layer].svc_params_received = |
1194 *params; | 1224 *params; |
1195 | 1225 |
1196 return VPX_CODEC_OK; | 1226 return VPX_CODEC_OK; |
1197 } | 1227 } |
1198 | 1228 |
| 1229 static vpx_codec_err_t ctrl_set_tune_content(vpx_codec_alg_priv_t *ctx, |
| 1230 va_list args) { |
| 1231 struct vp9_extracfg extra_cfg = ctx->extra_cfg; |
| 1232 extra_cfg.content = CAST(VP9E_SET_TUNE_CONTENT, args); |
| 1233 return update_extra_cfg(ctx, &extra_cfg); |
| 1234 } |
| 1235 |
1199 static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = { | 1236 static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = { |
1200 {VP8_COPY_REFERENCE, ctrl_copy_reference}, | 1237 {VP8_COPY_REFERENCE, ctrl_copy_reference}, |
1201 {VP8E_UPD_ENTROPY, ctrl_update_entropy}, | 1238 {VP8E_UPD_ENTROPY, ctrl_update_entropy}, |
1202 {VP8E_UPD_REFERENCE, ctrl_update_reference}, | 1239 {VP8E_UPD_REFERENCE, ctrl_update_reference}, |
1203 {VP8E_USE_REFERENCE, ctrl_use_reference}, | 1240 {VP8E_USE_REFERENCE, ctrl_use_reference}, |
1204 | 1241 |
1205 // Setters | 1242 // Setters |
1206 {VP8_SET_REFERENCE, ctrl_set_reference}, | 1243 {VP8_SET_REFERENCE, ctrl_set_reference}, |
1207 {VP8_SET_POSTPROC, ctrl_set_previewpp}, | 1244 {VP8_SET_POSTPROC, ctrl_set_previewpp}, |
1208 {VP8E_SET_ROI_MAP, ctrl_set_roi_map}, | 1245 {VP8E_SET_ROI_MAP, ctrl_set_roi_map}, |
(...skipping 12 matching lines...) Expand all Loading... |
1221 {VP8E_SET_TUNING, ctrl_set_tuning}, | 1258 {VP8E_SET_TUNING, ctrl_set_tuning}, |
1222 {VP8E_SET_CQ_LEVEL, ctrl_set_cq_level}, | 1259 {VP8E_SET_CQ_LEVEL, ctrl_set_cq_level}, |
1223 {VP8E_SET_MAX_INTRA_BITRATE_PCT, ctrl_set_rc_max_intra_bitrate_pct}, | 1260 {VP8E_SET_MAX_INTRA_BITRATE_PCT, ctrl_set_rc_max_intra_bitrate_pct}, |
1224 {VP9E_SET_LOSSLESS, ctrl_set_lossless}, | 1261 {VP9E_SET_LOSSLESS, ctrl_set_lossless}, |
1225 {VP9E_SET_FRAME_PARALLEL_DECODING, ctrl_set_frame_parallel_decoding_mode}, | 1262 {VP9E_SET_FRAME_PARALLEL_DECODING, ctrl_set_frame_parallel_decoding_mode}, |
1226 {VP9E_SET_AQ_MODE, ctrl_set_aq_mode}, | 1263 {VP9E_SET_AQ_MODE, ctrl_set_aq_mode}, |
1227 {VP9E_SET_FRAME_PERIODIC_BOOST, ctrl_set_frame_periodic_boost}, | 1264 {VP9E_SET_FRAME_PERIODIC_BOOST, ctrl_set_frame_periodic_boost}, |
1228 {VP9E_SET_SVC, ctrl_set_svc}, | 1265 {VP9E_SET_SVC, ctrl_set_svc}, |
1229 {VP9E_SET_SVC_PARAMETERS, ctrl_set_svc_parameters}, | 1266 {VP9E_SET_SVC_PARAMETERS, ctrl_set_svc_parameters}, |
1230 {VP9E_SET_SVC_LAYER_ID, ctrl_set_svc_layer_id}, | 1267 {VP9E_SET_SVC_LAYER_ID, ctrl_set_svc_layer_id}, |
| 1268 {VP9E_SET_TUNE_CONTENT, ctrl_set_tune_content}, |
1231 | 1269 |
1232 // Getters | 1270 // Getters |
1233 {VP8E_GET_LAST_QUANTIZER, ctrl_get_quantizer}, | 1271 {VP8E_GET_LAST_QUANTIZER, ctrl_get_quantizer}, |
1234 {VP8E_GET_LAST_QUANTIZER_64, ctrl_get_quantizer64}, | 1272 {VP8E_GET_LAST_QUANTIZER_64, ctrl_get_quantizer64}, |
1235 {VP9_GET_REFERENCE, ctrl_get_reference}, | 1273 {VP9_GET_REFERENCE, ctrl_get_reference}, |
1236 | 1274 |
1237 { -1, NULL}, | 1275 { -1, NULL}, |
1238 }; | 1276 }; |
1239 | 1277 |
1240 static vpx_codec_enc_cfg_map_t encoder_usage_cfg_map[] = { | 1278 static vpx_codec_enc_cfg_map_t encoder_usage_cfg_map[] = { |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1280 50, // rc_two_pass_vbrbias | 1318 50, // rc_two_pass_vbrbias |
1281 0, // rc_two_pass_vbrmin_section | 1319 0, // rc_two_pass_vbrmin_section |
1282 2000, // rc_two_pass_vbrmax_section | 1320 2000, // rc_two_pass_vbrmax_section |
1283 | 1321 |
1284 // keyframing settings (kf) | 1322 // keyframing settings (kf) |
1285 VPX_KF_AUTO, // g_kfmode | 1323 VPX_KF_AUTO, // g_kfmode |
1286 0, // kf_min_dist | 1324 0, // kf_min_dist |
1287 9999, // kf_max_dist | 1325 9999, // kf_max_dist |
1288 | 1326 |
1289 VPX_SS_DEFAULT_LAYERS, // ss_number_layers | 1327 VPX_SS_DEFAULT_LAYERS, // ss_number_layers |
1290 #if CONFIG_SPATIAL_SVC | |
1291 {0}, | 1328 {0}, |
1292 #endif | |
1293 {0}, // ss_target_bitrate | 1329 {0}, // ss_target_bitrate |
1294 1, // ts_number_layers | 1330 1, // ts_number_layers |
1295 {0}, // ts_target_bitrate | 1331 {0}, // ts_target_bitrate |
1296 {0}, // ts_rate_decimator | 1332 {0}, // ts_rate_decimator |
1297 0, // ts_periodicity | 1333 0, // ts_periodicity |
1298 {0}, // ts_layer_id | 1334 {0}, // ts_layer_id |
1299 #if VPX_ENCODER_ABI_VERSION == (1 + VPX_CODEC_ABI_VERSION) | 1335 #if VPX_ENCODER_ABI_VERSION == (1 + VPX_CODEC_ABI_VERSION) |
1300 "vp8.fpf" // first pass filename | 1336 "vp8.fpf" // first pass filename |
1301 #endif | 1337 #endif |
1302 } | 1338 } |
1303 }, | 1339 }, |
1304 { -1, {NOT_IMPLEMENTED}} | |
1305 }; | 1340 }; |
1306 | 1341 |
1307 #ifndef VERSION_STRING | 1342 #ifndef VERSION_STRING |
1308 #define VERSION_STRING | 1343 #define VERSION_STRING |
1309 #endif | 1344 #endif |
1310 CODEC_INTERFACE(vpx_codec_vp9_cx) = { | 1345 CODEC_INTERFACE(vpx_codec_vp9_cx) = { |
1311 "WebM Project VP9 Encoder" VERSION_STRING, | 1346 "WebM Project VP9 Encoder" VERSION_STRING, |
1312 VPX_CODEC_INTERNAL_ABI_VERSION, | 1347 VPX_CODEC_INTERNAL_ABI_VERSION, |
1313 VPX_CODEC_CAP_ENCODER | VPX_CODEC_CAP_PSNR, // vpx_codec_caps_t | 1348 VPX_CODEC_CAP_ENCODER | VPX_CODEC_CAP_PSNR, // vpx_codec_caps_t |
1314 encoder_init, // vpx_codec_init_fn_t | 1349 encoder_init, // vpx_codec_init_fn_t |
1315 encoder_destroy, // vpx_codec_destroy_fn_t | 1350 encoder_destroy, // vpx_codec_destroy_fn_t |
1316 encoder_ctrl_maps, // vpx_codec_ctrl_fn_map_t | 1351 encoder_ctrl_maps, // vpx_codec_ctrl_fn_map_t |
1317 NOT_IMPLEMENTED, // vpx_codec_get_mmap_fn_t | |
1318 NOT_IMPLEMENTED, // vpx_codec_set_mmap_fn_t | |
1319 { // NOLINT | 1352 { // NOLINT |
1320 NOT_IMPLEMENTED, // vpx_codec_peek_si_fn_t | 1353 NOT_IMPLEMENTED, // vpx_codec_peek_si_fn_t |
1321 NOT_IMPLEMENTED, // vpx_codec_get_si_fn_t | 1354 NOT_IMPLEMENTED, // vpx_codec_get_si_fn_t |
1322 NOT_IMPLEMENTED, // vpx_codec_decode_fn_t | 1355 NOT_IMPLEMENTED, // vpx_codec_decode_fn_t |
1323 NOT_IMPLEMENTED, // vpx_codec_frame_get_fn_t | 1356 NOT_IMPLEMENTED, // vpx_codec_frame_get_fn_t |
1324 NOT_IMPLEMENTED // vpx_codec_set_fb_fn_t | 1357 NOT_IMPLEMENTED // vpx_codec_set_fb_fn_t |
1325 }, | 1358 }, |
1326 { // NOLINT | 1359 { // NOLINT |
| 1360 1, // 1 cfg map |
1327 encoder_usage_cfg_map, // vpx_codec_enc_cfg_map_t | 1361 encoder_usage_cfg_map, // vpx_codec_enc_cfg_map_t |
1328 encoder_encode, // vpx_codec_encode_fn_t | 1362 encoder_encode, // vpx_codec_encode_fn_t |
1329 encoder_get_cxdata, // vpx_codec_get_cx_data_fn_t | 1363 encoder_get_cxdata, // vpx_codec_get_cx_data_fn_t |
1330 encoder_set_config, // vpx_codec_enc_config_set_fn_t | 1364 encoder_set_config, // vpx_codec_enc_config_set_fn_t |
1331 NOT_IMPLEMENTED, // vpx_codec_get_global_headers_fn_t | 1365 NOT_IMPLEMENTED, // vpx_codec_get_global_headers_fn_t |
1332 encoder_get_preview, // vpx_codec_get_preview_frame_fn_t | 1366 encoder_get_preview, // vpx_codec_get_preview_frame_fn_t |
1333 NOT_IMPLEMENTED // vpx_codec_enc_mr_get_mem_loc_fn_t | 1367 NOT_IMPLEMENTED // vpx_codec_enc_mr_get_mem_loc_fn_t |
1334 } | 1368 } |
1335 }; | 1369 }; |
OLD | NEW |