Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(432)

Side by Side Diff: source/libvpx/vp9/vp9_cx_iface.c

Issue 375983002: libvpx: Pull from upstream (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/deps/third_party/libvpx/
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 VP9_COMP *cpi; 81 VP9_COMP *cpi;
82 unsigned char *cx_data; 82 unsigned char *cx_data;
83 size_t cx_data_sz; 83 size_t cx_data_sz;
84 unsigned char *pending_cx_data; 84 unsigned char *pending_cx_data;
85 size_t pending_cx_data_sz; 85 size_t pending_cx_data_sz;
86 int pending_frame_count; 86 int pending_frame_count;
87 size_t pending_frame_sizes[8]; 87 size_t pending_frame_sizes[8];
88 size_t pending_frame_magnitude; 88 size_t pending_frame_magnitude;
89 vpx_image_t preview_img; 89 vpx_image_t preview_img;
90 vp8_postproc_cfg_t preview_ppcfg; 90 vp8_postproc_cfg_t preview_ppcfg;
91 vpx_codec_pkt_list_decl(64) pkt_list; 91 vpx_codec_pkt_list_decl(128) pkt_list;
92 unsigned int fixed_kf_cntr; 92 unsigned int fixed_kf_cntr;
93 }; 93 };
94 94
95 static VP9_REFFRAME ref_frame_to_vp9_reframe(vpx_ref_frame_type_t frame) { 95 static VP9_REFFRAME ref_frame_to_vp9_reframe(vpx_ref_frame_type_t frame) {
96 switch (frame) { 96 switch (frame) {
97 case VP8_LAST_FRAME: 97 case VP8_LAST_FRAME:
98 return VP9_LAST_FLAG; 98 return VP9_LAST_FLAG;
99 case VP8_GOLD_FRAME: 99 case VP8_GOLD_FRAME:
100 return VP9_GOLD_FLAG; 100 return VP9_GOLD_FLAG;
101 case VP8_ALTR_FRAME: 101 case VP8_ALTR_FRAME:
102 return VP9_ALT_FLAG; 102 return VP9_ALT_FLAG;
(...skipping 685 matching lines...) Expand 10 before | Expand all | Expand 10 after
788 pick_quickcompress_mode(ctx, duration, deadline); 788 pick_quickcompress_mode(ctx, duration, deadline);
789 vpx_codec_pkt_list_init(&ctx->pkt_list); 789 vpx_codec_pkt_list_init(&ctx->pkt_list);
790 790
791 // Handle Flags 791 // Handle Flags
792 if (((flags & VP8_EFLAG_NO_UPD_GF) && (flags & VP8_EFLAG_FORCE_GF)) || 792 if (((flags & VP8_EFLAG_NO_UPD_GF) && (flags & VP8_EFLAG_FORCE_GF)) ||
793 ((flags & VP8_EFLAG_NO_UPD_ARF) && (flags & VP8_EFLAG_FORCE_ARF))) { 793 ((flags & VP8_EFLAG_NO_UPD_ARF) && (flags & VP8_EFLAG_FORCE_ARF))) {
794 ctx->base.err_detail = "Conflicting flags."; 794 ctx->base.err_detail = "Conflicting flags.";
795 return VPX_CODEC_INVALID_PARAM; 795 return VPX_CODEC_INVALID_PARAM;
796 } 796 }
797 797
798 if (flags & (VP8_EFLAG_NO_REF_LAST | VP8_EFLAG_NO_REF_GF | 798 vp9_apply_encoding_flags(ctx->cpi, flags);
799 VP8_EFLAG_NO_REF_ARF)) {
800 int ref = 7;
801
802 if (flags & VP8_EFLAG_NO_REF_LAST)
803 ref ^= VP9_LAST_FLAG;
804
805 if (flags & VP8_EFLAG_NO_REF_GF)
806 ref ^= VP9_GOLD_FLAG;
807
808 if (flags & VP8_EFLAG_NO_REF_ARF)
809 ref ^= VP9_ALT_FLAG;
810
811 vp9_use_as_reference(ctx->cpi, ref);
812 }
813
814 if (flags & (VP8_EFLAG_NO_UPD_LAST | VP8_EFLAG_NO_UPD_GF |
815 VP8_EFLAG_NO_UPD_ARF | VP8_EFLAG_FORCE_GF |
816 VP8_EFLAG_FORCE_ARF)) {
817 int upd = 7;
818
819 if (flags & VP8_EFLAG_NO_UPD_LAST)
820 upd ^= VP9_LAST_FLAG;
821
822 if (flags & VP8_EFLAG_NO_UPD_GF)
823 upd ^= VP9_GOLD_FLAG;
824
825 if (flags & VP8_EFLAG_NO_UPD_ARF)
826 upd ^= VP9_ALT_FLAG;
827
828 vp9_update_reference(ctx->cpi, upd);
829 }
830
831 if (flags & VP8_EFLAG_NO_UPD_ENTROPY) {
832 vp9_update_entropy(ctx->cpi, 0);
833 }
834 799
835 // Handle fixed keyframe intervals 800 // Handle fixed keyframe intervals
836 if (ctx->cfg.kf_mode == VPX_KF_AUTO && 801 if (ctx->cfg.kf_mode == VPX_KF_AUTO &&
837 ctx->cfg.kf_min_dist == ctx->cfg.kf_max_dist) { 802 ctx->cfg.kf_min_dist == ctx->cfg.kf_max_dist) {
838 if (++ctx->fixed_kf_cntr > ctx->cfg.kf_min_dist) { 803 if (++ctx->fixed_kf_cntr > ctx->cfg.kf_min_dist) {
839 flags |= VPX_EFLAG_FORCE_KF; 804 flags |= VPX_EFLAG_FORCE_KF;
840 ctx->fixed_kf_cntr = 1; 805 ctx->fixed_kf_cntr = 1;
841 } 806 }
842 } 807 }
843 808
844 // Initialize the encoder instance on the first frame. 809 // Initialize the encoder instance on the first frame.
845 if (res == VPX_CODEC_OK && ctx->cpi != NULL) { 810 if (res == VPX_CODEC_OK && ctx->cpi != NULL) {
846 unsigned int lib_flags; 811 unsigned int lib_flags = 0;
847 YV12_BUFFER_CONFIG sd; 812 YV12_BUFFER_CONFIG sd;
848 int64_t dst_time_stamp, dst_end_time_stamp; 813 int64_t dst_time_stamp, dst_end_time_stamp;
849 size_t size, cx_data_sz; 814 size_t size, cx_data_sz;
850 unsigned char *cx_data; 815 unsigned char *cx_data;
851 816
852 // Set up internal flags 817 // Set up internal flags
853 if (ctx->base.init_flags & VPX_CODEC_USE_PSNR) 818 if (ctx->base.init_flags & VPX_CODEC_USE_PSNR)
854 ((VP9_COMP *)ctx->cpi)->b_calculate_psnr = 1; 819 ((VP9_COMP *)ctx->cpi)->b_calculate_psnr = 1;
855 820
856 // Convert API flags to internal codec lib flags
857 lib_flags = (flags & VPX_EFLAG_FORCE_KF) ? FRAMEFLAGS_KEY : 0;
858
859 /* vp9 use 10,000,000 ticks/second as time stamp */ 821 /* vp9 use 10,000,000 ticks/second as time stamp */
860 dst_time_stamp = (pts * 10000000 * ctx->cfg.g_timebase.num) 822 dst_time_stamp = (pts * 10000000 * ctx->cfg.g_timebase.num)
861 / ctx->cfg.g_timebase.den; 823 / ctx->cfg.g_timebase.den;
862 dst_end_time_stamp = (pts + duration) * 10000000 * ctx->cfg.g_timebase.num / 824 dst_end_time_stamp = (pts + duration) * 10000000 * ctx->cfg.g_timebase.num /
863 ctx->cfg.g_timebase.den; 825 ctx->cfg.g_timebase.den;
864 826
865 if (img != NULL) { 827 if (img != NULL) {
866 res = image2yuvconfig(img, &sd); 828 res = image2yuvconfig(img, &sd);
867 829
868 if (vp9_receive_raw_frame(ctx->cpi, lib_flags, 830 // Store the original flags in to the frame buffer. Will extract the
831 // key frame flag when we actually encode this frame.
832 if (vp9_receive_raw_frame(ctx->cpi, flags,
869 &sd, dst_time_stamp, dst_end_time_stamp)) { 833 &sd, dst_time_stamp, dst_end_time_stamp)) {
870 VP9_COMP *cpi = (VP9_COMP *)ctx->cpi; 834 VP9_COMP *cpi = (VP9_COMP *)ctx->cpi;
871 res = update_error_state(ctx, &cpi->common.error); 835 res = update_error_state(ctx, &cpi->common.error);
872 } 836 }
873 } 837 }
874 838
875 cx_data = ctx->cx_data; 839 cx_data = ctx->cx_data;
876 cx_data_sz = ctx->cx_data_sz; 840 cx_data_sz = ctx->cx_data_sz;
877 lib_flags = 0;
878 841
879 /* Any pending invisible frames? */ 842 /* Any pending invisible frames? */
880 if (ctx->pending_cx_data) { 843 if (ctx->pending_cx_data) {
881 memmove(cx_data, ctx->pending_cx_data, ctx->pending_cx_data_sz); 844 memmove(cx_data, ctx->pending_cx_data, ctx->pending_cx_data_sz);
882 ctx->pending_cx_data = cx_data; 845 ctx->pending_cx_data = cx_data;
883 cx_data += ctx->pending_cx_data_sz; 846 cx_data += ctx->pending_cx_data_sz;
884 cx_data_sz -= ctx->pending_cx_data_sz; 847 cx_data_sz -= ctx->pending_cx_data_sz;
885 848
886 /* TODO: this is a minimal check, the underlying codec doesn't respect 849 /* TODO: this is a minimal check, the underlying codec doesn't respect
887 * the buffer size anyway. 850 * the buffer size anyway.
888 */ 851 */
889 if (cx_data_sz < ctx->cx_data_sz / 2) { 852 if (cx_data_sz < ctx->cx_data_sz / 2) {
890 ctx->base.err_detail = "Compressed data buffer too small"; 853 ctx->base.err_detail = "Compressed data buffer too small";
891 return VPX_CODEC_ERROR; 854 return VPX_CODEC_ERROR;
892 } 855 }
893 } 856 }
894 857
895 while (cx_data_sz >= ctx->cx_data_sz / 2 && 858 while (cx_data_sz >= ctx->cx_data_sz / 2 &&
896 -1 != vp9_get_compressed_data(ctx->cpi, &lib_flags, &size, 859 -1 != vp9_get_compressed_data(ctx->cpi, &lib_flags, &size,
897 cx_data, &dst_time_stamp, 860 cx_data, &dst_time_stamp,
898 &dst_end_time_stamp, !img)) { 861 &dst_end_time_stamp, !img)) {
899 if (size) { 862 if (size) {
900 vpx_codec_pts_t round, delta; 863 vpx_codec_pts_t round, delta;
901 vpx_codec_cx_pkt_t pkt; 864 vpx_codec_cx_pkt_t pkt;
902 VP9_COMP *const cpi = (VP9_COMP *)ctx->cpi; 865 VP9_COMP *const cpi = (VP9_COMP *)ctx->cpi;
903 866
904 // Pack invisible frames with the next visible frame 867 // Pack invisible frames with the next visible frame
905 if (cpi->common.show_frame == 0) { 868 if (cpi->common.show_frame == 0
869 #ifdef CONFIG_SPATIAL_SVC
870 || (cpi->use_svc && cpi->svc.number_temporal_layers == 1 &&
871 cpi->svc.spatial_layer_id < cpi->svc.number_spatial_layers - 1)
872 #endif
873 ) {
906 if (ctx->pending_cx_data == 0) 874 if (ctx->pending_cx_data == 0)
907 ctx->pending_cx_data = cx_data; 875 ctx->pending_cx_data = cx_data;
908 ctx->pending_cx_data_sz += size; 876 ctx->pending_cx_data_sz += size;
909 ctx->pending_frame_sizes[ctx->pending_frame_count++] = size; 877 ctx->pending_frame_sizes[ctx->pending_frame_count++] = size;
910 ctx->pending_frame_magnitude |= size; 878 ctx->pending_frame_magnitude |= size;
911 cx_data += size; 879 cx_data += size;
912 cx_data_sz -= size; 880 cx_data_sz -= size;
913 continue; 881 continue;
914 } 882 }
915 883
916 // Add the frame packet to the list of returned packets. 884 // Add the frame packet to the list of returned packets.
917 round = (vpx_codec_pts_t)10000000 * ctx->cfg.g_timebase.num / 2 - 1; 885 round = (vpx_codec_pts_t)10000000 * ctx->cfg.g_timebase.num / 2 - 1;
918 delta = (dst_end_time_stamp - dst_time_stamp); 886 delta = (dst_end_time_stamp - dst_time_stamp);
919 pkt.kind = VPX_CODEC_CX_FRAME_PKT; 887 pkt.kind = VPX_CODEC_CX_FRAME_PKT;
920 pkt.data.frame.pts = 888 pkt.data.frame.pts =
921 (dst_time_stamp * ctx->cfg.g_timebase.den + round) 889 (dst_time_stamp * ctx->cfg.g_timebase.den + round)
922 / ctx->cfg.g_timebase.num / 10000000; 890 / ctx->cfg.g_timebase.num / 10000000;
923 pkt.data.frame.duration = (unsigned long) 891 pkt.data.frame.duration = (unsigned long)
924 ((delta * ctx->cfg.g_timebase.den + round) 892 ((delta * ctx->cfg.g_timebase.den + round)
925 / ctx->cfg.g_timebase.num / 10000000); 893 / ctx->cfg.g_timebase.num / 10000000);
926 pkt.data.frame.flags = lib_flags << 16; 894 pkt.data.frame.flags = lib_flags << 16;
927 895
928 if (lib_flags & FRAMEFLAGS_KEY) 896 if (lib_flags & FRAMEFLAGS_KEY
897 #ifdef CONFIG_SPATIAL_SVC
898 || (cpi->use_svc && cpi->svc.number_temporal_layers == 1 &&
899 cpi->svc.layer_context[0].is_key_frame)
900 #endif
901 )
929 pkt.data.frame.flags |= VPX_FRAME_IS_KEY; 902 pkt.data.frame.flags |= VPX_FRAME_IS_KEY;
930 903
931 if (cpi->common.show_frame == 0) { 904 if (cpi->common.show_frame == 0) {
932 pkt.data.frame.flags |= VPX_FRAME_IS_INVISIBLE; 905 pkt.data.frame.flags |= VPX_FRAME_IS_INVISIBLE;
933 906
934 // This timestamp should be as close as possible to the 907 // This timestamp should be as close as possible to the
935 // prior PTS so that if a decoder uses pts to schedule when 908 // prior PTS so that if a decoder uses pts to schedule when
936 // to do this, we start right after last frame was decoded. 909 // to do this, we start right after last frame was decoded.
937 // Invisible frames have no duration. 910 // Invisible frames have no duration.
938 pkt.data.frame.pts = ((cpi->last_time_stamp_seen 911 pkt.data.frame.pts = ((cpi->last_time_stamp_seen
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 return VPX_CODEC_INVALID_PARAM; 1131 return VPX_CODEC_INVALID_PARAM;
1159 } 1132 }
1160 return VPX_CODEC_OK; 1133 return VPX_CODEC_OK;
1161 } 1134 }
1162 1135
1163 static vpx_codec_err_t ctrl_set_svc_parameters(vpx_codec_alg_priv_t *ctx, 1136 static vpx_codec_err_t ctrl_set_svc_parameters(vpx_codec_alg_priv_t *ctx,
1164 va_list args) { 1137 va_list args) {
1165 VP9_COMP *const cpi = ctx->cpi; 1138 VP9_COMP *const cpi = ctx->cpi;
1166 vpx_svc_parameters_t *const params = va_arg(args, vpx_svc_parameters_t *); 1139 vpx_svc_parameters_t *const params = va_arg(args, vpx_svc_parameters_t *);
1167 1140
1168 if (params == NULL) 1141 if (params == NULL || params->spatial_layer < 0 ||
1142 params->spatial_layer >= cpi->svc.number_spatial_layers)
1169 return VPX_CODEC_INVALID_PARAM; 1143 return VPX_CODEC_INVALID_PARAM;
1170 1144
1171 cpi->svc.spatial_layer_id = params->spatial_layer; 1145 if (params->spatial_layer == 0) {
1172 cpi->svc.temporal_layer_id = params->temporal_layer; 1146 int i;
1147 for (i = 0; i < cpi->svc.number_spatial_layers; ++i) {
1148 cpi->svc.layer_context[i].svc_params_received.spatial_layer = -1;
1149 }
1150 }
1173 1151
1174 cpi->lst_fb_idx = params->lst_fb_idx; 1152 cpi->svc.layer_context[params->spatial_layer].svc_params_received =
1175 cpi->gld_fb_idx = params->gld_fb_idx; 1153 *params;
1176 cpi->alt_fb_idx = params->alt_fb_idx;
1177
1178 if (vp9_set_size_literal(ctx->cpi, params->width, params->height) != 0)
1179 return VPX_CODEC_INVALID_PARAM;
1180
1181 ctx->cfg.rc_max_quantizer = params->max_quantizer;
1182 ctx->cfg.rc_min_quantizer = params->min_quantizer;
1183
1184 set_encoder_config(&ctx->oxcf, &ctx->cfg, &ctx->extra_cfg);
1185 vp9_change_config(ctx->cpi, &ctx->oxcf);
1186 1154
1187 return VPX_CODEC_OK; 1155 return VPX_CODEC_OK;
1188 } 1156 }
1189 1157
1190 static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = { 1158 static vpx_codec_ctrl_fn_map_t encoder_ctrl_maps[] = {
1191 {VP8_COPY_REFERENCE, ctrl_copy_reference}, 1159 {VP8_COPY_REFERENCE, ctrl_copy_reference},
1192 {VP8E_UPD_ENTROPY, ctrl_update_entropy}, 1160 {VP8E_UPD_ENTROPY, ctrl_update_entropy},
1193 {VP8E_UPD_REFERENCE, ctrl_update_reference}, 1161 {VP8E_UPD_REFERENCE, ctrl_update_reference},
1194 {VP8E_USE_REFERENCE, ctrl_use_reference}, 1162 {VP8E_USE_REFERENCE, ctrl_use_reference},
1195 1163
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1313 { // NOLINT 1281 { // NOLINT
1314 encoder_usage_cfg_map, // vpx_codec_enc_cfg_map_t 1282 encoder_usage_cfg_map, // vpx_codec_enc_cfg_map_t
1315 encoder_encode, // vpx_codec_encode_fn_t 1283 encoder_encode, // vpx_codec_encode_fn_t
1316 encoder_get_cxdata, // vpx_codec_get_cx_data_fn_t 1284 encoder_get_cxdata, // vpx_codec_get_cx_data_fn_t
1317 encoder_set_config, // vpx_codec_enc_config_set_fn_t 1285 encoder_set_config, // vpx_codec_enc_config_set_fn_t
1318 NOT_IMPLEMENTED, // vpx_codec_get_global_headers_fn_t 1286 NOT_IMPLEMENTED, // vpx_codec_get_global_headers_fn_t
1319 encoder_get_preview, // vpx_codec_get_preview_frame_fn_t 1287 encoder_get_preview, // vpx_codec_get_preview_frame_fn_t
1320 NOT_IMPLEMENTED // vpx_codec_enc_mr_get_mem_loc_fn_t 1288 NOT_IMPLEMENTED // vpx_codec_enc_mr_get_mem_loc_fn_t
1321 } 1289 }
1322 }; 1290 };
OLDNEW
« no previous file with comments | « source/libvpx/vp9/encoder/x86/vp9_quantize_ssse3_x86_64.asm ('k') | source/libvpx/vp9/vp9_dx_iface.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698