static int enc_get_configuration_list(MSFilter *f, void *data) { const MSVideoConfiguration **vconf_list = (const MSVideoConfiguration **)data; MS_UNUSED(f); if (ms_get_cpu_count() > 1) *vconf_list = &multicore_vp8_conf_list[0]; else *vconf_list = &vp8_conf_list[0]; return 0; }
void MSOpenH264Encoder::initialize() { mFrameCount = 0; mPacker = rfc3984_new(); rfc3984_set_mode(mPacker, mPacketisationMode); rfc3984_enable_stap_a(mPacker, FALSE); if (mEncoder != 0) { SEncParamExt params; int ret = mEncoder->GetDefaultParams(¶ms); if (ret != 0) { ms_error("OpenH264 encoder: Failed getting default params: %d", ret); } else { int targetBitrate, maxBitrate; calcBitrates(targetBitrate, maxBitrate); params.iUsageType = CAMERA_VIDEO_REAL_TIME; params.iInputCsp = videoFormatI420; params.iPicWidth = mVConf.vsize.width; params.iPicHeight = mVConf.vsize.height; params.iTargetBitrate = targetBitrate; params.iMaxBitrate = maxBitrate; params.iRCMode = RC_LOW_BW_MODE; params.fMaxFrameRate = mVConf.fps; params.uiIntraPeriod=mVConf.fps*10; params.bEnableSpsPpsIdAddition=0; //params.bEnableRc = true; params.bEnableFrameSkip = true; params.bPrefixNalAddingCtrl = false; params.uiMaxNalSize = ms_get_payload_max_size(); params.iMultipleThreadIdc = ms_get_cpu_count(); params.bEnableDenoise = false; params.bEnableBackgroundDetection = true; params.bEnableAdaptiveQuant = true; params.bEnableSceneChangeDetect = false; params.bEnableLongTermReference = false; params.iSpatialLayerNum=1; params.sSpatialLayers[0].iVideoWidth = mVConf.vsize.width; params.sSpatialLayers[0].iVideoHeight = mVConf.vsize.height; params.sSpatialLayers[0].fFrameRate = mVConf.fps; params.sSpatialLayers[0].iSpatialBitrate = targetBitrate; params.sSpatialLayers[0].iMaxSpatialBitrate = maxBitrate; params.sSpatialLayers[0].sSliceCfg.uiSliceMode = SM_DYN_SLICE; params.sSpatialLayers[0].sSliceCfg.sSliceArgument.uiSliceSizeConstraint = ms_get_payload_max_size(); ret = mEncoder->InitializeExt(¶ms); if (ret != 0) { ms_error("OpenH264 encoder: Failed to initialize: %d", ret); } else { ret = mEncoder->SetOption(ENCODER_OPTION_TRACE_LEVEL, &debugLevel); if (ret != 0) { ms_error("OpenH264 encoder: Failed setting trace level: %d", ret); } mInitialized = true; } } } }
MSOpenH264Encoder::MSOpenH264Encoder(MSFilter *f) : mFilter(f), mPacker(0), mPacketisationMode(0), mVConfList(openh264_conf_list), mFrameCount(0), mInitialized(false) { mVConf = ms_video_find_best_configuration_for_bitrate(mVConfList, 384000,ms_get_cpu_count()); long ret = WelsCreateSVCEncoder(&mEncoder); if (ret != 0) { ms_error("OpenH264 encoder: Failed to create encoder: %li", ret); } }
static int enc_set_vsize(MSFilter *f, void *arg){ MSVideoConfiguration best_vconf; EncData *d = (EncData *)f->data; MSVideoSize *vs = (MSVideoSize *)arg; best_vconf = ms_video_find_best_configuration_for_size(d->vconf_list, *vs, ms_get_cpu_count()); d->vconf.vsize = *vs; d->vconf.fps = best_vconf.fps; d->vconf.bitrate_limit = best_vconf.bitrate_limit; enc_set_configuration(f, &d->vconf); return 0; }
static void enc_init(MSFilter *f) { vpx_codec_err_t res; MSVideoSize vsize; EncState *s=(EncState *)ms_new0(EncState,1); ms_message("Using %s\n",vpx_codec_iface_name(interface)); /* Populate encoder configuration */ res = vpx_codec_enc_config_default(interface, &s->cfg, 0); if(res) { ms_error("Failed to get config: %s\n", vpx_codec_err_to_string(res)); } if (ms_get_cpu_count() > 1) s->vconf_list = &multicore_vp8_conf_list[0]; else s->vconf_list = &vp8_conf_list[0]; MS_VIDEO_SIZE_ASSIGN(vsize, CIF); s->vconf = ms_video_find_best_configuration_for_size(s->vconf_list, vsize); s->frame_count = 0; s->cfg.g_w = s->vconf.vsize.width; s->cfg.g_h = s->vconf.vsize.height; /* encoder automatically places keyframes */ s->cfg.kf_mode = VPX_KF_AUTO; s->cfg.kf_max_dist = 300; s->cfg.rc_target_bitrate = ((float)s->vconf.required_bitrate)*0.92/1024.0; //0.9=take into account IP/UDP/RTP overhead, in average. s->cfg.g_pass = VPX_RC_ONE_PASS; /* -p 1 */ s->cfg.g_timebase.num = 1; s->cfg.g_timebase.den = s->vconf.fps; s->cfg.rc_end_usage = VPX_CBR; /* --end-usage=cbr */ #if TARGET_IPHONE_SIMULATOR s->cfg.g_threads = 1; /*workaround to remove crash on ipad simulator*/ #else s->cfg.g_threads = ms_get_cpu_count(); #endif ms_message("VP8 g_threads=%d", s->cfg.g_threads); s->cfg.rc_undershoot_pct = 95; /* --undershoot-pct=95 */ s->cfg.g_error_resilient = 1; s->cfg.g_lag_in_frames = 0; s->mtu=ms_get_payload_max_size()-1;/*-1 for the vp8 payload header*/ f->data = s; }
static void enc_init(MSFilter *f){ EncData *d=ms_new(EncData,1); d->enc=NULL; d->keyframe_int=10; /*10 seconds */ d->mode=0; d->framenum=0; d->generate_keyframe=FALSE; d->packer=NULL; d->vconf_list=x264_conf_list; d->vconf = ms_video_find_best_configuration_for_bitrate(d->vconf_list, 384000, ms_get_cpu_count()); f->data=d; }
static void enc_init(MSFilter *f){ MSVideoSize vsize; EncData *d=ms_new0(EncData,1); d->packer=NULL; d->isYUV=TRUE; d->mode=1; d->avpf_enabled=FALSE; d->force_keyframe=FALSE; d->framenum=0; d->vconf_list=mediaCodecH264_conf_list; MS_VIDEO_SIZE_ASSIGN(vsize, CIF); d->vconf = ms_video_find_best_configuration_for_size(d->vconf_list, vsize, ms_get_cpu_count()); f->data=d; }
static void enc_preprocess(MSFilter *f){ EncData *d=(EncData*)f->data; x264_param_t *params=&d->params; d->packer=rfc3984_new(); rfc3984_set_mode(d->packer,d->mode); rfc3984_enable_stap_a(d->packer,FALSE); #if defined(__arm__) || defined(ANDROID) if (x264_param_default_preset(params,"superfast"/*"ultrafast"*/,"zerolatency")) { ms_error("Cannot apply default x264 configuration"); } #else x264_param_default(params); #endif params->i_threads=ms_get_cpu_count(); params->i_sync_lookahead=0; params->i_width=d->vconf.vsize.width; params->i_height=d->vconf.vsize.height; params->i_fps_num=(int)d->vconf.fps; params->i_fps_den=1; params->i_slice_max_size=ms_get_payload_max_size()-100; /*-100 security margin*/ params->i_level_idc=13; apply_bitrate(f); params->rc.i_lookahead=0; /*enable this by config ?*/ /* params.i_keyint_max = (int)d->fps*d->keyframe_int; params.i_keyint_min = (int)d->fps; */ params->b_repeat_headers=1; params->b_annexb=0; //these parameters must be set so that our stream is baseline params->analyse.b_transform_8x8 = 0; params->b_cabac = 0; params->i_cqm_preset = X264_CQM_FLAT; params->i_bframe = 0; params->analyse.i_weighted_pred = X264_WEIGHTP_NONE; d->enc=x264_encoder_open(params); if (d->enc==NULL) ms_error("Fail to create x264 encoder."); d->framenum=0; video_starter_init(&d->starter); }
static int enc_set_br(MSFilter *f, void*data) { int br = *(int *)data; const MSVideoConfiguration *current_vconf; const MSVideoConfiguration *closer_to_best_vconf = NULL; MSVideoConfiguration best_vconf; if (ms_get_cpu_count() > 1) current_vconf = &multicore_vp8_conf_list[0]; else current_vconf = &vp8_conf_list[0]; while (closer_to_best_vconf == NULL) { if ((br >= current_vconf->bitrate) || (current_vconf->bitrate == 0)) { closer_to_best_vconf = current_vconf; } else { current_vconf++; } } memcpy(&best_vconf, closer_to_best_vconf, sizeof(best_vconf)); best_vconf.bitrate = br; enc_set_configuration(f, &best_vconf); return 0; }
static void enc_init(MSFilter *f) { vpx_codec_err_t res; EncState *s=(EncState *)ms_new0(EncState,1); ms_message("Using %s\n",vpx_codec_iface_name(interface)); /* Populate encoder configuration */ res = vpx_codec_enc_config_default(interface, &s->cfg, 0); if(res) { ms_error("Failed to get config: %s\n", vpx_codec_err_to_string(res)); } s->width = MS_VIDEO_SIZE_CIF_W; s->height = MS_VIDEO_SIZE_CIF_H; s->bitrate=256000; s->frame_count = 0; s->cfg.g_w = s->width; s->cfg.g_h = s->height; /* encoder automatically places keyframes */ s->cfg.kf_mode = VPX_KF_AUTO; s->cfg.kf_max_dist = 300; s->cfg.rc_target_bitrate = ((float)s->bitrate)*0.92/1024.0; //0.9=take into account IP/UDP/RTP overhead, in average. s->cfg.g_pass = VPX_RC_ONE_PASS; /* -p 1 */ s->fps=15; s->cfg.g_timebase.num = 1; s->cfg.g_timebase.den = s->fps; s->cfg.rc_end_usage = VPX_CBR; /* --end-usage=cbr */ s->cfg.g_threads = ms_get_cpu_count(); ms_message("VP8 g_threads=%d", s->cfg.g_threads); s->cfg.rc_undershoot_pct = 95; /* --undershoot-pct=95 */ s->cfg.g_error_resilient = 1; s->cfg.g_lag_in_frames = 0; s->mtu=ms_get_payload_max_size()-1;/*-1 for the vp8 payload header*/ f->data = s; }
static int enc_set_br(MSFilter *f, void *arg) { EncData *d = (EncData *)f->data; int br = *(int *)arg; if (d->codec != NULL) { /* Encoding is already ongoing, do not change video size, only bitrate. */ d->vconf.required_bitrate = br; enc_set_configuration(f,&d->vconf); } else { MSVideoConfiguration best_vconf = ms_video_find_best_configuration_for_bitrate(d->vconf_list, br, ms_get_cpu_count()); enc_set_configuration(f, &best_vconf); } return 0; }
static void enc_preprocess(MSFilter *f){ EncData *d=(EncData*)f->data; x264_param_t *params=&d->params; d->packer=rfc3984_new(); rfc3984_set_mode(d->packer,d->mode); rfc3984_enable_stap_a(d->packer,FALSE); #if defined(__arm__) || defined(ANDROID) if (x264_param_default_preset(params,"superfast"/*"ultrafast"*/,"zerolatency")) { #else x264_param_default(params); { #endif ms_error("Cannot apply default x264 configuration"); }; params->i_threads=ms_get_cpu_count(); params->i_sync_lookahead=0; params->i_width=d->vconf.vsize.width; params->i_height=d->vconf.vsize.height; params->i_fps_num=(int)d->vconf.fps; params->i_fps_den=1; params->i_slice_max_size=ms_get_payload_max_size()-100; /*-100 security margin*/ params->i_level_idc=13; apply_bitrate(f); params->rc.i_lookahead=0; /*enable this by config ?*/ /* params.i_keyint_max = (int)d->fps*d->keyframe_int; params.i_keyint_min = (int)d->fps; */ params->b_repeat_headers=1; params->b_annexb=0; //these parameters must be set so that our stream is baseline params->analyse.b_transform_8x8 = 0; params->b_cabac = 0; params->i_cqm_preset = X264_CQM_FLAT; params->i_bframe = 0; params->analyse.i_weighted_pred = X264_WEIGHTP_NONE; d->enc=x264_encoder_open(params); if (d->enc==NULL) ms_error("Fail to create x264 encoder."); d->framenum=0; video_starter_init(&d->starter); } static void x264_nals_to_msgb(x264_nal_t *xnals, int num_nals, MSQueue * nalus){ int i; mblk_t *m; /*int bytes;*/ for (i=0;i<num_nals;++i){ m=allocb(xnals[i].i_payload+10,0); memcpy(m->b_wptr,xnals[i].p_payload+4,xnals[i].i_payload-4); m->b_wptr+=xnals[i].i_payload-4; if (xnals[i].i_type==7) { ms_message("A SPS is being sent."); }else if (xnals[i].i_type==8) { ms_message("A PPS is being sent."); } ms_queue_put(nalus,m); } }
void MSOpenH264Encoder::setSize(MSVideoSize size) { MSVideoConfiguration best_vconf = ms_video_find_best_configuration_for_size(mVConfList, size, ms_get_cpu_count()); mVConf.vsize = size; mVConf.fps = best_vconf.fps; mVConf.bitrate_limit = best_vconf.bitrate_limit; setConfiguration(mVConf); }
void MSOpenH264Encoder::setBitrate(int bitrate) { if (isInitialized()) { // Encoding is already ongoing, do not change video size, only bitrate. mVConf.required_bitrate = bitrate; setConfiguration(mVConf); } else { MSVideoConfiguration best_vconf = ms_video_find_best_configuration_for_bitrate(mVConfList, bitrate, ms_get_cpu_count()); setConfiguration(best_vconf); } }