1b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian/* 2b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * Copyright (c) 2013 The WebM project authors. All Rights Reserved. 3b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * 4b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * Use of this source code is governed by a BSD-style license 5b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * that can be found in the LICENSE file in the root of the source 6b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * tree. An additional intellectual property rights grant can be found 7b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * in the file PATENTS. All contributing project authors may 8b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian * be found in the AUTHORS file in the root of the source tree. 9b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian */ 10b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 11b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "./warnings.h" 12b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 13b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <assert.h> 14b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <stdio.h> 15b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <stdlib.h> 16b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include <string.h> 17b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 18b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "vpx/vpx_encoder.h" 19b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 20b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "./tools_common.h" 21b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian#include "./vpxenc.h" 22b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 23b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic const char quantizer_warning_string[] = 24b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "Bad quantizer values. Quantizer values should not be equal, and should " 25b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "differ by at least 8."; 26b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic const char lag_in_frames_with_realtime[] = 27b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "Lag in frames is ignored when deadline is set to realtime."; 28b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 29b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct WarningListNode { 30b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const char *warning_string; 31b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningListNode *next_warning; 32b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 33b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 34b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstruct WarningList { 35b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningListNode *warning_node; 36b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian}; 37b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 38b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void add_warning(const char *warning_string, 39b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningList *warning_list) { 40b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningListNode **node = &warning_list->warning_node; 41b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 42b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningListNode *new_node = malloc(sizeof(*new_node)); 43b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (new_node == NULL) { 44b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fatal("Unable to allocate warning node."); 45b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 46b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 47b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian new_node->warning_string = warning_string; 48b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian new_node->next_warning = NULL; 49b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 50b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian while (*node != NULL) 51b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian node = &(*node)->next_warning; 52b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 53b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian *node = new_node; 54b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 55b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 56b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void free_warning_list(struct WarningList *warning_list) { 57b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian while (warning_list->warning_node != NULL) { 58b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningListNode *const node = warning_list->warning_node; 59b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian warning_list->warning_node = node->next_warning; 60b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian free(node); 61b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 62b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 63b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 64b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic int continue_prompt(int num_warnings) { 65b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int c; 66b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian fprintf(stderr, 67b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian "%d encoder configuration warning(s). Continue? (y to continue) ", 68b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian num_warnings); 69b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian c = getchar(); 70b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian return c == 'y'; 71b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 72b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 73b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void check_quantizer(int min_q, int max_q, 74b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningList *warning_list) { 75b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const int lossless = min_q == 0 && max_q == 0; 76b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!lossless && (min_q == max_q || abs(max_q - min_q) < 8)) 77b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian add_warning(quantizer_warning_string, warning_list); 78b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 79b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 80b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianstatic void check_lag_in_frames_realtime_deadline( 81b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int lag_in_frames, 82b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int deadline, 83b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningList *warning_list) { 84b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (deadline == VPX_DL_REALTIME && lag_in_frames != 0) 85b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian add_warning(lag_in_frames_with_realtime, warning_list); 86b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 87b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 88b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanianvoid check_encoder_config(int disable_prompt, 89b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const struct VpxEncoderConfig *global_config, 90b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian const struct vpx_codec_enc_cfg *stream_config) { 91b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian int num_warnings = 0; 92b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningListNode *warning = NULL; 93b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian struct WarningList warning_list = {0}; 94b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 95b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian check_quantizer(stream_config->rc_min_quantizer, 96b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian stream_config->rc_max_quantizer, 97b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian &warning_list); 98b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian check_lag_in_frames_realtime_deadline(stream_config->g_lag_in_frames, 99b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian global_config->deadline, 100b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian &warning_list); 101b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian /* Count and print warnings. */ 102b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian for (warning = warning_list.warning_node; 103b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian warning != NULL; 104b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian warning = warning->next_warning, 105b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian ++num_warnings) { 106b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian warn(warning->warning_string); 107b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 108b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 109b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian free_warning_list(&warning_list); 110b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian 111b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (num_warnings) { 112b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian if (!disable_prompt && !continue_prompt(num_warnings)) 113b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian exit(EXIT_FAILURE); 114b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian } 115b08e2e23eec181e9951df33cd704ac294c5407b6Vignesh Venkatasubramanian} 116