diff options
Diffstat (limited to 'third_party/aom/av1/av1_cx_iface.c')
-rw-r--r-- | third_party/aom/av1/av1_cx_iface.c | 381 |
1 files changed, 217 insertions, 164 deletions
diff --git a/third_party/aom/av1/av1_cx_iface.c b/third_party/aom/av1/av1_cx_iface.c index 4e13409df..81fffd1f2 100644 --- a/third_party/aom/av1/av1_cx_iface.c +++ b/third_party/aom/av1/av1_cx_iface.c @@ -55,10 +55,8 @@ struct av1_extracfg { unsigned int qm_min; unsigned int qm_max; #endif -#if CONFIG_TILE_GROUPS unsigned int num_tg; unsigned int mtu_size; -#endif #if CONFIG_TEMPMV_SIGNALING unsigned int disable_tempmv; #endif @@ -71,6 +69,10 @@ struct av1_extracfg { aom_bit_depth_t bit_depth; aom_tune_content content; aom_color_space_t color_space; +#if CONFIG_COLORSPACE_HEADERS + aom_transfer_function_t transfer_function; + aom_chroma_sample_position_t chroma_sample_position; +#endif int color_range; int render_width; int render_height; @@ -79,7 +81,7 @@ struct av1_extracfg { int ans_window_size_log2; #endif #if CONFIG_EXT_TILE - unsigned int tile_encoding_mode; + unsigned int single_tile_decoding; #endif // CONFIG_EXT_TILE unsigned int motion_vector_unit_test; @@ -94,15 +96,10 @@ static struct av1_extracfg default_extra_cfg = { 0, // noise_sensitivity 0, // sharpness 0, // static_thresh -#if CONFIG_EXT_TILE - UINT_MAX, // tile_columns - UINT_MAX, // tile_rows -#else - 0, // tile_columns - 0, // tile_rows -#endif // CONFIG_EXT_TILE + 0, // tile_columns + 0, // tile_rows #if CONFIG_DEPENDENT_HORZTILES - 0, // Depdendent Horizontal tiles + 0, // Dependent Horizontal tiles #endif #if CONFIG_LOOPFILTERING_ACROSS_TILES 1, // loop_filter_across_tiles_enabled @@ -122,10 +119,8 @@ static struct av1_extracfg default_extra_cfg = { DEFAULT_QM_FIRST, // qm_min DEFAULT_QM_LAST, // qm_max #endif -#if CONFIG_TILE_GROUPS 1, // max number of tile groups 0, // mtu_size -#endif #if CONFIG_TEMPMV_SIGNALING 0, // disable temporal mv prediction #endif @@ -134,10 +129,14 @@ static struct av1_extracfg default_extra_cfg = { #if CONFIG_EXT_DELTA_Q NO_DELTA_Q, // deltaq_mode #endif - CONFIG_XIPHRC, // frame_periodic_delta_q - AOM_BITS_8, // Bit depth - AOM_CONTENT_DEFAULT, // content - AOM_CS_UNKNOWN, // color space + CONFIG_XIPHRC, // frame_periodic_delta_q + AOM_BITS_8, // Bit depth + AOM_CONTENT_DEFAULT, // content + AOM_CS_UNKNOWN, // color space +#if CONFIG_COLORSPACE_HEADERS + AOM_TF_UNKNOWN, // transfer function + AOM_CSP_UNKNOWN, // chroma sample position +#endif 0, // color range 0, // render width 0, // render height @@ -146,7 +145,7 @@ static struct av1_extracfg default_extra_cfg = { 23, // ans_window_size_log2 #endif #if CONFIG_EXT_TILE - 0, // Tile encoding mode is TILE_NORMAL by default. + 0, // Single tile decoding is off by default. #endif // CONFIG_EXT_TILE 0, // motion_vector_unit_test @@ -235,10 +234,7 @@ static aom_codec_err_t validate_config(aom_codec_alg_priv_t *ctx, RANGE_CHECK_HI(cfg, rc_overshoot_pct, 100); RANGE_CHECK_HI(cfg, rc_2pass_vbr_bias_pct, 100); RANGE_CHECK(cfg, kf_mode, AOM_KF_DISABLED, AOM_KF_AUTO); - RANGE_CHECK_BOOL(cfg, rc_resize_allowed); RANGE_CHECK_HI(cfg, rc_dropframe_thresh, 100); - RANGE_CHECK_HI(cfg, rc_resize_up_thresh, 100); - RANGE_CHECK_HI(cfg, rc_resize_down_thresh, 100); RANGE_CHECK(cfg, g_pass, AOM_RC_ONE_PASS, AOM_RC_LAST_PASS); RANGE_CHECK_HI(extra_cfg, min_gf_interval, MAX_LAG_BUFFERS - 1); RANGE_CHECK_HI(extra_cfg, max_gf_interval, MAX_LAG_BUFFERS - 1); @@ -250,10 +246,18 @@ static aom_codec_err_t validate_config(aom_codec_alg_priv_t *ctx, (MAX_LAG_BUFFERS - 1)); } - if (cfg->rc_resize_allowed == 1) { - RANGE_CHECK_HI(cfg, rc_scaled_width, cfg->g_w); - RANGE_CHECK_HI(cfg, rc_scaled_height, cfg->g_h); - } + RANGE_CHECK_HI(cfg, rc_resize_mode, RESIZE_DYNAMIC); + RANGE_CHECK(cfg, rc_resize_numerator, SCALE_DENOMINATOR / 2, + SCALE_DENOMINATOR); + RANGE_CHECK(cfg, rc_resize_kf_numerator, SCALE_DENOMINATOR / 2, + SCALE_DENOMINATOR); +#if CONFIG_FRAME_SUPERRES + RANGE_CHECK_HI(cfg, rc_superres_mode, SUPERRES_DYNAMIC); + RANGE_CHECK(cfg, rc_superres_numerator, SCALE_DENOMINATOR / 2, + SCALE_DENOMINATOR); + RANGE_CHECK(cfg, rc_superres_kf_numerator, SCALE_DENOMINATOR / 2, + SCALE_DENOMINATOR); +#endif // CONFIG_FRAME_SUPERRES // AV1 does not support a lower bound on the keyframe interval in // automatic keyframe placement mode. @@ -273,28 +277,34 @@ static aom_codec_err_t validate_config(aom_codec_alg_priv_t *ctx, RANGE_CHECK(extra_cfg, superblock_size, AOM_SUPERBLOCK_SIZE_64X64, AOM_SUPERBLOCK_SIZE_DYNAMIC); #if CONFIG_EXT_TILE + RANGE_CHECK_HI(cfg, large_scale_tile, 1); + RANGE_CHECK_HI(extra_cfg, single_tile_decoding, 1); + + if (cfg->large_scale_tile) { // TODO(any): Waring. If CONFIG_EXT_TILE is true, tile_columns really // means tile_width, and tile_rows really means tile_hight. The interface // should be sanitized. #if CONFIG_EXT_PARTITION - if (extra_cfg->superblock_size != AOM_SUPERBLOCK_SIZE_64X64) { - if (extra_cfg->tile_columns != UINT_MAX) - RANGE_CHECK(extra_cfg, tile_columns, 1, 32); - if (extra_cfg->tile_rows != UINT_MAX) - RANGE_CHECK(extra_cfg, tile_rows, 1, 32); - } else + if (extra_cfg->superblock_size != AOM_SUPERBLOCK_SIZE_64X64) { + if (extra_cfg->tile_columns != 0) + RANGE_CHECK(extra_cfg, tile_columns, 1, 32); + if (extra_cfg->tile_rows != 0) RANGE_CHECK(extra_cfg, tile_rows, 1, 32); + } else { #endif // CONFIG_EXT_PARTITION - { - if (extra_cfg->tile_columns != UINT_MAX) - RANGE_CHECK(extra_cfg, tile_columns, 1, 64); - if (extra_cfg->tile_rows != UINT_MAX) - RANGE_CHECK(extra_cfg, tile_rows, 1, 64); + if (extra_cfg->tile_columns != 0) + RANGE_CHECK(extra_cfg, tile_columns, 1, 64); + if (extra_cfg->tile_rows != 0) RANGE_CHECK(extra_cfg, tile_rows, 1, 64); +#if CONFIG_EXT_PARTITION + } +#endif // CONFIG_EXT_PARTITION + } else { +#endif // CONFIG_EXT_TILE + RANGE_CHECK_HI(extra_cfg, tile_columns, 6); + RANGE_CHECK_HI(extra_cfg, tile_rows, 2); +#if CONFIG_EXT_TILE } - RANGE_CHECK_HI(extra_cfg, tile_encoding_mode, 1); -#else - RANGE_CHECK_HI(extra_cfg, tile_columns, 6); - RANGE_CHECK_HI(extra_cfg, tile_rows, 2); #endif // CONFIG_EXT_TILE + #if CONFIG_DEPENDENT_HORZTILES RANGE_CHECK_HI(extra_cfg, dependent_horz_tiles, 1); #endif @@ -354,7 +364,14 @@ static aom_codec_err_t validate_config(aom_codec_alg_priv_t *ctx, cfg->g_bit_depth == AOM_BITS_8) { ERROR("Codec bit-depth 8 not supported in profile > 1"); } +#if CONFIG_COLORSPACE_HEADERS + RANGE_CHECK(extra_cfg, color_space, AOM_CS_UNKNOWN, AOM_CS_ICTCP); + RANGE_CHECK(extra_cfg, transfer_function, AOM_TF_UNKNOWN, AOM_TF_HLG); + RANGE_CHECK(extra_cfg, chroma_sample_position, AOM_CSP_UNKNOWN, + AOM_CSP_COLOCATED); +#else RANGE_CHECK(extra_cfg, color_space, AOM_CS_UNKNOWN, AOM_CS_SRGB); +#endif RANGE_CHECK(extra_cfg, color_range, 0, 1); #if CONFIG_ANS && ANS_MAX_SYMBOLS RANGE_CHECK(extra_cfg, ans_window_size_log2, 8, 23); @@ -461,10 +478,12 @@ static aom_codec_err_t set_encoder_config( oxcf->qm_maxlevel = extra_cfg->qm_max; #endif -#if CONFIG_TILE_GROUPS oxcf->num_tile_groups = extra_cfg->num_tg; +#if CONFIG_EXT_TILE + // In large-scale tile encoding mode, num_tile_groups is always 1. + if (cfg->large_scale_tile) oxcf->num_tile_groups = 1; +#endif // CONFIG_EXT_TILE oxcf->mtu = extra_cfg->mtu_size; -#endif #if CONFIG_TEMPMV_SIGNALING oxcf->disable_tempmv = extra_cfg->disable_tempmv; @@ -472,26 +491,23 @@ static aom_codec_err_t set_encoder_config( oxcf->under_shoot_pct = cfg->rc_undershoot_pct; oxcf->over_shoot_pct = cfg->rc_overshoot_pct; - oxcf->scaled_frame_width = cfg->rc_scaled_width; - oxcf->scaled_frame_height = cfg->rc_scaled_height; - if (cfg->rc_resize_allowed == 1) { - oxcf->resize_mode = - (oxcf->scaled_frame_width == 0 || oxcf->scaled_frame_height == 0) - ? RESIZE_DYNAMIC - : RESIZE_FIXED; - } else { + oxcf->resize_mode = (RESIZE_MODE)cfg->rc_resize_mode; + oxcf->resize_scale_numerator = (uint8_t)cfg->rc_resize_numerator; + oxcf->resize_kf_scale_numerator = (uint8_t)cfg->rc_resize_kf_numerator; + if (oxcf->resize_mode == RESIZE_FIXED && + oxcf->resize_scale_numerator == SCALE_DENOMINATOR && + oxcf->resize_kf_scale_numerator == SCALE_DENOMINATOR) oxcf->resize_mode = RESIZE_NONE; - } - - // Initialize to input resolution if not specified. - if (oxcf->resize_mode != RESIZE_FIXED) { - oxcf->scaled_frame_width = oxcf->width; - oxcf->scaled_frame_height = oxcf->height; - } #if CONFIG_FRAME_SUPERRES - oxcf->superres_enabled = 1; // TODO(afergs): Check the config -#endif // CONFIG_FRAME_SUPERRES + oxcf->superres_mode = (SUPERRES_MODE)cfg->rc_superres_mode; + oxcf->superres_scale_numerator = (uint8_t)cfg->rc_superres_numerator; + oxcf->superres_kf_scale_numerator = (uint8_t)cfg->rc_superres_kf_numerator; + if (oxcf->superres_mode == SUPERRES_FIXED && + oxcf->superres_scale_numerator == SCALE_DENOMINATOR && + oxcf->superres_kf_scale_numerator == SCALE_DENOMINATOR) + oxcf->superres_mode = SUPERRES_NONE; +#endif // CONFIG_FRAME_SUPERRES oxcf->maximum_buffer_size_ms = is_vbr ? 240000 : cfg->rc_buf_sz; oxcf->starting_buffer_level_ms = is_vbr ? 60000 : cfg->rc_buf_initial_sz; @@ -523,6 +539,10 @@ static aom_codec_err_t set_encoder_config( #endif oxcf->color_space = extra_cfg->color_space; +#if CONFIG_COLORSPACE_HEADERS + oxcf->transfer_function = extra_cfg->transfer_function; + oxcf->chroma_sample_position = extra_cfg->chroma_sample_position; +#endif oxcf->color_range = extra_cfg->color_range; oxcf->render_width = extra_cfg->render_width; oxcf->render_height = extra_cfg->render_height; @@ -542,23 +562,38 @@ static aom_codec_err_t set_encoder_config( #endif // CONFIG_ANS && ANS_MAX_SYMBOLS #if CONFIG_EXT_TILE - { + oxcf->large_scale_tile = cfg->large_scale_tile; + oxcf->single_tile_decoding = + (oxcf->large_scale_tile) ? extra_cfg->single_tile_decoding : 0; + if (oxcf->large_scale_tile) { #if CONFIG_EXT_PARTITION const unsigned int max = extra_cfg->superblock_size == AOM_SUPERBLOCK_SIZE_64X64 ? 64 : 32; #else const unsigned int max = 64; #endif // CONFIG_EXT_PARTITION - oxcf->tile_columns = AOMMIN(extra_cfg->tile_columns, max); - oxcf->tile_rows = AOMMIN(extra_cfg->tile_rows, max); - oxcf->tile_encoding_mode = extra_cfg->tile_encoding_mode; + // If tile size is not set, set it to the default value. + const unsigned int tc = + (!extra_cfg->tile_columns) ? UINT_MAX : extra_cfg->tile_columns; + const unsigned int tr = + (!extra_cfg->tile_rows) ? UINT_MAX : extra_cfg->tile_rows; + + oxcf->tile_columns = AOMMIN(tc, max); + oxcf->tile_rows = AOMMIN(tr, max); + } else { +#endif // CONFIG_EXT_TILE + oxcf->tile_columns = extra_cfg->tile_columns; + oxcf->tile_rows = extra_cfg->tile_rows; +#if CONFIG_EXT_TILE } -#else - oxcf->tile_columns = extra_cfg->tile_columns; - oxcf->tile_rows = extra_cfg->tile_rows; #endif // CONFIG_EXT_TILE + #if CONFIG_DEPENDENT_HORZTILES - oxcf->dependent_horz_tiles = extra_cfg->dependent_horz_tiles; + oxcf->dependent_horz_tiles = +#if CONFIG_EXT_TILE + (cfg->large_scale_tile) ? 0 : +#endif // CONFIG_EXT_TILE + extra_cfg->dependent_horz_tiles; #endif #if CONFIG_LOOPFILTERING_ACROSS_TILES oxcf->loop_filter_across_tiles_enabled = @@ -828,7 +863,6 @@ static aom_codec_err_t ctrl_set_qm_max(aom_codec_alg_priv_t *ctx, } #endif -#if CONFIG_TILE_GROUPS static aom_codec_err_t ctrl_set_num_tg(aom_codec_alg_priv_t *ctx, va_list args) { struct av1_extracfg extra_cfg = ctx->extra_cfg; @@ -841,7 +875,6 @@ static aom_codec_err_t ctrl_set_mtu(aom_codec_alg_priv_t *ctx, va_list args) { extra_cfg.mtu_size = CAST(AV1E_SET_MTU, args); return update_extra_cfg(ctx, &extra_cfg); } -#endif #if CONFIG_TEMPMV_SIGNALING static aom_codec_err_t ctrl_set_disable_tempmv(aom_codec_alg_priv_t *ctx, va_list args) { @@ -859,10 +892,10 @@ static aom_codec_err_t ctrl_set_frame_parallel_decoding_mode( } #if CONFIG_EXT_TILE -static aom_codec_err_t ctrl_set_tile_encoding_mode(aom_codec_alg_priv_t *ctx, - va_list args) { +static aom_codec_err_t ctrl_set_single_tile_decoding(aom_codec_alg_priv_t *ctx, + va_list args) { struct av1_extracfg extra_cfg = ctx->extra_cfg; - extra_cfg.tile_encoding_mode = CAST(AV1E_SET_TILE_ENCODING_MODE, args); + extra_cfg.single_tile_decoding = CAST(AV1E_SET_SINGLE_TILE_DECODING, args); return update_extra_cfg(ctx, &extra_cfg); } #endif // CONFIG_EXT_TILE @@ -992,12 +1025,10 @@ static void pick_quickcompress_mode(aom_codec_alg_priv_t *ctx, } // Turn on to test if supplemental superframe data breaks decoding -// #define TEST_SUPPLEMENTAL_SUPERFRAME_DATA +#define TEST_SUPPLEMENTAL_SUPERFRAME_DATA 0 + static int write_superframe_index(aom_codec_alg_priv_t *ctx) { uint8_t marker = 0xc0; - unsigned int mask; - int mag, index_sz; - int i; size_t max_frame_sz = 0; assert(ctx->pending_frame_count); @@ -1005,12 +1036,14 @@ static int write_superframe_index(aom_codec_alg_priv_t *ctx) { // Add the number of frames to the marker byte marker |= ctx->pending_frame_count - 1; - for (i = 0; i < ctx->pending_frame_count - 1; i++) { - const size_t frame_sz = (unsigned int)ctx->pending_frame_sizes[i] - 1; - max_frame_sz = frame_sz > max_frame_sz ? frame_sz : max_frame_sz; + for (int i = 0; i < ctx->pending_frame_count - 1; i++) { + const size_t frame_sz = ctx->pending_frame_sizes[i] - 1; + max_frame_sz = AOMMAX(frame_sz, max_frame_sz); } // Choose the magnitude + int mag; + unsigned int mask; for (mag = 0, mask = 0xff; mag < 4; mag++) { if (max_frame_sz <= mask) break; mask <<= 8; @@ -1019,43 +1052,43 @@ static int write_superframe_index(aom_codec_alg_priv_t *ctx) { marker |= mag << 3; // Write the index - index_sz = 2 + (mag + 1) * (ctx->pending_frame_count - 1); - if (ctx->pending_cx_data_sz + index_sz < ctx->cx_data_sz) { - uint8_t *x = ctx->pending_cx_data + ctx->pending_cx_data_sz; -#ifdef TEST_SUPPLEMENTAL_SUPERFRAME_DATA + uint8_t buffer[256]; + uint8_t *x = buffer; + + if (TEST_SUPPLEMENTAL_SUPERFRAME_DATA) { uint8_t marker_test = 0xc0; int mag_test = 2; // 1 - 4 int frames_test = 4; // 1 - 8 - int index_sz_test = 2 + mag_test * frames_test; marker_test |= frames_test - 1; marker_test |= (mag_test - 1) << 3; *x++ = marker_test; - for (i = 0; i < mag_test * frames_test; ++i) + for (int i = 0; i < mag_test * frames_test; ++i) *x++ = 0; // fill up with arbitrary data *x++ = marker_test; - ctx->pending_cx_data_sz += index_sz_test; printf("Added supplemental superframe data\n"); -#endif - - *x++ = marker; - for (i = 0; i < ctx->pending_frame_count - 1; i++) { - unsigned int this_sz; - int j; + } - assert(ctx->pending_frame_sizes[i] > 0); - this_sz = (unsigned int)ctx->pending_frame_sizes[i] - 1; - for (j = 0; j <= mag; j++) { - *x++ = this_sz & 0xff; - this_sz >>= 8; - } + *x++ = marker; + for (int i = 0; i < ctx->pending_frame_count - 1; i++) { + assert(ctx->pending_frame_sizes[i] > 0); + unsigned int this_sz = (unsigned int)ctx->pending_frame_sizes[i] - 1; + for (int j = 0; j <= mag; j++) { + *x++ = this_sz & 0xff; + this_sz >>= 8; } - *x++ = marker; - ctx->pending_cx_data_sz += index_sz; -#ifdef TEST_SUPPLEMENTAL_SUPERFRAME_DATA - index_sz += index_sz_test; -#endif } - return index_sz; + *x++ = marker; + + const size_t index_sz = x - buffer; + assert(ctx->pending_cx_data_sz + index_sz < ctx->cx_data_sz); + + // move the frame to make room for the index + memmove(ctx->pending_cx_data + index_sz, ctx->pending_cx_data, + ctx->pending_cx_data_sz); + memcpy(ctx->pending_cx_data, buffer, index_sz); + ctx->pending_cx_data_sz += index_sz; + + return (int)index_sz; } // av1 uses 10,000,000 ticks/second as time stamp @@ -1091,10 +1124,8 @@ static aom_codec_err_t encoder_encode(aom_codec_alg_priv_t *ctx, unsigned long deadline) { const size_t kMinCompressedSize = 8192; volatile aom_codec_err_t res = AOM_CODEC_OK; - volatile aom_enc_frame_flags_t flags = enc_flags; AV1_COMP *const cpi = ctx->cpi; const aom_rational_t *const timebase = &ctx->cfg.g_timebase; - size_t data_sz; if (cpi == NULL) return AOM_CODEC_INVALID_PARAM; @@ -1104,14 +1135,15 @@ static aom_codec_err_t encoder_encode(aom_codec_alg_priv_t *ctx, // failure condition, encoder setup is done fully in init() currently. if (res == AOM_CODEC_OK) { #if CONFIG_EXT_REFS - data_sz = ALIGN_POWER_OF_TWO(ctx->cfg.g_w, 5) * - ALIGN_POWER_OF_TWO(ctx->cfg.g_h, 5) * get_image_bps(img); + size_t data_sz = ALIGN_POWER_OF_TWO(ctx->cfg.g_w, 5) * + ALIGN_POWER_OF_TWO(ctx->cfg.g_h, 5) * get_image_bps(img); #else // There's no codec control for multiple alt-refs so check the encoder // instance for its status to determine the compressed data size. - data_sz = ALIGN_POWER_OF_TWO(ctx->cfg.g_w, 5) * - ALIGN_POWER_OF_TWO(ctx->cfg.g_h, 5) * get_image_bps(img) / 8 * - (cpi->multi_arf_allowed ? 8 : 2); + size_t data_sz = ALIGN_POWER_OF_TWO(ctx->cfg.g_w, 5) * + ALIGN_POWER_OF_TWO(ctx->cfg.g_h, 5) * + get_image_bps(img) / 8 * + (cpi->multi_arf_allowed ? 8 : 2); #endif // CONFIG_EXT_REFS if (data_sz < kMinCompressedSize) data_sz = kMinCompressedSize; if (ctx->cx_data == NULL || ctx->cx_data_sz < data_sz) { @@ -1128,6 +1160,8 @@ static aom_codec_err_t encoder_encode(aom_codec_alg_priv_t *ctx, pick_quickcompress_mode(ctx, deadline); aom_codec_pkt_list_init(&ctx->pkt_list); + volatile aom_enc_frame_flags_t flags = enc_flags; + // Handle Flags if (((flags & AOM_EFLAG_NO_UPD_GF) && (flags & AOM_EFLAG_FORCE_GF)) || ((flags & AOM_EFLAG_NO_UPD_ARF) && (flags & AOM_EFLAG_FORCE_ARF))) { @@ -1155,18 +1189,15 @@ static aom_codec_err_t encoder_encode(aom_codec_alg_priv_t *ctx, } if (res == AOM_CODEC_OK) { - unsigned int lib_flags = 0; - YV12_BUFFER_CONFIG sd; int64_t dst_time_stamp = timebase_units_to_ticks(timebase, pts); int64_t dst_end_time_stamp = timebase_units_to_ticks(timebase, pts + duration); - size_t size, cx_data_sz; - unsigned char *cx_data; // Set up internal flags if (ctx->base.init_flags & AOM_CODEC_USE_PSNR) cpi->b_calculate_psnr = 1; if (img != NULL) { + YV12_BUFFER_CONFIG sd; res = image2yuvconfig(img, &sd); // Store the original flags in to the frame buffer. Will extract the @@ -1178,8 +1209,8 @@ static aom_codec_err_t encoder_encode(aom_codec_alg_priv_t *ctx, ctx->next_frame_flags = 0; } - cx_data = ctx->cx_data; - cx_data_sz = ctx->cx_data_sz; + unsigned char *cx_data = ctx->cx_data; + size_t cx_data_sz = ctx->cx_data_sz; /* Any pending invisible frames? */ if (ctx->pending_cx_data) { @@ -1198,8 +1229,10 @@ static aom_codec_err_t encoder_encode(aom_codec_alg_priv_t *ctx, } } + size_t frame_size; + unsigned int lib_flags = 0; while (cx_data_sz >= ctx->cx_data_sz / 2 && - -1 != av1_get_compressed_data(cpi, &lib_flags, &size, cx_data, + -1 != av1_get_compressed_data(cpi, &lib_flags, &frame_size, cx_data, &dst_time_stamp, &dst_end_time_stamp, !img)) { #if CONFIG_REFERENCE_BUFFER @@ -1208,47 +1241,45 @@ static aom_codec_err_t encoder_encode(aom_codec_alg_priv_t *ctx, return AOM_CODEC_ERROR; } #endif - if (size) { - aom_codec_cx_pkt_t pkt; - - // Pack invisible frames with the next visible frame - if (!cpi->common.show_frame) { - if (ctx->pending_cx_data == 0) ctx->pending_cx_data = cx_data; - ctx->pending_cx_data_sz += size; - ctx->pending_frame_sizes[ctx->pending_frame_count++] = size; - cx_data += size; - cx_data_sz -= size; - - continue; - } + if (!frame_size) continue; - // Add the frame packet to the list of returned packets. - pkt.kind = AOM_CODEC_CX_FRAME_PKT; - pkt.data.frame.pts = ticks_to_timebase_units(timebase, dst_time_stamp); - pkt.data.frame.duration = (unsigned long)ticks_to_timebase_units( - timebase, dst_end_time_stamp - dst_time_stamp); - pkt.data.frame.flags = get_frame_pkt_flags(cpi, lib_flags); - - if (ctx->pending_cx_data) { - ctx->pending_frame_sizes[ctx->pending_frame_count++] = size; - ctx->pending_cx_data_sz += size; - size += write_superframe_index(ctx); - pkt.data.frame.buf = ctx->pending_cx_data; - pkt.data.frame.sz = ctx->pending_cx_data_sz; - ctx->pending_cx_data = NULL; - ctx->pending_cx_data_sz = 0; - ctx->pending_frame_count = 0; - } else { - pkt.data.frame.buf = cx_data; - pkt.data.frame.sz = size; - } - pkt.data.frame.partition_id = -1; + if (ctx->pending_cx_data == 0) ctx->pending_cx_data = cx_data; + + ctx->pending_frame_sizes[ctx->pending_frame_count++] = frame_size; + ctx->pending_cx_data_sz += frame_size; + + cx_data += frame_size; + cx_data_sz -= frame_size; - aom_codec_pkt_list_add(&ctx->pkt_list.head, &pkt); + // invisible frames get packed with the next visible frame + if (!cpi->common.show_frame) continue; - cx_data += size; - cx_data_sz -= size; + // insert superframe index if needed + if (ctx->pending_frame_count > 1) { + const size_t index_size = write_superframe_index(ctx); + cx_data += index_size; + cx_data_sz -= index_size; } + + // Add the frame packet to the list of returned packets. + aom_codec_cx_pkt_t pkt; + + pkt.kind = AOM_CODEC_CX_FRAME_PKT; + + pkt.data.frame.buf = ctx->pending_cx_data; + pkt.data.frame.sz = ctx->pending_cx_data_sz; + pkt.data.frame.partition_id = -1; + + pkt.data.frame.pts = ticks_to_timebase_units(timebase, dst_time_stamp); + pkt.data.frame.flags = get_frame_pkt_flags(cpi, lib_flags); + pkt.data.frame.duration = (uint32_t)ticks_to_timebase_units( + timebase, dst_end_time_stamp - dst_time_stamp); + + aom_codec_pkt_list_add(&ctx->pkt_list.head, &pkt); + + ctx->pending_cx_data = NULL; + ctx->pending_cx_data_sz = 0; + ctx->pending_frame_count = 0; } } @@ -1419,6 +1450,23 @@ static aom_codec_err_t ctrl_set_color_space(aom_codec_alg_priv_t *ctx, return update_extra_cfg(ctx, &extra_cfg); } +#if CONFIG_COLORSPACE_HEADERS +static aom_codec_err_t ctrl_set_transfer_function(aom_codec_alg_priv_t *ctx, + va_list args) { + struct av1_extracfg extra_cfg = ctx->extra_cfg; + extra_cfg.transfer_function = CAST(AV1E_SET_TRANSFER_FUNCTION, args); + return update_extra_cfg(ctx, &extra_cfg); +} + +static aom_codec_err_t ctrl_set_chroma_sample_position( + aom_codec_alg_priv_t *ctx, va_list args) { + struct av1_extracfg extra_cfg = ctx->extra_cfg; + extra_cfg.chroma_sample_position = + CAST(AV1E_SET_CHROMA_SAMPLE_POSITION, args); + return update_extra_cfg(ctx, &extra_cfg); +} +#endif + static aom_codec_err_t ctrl_set_color_range(aom_codec_alg_priv_t *ctx, va_list args) { struct av1_extracfg extra_cfg = ctx->extra_cfg; @@ -1489,10 +1537,8 @@ static aom_codec_ctrl_fn_map_t encoder_ctrl_maps[] = { { AV1E_SET_QM_MIN, ctrl_set_qm_min }, { AV1E_SET_QM_MAX, ctrl_set_qm_max }, #endif -#if CONFIG_TILE_GROUPS { AV1E_SET_NUM_TG, ctrl_set_num_tg }, { AV1E_SET_MTU, ctrl_set_mtu }, -#endif #if CONFIG_TEMPMV_SIGNALING { AV1E_SET_DISABLE_TEMPMV, ctrl_set_disable_tempmv }, #endif @@ -1504,6 +1550,10 @@ static aom_codec_ctrl_fn_map_t encoder_ctrl_maps[] = { { AV1E_SET_FRAME_PERIODIC_BOOST, ctrl_set_frame_periodic_boost }, { AV1E_SET_TUNE_CONTENT, ctrl_set_tune_content }, { AV1E_SET_COLOR_SPACE, ctrl_set_color_space }, +#if CONFIG_COLORSPACE_HEADERS + { AV1E_SET_TRANSFER_FUNCTION, ctrl_set_transfer_function }, + { AV1E_SET_CHROMA_SAMPLE_POSITION, ctrl_set_chroma_sample_position }, +#endif { AV1E_SET_COLOR_RANGE, ctrl_set_color_range }, { AV1E_SET_NOISE_SENSITIVITY, ctrl_set_noise_sensitivity }, { AV1E_SET_MIN_GF_INTERVAL, ctrl_set_min_gf_interval }, @@ -1514,7 +1564,7 @@ static aom_codec_ctrl_fn_map_t encoder_ctrl_maps[] = { { AV1E_SET_ANS_WINDOW_SIZE_LOG2, ctrl_set_ans_window_size_log2 }, #endif #if CONFIG_EXT_TILE - { AV1E_SET_TILE_ENCODING_MODE, ctrl_set_tile_encoding_mode }, + { AV1E_SET_SINGLE_TILE_DECODING, ctrl_set_single_tile_decoding }, #endif // CONFIG_EXT_TILE { AV1E_ENABLE_MOTION_VECTOR_UNIT_TEST, ctrl_enable_motion_vector_unit_test }, @@ -1549,12 +1599,14 @@ static aom_codec_enc_cfg_map_t encoder_usage_cfg_map[] = { 25, // g_lag_in_frames - 0, // rc_dropframe_thresh - 0, // rc_resize_allowed - 0, // rc_scaled_width - 0, // rc_scaled_height - 60, // rc_resize_down_thresold - 30, // rc_resize_up_thresold + 0, // rc_dropframe_thresh + RESIZE_NONE, // rc_resize_mode + SCALE_DENOMINATOR, // rc_resize_numerator + SCALE_DENOMINATOR, // rc_resize_kf_numerator + + 0, // rc_superres_mode + SCALE_DENOMINATOR, // rc_superres_numerator + SCALE_DENOMINATOR, // rc_superres_kf_numerator AOM_VBR, // rc_end_usage { NULL, 0 }, // rc_twopass_stats_in @@ -1577,6 +1629,7 @@ static aom_codec_enc_cfg_map_t encoder_usage_cfg_map[] = { AOM_KF_AUTO, // g_kfmode 0, // kf_min_dist 9999, // kf_max_dist + 0, // large_scale_tile } }, }; |