1474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* 2474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Copyright (c) 2010 The WebM project authors. All Rights Reserved. 3474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 4474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * Use of this source code is governed by a BSD-style license 5474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * that can be found in the LICENSE file in the root of the source 6474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * tree. An additional intellectual property rights grant can be found 7474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * in the file PATENTS. All contributing project authors may 8474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * be found in the AUTHORS file in the root of the source tree. 9474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 10474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 11474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 12474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/*!\file 13474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * \brief Provides the high level interface to wrap encoder algorithms. 14474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * 15474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 16474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <limits.h> 17474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include <string.h> 18474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_config.h" 1987997d490ae52aa962a985c95b3cddf7f8832641johannkoenig@chromium.org#include "vpx/internal/vpx_codec_internal.h" 20474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 21474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define SAVE_STATUS(ctx,var) (ctx?(ctx->err = var):var) 22474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 23d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.orgstatic vpx_codec_alg_priv_t *get_alg_priv(vpx_codec_ctx_t *ctx) { 24d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org return (vpx_codec_alg_priv_t *)ctx->priv; 25d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org} 26d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org 27474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvpx_codec_err_t vpx_codec_enc_init_ver(vpx_codec_ctx_t *ctx, 28474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_iface_t *iface, 29d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org const vpx_codec_enc_cfg_t *cfg, 30474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_flags_t flags, 316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org int ver) { 326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_err_t res; 336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (ver != VPX_ENCODER_ABI_VERSION) 356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_ABI_MISMATCH; 366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!ctx || !iface || !cfg) 376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INVALID_PARAM; 386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (iface->abi_version != VPX_CODEC_INTERNAL_ABI_VERSION) 396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_ABI_MISMATCH; 406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!(iface->caps & VPX_CODEC_CAP_ENCODER)) 416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INCAPABLE; 426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if ((flags & VPX_CODEC_USE_PSNR) 436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org && !(iface->caps & VPX_CODEC_CAP_PSNR)) 446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INCAPABLE; 456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if ((flags & VPX_CODEC_USE_OUTPUT_PARTITION) 466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org && !(iface->caps & VPX_CODEC_CAP_OUTPUT_PARTITION)) 476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INCAPABLE; 486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else { 496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->iface = iface; 506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->name = iface->name; 516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv = NULL; 526fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->init_flags = flags; 536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->config.enc = cfg; 546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = ctx->iface->init(ctx, NULL); 556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (res) { 576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err_detail = ctx->priv ? ctx->priv->err_detail : NULL; 586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_destroy(ctx); 59474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return SAVE_STATUS(ctx, res); 63474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 64474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 65167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.orgvpx_codec_err_t vpx_codec_enc_init_multi_ver(vpx_codec_ctx_t *ctx, 66167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_codec_iface_t *iface, 67167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_codec_enc_cfg_t *cfg, 68167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org int num_enc, 69167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_codec_flags_t flags, 70167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org vpx_rational_t *dsf, 716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org int ver) { 7276e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org vpx_codec_err_t res = VPX_CODEC_OK; 736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (ver != VPX_ENCODER_ABI_VERSION) 756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_ABI_MISMATCH; 766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!ctx || !iface || !cfg || (num_enc > 16 || num_enc < 1)) 776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INVALID_PARAM; 786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (iface->abi_version != VPX_CODEC_INTERNAL_ABI_VERSION) 796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_ABI_MISMATCH; 806fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!(iface->caps & VPX_CODEC_CAP_ENCODER)) 816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INCAPABLE; 826fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if ((flags & VPX_CODEC_USE_PSNR) 836fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org && !(iface->caps & VPX_CODEC_CAP_PSNR)) 846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INCAPABLE; 856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if ((flags & VPX_CODEC_USE_OUTPUT_PARTITION) 866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org && !(iface->caps & VPX_CODEC_CAP_OUTPUT_PARTITION)) 876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INCAPABLE; 886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else { 896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org int i; 906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org void *mem_loc = NULL; 916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 926fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (!(res = iface->enc.mr_get_mem_loc(cfg, &mem_loc))) { 936fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org for (i = 0; i < num_enc; i++) { 946fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_priv_enc_mr_cfg_t mr_cfg; 956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org /* Validate down-sampling factor. */ 976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (dsf->num < 1 || dsf->num > 4096 || dsf->den < 1 || 986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org dsf->den > dsf->num) { 996fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INVALID_PARAM; 1006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org break; 101167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 1026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org mr_cfg.mr_low_res_mode_info = mem_loc; 1046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org mr_cfg.mr_total_resolutions = num_enc; 1056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org mr_cfg.mr_encoder_id = num_enc - 1 - i; 1066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org mr_cfg.mr_down_sampling_factor.num = dsf->num; 1076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org mr_cfg.mr_down_sampling_factor.den = dsf->den; 1086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org /* Force Key-frame synchronization. Namely, encoder at higher 1106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * resolution always use the same frame_type chosen by the 1116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * lowest-resolution encoder. 1126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */ 1136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (mr_cfg.mr_encoder_id) 1146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org cfg->kf_mode = VPX_KF_DISABLED; 1156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->iface = iface; 1176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->name = iface->name; 1186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv = NULL; 1196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->init_flags = flags; 1206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->config.enc = cfg; 1216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = ctx->iface->init(ctx, &mr_cfg); 1226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (res) { 1246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org const char *error_detail = 1256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv ? ctx->priv->err_detail : NULL; 1266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org /* Destroy current ctx */ 1276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err_detail = error_detail; 1286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_destroy(ctx); 1296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org /* Destroy already allocated high-level ctx */ 1316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org while (i) { 1326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx--; 1336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err_detail = error_detail; 1346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_destroy(ctx); 1356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org i--; 1366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 1376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 1386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (res) 1406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org break; 1416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx++; 1436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org cfg++; 1446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org dsf++; 1456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 1460e29f91ae7876791fc422e9c7cea72b1866439a6johannkoenig@chromium.org ctx--; 147167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org } 1486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 149167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org 1506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return SAVE_STATUS(ctx, res); 151167514562bbce1eb0566271d6cb41d90d2b5ffa0hclam@chromium.org} 152474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 153474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 154474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvpx_codec_err_t vpx_codec_enc_config_default(vpx_codec_iface_t *iface, 1556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_enc_cfg_t *cfg, 1566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org unsigned int usage) { 1576fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_err_t res; 1586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_enc_cfg_map_t *map; 15941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org int i; 1606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 1616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (!iface || !cfg || usage > INT_MAX) 1626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INVALID_PARAM; 1636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!(iface->caps & VPX_CODEC_CAP_ENCODER)) 1646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INCAPABLE; 1656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else { 1666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INVALID_PARAM; 1676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 16841294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org for (i = 0; i < iface->enc.cfg_map_count; ++i) { 16941294d96d7dbf9bc215b09832a8336c5fb158f0bjohannkoenig@chromium.org map = iface->enc.cfg_maps + i; 1706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (map->usage == (int)usage) { 1716fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *cfg = map->cfg; 1726fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org cfg->g_usage = usage; 1736fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_OK; 1746fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org break; 1756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 176474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 1776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 178474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 1796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return res; 180474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 181474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 182474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 183474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#if ARCH_X86 || ARCH_X86_64 184474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org/* On X86, disable the x87 unit's internal 80 bit precision for better 185474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org * consistency with the SSE unit's 64 bit precision. 186474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org */ 187474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#include "vpx_ports/x86.h" 188474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define FLOATING_POINT_INIT() do {\ 1896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org unsigned short x87_orig_mode = x87_set_double_precision(); 190474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#define FLOATING_POINT_RESTORE() \ 1916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org x87_set_control_word(x87_orig_mode); }while(0) 192474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 193474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 194474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#else 195474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void FLOATING_POINT_INIT() {} 196474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgstatic void FLOATING_POINT_RESTORE() {} 197474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org#endif 198474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 199474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 200474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvpx_codec_err_t vpx_codec_encode(vpx_codec_ctx_t *ctx, 201474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org const vpx_image_t *img, 202474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_codec_pts_t pts, 203474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org unsigned long duration, 204474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org vpx_enc_frame_flags_t flags, 2056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org unsigned long deadline) { 20676e516e2154f353aa02c504bac88afb0f95fefa7johannkoenig@chromium.org vpx_codec_err_t res = VPX_CODEC_OK; 2076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (!ctx || (img && !duration)) 2096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INVALID_PARAM; 2106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!ctx->iface || !ctx->priv) 2116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_ERROR; 2126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) 2136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INCAPABLE; 2146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else { 2159c920af5cd2f78ab30bb06f01f4a4d9d30d5c92bfgalligan@chromium.org unsigned int num_enc = ctx->priv->enc.total_encoders; 2169c920af5cd2f78ab30bb06f01f4a4d9d30d5c92bfgalligan@chromium.org 2176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org /* Execute in a normalized floating point environment, if the platform 2186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * requires it. 2196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */ 2206fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org FLOATING_POINT_INIT(); 2216fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2226fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (num_enc == 1) 223d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org res = ctx->iface->enc.encode(get_alg_priv(ctx), img, pts, 2246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org duration, flags, deadline); 2256fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else { 2266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org /* Multi-resolution encoding: 2276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * Encode multi-levels in reverse order. For example, 2286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * if mr_total_resolutions = 3, first encode level 2, 2296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org * then encode level 1, and finally encode level 0. 2306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org */ 2316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org int i; 2326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx += num_enc - 1; 2346fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (img) img += num_enc - 1; 2356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org for (i = num_enc - 1; i >= 0; i--) { 237d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org if ((res = ctx->iface->enc.encode(get_alg_priv(ctx), img, pts, 2386fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org duration, flags, deadline))) 2396fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org break; 2406fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx--; 2426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (img) img--; 2436fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 2446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx++; 245474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 246474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 2476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org FLOATING_POINT_RESTORE(); 2486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 2496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return SAVE_STATUS(ctx, res); 251474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 252474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 253474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 254411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.orgconst vpx_codec_cx_pkt_t *vpx_codec_get_cx_data(vpx_codec_ctx_t *ctx, 255411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org vpx_codec_iter_t *iter) { 2566fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org const vpx_codec_cx_pkt_t *pkt = NULL; 257474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 2586fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (ctx) { 2596fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (!iter) 2606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err = VPX_CODEC_INVALID_PARAM; 2616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!ctx->iface || !ctx->priv) 2626fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err = VPX_CODEC_ERROR; 2636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) 2646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err = VPX_CODEC_INCAPABLE; 2656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else 266d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org pkt = ctx->iface->enc.get_cx_data(get_alg_priv(ctx), iter); 2676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 2686fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 2696fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (pkt && pkt->kind == VPX_CODEC_CX_FRAME_PKT) { 270411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org // If the application has specified a destination area for the 271411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org // compressed data, and the codec has not placed the data there, 272411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org // and it fits, copy it. 273411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org vpx_codec_priv_t *const priv = ctx->priv; 274411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org char *const dst_buf = (char *)priv->enc.cx_data_dst_buf.buf; 275411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org 276411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org if (dst_buf && 277411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org pkt->data.raw.buf != dst_buf && 278411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org pkt->data.raw.sz + priv->enc.cx_data_pad_before + 279411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org priv->enc.cx_data_pad_after <= priv->enc.cx_data_dst_buf.sz) { 280411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org vpx_codec_cx_pkt_t *modified_pkt = &priv->enc.cx_data_pkt; 281411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org 282411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org memcpy(dst_buf + priv->enc.cx_data_pad_before, pkt->data.raw.buf, 283411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org pkt->data.raw.sz); 2846fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *modified_pkt = *pkt; 2856fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org modified_pkt->data.raw.buf = dst_buf; 286411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org modified_pkt->data.raw.sz += priv->enc.cx_data_pad_before + 287411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org priv->enc.cx_data_pad_after; 2886fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org pkt = modified_pkt; 2896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 290474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 2916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (dst_buf == pkt->data.raw.buf) { 292411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org priv->enc.cx_data_dst_buf.buf = dst_buf + pkt->data.raw.sz; 293411971f94253c85e1866c281860d6344f6aa0c78fgalligan@chromium.org priv->enc.cx_data_dst_buf.sz -= pkt->data.raw.sz; 294474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org } 2956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 296474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 2976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return pkt; 298474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 299474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 300474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 301474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvpx_codec_err_t vpx_codec_set_cx_data_buf(vpx_codec_ctx_t *ctx, 3026fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org const vpx_fixed_buf_t *buf, 3036fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org unsigned int pad_before, 3046fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org unsigned int pad_after) { 3056fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (!ctx || !ctx->priv) 3066fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return VPX_CODEC_INVALID_PARAM; 3076fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 3086fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (buf) { 3096fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv->enc.cx_data_dst_buf = *buf; 3106fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv->enc.cx_data_pad_before = pad_before; 3116fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv->enc.cx_data_pad_after = pad_after; 3126fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } else { 3136fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv->enc.cx_data_dst_buf.buf = NULL; 3146fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv->enc.cx_data_dst_buf.sz = 0; 3156fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv->enc.cx_data_pad_before = 0; 3166fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->priv->enc.cx_data_pad_after = 0; 3176fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 3186fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 3196fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return VPX_CODEC_OK; 320474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 321474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 322474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3236fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgconst vpx_image_t *vpx_codec_get_preview_frame(vpx_codec_ctx_t *ctx) { 3246fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_image_t *img = NULL; 325474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3266fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (ctx) { 3276fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (!ctx->iface || !ctx->priv) 3286fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err = VPX_CODEC_ERROR; 3296fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) 3306fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err = VPX_CODEC_INCAPABLE; 3316fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!ctx->iface->enc.get_preview) 3326fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err = VPX_CODEC_INCAPABLE; 3336fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else 334d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org img = ctx->iface->enc.get_preview(get_alg_priv(ctx)); 3356fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 3366fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 3376fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return img; 338474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 339474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 340474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3416fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.orgvpx_fixed_buf_t *vpx_codec_get_global_headers(vpx_codec_ctx_t *ctx) { 3426fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_fixed_buf_t *buf = NULL; 343474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3446fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (ctx) { 3456fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (!ctx->iface || !ctx->priv) 3466fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err = VPX_CODEC_ERROR; 3476fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) 3486fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err = VPX_CODEC_INCAPABLE; 3496fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!ctx->iface->enc.get_glob_hdrs) 3506fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org ctx->err = VPX_CODEC_INCAPABLE; 3516fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else 352d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org buf = ctx->iface->enc.get_glob_hdrs(get_alg_priv(ctx)); 3536fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 3546fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org 3556fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return buf; 356474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 357474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 358474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 359474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgvpx_codec_err_t vpx_codec_enc_config_set(vpx_codec_ctx_t *ctx, 3606fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org const vpx_codec_enc_cfg_t *cfg) { 3616fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_err_t res; 362474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3636fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (!ctx || !ctx->iface || !ctx->priv || !cfg) 3646fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INVALID_PARAM; 3656fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else if (!(ctx->iface->caps & VPX_CODEC_CAP_ENCODER)) 3666fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org res = VPX_CODEC_INCAPABLE; 3676fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else 368d95585fb0ec024f6abd96f7b02e0df58019d46afjohannkoenig@chromium.org res = ctx->iface->enc.cfg_set(get_alg_priv(ctx), cfg); 369474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3706fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return SAVE_STATUS(ctx, res); 371474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 372474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 373474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 374474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgint vpx_codec_pkt_list_add(struct vpx_codec_pkt_list *list, 3756fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org const struct vpx_codec_cx_pkt *pkt) { 3766fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (list->cnt < list->max) { 3776fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org list->pkts[list->cnt++] = *pkt; 3786fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return 0; 3796fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 380474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3816fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return 1; 382474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 383474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 384474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 385474eb7536515fb785e925cc9375d22817c416851hclam@chromium.orgconst vpx_codec_cx_pkt_t *vpx_codec_pkt_list_get(struct vpx_codec_pkt_list *list, 3866fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org vpx_codec_iter_t *iter) { 3876fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org const vpx_codec_cx_pkt_t *pkt; 388474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3896fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if (!(*iter)) { 3906fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *iter = list->pkts; 3916fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org } 392474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 39393a74791c8e808ea76001ee07693aa2a5fdd3500johannkoenig@chromium.org pkt = (const vpx_codec_cx_pkt_t *)*iter; 394474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 3956fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org if ((size_t)(pkt - list->pkts) < list->cnt) 3966fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org *iter = pkt + 1; 3976fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org else 3986fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org pkt = NULL; 399474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org 4006fefe538d859300e7febe78271828198c10f1b52fgalligan@chromium.org return pkt; 401474eb7536515fb785e925cc9375d22817c416851hclam@chromium.org} 402