static int av_driver_execute_action(MSBitrateDriver *objbase, const MSRateControlAction *action){ MSAVBitrateDriver *obj=(MSAVBitrateDriver*)objbase; int ret=0; if (obj->nom_bitrate==0){ ms_filter_call_method(obj->venc,MS_FILTER_GET_BITRATE,&obj->nom_bitrate); if (obj->nom_bitrate==0){ ms_warning("MSAVBitrateDriver: Not doing adaptive rate control on video encoder, it does not seem to support that."); return -1; } } switch(action->type){ case MSRateControlActionDecreaseBitrate: ret=dec_video_bitrate(obj,action); break; case MSRateControlActionDecreasePacketRate: if (obj->audio_driver){ ret=ms_bitrate_driver_execute_action(obj->audio_driver,action); } break; case MSRateControlActionIncreaseQuality: ret=inc_video_bitrate(obj,action); break; case MSRateControlActionDoNothing: break; } return ret; }
static int bandwidth_driver_execute_action(MSBitrateDriver *objbase, const MSRateControlAction *action){ MSBandwidthBitrateDriver *obj=(MSBandwidthBitrateDriver*)objbase; int ret=0; if (obj->nom_bitrate==0&&obj->venc){ ms_filter_call_method(obj->venc,MS_FILTER_GET_BITRATE,&obj->nom_bitrate); if (obj->nom_bitrate==0){ ms_warning("MSBandwidthBitrateDriver: Not doing adaptive rate control on video encoder, it does not seem to support that."); return -1; } } if (!obj->venc){ ret=1; } switch(action->type){ case MSRateControlActionDecreaseBitrate: if (obj->venc){ ret=bandwidth_change_video_bitrate(obj,action); } if (ret!=0 && obj->audio_driver){ ret=ms_bitrate_driver_execute_action(obj->audio_driver,action); } break; case MSRateControlActionDecreasePacketRate: if (obj->audio_driver){ ret=bandwidth_change_ptime((MSAudioBitrateDriver*) obj->audio_driver, 100); }else{ ret=1; } break; case MSRateControlActionIncreaseQuality: if (obj->venc){ ret=bandwidth_change_video_bitrate(obj,action); } if (ret!=0 && obj->audio_driver){ ret=ms_bitrate_driver_execute_action(obj->audio_driver,action); } break; case MSRateControlActionDoNothing: break; } ms_message("MSBandwidthBitrateDriver: Action %s %s", ms_rate_control_action_type_name(action->type), ret == 0 ? "succeeded" : "failed"); return ret; }
static int execute_action(MSBitrateController *obj, const MSRateControlAction *action){ return ms_bitrate_driver_execute_action(obj->driver,action); }