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