15ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/* 25ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * Copyright (c) 2013 The WebM project authors. All Rights Reserved. 35ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * 45ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * Use of this source code is governed by a BSD-style license 55ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * that can be found in the LICENSE file in the root of the source 65ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * tree. An additional intellectual property rights grant can be found 75ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * in the file PATENTS. All contributing project authors may 85ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * be found in the AUTHORS file in the root of the source tree. 95ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * SvcContext - input parameters and state to encode a multi-layered 135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * spatial SVC frame 145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifndef VPX_SVC_CONTEXT_H_ 175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#define VPX_SVC_CONTEXT_H_ 185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vpx/vp8cx.h" 205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#include "vpx/vpx_encoder.h" 215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef __cplusplus 235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangextern "C" { 245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif 255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef enum SVC_ENCODING_MODE { 275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang INTER_LAYER_PREDICTION_I, 285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang ALT_INTER_LAYER_PREDICTION_IP, 295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang INTER_LAYER_PREDICTION_IP, 305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang USE_GOLDEN_FRAME 315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} SVC_ENCODING_MODE; 325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef enum SVC_LOG_LEVEL { 345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang SVC_LOG_ERROR, 355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang SVC_LOG_INFO, 365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang SVC_LOG_DEBUG 375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} SVC_LOG_LEVEL; 385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangtypedef struct { 405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // public interface to svc_command options 415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int spatial_layers; // number of layers 425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int first_frame_full_size; // set to one to force first frame full size 435ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang SVC_ENCODING_MODE encoding_mode; // svc encoding strategy 445ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang SVC_LOG_LEVEL log_level; // amount of information to display 455ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int log_print; // when set, printf log messages instead of returning the 465ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // message with svc_get_message 475ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 485ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang // private storage for vpx_svc_encode 495ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang void *internal; 505ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} SvcContext; 515ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 525ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 535ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * Set SVC options 545ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * options are supplied as a single string separated by spaces 555ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * Format: encoding-mode=<i|ip|alt-ip|gf> 565ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * layers=<layer_count> 575ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * scaling-factors=<n1>/<d1>,<n2>/<d2>,... 585ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * quantizers=<q1>,<q2>,... 595ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 605ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvpx_codec_err_t vpx_svc_set_options(SvcContext *svc_ctx, const char *options); 615ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 625ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 635ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * Set SVC quantizer values 645ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * values comma separated, ordered from lowest resolution to highest 655ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * e.g., "60,53,39,33,27" 665ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 675ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvpx_codec_err_t vpx_svc_set_quantizers(SvcContext *svc_ctx, 685ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const char *quantizer_values); 695ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 705ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 715ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * Set SVC scale factors 725ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * values comma separated, ordered from lowest resolution to highest 735ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * e.g., "4/16,5/16,7/16,11/16,16/16" 745ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 755ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvpx_codec_err_t vpx_svc_set_scale_factors(SvcContext *svc_ctx, 765ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang const char *scale_factors); 775ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 785ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 795ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * initialize SVC encoding 805ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 815ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvpx_codec_err_t vpx_svc_init(SvcContext *svc_ctx, vpx_codec_ctx_t *codec_ctx, 825ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_codec_iface_t *iface, 835ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang vpx_codec_enc_cfg_t *cfg); 845ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 855ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * encode a frame of video with multiple layers 865ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 875ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvpx_codec_err_t vpx_svc_encode(SvcContext *svc_ctx, vpx_codec_ctx_t *codec_ctx, 885ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang struct vpx_image *rawimg, vpx_codec_pts_t pts, 895ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int64_t duration, int deadline); 905ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 915ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 925ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * finished with svc encoding, release allocated resources 935ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 945ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid vpx_svc_release(SvcContext *svc_ctx); 955ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 965ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 975ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * dump accumulated statistics and reset accumulated values 985ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 995ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char *vpx_svc_dump_statistics(SvcContext *svc_ctx); 1005ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1015ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 1025ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * get status message from previous encode 1035ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 1045ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangconst char *vpx_svc_get_message(const SvcContext *svc_ctx); 1055ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1065ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 1075ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * return size of encoded data to be returned by vpx_svc_get_buffer 1085ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 1095ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangsize_t vpx_svc_get_frame_size(const SvcContext *svc_ctx); 1105ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1115ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 1125ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * return buffer with encoded data 1135ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 1145ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid *vpx_svc_get_buffer(const SvcContext *svc_ctx); 1155ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1165ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 1175ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * return spatial resolution of the specified layer 1185ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 1195ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvpx_codec_err_t vpx_svc_get_layer_resolution(const SvcContext *svc_ctx, 1205ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang int layer, 1215ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang unsigned int *width, 1225ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang unsigned int *height); 1235ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 1245ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * return number of frames that have been encoded 1255ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 1265ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint vpx_svc_get_encode_frame_count(const SvcContext *svc_ctx); 1275ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1285ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 1295ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * return 1 if last encoded frame was a keyframe 1305ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 1315ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangint vpx_svc_is_keyframe(const SvcContext *svc_ctx); 1325ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1335ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang/** 1345ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang * force the next frame to be a keyframe 1355ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang */ 1365ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuangvoid vpx_svc_set_keyframe(SvcContext *svc_ctx); 1375ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1385ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#ifdef __cplusplus 1395ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang} // extern "C" 1405ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif 1415ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang 1425ae7ac49f08a179e4f054d99fcfc9dce78d26e58hkuang#endif /* VPX_SVC_CONTEXT_H_ */ 143